@design.estate/dees-catalog 9.5.0 → 9.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_bundle/bundle.js +1319 -1452
- package/dist_bundle/bundle.js.map +1 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.js +5 -4
- package/dist_ts_web/elements/00group-input/dees-input-base/dees-input-base.d.ts +1 -8
- package/dist_ts_web/elements/00group-input/dees-input-base/dees-input-base.js +7 -2
- package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.d.ts +21 -2
- package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.d.ts +4 -0
- package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.js +218 -193
- package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.js +288 -403
- package/dist_ts_web/elements/00group-layout/dees-stepper/styles.d.ts +1 -0
- package/dist_ts_web/elements/00group-layout/dees-stepper/styles.js +41 -0
- package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.d.ts +1 -1
- package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +5 -4
- package/package.json +2 -2
- package/readme.md +52 -3
- package/scripts/check-bdtheme-ratchet.cjs +2 -2
- package/scripts/check-packed-consumer.mjs +45 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/00group-dataview/dees-table/dees-table.ts +3 -2
- package/ts_web/elements/00group-input/dees-input-base/dees-input-base.ts +6 -1
- package/ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.ts +142 -200
- package/ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts +216 -400
- package/ts_web/elements/00group-layout/dees-stepper/styles.ts +41 -0
- package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +3 -3
- package/readme.hints.md +0 -1233
- package/readme.icons.md +0 -1849
- package/readme.info.md +0 -80
- package/readme.plan.md +0 -671
- package/readme.playbook.md +0 -820
- package/readme.theme-migration.md +0 -168
package/readme.plan.md
DELETED
|
@@ -1,671 +0,0 @@
|
|
|
1
|
-
# Catalog modernization — September 2026
|
|
2
|
-
|
|
3
|
-
## Forms and the full input family — September 2026
|
|
4
|
-
|
|
5
|
-
Continue the approved modern Apple app direction across every implemented input
|
|
6
|
-
and the form/submit/label owners, in consultation with Fable. Consolidate field
|
|
7
|
-
dimensions, label/helper rhythm, focus and disabled presentation in the input
|
|
8
|
-
foundation; retain compact settings rows and roomier document editors. Correct
|
|
9
|
-
compound controls that prevent real editing or keyboard use. Preserve existing
|
|
10
|
-
values, change events, validation, file/crop operations and editor engines.
|
|
11
|
-
|
|
12
|
-
Replace disconnected demo galleries with shared workspace settings examples and
|
|
13
|
-
focused component/state views. Cover text/password, dropdown/date, phone/IBAN,
|
|
14
|
-
checkbox/toggle/radio/segmented selection, quantities, tags/type lists/editable
|
|
15
|
-
lists, file/avatar input, code and rich/block editors. The empty search-select
|
|
16
|
-
source has no registered implementation; use the existing searchable dropdown.
|
|
17
|
-
Keep all demo state local and deterministic, with real form collection.
|
|
18
|
-
|
|
19
|
-
Review desktop bright/dark and touch renders with Fable. Verify field editing,
|
|
20
|
-
keyboard/focus/disabled states, grouped alignment, form values and touched editor
|
|
21
|
-
behavior; run focused native tests, strict checks, build and documentation/theme
|
|
22
|
-
checks sequentially. Commit the verified changes on main after the stable-diff
|
|
23
|
-
gate. This batch does not include a release.
|
|
24
|
-
|
|
25
|
-
Implemented: the shared field/compound recipes, 18-input preferences showcase,
|
|
26
|
-
focused demos and corrected API discovery. Phone/IBAN edits publish once through
|
|
27
|
-
their shadow boundary; form Enter skips disabled fields and preserves native
|
|
28
|
-
button actions. Avatar actions remain visible, rich text retains disabled content,
|
|
29
|
-
and collection edits survive submission. Fable accepted the final dark, bright,
|
|
30
|
-
grouped, validation and touch captures. Production build, strict new-test check,
|
|
31
|
-
37 focused browser tests, component documentation and theme ratchet checks pass.
|
|
32
|
-
The preview remains on port 3002. Final local commit review follows verification.
|
|
33
|
-
|
|
34
|
-
## Charts, App UI and storage workspace
|
|
35
|
-
|
|
36
|
-
Modernize the three families together following the reviewed Fable direction.
|
|
37
|
-
Charts get shared framing, readable series and deterministic demos; fix reconnect
|
|
38
|
-
initialization, empty data and reduced-motion behavior at the chart owners.
|
|
39
|
-
Retain existing chart engines, distributed license notices, ranges and data contracts.
|
|
40
|
-
App UI gets visible sidebar controls, keyboard-accessible navigation and tabs,
|
|
41
|
-
consistent spacing and an integrated demo with overview, analytics and files.
|
|
42
|
-
Storage gets one toolbar/content frame, discoverable row actions and a preview
|
|
43
|
-
that becomes the active pane on narrow screens with an explicit return control.
|
|
44
|
-
Preserve provider operations, confirmations and existing events. Use valid demo
|
|
45
|
-
assets and local deterministic state. Fix request/lifecycle defects that block
|
|
46
|
-
these interactions without unrelated routing or persistence changes.
|
|
47
|
-
|
|
48
|
-
Verify native keyboard/touch interactions, reconnects, empty/loading/error states,
|
|
49
|
-
preview navigation and representative storage operations. Run focused regression
|
|
50
|
-
tests, strict type checks, build and theme ratchet; review rendered desktop and
|
|
51
|
-
phone results with Fable. Commit the verified task locally after the final gate.
|
|
52
|
-
No release or dependency upgrade is included.
|
|
53
|
-
|
|
54
|
-
The batch also consolidates segmented controls in the existing
|
|
55
|
-
`dees-input-multitoggle`: keyed options, boolean binding order, native keyboard
|
|
56
|
-
selection, disabled choices, compact/touch sizing and resize-safe thumb geometry.
|
|
57
|
-
Storage, codebox, composer and the affected demos share it. Codebox preserves
|
|
58
|
-
explicit pinning of its automatic diff layout. The README now starts with a
|
|
59
|
-
pattern/task chooser and has a generated tag/source index verified by
|
|
60
|
-
`node scripts/check-component-docs.cjs`.
|
|
61
|
-
|
|
62
|
-
Implemented and reviewed in bright/dark desktop and phone layouts. Fable's visual
|
|
63
|
-
findings are resolved. Native verification covers keyboard/touch selection,
|
|
64
|
-
chart reconnects and compact axes, retained diff choices, preview load generations,
|
|
65
|
-
move confirmation, edit/save, and guarded navigation. Build, strict checks,
|
|
66
|
-
theme ratchet and README index checks pass. The full suite identified outdated
|
|
67
|
-
consumer selectors; all affected consumer and workspace regression tests pass
|
|
68
|
-
after updating them. Final local commit follows the stable-diff review.
|
|
69
|
-
|
|
70
|
-
## Operational overview components — September 2026
|
|
71
|
-
|
|
72
|
-
Modernize `dees-statsgrid` and `dees-dataview-statusobject` as a coherent pair
|
|
73
|
-
following the table pass. Keep existing tile types, status data and action
|
|
74
|
-
contracts. Give values, labels and explanations clear hierarchy on quiet opaque
|
|
75
|
-
surfaces. Expose actions to mouse, keyboard and touch; retain existing safe tile
|
|
76
|
-
click and context menus. Render status text and distinct status shapes, allow
|
|
77
|
-
long detail values to wrap, and show honest copy feedback. Fix the metric grid's
|
|
78
|
-
container sizing and clamp spans to available columns without changing the
|
|
79
|
-
configured minimum width/gap semantics. Use connection-owned resize observation
|
|
80
|
-
and respect reduced motion.
|
|
81
|
-
|
|
82
|
-
Replace the static galleries with deterministic interactive overview and service
|
|
83
|
-
health scenarios, plus discoverable examples of all nine tile types. Consult
|
|
84
|
-
Fable before the implementation and on actual bright/dark/touch renders. Verify
|
|
85
|
-
actions, responsive layout, state transitions, copy success/failure and existing
|
|
86
|
-
live updates; run native build/strict checks and the theme ratchet. Commit the
|
|
87
|
-
verified batch locally after the final sanity gate. No release in this batch.
|
|
88
|
-
|
|
89
|
-
## Session scroll shadows and search toolbar
|
|
90
|
-
|
|
91
|
-
Correct the session list's floating shadow band: the 16px edge overlay was
|
|
92
|
-
casting an outer box shadow from its inner edge. Use the shared transcript
|
|
93
|
-
contact-shadow gradient inside the overlay, darkest at the scroll boundary.
|
|
94
|
-
Keep overflow-driven visibility and hit targets unchanged.
|
|
95
|
-
Move New group into a compact action beside search and remove the bottom row.
|
|
96
|
-
Keep the action visible while filtering, preserve its request event, and let the
|
|
97
|
-
demo clear search after successful creation. Use distinct 44px touch targets.
|
|
98
|
-
Verify both appearances, scrolling endpoints, filtering, keyboard/touch creation
|
|
99
|
-
and the existing session tests; review the rendered result with Fable.
|
|
100
|
-
|
|
101
|
-
The taller viewport exposed browser scroll anchoring moving the list after drag
|
|
102
|
-
auto-scroll stopped. Disable anchoring only during active drags so moving drop
|
|
103
|
-
placeholders cannot shift the manually controlled viewport; restore normal
|
|
104
|
-
anchoring when the gesture ends.
|
|
105
|
-
|
|
106
|
-
Implemented and reviewed with Fable in dark, bright and touch layouts. Build,
|
|
107
|
-
strict checks for both changed tests, all 49 session/resource/demo tests and the
|
|
108
|
-
theme ratchet pass. Browser checks confirm flush inward shadows, end-of-scroll
|
|
109
|
-
visibility, stable search width, keyboard and touch creation, retained button
|
|
110
|
-
focus, and distinct 44px input/button targets with an 8px gap on touch devices.
|
|
111
|
-
|
|
112
|
-
## Session states and harness identity
|
|
113
|
-
|
|
114
|
-
Add optional harness identity and precise status labels to session metadata.
|
|
115
|
-
Keep a stable three-line row (title, status, harness/time) so both the state and
|
|
116
|
-
the harness remain visible at sidebar widths. Use small semantic state icons,
|
|
117
|
-
stationary warning/error edge cues, and activity-only reduced-motion-safe pulses.
|
|
118
|
-
Preserve controlled selection, expansion, grouping, resources and ordering; show
|
|
119
|
-
attention counts even when groups are collapsed. Make identity and state searchable.
|
|
120
|
-
|
|
121
|
-
Replace the repetitive session demo with a bounded two-pane app and curated
|
|
122
|
-
sessions. Let users step through starting, working, feedback, approval, completion
|
|
123
|
-
and failure using existing question and permission cards. Keep all transitions
|
|
124
|
-
local and deterministic, with no timers, and retain resource and modal examples.
|
|
125
|
-
Review both themes and phone layouts with Fable, run the session/resource tests,
|
|
126
|
-
strict test checks and build, then commit the verified changes locally.
|
|
127
|
-
|
|
128
|
-
Implemented and reviewed with Fable. The native build, strict checks for both
|
|
129
|
-
changed test files, 48 session/resource/demo tests and theme ratchet pass.
|
|
130
|
-
Browser checks cover both themes, seven visible desktop states, real approval
|
|
131
|
-
and question responses, reduced motion, dialog-owned Actions, and touch navigation
|
|
132
|
-
with focus restored to the selected row. Resources remain attached to the final
|
|
133
|
-
session so their child rows do not hide other states on the initial desktop view.
|
|
134
|
-
|
|
135
|
-
## Transcript scroll depth
|
|
136
|
-
|
|
137
|
-
Give the transcript fixed top and bottom contact shadows so it reads as passing
|
|
138
|
-
under the header and composer. Keep the 20px gradients inside the transcript
|
|
139
|
-
width, hide the upper shadow when there is no toolbar, and leave scroll/follow
|
|
140
|
-
behavior and nested transcript fades untouched. Use a shared theme token for
|
|
141
|
-
the stronger dark appearance. Verify both themes, scroll endpoints, empty and
|
|
142
|
-
toolbar-free states, suggestions, the jump control, and the narrow drawer.
|
|
143
|
-
|
|
144
|
-
Implemented with a passing build, 20 chat browser tests, and the theme ratchet.
|
|
145
|
-
Browser checks confirm stationary edges, toolbar-aware upper shadow visibility,
|
|
146
|
-
unchanged hit targets, and unobstructed suggestions and narrow drawers.
|
|
147
|
-
|
|
148
|
-
## Chat composer and sidebar alignment
|
|
149
|
-
|
|
150
|
-
Integrate reply context into the composer's input surface through a named
|
|
151
|
-
`context` slot and an accessible text description. Keep the composer at a stable
|
|
152
|
-
position inside the transcript column so its width follows the conversation and
|
|
153
|
-
the desktop sidebar extends to the bottom. Preserve draft, attachment, suggestion,
|
|
154
|
-
IME, send/steer, and narrow drawer behavior. Use one field border/focus treatment,
|
|
155
|
-
an empty slot with no reserved height, and bounded context text. Verify desktop
|
|
156
|
-
geometry, narrow drawer hit targets, keyboard focus, and both themes with Fable
|
|
157
|
-
before the native checks and local main commit.
|
|
158
|
-
|
|
159
|
-
Implemented and reviewed with Fable. The focused chat/composer suite passes 42
|
|
160
|
-
tests, including preserved draft and selection, field focus, slot geometry, and
|
|
161
|
-
drawer hit testing. Strict checks cover both changed test files. Browser checks
|
|
162
|
-
cover both themes, the embedded desktop view, and a real coarse-pointer phone
|
|
163
|
-
context. The narrow chat owns clipping of its closed off-canvas drawer.
|
|
164
|
-
|
|
165
|
-
## Harness components
|
|
166
|
-
|
|
167
|
-
Continue the shared visual system across chat, composer, transcript cards,
|
|
168
|
-
session navigation and supporting controls. Use neutral grouped surfaces,
|
|
169
|
-
consistent action heights and typography, opaque chrome, and small status
|
|
170
|
-
indicators. Session selection keeps constant geometry. Retain event-driven
|
|
171
|
-
outcome flashes and scroll-edge indicators; replace perpetual surface scans
|
|
172
|
-
with small opacity pulses that stop under reduced motion.
|
|
173
|
-
|
|
174
|
-
Preserve public APIs, streaming, virtualization, nested subagent disclosure,
|
|
175
|
-
keyboard behavior, attachments, steering and resource drag operations. Refresh
|
|
176
|
-
the demos with the shared catalog presentation and review rendered results with
|
|
177
|
-
Fable before the native build/tests and final commit gate.
|
|
178
|
-
|
|
179
|
-
Implemented and reviewed with Fable 5.1. The full catalog suite passed 405 tests;
|
|
180
|
-
final responsive polish is covered by the affected harness tests and a fresh
|
|
181
|
-
build. Browser checks cover both themes, 320/390px layouts, visible demo responses,
|
|
182
|
-
session-modal dismissal, subagent activity and reduced-motion behavior.
|
|
183
|
-
|
|
184
|
-
## Harness touch and adaptive diffs
|
|
185
|
-
|
|
186
|
-
Following the 9.0.0 release, add automatic codebox layouts using the codebox's
|
|
187
|
-
own width, while retaining concrete manual choices and transcript view state.
|
|
188
|
-
Keep automatic resize updates limited to the 640px boundary, preserve unfolded
|
|
189
|
-
context, and disconnect observation outside auto mode or after removal.
|
|
190
|
-
|
|
191
|
-
Expose session Actions alongside the independent expander, with 44px coarse
|
|
192
|
-
pointer targets and ContextMenu/Shift+F10 access through the existing context
|
|
193
|
-
event. The session demos open dialog-owned menus synchronously, show action
|
|
194
|
-
results, and restore focus through the menu lifecycle, including group moves.
|
|
195
|
-
Correct the shared context menu's hidden-focus and hover-based keyboard handling
|
|
196
|
-
so these controls support arrow navigation, Enter, and isolated Escape dismissal.
|
|
197
|
-
|
|
198
|
-
Implemented with a passing native build, 80 focused browser tests, and strict
|
|
199
|
-
type checks for the four changed test files. Browser checks cover automatic and
|
|
200
|
-
manual diff layouts, 44px touch targets, dialog ownership, keyboard menu actions,
|
|
201
|
-
and focus restoration after dismissal and session moves. Real coarse-pointer
|
|
202
|
-
browser assertions also confirm resting surfaces remain unchanged after tapping
|
|
203
|
-
and dismissing Actions; desktop hover feedback remains available.
|
|
204
|
-
|
|
205
|
-
## Catalog foundations
|
|
206
|
-
|
|
207
|
-
Approved scope: modern Apple app styling, coordinated with Fable 5.1, with an
|
|
208
|
-
emphasis on performance and a coherent catalog. The user also approved improving
|
|
209
|
-
the pages and demos and requested stable settings-window dimensions.
|
|
210
|
-
|
|
211
|
-
- Shared tonal surfaces, compact control proportions, readable semantic colors,
|
|
212
|
-
grouped form rows, and opaque modal and dropdown surfaces.
|
|
213
|
-
- Native modal focus containment, dismissal and restoration; transient controls
|
|
214
|
-
mount inside their owning dialog. Sidebar windows reserve a fixed height.
|
|
215
|
-
- Explicit form submission separate from focus, accessible text/picker controls,
|
|
216
|
-
and consistent button behavior across pointer and keyboard activation.
|
|
217
|
-
- Four complementary pages and shared layouts for the core button, form, submit,
|
|
218
|
-
text input, and modal demos. Settings retain a draft across navigation.
|
|
219
|
-
- Native build, contrast/form/modal regressions, full catalog tests, and browser
|
|
220
|
-
checks in both appearances and compact viewports precede the local main commit.
|
|
221
|
-
|
|
222
|
-
The related connection/directive lifecycle correction is published in
|
|
223
|
-
`dees-element` 3.1.0, and composed demo instance discovery is published in
|
|
224
|
-
`dees-wcctools` 3.9.4. The catalog consumes both published packages.
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
# Plan: dees-workspace-terminal PTY support
|
|
229
|
-
|
|
230
|
-
## Context
|
|
231
|
-
|
|
232
|
-
`dees-workspace-terminal` already uses xterm.js, so the terminal renderer can handle TUI escape sequences. The missing pieces were PTY-aware runtime dimensions, process resize propagation, and safe process/listener cleanup. A native `node-pty` backend is intentionally out of scope for `dees-catalog` because this package is browser-side UI; backend PTY implementations should live in a consuming app or optional companion backend package.
|
|
233
|
-
|
|
234
|
-
## Implemented Scope
|
|
235
|
-
|
|
236
|
-
1. Add terminal-aware spawn options to `IExecutionEnvironment.spawn()`.
|
|
237
|
-
2. Add optional process resize support to `IProcessHandle`.
|
|
238
|
-
3. Forward terminal dimensions and resize support through `WebContainerEnvironment`.
|
|
239
|
-
4. Spawn terminal processes with current xterm `cols`/`rows`.
|
|
240
|
-
5. Resize active non-exited processes whenever xterm is fitted after attach or container resize.
|
|
241
|
-
6. Preserve raw PTY output by not forcing `convertEol` in interactive terminal tabs.
|
|
242
|
-
7. Clean up terminal input listeners, process input writers, output pipes, and resize observers on exit/close/disconnect.
|
|
243
|
-
8. Guard async setup/spawn paths so disconnecting the component while libraries or environments load cannot leave unmanaged processes.
|
|
244
|
-
|
|
245
|
-
## Verification
|
|
246
|
-
|
|
247
|
-
- `pnpm run build` passes.
|
|
248
|
-
- No existing terminal/WebContainer browser smoke test exists in `test/`; manual verification should cover shell startup, TUI rendering, resize, Ctrl-C latency, large output, and an opencode session against a real PTY backend.
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
# Plan: dees-stepper — adopt dees-tile + optional overlay window layer
|
|
253
|
-
|
|
254
|
-
> First line (per CLAUDE.md): Please reread `/home/philkunz/.claude/CLAUDE.md` before continuing.
|
|
255
|
-
|
|
256
|
-
## Context
|
|
257
|
-
|
|
258
|
-
Today `dees-stepper` is an inline-only layout component: it hard-codes each step as a custom `.step` `<div>` with its own border / background / box-shadow / border-radius, and its `:host` is `position: absolute; width: 100%; height: 100%;` so it can only live inside a bounded parent container.
|
|
259
|
-
|
|
260
|
-
The user wants it to behave more like `dees-modal`:
|
|
261
|
-
|
|
262
|
-
1. Each step should be wrapped in a `<dees-tile>` — the unified "rounded on rounded" frame used by modals and panels — rather than a bespoke `.step` div.
|
|
263
|
-
2. A `DeesWindowLayer` should be added behind the stepper, the same way `DeesModal.createAndShow` does, so the stepper can appear as an overlay on top of the page.
|
|
264
|
-
|
|
265
|
-
User has confirmed (via AskUserQuestion in this session):
|
|
266
|
-
- **API**: keep the current inline usage working AND add a static `createAndShow()` like dees-modal.
|
|
267
|
-
- **Layout**: keep the current vertical stack + SweetScroll behavior inside the overlay (don't switch to single-tile swap).
|
|
268
|
-
- **Nav placement**: split header/footer — goBack + step counter go into the `dees-tile` header slot; the title stays in the content area; the tile footer is used for optional next/submit buttons supplied per-step.
|
|
269
|
-
|
|
270
|
-
No external consumers of `dees-stepper` were found inside this package (`grep dees-stepper|DeesStepper` only matches its own source, demo, index, changelog, readme). External consumers in dependent projects may exist — the refactor is kept backward-compatible for the inline path.
|
|
271
|
-
|
|
272
|
-
## Current state (reference)
|
|
273
|
-
|
|
274
|
-
**File:** `ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts` (lines 20–299)
|
|
275
|
-
|
|
276
|
-
- `IStep` interface — `title`, `content: TemplateResult`, `validationFunc`, `onReturnToStepFunc`, internal flags (lines 20–27).
|
|
277
|
-
- `:host { position: absolute; width: 100%; height: 100%; }` (lines 59–63).
|
|
278
|
-
- `.stepperContainer` — absolute, 100% w/h, `overflow: hidden`, holds SweetScroll (lines 64–69).
|
|
279
|
-
- `.step` — max-width 500, min-height 300, `border-radius: 12px`, theme background, theme border, `box-shadow: 0 8px 32px rgba(0,0,0,0.4)`, `filter: opacity(0.55) saturate(0.85)`, transform transition (lines 71–97). **These frame styles overlap with what `dees-tile` already provides.**
|
|
280
|
-
- `.step.selected` — `filter: opacity(1) saturate(1)` (lines 89–93). **Scroll-through visual cue, keep.**
|
|
281
|
-
- `.step.hiddenStep` — `filter: opacity(0)` (line 95). **Keep.**
|
|
282
|
-
- `.step.entrance` — faster transition variant for first-render (lines 99–105). **Keep.**
|
|
283
|
-
- `.step .stepCounter` — `position: absolute; top: 12px; right: 12px;` pill (lines 111–121). **Move into header slot as a flex child.**
|
|
284
|
-
- `.step .goBack` — `position: absolute; top: 12px; left: 12px;` pill + icon + hover (lines 123–161). **Move into header slot as a flex child.**
|
|
285
|
-
- `.step .title` — centered, 24px, 64px top padding (lines 163–171). **Keep inside the tile's content slot; remove the 64px top padding since goBack/counter no longer overlap it.**
|
|
286
|
-
- `.step .content` — 32px padding (lines 173–175). **Keep.**
|
|
287
|
-
- `render()` (lines 179–204) — maps `steps` to `.step` divs.
|
|
288
|
-
- `setScrollStatus()` (lines 226–263) — SweetScroll container setup + step validation kick-off. **Keep mostly as-is; selectors still target `.step`/`.selected` so rename cautiously.**
|
|
289
|
-
- `firstUpdated` (lines 210–218), `updated` (lines 220–222), `goBack` (lines 265–282), `goNext` (lines 284–298) — untouched in behavior, only DOM selectors may need adjusting.
|
|
290
|
-
|
|
291
|
-
**Reference files (read, do not modify):**
|
|
292
|
-
- `ts_web/elements/00group-overlay/dees-modal/dees-modal.ts` — canonical `createAndShow` + `destroy` + window-layer coordination + z-index registry usage.
|
|
293
|
-
- `ts_web/elements/00group-layout/dees-tile/dees-tile.ts` — slot API: `slot="header"`, default slot, `slot="footer"`. Auto-hides footer when slotted nodes are empty. Uses `part="outer"`, `part="header"`, `part="content"`, `part="footer"` for external shadow-part styling.
|
|
294
|
-
- `ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.ts` — `createAndShow({ blur })`, `destroy()`, dispatches `clicked` event on backdrop click, uses `zIndexRegistry`.
|
|
295
|
-
- `ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.ts` — existing inline demo.
|
|
296
|
-
|
|
297
|
-
## Target state
|
|
298
|
-
|
|
299
|
-
### 1. IStep interface — add one optional field
|
|
300
|
-
|
|
301
|
-
```ts
|
|
302
|
-
export interface IStep {
|
|
303
|
-
title: string;
|
|
304
|
-
content: TemplateResult;
|
|
305
|
-
footerContent?: TemplateResult; // NEW: optional, rendered in dees-tile footer slot
|
|
306
|
-
validationFunc?: (stepper: DeesStepper, htmlElement: HTMLElement, signal?: AbortSignal) => Promise<any>;
|
|
307
|
-
onReturnToStepFunc?: (stepper: DeesStepper, htmlElement: HTMLElement) => Promise<any>;
|
|
308
|
-
validationFuncCalled?: boolean;
|
|
309
|
-
abortController?: AbortController;
|
|
310
|
-
}
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
Form-based steps don't need `footerContent` — their `dees-form-submit` stays inside the form in the content slot (as today). `footerContent` is for non-form steps that need an explicit primary action, or for any step that wants buttons in the conventional tile footer location.
|
|
314
|
-
|
|
315
|
-
### 2. New overlay-mode state + API on DeesStepper
|
|
316
|
-
|
|
317
|
-
```ts
|
|
318
|
-
@state() accessor overlay: boolean = false;
|
|
319
|
-
@state() accessor stepperZIndex: number = 1000;
|
|
320
|
-
private windowLayer?: DeesWindowLayer;
|
|
321
|
-
|
|
322
|
-
public static async createAndShow(optionsArg: {
|
|
323
|
-
steps: IStep[];
|
|
324
|
-
}): Promise<DeesStepper> {
|
|
325
|
-
const body = document.body;
|
|
326
|
-
const stepper = new DeesStepper();
|
|
327
|
-
stepper.steps = optionsArg.steps;
|
|
328
|
-
stepper.overlay = true;
|
|
329
|
-
stepper.windowLayer = await DeesWindowLayer.createAndShow({ blur: true });
|
|
330
|
-
stepper.windowLayer.addEventListener('click', async () => {
|
|
331
|
-
await stepper.destroy();
|
|
332
|
-
});
|
|
333
|
-
body.append(stepper.windowLayer); // (already appended inside createAndShow, but mirror dees-modal's pattern; see note)
|
|
334
|
-
body.append(stepper);
|
|
335
|
-
stepper.stepperZIndex = zIndexRegistry.getNextZIndex();
|
|
336
|
-
zIndexRegistry.register(stepper, stepper.stepperZIndex);
|
|
337
|
-
return stepper;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
public async destroy() {
|
|
341
|
-
const domtools = await this.domtoolsPromise;
|
|
342
|
-
const container = this.shadowRoot!.querySelector('.stepperContainer');
|
|
343
|
-
container?.classList.add('predestroy');
|
|
344
|
-
await domtools.convenience.smartdelay.delayFor(200);
|
|
345
|
-
if (this.parentElement) this.parentElement.removeChild(this);
|
|
346
|
-
if (this.windowLayer) await this.windowLayer.destroy();
|
|
347
|
-
zIndexRegistry.unregister(this);
|
|
348
|
-
}
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
**Note on `body.append(windowLayer)`:** `DeesWindowLayer.createAndShow` already appends the window layer to `document.body` (line 27 of `dees-windowlayer.ts`). `dees-modal.ts:71` still calls `body.append(modal.windowLayer)` — that's either a no-op (already-attached nodes) or a re-parent to keep ordering. I will match dees-modal's exact sequence verbatim to avoid introducing subtle differences; if it's a bug in dees-modal it is out of scope for this task.
|
|
352
|
-
|
|
353
|
-
**Minimum new scope for createAndShow:** just `steps` for now. No `onComplete`, no `showCloseButton`, no width options. Future-proofing via additional options is an explicit follow-up — this plan keeps scope razor-sharp (per CLAUDE.md). The caller can already wire completion via the last step's `validationFunc` calling back into their own code.
|
|
354
|
-
|
|
355
|
-
### 3. Render template — wrap each step in `<dees-tile>`
|
|
356
|
-
|
|
357
|
-
```ts
|
|
358
|
-
public render() {
|
|
359
|
-
return html`
|
|
360
|
-
<div class="stepperContainer ${this.overlay ? 'overlay' : ''}" style="${this.overlay ? `z-index: ${this.stepperZIndex}` : ''}">
|
|
361
|
-
${this.steps.map((stepArg, i) => {
|
|
362
|
-
const isSelected = stepArg === this.selectedStep;
|
|
363
|
-
const isHidden = this.getIndexOfStep(stepArg) > this.getIndexOfStep(this.selectedStep);
|
|
364
|
-
const isFirst = i === 0;
|
|
365
|
-
const stepNumber = i + 1;
|
|
366
|
-
return html`
|
|
367
|
-
<dees-tile
|
|
368
|
-
class="step ${isSelected ? 'selected' : ''} ${isHidden ? 'hiddenStep' : ''} ${isFirst ? 'entrance' : ''}"
|
|
369
|
-
>
|
|
370
|
-
<div slot="header" class="step-header">
|
|
371
|
-
${!isFirst
|
|
372
|
-
? html`<div class="goBack" @click=${this.goBack}>
|
|
373
|
-
<span>←</span> go to previous step
|
|
374
|
-
</div>`
|
|
375
|
-
: html`<div class="goBack-spacer"></div>`}
|
|
376
|
-
<div class="stepCounter">Step ${stepNumber} of ${this.steps.length}</div>
|
|
377
|
-
</div>
|
|
378
|
-
<div class="step-body">
|
|
379
|
-
<div class="title">${stepArg.title}</div>
|
|
380
|
-
<div class="content">${stepArg.content}</div>
|
|
381
|
-
</div>
|
|
382
|
-
${stepArg.footerContent
|
|
383
|
-
? html`<div slot="footer" class="step-footer">${stepArg.footerContent}</div>`
|
|
384
|
-
: ''}
|
|
385
|
-
</dees-tile>
|
|
386
|
-
`;
|
|
387
|
-
})}
|
|
388
|
-
</div>
|
|
389
|
-
`;
|
|
390
|
-
}
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
**Key detail:** on the first step, render a `.goBack-spacer` (empty div) in the header instead of nothing — so the `stepCounter` stays right-aligned via `justify-content: space-between`. Without a spacer, flex would left-align the counter on step 1.
|
|
394
|
-
|
|
395
|
-
### 4. CSS changes
|
|
396
|
-
|
|
397
|
-
**Remove from `.step`:**
|
|
398
|
-
- `border-radius: 12px;`
|
|
399
|
-
- `background: ${cssManager.bdTheme(...)};`
|
|
400
|
-
- `border: 1px solid ${cssManager.bdTheme(...)};`
|
|
401
|
-
- `color: ${cssManager.bdTheme(...)};`
|
|
402
|
-
- `box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);`
|
|
403
|
-
- `overflow: hidden;`
|
|
404
|
-
|
|
405
|
-
**Why:** `dees-tile` owns all of these now. The `.step` selector still exists (since `dees-tile` has `class="step ..."` on it), but it only controls the outer animation wrapper: `max-width`, `min-height`, `margin`, `filter`, `transform`, `transition`, `user-select`, `pointer-events`.
|
|
406
|
-
|
|
407
|
-
**Keep on `.step`:**
|
|
408
|
-
- `position: relative;`
|
|
409
|
-
- `pointer-events: none;` + `.step.selected { pointer-events: all; }`
|
|
410
|
-
- `max-width: 500px;` / `min-height: 300px;`
|
|
411
|
-
- `margin: auto; margin-bottom: 20px;`
|
|
412
|
-
- `filter: opacity(0.55) saturate(0.85);` + `.selected { filter: opacity(1) saturate(1); }`
|
|
413
|
-
- `.hiddenStep { filter: opacity(0); }`
|
|
414
|
-
- All the cubic-bezier transitions (transform/filter/box-shadow — but box-shadow is now a no-op since dees-tile provides the shadow; leave the transition spec in so we don't have to re-check browser parsing; or just drop `box-shadow` from the transition list — I'll drop it for cleanliness).
|
|
415
|
-
- `.step.entrance` + `.step.entrance.hiddenStep { transform: translateY(16px); }`
|
|
416
|
-
- `.step:last-child { margin-bottom: 100vh; }`
|
|
417
|
-
|
|
418
|
-
**Add for dees-tile shadow enhancement:** use `::part(outer)` to apply the modal-style elevated shadow only when in overlay mode (optional polish — inline mode stays flat):
|
|
419
|
-
```css
|
|
420
|
-
.stepperContainer.overlay dees-tile.step::part(outer) {
|
|
421
|
-
box-shadow:
|
|
422
|
-
0 0 0 1px ${cssManager.bdTheme('hsl(0 0% 0% / 0.03)', 'hsl(0 0% 100% / 0.03)')},
|
|
423
|
-
0 8px 40px ${cssManager.bdTheme('hsl(0 0% 0% / 0.12)', 'hsl(0 0% 0% / 0.5)')},
|
|
424
|
-
0 2px 8px ${cssManager.bdTheme('hsl(0 0% 0% / 0.06)', 'hsl(0 0% 0% / 0.25)')};
|
|
425
|
-
}
|
|
426
|
-
```
|
|
427
|
-
This exactly mirrors the dees-modal::part(outer) shadow stack (dees-modal.ts:157–161) so the overlay stepper reads as "same visual language as modal."
|
|
428
|
-
|
|
429
|
-
**Restyle `.step-header` (NEW — the `<div slot="header">`):**
|
|
430
|
-
```css
|
|
431
|
-
.step-header {
|
|
432
|
-
height: 48px;
|
|
433
|
-
display: flex;
|
|
434
|
-
align-items: center;
|
|
435
|
-
justify-content: space-between;
|
|
436
|
-
padding: 8px 12px;
|
|
437
|
-
gap: 12px;
|
|
438
|
-
}
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
**Restyle `.step .stepCounter` → `.step-header .stepCounter` (move from absolute to flex child):**
|
|
442
|
-
- Drop `position: absolute; top: 12px; right: 12px;`
|
|
443
|
-
- Keep everything else (padding, font-size, border-radius, background, border).
|
|
444
|
-
|
|
445
|
-
**Restyle `.step .goBack` → `.step-header .goBack` (move from absolute to flex child):**
|
|
446
|
-
- Drop `position: absolute; top: 12px; left: 12px;`
|
|
447
|
-
- Keep everything else (padding, font-size, border-radius, background, border, hover/active states).
|
|
448
|
-
|
|
449
|
-
**Add `.goBack-spacer`:**
|
|
450
|
-
```css
|
|
451
|
-
.goBack-spacer { width: 1px; } /* placeholder so flex space-between works on step 1 */
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
**Restyle `.step .title`:**
|
|
455
|
-
- Drop `padding-top: 64px;` — no longer overlaps anything since header is in its own slot.
|
|
456
|
-
- Keep `text-align: center; font-family: 'Geist Sans', sans-serif; font-size: 24px; font-weight: 600; letter-spacing: -0.01em; color: inherit;`
|
|
457
|
-
- Add `padding-top: 32px;` (or similar) so there's consistent breathing room above the title inside the tile content.
|
|
458
|
-
|
|
459
|
-
**Add `.step-footer` (new container for `stepArg.footerContent`):**
|
|
460
|
-
```css
|
|
461
|
-
.step-footer {
|
|
462
|
-
display: flex;
|
|
463
|
-
align-items: center;
|
|
464
|
-
justify-content: flex-end;
|
|
465
|
-
gap: 8px;
|
|
466
|
-
padding: 12px 16px;
|
|
467
|
-
}
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
**Add overlay-mode positioning:**
|
|
471
|
-
```css
|
|
472
|
-
.stepperContainer {
|
|
473
|
-
position: absolute;
|
|
474
|
-
width: 100%;
|
|
475
|
-
height: 100%;
|
|
476
|
-
overflow: hidden;
|
|
477
|
-
}
|
|
478
|
-
.stepperContainer.overlay {
|
|
479
|
-
position: fixed;
|
|
480
|
-
top: 0;
|
|
481
|
-
left: 0;
|
|
482
|
-
width: 100vw;
|
|
483
|
-
height: 100vh;
|
|
484
|
-
}
|
|
485
|
-
.stepperContainer.predestroy {
|
|
486
|
-
opacity: 0;
|
|
487
|
-
transition: opacity 0.2s ease-in;
|
|
488
|
-
}
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
**Adjust `:host` for dual-mode:**
|
|
492
|
-
```css
|
|
493
|
-
:host {
|
|
494
|
-
position: absolute; /* inline default */
|
|
495
|
-
width: 100%;
|
|
496
|
-
height: 100%;
|
|
497
|
-
font-family: ${cssGeistFontFamily};
|
|
498
|
-
color: var(--dees-color-text-primary);
|
|
499
|
-
}
|
|
500
|
-
:host([overlay]) {
|
|
501
|
-
position: fixed; /* overlay mode */
|
|
502
|
-
top: 0;
|
|
503
|
-
left: 0;
|
|
504
|
-
width: 100vw;
|
|
505
|
-
height: 100vh;
|
|
506
|
-
}
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
The `overlay` @state needs to reflect to an attribute for the `:host([overlay])` selector to work. Since `@state` doesn't reflect attributes, use `@property({ type: Boolean, reflect: true })` instead — change the decorator accordingly.
|
|
510
|
-
|
|
511
|
-
### 5. Imports to add in `dees-stepper.ts`
|
|
512
|
-
|
|
513
|
-
```ts
|
|
514
|
-
import { DeesWindowLayer } from '../../00group-overlay/dees-windowlayer/dees-windowlayer.js';
|
|
515
|
-
import { zIndexRegistry } from '../../00zindex.js';
|
|
516
|
-
import { cssGeistFontFamily } from '../../00fonts.js';
|
|
517
|
-
import '../../00group-layout/dees-tile/dees-tile.js';
|
|
518
|
-
```
|
|
519
|
-
|
|
520
|
-
`dees-tile` side-effect import registers the custom element. `cssGeistFontFamily` is only needed if I add it to `:host` (which I want, to match modal).
|
|
521
|
-
|
|
522
|
-
### 6. SweetScroll selector stability
|
|
523
|
-
|
|
524
|
-
`setScrollStatus()` selectors target `.step` and `.selected` (lines 228–229). These continue to match since I'm keeping those class names on the `<dees-tile>` elements. **No selector changes needed.**
|
|
525
|
-
|
|
526
|
-
One subtlety: `offsetTop` / `offsetHeight` on `<dees-tile>` should still work — the tile's `:host` is `display: flex; flex-direction: column;` which participates in layout. I'll verify visually in the demo.
|
|
527
|
-
|
|
528
|
-
### 7. Demo update
|
|
529
|
-
|
|
530
|
-
**File:** `ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.ts`
|
|
531
|
-
|
|
532
|
-
Current demo renders one inline stepper directly. I'll keep that and add an **overlay launcher button** above it:
|
|
533
|
-
|
|
534
|
-
```ts
|
|
535
|
-
export const stepperDemo = () => html`
|
|
536
|
-
<div style="padding: 16px;">
|
|
537
|
-
<dees-button @click=${async () => {
|
|
538
|
-
const stepper = await DeesStepper.createAndShow({
|
|
539
|
-
steps: [/* same steps as inline demo */],
|
|
540
|
-
});
|
|
541
|
-
}}>Open stepper as overlay</dees-button>
|
|
542
|
-
</div>
|
|
543
|
-
<dees-stepper .steps=${[/* ... existing inline demo steps ... */]}></dees-stepper>
|
|
544
|
-
`;
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
Extract the step definitions into a `const demoSteps = [...]` above the template so both the inline and overlay paths reuse them (DRY). Import `DeesStepper` at the top of the demo file.
|
|
548
|
-
|
|
549
|
-
## Files to modify
|
|
550
|
-
|
|
551
|
-
1. **`ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts`** — main refactor (IStep, imports, render, styles, createAndShow, destroy, overlay state).
|
|
552
|
-
2. **`ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.ts`** — add overlay launcher button, extract shared `demoSteps` const, import `DeesStepper`.
|
|
553
|
-
|
|
554
|
-
**Files explicitly NOT modified:**
|
|
555
|
-
- `dees-tile.ts` — used as-is via its slot API.
|
|
556
|
-
- `dees-windowlayer.ts` — used as-is via `createAndShow` / `destroy` / `click` event.
|
|
557
|
-
- `dees-modal.ts` — reference only.
|
|
558
|
-
- `00zindex.ts` — reference only.
|
|
559
|
-
|
|
560
|
-
## Verification
|
|
561
|
-
|
|
562
|
-
1. **Build**: `pnpm run build` — must pass with no TS errors. Pure refactor, no new dependencies, no lib-check regressions expected.
|
|
563
|
-
|
|
564
|
-
2. **Inline demo (backward compat)**:
|
|
565
|
-
- Start the demo server (port 8080 is already running) and navigate to the dees-stepper demo page.
|
|
566
|
-
- Confirm the stepper renders inline exactly like before: first step centered, subsequent steps dimmed below, scroll-through animation on goNext / goBack.
|
|
567
|
-
- Fill out the first form, submit → stepper scrolls to step 2. Click goBack → scrolls back.
|
|
568
|
-
- Confirm the `dees-tile` frame is visible on each step (rounded, bordered, themed) and that the title + form are inside the tile's content area.
|
|
569
|
-
- Confirm goBack button + step counter sit in the tile's header row, space-between, left/right respectively.
|
|
570
|
-
|
|
571
|
-
3. **Overlay demo (new path)**:
|
|
572
|
-
- Click the "Open stepper as overlay" button.
|
|
573
|
-
- Confirm a `dees-windowlayer` with blur appears behind the stepper.
|
|
574
|
-
- Confirm the stepper fills the viewport (fixed, 100vw×100vh).
|
|
575
|
-
- Confirm z-index stacking: stepper above window layer above page content.
|
|
576
|
-
- Click the window layer (outside the tile) → stepper animates out, then destroys along with the window layer.
|
|
577
|
-
- Re-open and step through forward & back — behavior identical to inline mode.
|
|
578
|
-
|
|
579
|
-
4. **Playwright visual check** (per CLAUDE.md: screenshots MUST go in `.playwright-mcp/`):
|
|
580
|
-
- `.playwright-mcp/dees-stepper-inline.png` — inline mode, step 1 with form.
|
|
581
|
-
- `.playwright-mcp/dees-stepper-overlay.png` — overlay mode, same step.
|
|
582
|
-
- `.playwright-mcp/dees-stepper-overlay-step3.png` — overlay mode mid-flow, to verify scroll-stack visual.
|
|
583
|
-
- Both light and dark themes if the demo has a theme toggle.
|
|
584
|
-
|
|
585
|
-
5. **Grep sanity**:
|
|
586
|
-
- Confirm `dees-stepper` has no new unexpected match locations: `grep dees-stepper ts_web/` should still only match stepper's own files.
|
|
587
|
-
- Confirm no `.step` class collisions elsewhere (unlikely — `.step` is a plain class name; all usages should be shadow-scoped to `dees-stepper`).
|
|
588
|
-
|
|
589
|
-
## Open assumptions & deferred scope
|
|
590
|
-
|
|
591
|
-
These are explicit defaults in this plan. If the user wants different behavior for any of them, they should flag it on review — each is a simple follow-up but not in scope right now (CLAUDE.md: stay focused, no "while we're at it"):
|
|
592
|
-
|
|
593
|
-
- **No close button on overlay stepper.** Clicking the window layer backdrop is the only way to dismiss. Matches how dees-modal with `showCloseButton: false` behaves. Can add a close button in a follow-up.
|
|
594
|
-
- **No `onComplete` callback in `createAndShow`.** The last step doesn't auto-destroy the overlay — the app controls it via the step's `validationFunc`. Can add a callback option in a follow-up.
|
|
595
|
-
- **No width/size options in `createAndShow`.** The step tile continues to use the stepper's existing `max-width: 500px`. Can parameterize in a follow-up.
|
|
596
|
-
- **Box-shadow in the `.step` transition list** is dropped from the transition for cleanliness — the box-shadow is now on `dees-tile::part(outer)` and doesn't change between selected/hiddenStep, so transitioning it was already a no-op.
|
|
597
|
-
- **`pnpm start` / dev server path**: I'll reuse the existing server on port 8080 that was already listening when this session began; if that server doesn't serve the stepper demo, I'll start wcctools manually.
|
|
598
|
-
|
|
599
|
-
## Risk
|
|
600
|
-
|
|
601
|
-
- **Low-medium.** The change is localized to one component and its demo. No API removal, only an additive `createAndShow` + an optional `footerContent` field. External consumers of the inline API continue to work if they only set `steps` + `selectedStep`.
|
|
602
|
-
- **Biggest risk:** SweetScroll's `offsetTop` / `offsetHeight` measurements on `<dees-tile>` may compute differently than on the former `<div class="step">` because `dees-tile` has an internal `display: flex; flex-direction: column;` host and a `.tile-outer { flex: 1; min-height: 0; }` inner frame. If the scroll math drifts, the mitigation is to keep the `.step` wrapper as an outer `<div>` that **contains** a `<dees-tile>`, rather than putting the class directly on `<dees-tile>`. That preserves the exact box model SweetScroll was measuring. I'll try the direct-class approach first (simpler) and fall back to the wrapper approach if the scroll target looks off in the demo.
|
|
603
|
-
- **Second risk:** The `:host([overlay])` attribute selector requires `overlay` to be a reflected `@property`, not `@state`. I've already accounted for this in the plan (decorator change).
|
|
604
|
-
|
|
605
|
-
## Coherent App UI workspace — 2026-09-07
|
|
606
|
-
|
|
607
|
-
Follow-up design pass: align App UI chrome to one 40px desktop / 48px touch
|
|
608
|
-
row. Use an opaque shared chrome tone, quiet collapsible section labels,
|
|
609
|
-
consistent 13px navigation, inset tab selection and clearer activity/profile
|
|
610
|
-
hierarchy. Preserve all demo flows and public controls. Tab selection should
|
|
611
|
-
belong to the tab itself so scrolling/resizing cannot detach its highlight;
|
|
612
|
-
fix sidebar selection after immutable badge updates in the owning component.
|
|
613
|
-
Review rendered bright/dark, expanded/rail and phone results with Fable, verify
|
|
614
|
-
keyboard and geometry regressions, then commit locally after the stable gate.
|
|
615
|
-
Fable's rendered review approved the aligned chrome and CSS tab selection;
|
|
616
|
-
follow-up refinements raise the dark account popover, add the compact drawer
|
|
617
|
-
scrim, and improve tab close-control contrast. Activity streaming is explicitly
|
|
618
|
-
opt-in through both the component and shell configuration, without a pulse.
|
|
619
|
-
|
|
620
|
-
User-authorized implementation: compose every App UI shell component into one
|
|
621
|
-
gateway example, improving shared components where composition exposes defects.
|
|
622
|
-
Fable reviewed Browse / Inspect / Focus presets. Keep one per-instance model for
|
|
623
|
-
service health, samples, files, settings and activity. Presets own layout; views
|
|
624
|
-
own contextual navigation and tabs. Show a complete incident-to-recovery flow,
|
|
625
|
-
service detail tabs, charts, searchable navigation, file editing, profile settings
|
|
626
|
-
and activity/status updates without embedding standalone demo launchers.
|
|
627
|
-
|
|
628
|
-
Fix the owning chrome for keyboard controls, profile focus/dismissal, context-menu
|
|
629
|
-
anchoring, hidden panel focus and bottom-bar state preservation. Use existing
|
|
630
|
-
multitoggle, table, form, modal, storage and chart components. No dependencies,
|
|
631
|
-
timed simulations, external services or releases. Verify coherent state, guarded
|
|
632
|
-
navigation, layout persistence, overlays, narrow/touch and both themes; send
|
|
633
|
-
rendered compositions to Fable, then build/test and commit locally after the
|
|
634
|
-
stable sanity gate. Document the composition map in the README.
|
|
635
|
-
|
|
636
|
-
Implemented the shared gateway model and all nine App UI roles, with one
|
|
637
|
-
walkthrough below the frame. Fable's rendered review led to compact navigation
|
|
638
|
-
drawers, full-width activity, retained attention badges and less duplicate
|
|
639
|
-
chrome. Also corrected two composition defects in their owners: the activity
|
|
640
|
-
overlay's height extended beneath the status bar, and area-chart resizing
|
|
641
|
-
revealed empty history instead of preserving the visible range. Regression
|
|
642
|
-
coverage exercises shared state, settings guards, file activity, tab closing,
|
|
643
|
-
menu/profile focus, compact navigation, table footer semantics and chart ranges.
|
|
644
|
-
Rapid clicks also exposed duplicate profile portals. App-bar menu opens now
|
|
645
|
-
invalidate stale asynchronous results on toggle or disconnect, with regression
|
|
646
|
-
coverage for both profile and application menus.
|
|
647
|
-
|
|
648
|
-
## Table modernization — approved 2026-09-06
|
|
649
|
-
|
|
650
|
-
- Preserve the existing table data pipeline, stable row identity, editing, file drop, action contracts, virtualization and both sticky-header modes.
|
|
651
|
-
- Correct action-column ownership, native keyboard action/sort controls, filtered-empty feedback, and visible/total/selected counts. Keep search state controlled through current APIs and remove obsolete search subscriptions.
|
|
652
|
-
- Keep the shared tile shell. Introduce a stronger heading, integrated search and quieter row separators by default; preserve explicit grid options. Add optional column alignment without inferring value semantics. Use container width for toolbar/action compaction and coarse pointer for 44px touch controls.
|
|
653
|
-
- Limit primary row actions to three; expose remaining actions through the existing context menu with relevance and ordering preserved. Compact layouts offer one Actions menu.
|
|
654
|
-
- Replace the disconnected demo gallery with an interactive operations example and grouped advanced demonstrations, preserving discoverability of schema, filtering, editing, grid, server search, multi-sort and live/virtualized capabilities. Correct the table documentation.
|
|
655
|
-
- Verify focused browser regressions, live-update/retention checks, build and theme ratchet. Review dark, bright, narrow and touch screenshots with Fable before the stable commit gate. Commit to local main when verified; a further release is not part of this step.
|
|
656
|
-
|
|
657
|
-
Implemented with 11 focused table tests, 3 existing live-update/retention tests,
|
|
658
|
-
7 context-menu tests, strict checks for the changed tests, a passing build and
|
|
659
|
-
the theme ratchet. Browser checks cover both themes, real coarse-pointer 44px
|
|
660
|
-
targets, centered checkboxes, both sticky-header modes, filtering, approval,
|
|
661
|
-
creation, keyboard menu focus and virtualized updates. The hover defect came
|
|
662
|
-
from the alpha row-hover color showing through the pinned column; it now has
|
|
663
|
-
an opaque base. The contact shadow follows actual pinned-edge occlusion,
|
|
664
|
-
including scrollbar gutters, resize and reconnect. Integrated editors delegate
|
|
665
|
-
their focus ring to the cell; other editors retain their own single ring.
|
|
666
|
-
Shared context menus restore focus to their shadow-DOM opener when dismissal
|
|
667
|
-
would otherwise leave focus on the body. The detached watcher uses the element
|
|
668
|
-
preset's default port 3002.
|
|
669
|
-
Fable reviewed the final bright, dark and touch renders with no required visual
|
|
670
|
-
changes. The page-floating header mirrors the original table's compact state
|
|
671
|
-
and typography, including when a wide table is clipped by a narrower ancestor.
|