v0.3.1

pascalorg/editorv0.3.1Mar 26, 2026by open-pascal

AI Summary

This release focuses on UI polish and bug fixes, introducing a new slider control, ESC key behavior changes, STL/OBJ export formats, and resolving state management issues.

Key Highlights

  • Slider control rewrite with intuitive drag interactions and keyboard shortcuts
  • ESC key fix to distinguish between canceling actions and switching modes
  • New STL and OBJ export formats for 3D printing and rendering
  • State management fixes including memory leak and recursive delete corrections
  • Ghost wall fix to prevent crashes on reload

New Features

  • Slider control rewrite
  • STL export
  • OBJ export
  • Window panel improvements

Full Release Notes

## What's new in v0.3.1

### Slider control rewrite

Complete overhaul of the slider UI component:

- Drag interaction moved from track bar to label (more intuitive, Blender-style)
- Defaults to unbounded range — no more artificial min/max clamping
- Arrow keys (Up/Down/Left/Right) for fine adjustments, Shift for 10× steps, Cmd/Ctrl for 0.1× precision
- Scroll wheel support on the label area
- Cleaner, more compact design

### ESC key fix

Fixed a long-standing annoyance where pressing Escape during a mid-action (drawing a wall, placing a slab, etc.) would both cancel the current action **and** switch back to select mode. Now:

- First ESC cancels the in-progress action (e.g., clears the wall draft)
- Second ESC switches back to select mode

Affected tools: Wall, Slab, Ceiling, Roof.

### STL and OBJ export

New export formats alongside the existing GLB export. Uses Three.js built-in exporters, no new dependencies.

- **STL** — standard for 3D printing (physical scale models)
- **OBJ** — widely used in rendering pipelines

Three format-specific buttons in the settings panel replace the single export button.

### State management fixes

- Fixed recursive `deleteNodesAction` that could cause state inconsistencies — now collects all descendants first, deletes in a single batch
- Fixed memory leak in temporal tracking (`prevNodesSnapshot` persisted across store re-creations)
- Fixed `requestAnimationFrame` in `updateNodesAction` without cleanup — could queue duplicate callbacks
- Removed unused debug variable in wall system

### Other improvements

- **Ghost wall fix** — `WALL_MIN_LENGTH` increased to match grid snap step (0.5m), preventing zero-length wall artifacts that crashed on reload
- **Antialias** — re-enabled default antialias on WebGPU renderer
- **Post-processing** — cleaned up pipeline code, improved error handling
- **Window panel** — removed artificial slider bounds on position, dimension, and frame controls
- **Resize handling** — added 100ms debounce for smoother viewport resizing
- **Community setup** — added issue/PR templates, CONTRIBUTING.md, simplified SETUP.md

### Packages

- `@pascal-app/core@0.3.1` — [npm](https://www.npmjs.com/package/@pascal-app/core/v/0.3.1)
- `@pascal-app/viewer@0.3.1` — [npm](https://www.npmjs.com/package/@pascal-app/viewer/v/0.3.1)

### Install

```bash
npm install @pascal-app/core@0.3.1 @pascal-app/viewer@0.3.1
```

### Numbers

29 files changed. +689 / −695 lines. No breaking changes.

---

**Full Changelog**: https://github.com/pascalorg/editor/compare/v0.3.0...v0.3.1