Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
aa4153a
Build Studio editor layout foundation
Yona-Appletree Jun 23, 2026
9b4f8cf
chore: minor scratch updatu
Yona-Appletree Jun 23, 2026
a333f5c
Add hierarchical Studio UX dispatch
Yona-Appletree Jun 23, 2026
b6111ec
Add Studio project sync foundation
Yona-Appletree Jun 23, 2026
7754cca
feat: project view improvements
Yona-Appletree Jun 23, 2026
a502c72
WIP node UI story spike
Yona-Appletree Jun 23, 2026
100e9ee
WIP improve Studio storybook shell
Yona-Appletree Jun 23, 2026
4b3d55d
WIP document Studio UI style principles
Yona-Appletree Jun 23, 2026
115cbb7
WIP ground node UI stories in project data
Yona-Appletree Jun 23, 2026
ff553dc
WIP refine Studio node UI status icons
Yona-Appletree Jun 23, 2026
05216dc
Organize Studio web UI component families
Yona-Appletree Jun 23, 2026
cdda1d9
Colocate Studio web stories
Yona-Appletree Jun 24, 2026
1b10b21
Add Studio popover primitive and story baselines
Yona-Appletree Jun 24, 2026
ee091e2
feat(studio): add macro-driven story registry
Yona-Appletree Jun 24, 2026
92b8750
fix(studio): colocate generated stories with components
Yona-Appletree Jun 24, 2026
a4f5172
fix(studio): use ui_exploration story source root
Yona-Appletree Jun 24, 2026
05e8e3a
feat(studio): simplify story declarations
Yona-Appletree Jun 24, 2026
a0e310e
feat(studio): organize storybook navigation
Yona-Appletree Jun 24, 2026
910f135
feat: storybook updates
Yona-Appletree Jun 24, 2026
3d0b645
docs: language
Yona-Appletree Jun 24, 2026
e4bf0a3
build: use dx for studio web
Yona-Appletree Jun 24, 2026
9bea6bc
build: keep studio generated assets out of public
Yona-Appletree Jun 24, 2026
ab03b83
refactor: rename studio core crate
Yona-Appletree Jun 24, 2026
d7d974f
refactor: cleaning up app layers
Yona-Appletree Jun 24, 2026
6a028c0
refactor: cleaning up ui naming
Yona-Appletree Jun 24, 2026
9e6eb15
docs(studio): document core UI contracts
Yona-Appletree Jun 24, 2026
63e6a84
refactor(studio): simplify story canvas chrome
Yona-Appletree Jun 25, 2026
4758bda
refactor(studio): adopt tailwind-first styling
Yona-Appletree Jun 25, 2026
af0e9c2
scratch: playing with logo ideas
Yona-Appletree Jun 25, 2026
c65c971
Add fiber headband example
Yona-Appletree Jun 25, 2026
f4e3ec9
Polish Studio device controls
Yona-Appletree Jun 25, 2026
8472725
Add Studio node anatomy components
Yona-Appletree Jun 25, 2026
9e0a0fb
Refine Studio node icon menus
Yona-Appletree Jun 25, 2026
f44163c
feat: add Studio node component bones
Yona-Appletree Jun 25, 2026
672af7a
feat: refine Studio slot row states
Yona-Appletree Jun 25, 2026
3b98905
feat: refine Studio slot affordance menus
Yona-Appletree Jun 25, 2026
0366188
refactor: unify Studio node config slot model
Yona-Appletree Jun 25, 2026
fffd119
docs: renamed overview -> gallery for stories
Yona-Appletree Jun 25, 2026
a3e7a84
refactor: tighten Studio slot detail popup
Yona-Appletree Jun 25, 2026
e3073e0
refactor: normalize Studio slot detail surfaces
Yona-Appletree Jun 25, 2026
93ea78c
feat: prepare Studio node DTOs for real project data
Yona-Appletree Jun 26, 2026
0933cf7
feat: standardize Studio shape and unit display
Yona-Appletree Jun 26, 2026
8bd495e
feat: add studio project editor controller tree
Yona-Appletree Jun 26, 2026
4d33fc5
refactor: simplify studio project controller tree
Yona-Appletree Jun 26, 2026
ae89a7e
feat: project controllers emit node DTOs
Yona-Appletree Jun 26, 2026
c1b48d1
feat: render project workspace with node panes
Yona-Appletree Jun 26, 2026
0a9eabb
feat: render optional config slots inline
Yona-Appletree Jun 26, 2026
7294de7
feat: preview selected visual products in studio
Yona-Appletree Jun 26, 2026
7379dad
fix: refresh live node slots in studio
Yona-Appletree Jun 26, 2026
af9c17c
feat: improve Studio node UI stories
Yona-Appletree Jun 26, 2026
a14c963
feat: remember studio connection intent in URL
Yona-Appletree Jun 26, 2026
ffc5e0b
Merge branch 'codex/studio-ui-improvements' into feature/studio
Yona-Appletree Jun 26, 2026
bcc87ff
chore: add attached popup scratch playground
Yona-Appletree Jun 26, 2026
155443b
chore: refine attached popup corner scratch
Yona-Appletree Jun 26, 2026
26a7a7b
chore: expand attached popup playground
Yona-Appletree Jun 26, 2026
ae5d18b
Improve studio product preview tracking
Yona-Appletree Jun 26, 2026
120dc43
Improve Studio attached popovers
Yona-Appletree Jun 26, 2026
5c682c7
Remove first slot detail divider
Yona-Appletree Jun 26, 2026
ef4c561
Improve studio demo product previews
Yona-Appletree Jun 26, 2026
9d78780
Merge branch 'codex/studio-ui-improvements' into feature/studio
Yona-Appletree Jun 26, 2026
20566ef
Add control product preview probes
Yona-Appletree Jun 26, 2026
754d04c
Refine Studio product previews
Yona-Appletree Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .github/workflows/deploy-pages-channel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ jobs:
- name: Install wasm-bindgen-cli
run: cargo install wasm-bindgen-cli --version 0.2.114 --locked

