@design.estate/dees-catalog 9.6.0 → 9.7.0

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.
Files changed (66) hide show
  1. package/dist_bundle/bundle.js +2957 -2685
  2. package/dist_bundle/bundle.js.map +1 -1
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/demos/inputs.d.ts +1 -1
  5. package/dist_ts_web/demos/inputs.js +5 -4
  6. package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.js +5 -4
  7. package/dist_ts_web/elements/00group-form/dees-form/dees-form.d.ts +5 -1
  8. package/dist_ts_web/elements/00group-form/dees-form/dees-form.js +27 -3
  9. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +1 -0
  10. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +11 -2
  11. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +3 -0
  12. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +4 -1
  13. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +51 -13
  14. package/dist_ts_web/elements/00group-input/dees-input-base/dees-input-base.d.ts +1 -8
  15. package/dist_ts_web/elements/00group-input/dees-input-base/dees-input-base.js +7 -2
  16. package/dist_ts_web/elements/00group-input/dees-input-datepicker/component.d.ts +18 -3
  17. package/dist_ts_web/elements/00group-input/dees-input-datepicker/component.js +181 -144
  18. package/dist_ts_web/elements/00group-input/dees-input-datepicker/date-validation.d.ts +13 -0
  19. package/dist_ts_web/elements/00group-input/dees-input-datepicker/date-validation.js +65 -0
  20. package/dist_ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.js +44 -56
  21. package/dist_ts_web/elements/00group-input/dees-input-datepicker/styles.js +6 -1
  22. package/dist_ts_web/elements/00group-input/dees-input-datepicker/template.js +11 -5
  23. package/dist_ts_web/elements/00group-input/dees-input-text/dees-input-text.d.ts +8 -8
  24. package/dist_ts_web/elements/00group-input/dees-input-text/dees-input-text.js +6 -53
  25. package/dist_ts_web/elements/00group-input/dees-input-textarea/dees-input-textarea.d.ts +62 -0
  26. package/dist_ts_web/elements/00group-input/dees-input-textarea/dees-input-textarea.demo.d.ts +1 -0
  27. package/dist_ts_web/elements/00group-input/dees-input-textarea/dees-input-textarea.demo.js +3 -0
  28. package/dist_ts_web/elements/00group-input/dees-input-textarea/dees-input-textarea.js +224 -0
  29. package/dist_ts_web/elements/00group-input/dees-input-textarea/index.d.ts +1 -0
  30. package/dist_ts_web/elements/00group-input/dees-input-textarea/index.js +2 -0
  31. package/dist_ts_web/elements/00group-input/index.d.ts +1 -0
  32. package/dist_ts_web/elements/00group-input/index.js +2 -1
  33. package/dist_ts_web/elements/00group-input/text-input-contextmenu.d.ts +29 -0
  34. package/dist_ts_web/elements/00group-input/text-input-contextmenu.js +29 -0
  35. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.d.ts +1 -1
  36. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +5 -4
  37. package/package.json +2 -2
  38. package/readme.md +78 -4
  39. package/scripts/check-bdtheme-ratchet.cjs +2 -2
  40. package/scripts/check-packed-consumer.mjs +48 -0
  41. package/ts_web/00_commitinfo_data.ts +1 -1
  42. package/ts_web/demos/inputs.ts +5 -4
  43. package/ts_web/elements/00group-dataview/dees-table/dees-table.ts +3 -2
  44. package/ts_web/elements/00group-form/dees-form/dees-form.ts +25 -2
  45. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +4 -0
  46. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +3 -0
  47. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +37 -11
  48. package/ts_web/elements/00group-input/dees-input-base/dees-input-base.ts +6 -1
  49. package/ts_web/elements/00group-input/dees-input-datepicker/component.ts +149 -148
  50. package/ts_web/elements/00group-input/dees-input-datepicker/date-validation.ts +64 -0
  51. package/ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.ts +40 -40
  52. package/ts_web/elements/00group-input/dees-input-datepicker/styles.ts +5 -0
  53. package/ts_web/elements/00group-input/dees-input-datepicker/template.ts +10 -4
  54. package/ts_web/elements/00group-input/dees-input-text/dees-input-text.ts +5 -52
  55. package/ts_web/elements/00group-input/dees-input-textarea/dees-input-textarea.demo.ts +2 -0
  56. package/ts_web/elements/00group-input/dees-input-textarea/dees-input-textarea.ts +128 -0
  57. package/ts_web/elements/00group-input/dees-input-textarea/index.ts +1 -0
  58. package/ts_web/elements/00group-input/index.ts +1 -0
  59. package/ts_web/elements/00group-input/text-input-contextmenu.ts +31 -0
  60. package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +3 -3
  61. package/readme.hints.md +0 -1233
  62. package/readme.icons.md +0 -1849
  63. package/readme.info.md +0 -80
  64. package/readme.plan.md +0 -671
  65. package/readme.playbook.md +0 -820
  66. 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>&larr;</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.