pf_app
Two unrelated changes, in one commit because both touch Forecast.jsx in ways that cannot be staged apart without an interactive add. Calculating indicator. Perspective shows a beaker while the view rebuilds, but it lives in the viewer's status bar, which is only rendered while the settings panel is open -- so the signal disappears exactly when the panel is closed and you have nothing else to go on. Forecast.jsx now raises a counter around the calls that *start* a rebuild and lowers it after viewer.flush(), broadcasting `pf-pivot-busy` on the window; StatusBar listens and shows a spinner, following the `pf-data-changed` pattern already used between the two. Deliberately not driven from `perspective-config-update`, which was the obvious hook and is wrong: measured on a depth change over a large grain, the event arrives *after* the rebuild -- seconds late -- and the flush that follows resolves in 6ms. It reports the end of the work, not the start. This therefore covers what the toolbar drives (depth on both axes, applying a layout) and not sorting or filtering from the viewer's own chrome, which the app is never told has begun. Theme. viewer.save() includes `theme`, so every persisted layout had one baked in, and cleanLayout passed it through -- each restore reasserted the stored theme and silently undid the light/dark toggle. It is the reader's choice, not a property of the layout, so it is dropped on the way in; a published layout can no longer impose its author's theme either. sameConfig ignores it too, or toggling would light the dirty dot and offer to save a change nobody made. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| lib | ||
| public | ||
| routes | ||
| setup_sql | ||
| ui | ||
| .env.example | ||
| .gitignore | ||
| CLAUDE.md | ||
| install.sh | ||
| package-lock.json | ||
| package.json | ||
| PERSPECTIVE.md | ||
| pf_perspective_options.md | ||
| pf_spec.md | ||
| pf.sh | ||
| server.js | ||