- name: Install dioxus-cli
run: cargo install dioxus-cli --version 0.7.9 --locked

- name: Install espflash
if: inputs.channel == 'beta'
run: cargo install espflash --version 3.3.0 --locked
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/deploy-studio-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ jobs:
- name: Install wasm-bindgen-cli
run: cargo install wasm-bindgen-cli --version 0.2.114 --locked

- name: Install dioxus-cli
run: cargo install dioxus-cli --version 0.7.9 --locked

- name: Install espflash
run: cargo install espflash --version 3.3.0 --locked

Expand Down
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ perf.data*
.builtins-source-hash
traces/
profiles/
lp-app/lpa-studio-web/public/pkg/
lp-app/lpa-studio-web/public/fw-browser-worker.js
lp-app/lpa-studio-web/public/firmware/
lp-app/lpa-studio-web/dist/
lp-app/lpa-studio-web/story-images/.new/
lp-app/lpa-studio-web/story-images/.scratch/
1 change: 1 addition & 0 deletions .idea/dictionaries/project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions .idea/lp2025.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,14 @@ be migrated unless a separate migration plan asks for it.

## Studio UI visual baselines

When a change touches non-generated files under `lp-app/lp-studio-web/`, run the
When a change touches non-generated files under `lp-app/lpa-studio-web/`, run the
Studio story baseline helper before committing:

```bash
just studio-story-baselines-if-needed
```

