- Add setWireframe(enabled) and refactor toggleWireframe to use it.
- Apply config.stl.color and config.stl.wireframe in Three.js preview.
- Support CameraConfig.mode='orthographic' with camera switching and frustum fitting.
- Switch release workflow from npm ci to npm install to avoid platform-specific optional dependency lockfile mismatches.
- Update package-lock.json version to 0.5.7.
- Change .ai3d-btn-active from accent text to filled accent background + on-accent text.
- Keep the active highlight on hover with a slight brightness boost.
- Replace the dropdown menu with the original left/right inline expansion of secondary actions.
- Keep icon-only primary buttons and grouped toolbar layout.
- Replace per-preview document click/keydown listeners with a single global listener to avoid performance issues with many previews.
- Refactor dropdown open/close to read state from DOM and close other menus when opening.
- Update verify:obsidian to open the dropdown before clicking reset-parts.
- Move all secondary actions into a theme-styled dropdown menu triggered by the "more" button.
- Keep primary icon buttons on the toolbar: reset, wireframe, axes, bbox, focus, disassemble, measure, annotate, copy.
- Add menu sections with separators and full descriptive labels.
- Support Escape and outside-click to close the menu.
- Remove old inline .show-secondary expansion CSS.
- Promote reset, wireframe, axes, bounding box, focus, disassemble, measure, annotate, and copy snapshot to primary icon+text buttons.
- Collapse all secondary buttons behind a global "more" toggle by default.
- Add short-label i18n keys and tighten labeled-button CSS sizing.
- Update preview verification harness to expand the more menu for secondary actions.
- Make the measurement tool a primary inline toolbar button with a visible text label ("测距" / "Measure").
- Add .ai3d-inline-btn--labeled styles for icon+text layout and compact sizing.
- Verified with typecheck, lint, unit tests, preview harness, and Obsidian vault install.
- Install vitest and @vitest/coverage-v8; add npm test script.
- Extract remote-draft normalizer to pure module for testability.
- Add tests for escapeHtml, remote draft sanitization, and ConversionManager
timeout/deduplication.
- Add data-testid to toolbar buttons via setAction().
- Pause Babylon preview render loop when canvas leaves viewport.
- Track dirty state in Babylon 3dgrid and skip unchanged cells.
- Cap annotation pins at 200 and batch DOM reads/writes in label avoidance.
- Listen for webglcontextlost/restored on canvas and stop/restart loops.
- Stop Babylon grid render loop on context loss and resume on restore.
- Add stat() helper to node-shim for file type validation.
- Replace empty .catch(() => {}) on vault.createFolder with warn logs.
- Add ConversionTimeoutError and outer timeout in ConversionManager.convert().
- Wrap async command callbacks in main.ts with Notice-on-error handler.
- Rejects converter commands containing shell metacharacters in both inspection
and execution paths.
- Verifies that configured absolute paths point to regular files, not directories.
- Adds stat() helper to node-shim for desktop environments.
- Adds shared escapeHtml() utility.
- Remote draft fields (title, summary, sections, tags, warnings, model) are
HTML-escaped and capped at 8k chars before being written to vault notes.
- Model-derived strings (part names, material names, heading refs, annotation
labels, registered-match names) are HTML-escaped when inserted into generated
Markdown in knowledge-note.ts and preview/report.ts.
- PluginStore.dispose() now triggers a final persist so annotations,
registered parts, and last-generation metadata are not lost when the
plugin unloads within the 500ms debounce window.
- main.ts onunload awaits ps.save() to ensure the flush starts before
Obsidian tears down the plugin.
- Fixes package-lock.json staying at 0.4.3 while manifest/package.json were 0.5.5,
which blocked release verification.
- Upgrades esbuild to resolve GHSA-gv7w-rqvm-qjhr (npm audit high severity).