If it updates files under `lp-app/lp-studio-web/story-images/`, include those
If it updates files under `lp-app/lpa-studio-web/story-images/`, include those
PNG changes in the same commit and mention the affected story baselines in the
final summary. The helper intentionally ignores generated web artifacts,
scratch PNGs, fresh check PNGs, and the baseline PNGs themselves.
Expand Down
30 changes: 28 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ members = [
"lp-app/lpa-server",
"lp-app/lpa-client",
"lp-app/lpa-link",
"lp-app/lpa-studio-ux",
"lp-app/lpa-studio-core",
"lp-app/lpa-studio-web",
"lp-app/lpa-studio-web-story-macros",
"lp-fw/fw-browser",
"lp-fw/fw-core",
"lp-fw/fw-host",
Expand Down Expand Up @@ -74,7 +75,7 @@ default-members = [
"lp-app/lpa-server",
"lp-app/lpa-client",
"lp-app/lpa-link",
"lp-app/lpa-studio-ux",
"lp-app/lpa-studio-core",
"lp-fw/fw-core",
"lp-fw/fw-host",
"lp-fw/fw-checks",
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/2026-06-18-browser-serial-shim.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ into unrelated Rust validation.

Use a tiny JavaScript shim for direct Web Serial stream ownership.

- `lp-app/lp-studio-web/public/browser-serial.js` owns
- `lp-app/lpa-studio-web/public/browser-serial.js` owns
`navigator.serial.requestPort()`, `SerialPort.open()`, stream readers,
stream writers, line buffering, and close/cancel behavior.
- The shim installs a narrow global function surface before the Rust wasm module
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/2026-06-18-studio-action-session-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Studio is split into three application-facing crates:
events, diagnostics, capabilities, and session records.
- `lp-studio-runtime` executes effects and translates link/client/runtime facts
back into Studio events.
- `lp-studio-web` renders `StudioState` with Dioxus and dispatches
- `lpa-studio-web` renders `StudioState` with Dioxus and dispatches
`StudioAction` values.

The core loop is:
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/2026-06-18-studio-native-storybook.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ props. That makes them well suited to local fixture-driven stories.

## Decision

Studio component stories will be native Dioxus code in `lp-studio-web`.
Studio component stories will be native Dioxus code in `lpa-studio-web`.

- Story files live next to components as sibling `*_stories.rs` modules.
- A small explicit Rust registry collects story descriptors and render functions.
Expand Down
23 changes: 18 additions & 5 deletions docs/adr/2026-06-18-studio-story-png-baselines.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@ before investing in CI visual-regression infrastructure.

## Decision

Commit a curated baseline PNG set for `lp-studio-web` stories.
Commit a curated baseline PNG set for `lpa-studio-web` stories.

- Committed baselines live under `lp-app/lp-studio-web/story-images/`.
- Committed baselines live under `lp-app/lpa-studio-web/story-images/`.
- Scratch review PNGs stay gitignored under
`lp-app/lp-studio-web/story-images/.scratch/`.
`lp-app/lpa-studio-web/story-images/.scratch/`.
- Fresh check output lives under gitignored
`lp-app/lp-studio-web/story-images/.new/`.
`lp-app/lpa-studio-web/story-images/.new/`.
- `just studio-story-baselines` regenerates the committed baseline set.
- `just studio-story-check` compares fresh story PNGs to committed baselines
without updating them.
- `just studio-story-baselines-if-needed` runs baseline generation only when
non-generated files under `lp-app/lp-studio-web/` changed since `HEAD`.
non-generated files under `lp-app/lpa-studio-web/` changed since `HEAD`.
- Story captures are clipped to the marked story canvas content rather than the
full browser viewport.
- Baseline and check commands require `oxipng` so fresh captures are normalized
Expand All @@ -51,3 +51,16 @@ and baseline updates should remain intentional.
CI can later run `just studio-story-check`, but CI should not commit updated
PNGs. If the image set grows substantially or churn becomes painful, revisit
this decision before adding Git LFS or hard visual gates.

## 2026-06-23 Addendum: Responsive Baseline Matrix

The project editor foundation makes responsive layout a first-order part of the
Studio UI. The accepted baseline set now captures each story at `sm`, `md`, and
`lg` viewports. Baseline filenames include the viewport id, such as
`studio__editor-shell__sm.png`, so check mode can compare the full story by
viewport matrix and report changed, new, or removed images precisely.

This increases baseline count and disk usage, but keeps responsive regressions
visible while the editor shell, node tree, and device rail are still taking
shape. The same `oxipng` normalization remains required for baseline and check
modes.
2 changes: 1 addition & 1 deletion docs/adr/2026-06-18-studio-web-provisioning-controller.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ plug into the same user journey.

## Decision

Use a thin browser-side provisioning controller in `lp-studio-web`.
Use a thin browser-side provisioning controller in `lpa-studio-web`.

- The controller dispatches real `StudioActionKind` values into `StudioApp`.
- It drains returned `StudioEffect` values through the active browser runtime.
Expand Down
6 changes: 4 additions & 2 deletions docs/adr/2026-06-22-studio-pages-deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,10 @@ manual workflow, then published as static commits to the corresponding Pages
repository.

Deployment tooling stages clean release-only artifacts under `target/pages/`
and generates `version.json`, `.nojekyll`, and `CNAME` files. This avoids
uploading stale debug wasm from `lp-app/lpa-studio-web/public/pkg`.
and generates `version.json`, `.nojekyll`, and `CNAME` files. Studio app
JS/WASM comes from `dx` release output, and generated runtime sidecars are
copied into that output from `target/studio-web-assets/` instead of being staged
under source `public/`.

## Consequences

Expand Down
78 changes: 78 additions & 0 deletions docs/adr/2026-06-23-studio-hierarchical-ux-node-dispatch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# ADR 2026-06-23: Studio Hierarchical UX Node Dispatch

## Status

Accepted.

## Context

The Studio device manager started with a small static UX tree:

```text
StudioUx
DeviceUx
ProjectUx
```

Exact target matching was enough for that shape. The project editor needs more
dynamic action targets: node tree, individual nodes, slot rows, assets, changes,
bus views, probes, and eventually binding controls attached to slot rows.

Several designs were considered:

- Keep exact static dispatch and add ad hoc string checks as needed.
- Add a non-owning `UxRegistry` or router that maps target prefixes to owners.
- Add a registry-owned component tree of boxed dynamic UX nodes.
- Make `UxNodeId` path-shaped and dispatch hierarchically through the explicit
ownership tree.

## Decision

Studio will use path-shaped `UxNodeId` values and owner-local hierarchical
dispatch.

The ownership tree remains explicit Rust structs:

```text
StudioUx
owns DeviceUx
owns ProjectUx
```

The address tree is a UX path:

```text
studio.device
studio.project
studio.project.node_tree
studio.project.node.<id>
studio.project.node.<id>.slot.<slot-path>
studio.project.asset.<id>
studio.project.changes
studio.project.bus
```

`StudioUx` owns top-level routing. It handles `studio.device` and routes
`studio.project` plus `studio.project.*` to project ownership. `ProjectUx` owns
interpretation of project-local subtargets.

Actions remain in-process typed values. The target address identifies the UX
surface; the boxed typed operation identifies what to do. This decision does
not introduce serialized action commands or a remote action protocol.

## Consequences

The model keeps Rust ownership simple. There is no weak-reference graph,
`Rc<RefCell<_>>` ownership tree, or boxed async node runtime.

Dynamic addresses do not imply dynamic object ownership. A slot row can be
addressed without being stored as an independently owned UX node.

Dispatch has some manual machinery. Each owner must parse and handle its own
subtree clearly, with explicit errors for unknown targets or wrong operation
types.

A future `UxRegistry` is still possible if Studio grows non-tree routing,
plugin-style mounting, or cross-cutting introspection needs. If introduced
later, it should build on the path-shaped `UxNodeId` model rather than replacing
typed in-process actions.
Loading
Loading