@agent-ui-kit/components 0.0.3
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/base-styles.css +8 -0
- package/dist/component-styles.css +147 -0
- package/dist/controls/_base/index.d.ts +3 -0
- package/dist/controls/_base/index.js +9 -0
- package/dist/controls/_base/indicator-element.d.ts +132 -0
- package/dist/controls/_base/indicator-element.js +158 -0
- package/dist/controls/_base/listbox-element.d.ts +70 -0
- package/dist/controls/_base/listbox-element.js +74 -0
- package/dist/controls/_base/range-element.d.ts +120 -0
- package/dist/controls/_base/range-element.js +158 -0
- package/dist/controls/_surface/container-box.css +301 -0
- package/dist/controls/_surface/container.css +156 -0
- package/dist/controls/_token-surface/token-surface.d.ts +35 -0
- package/dist/controls/_token-surface/token-surface.js +97 -0
- package/dist/controls/attachment/attachment-meta.d.ts +8 -0
- package/dist/controls/attachment/attachment-meta.js +84 -0
- package/dist/controls/attachment/attachment.css +91 -0
- package/dist/controls/attachment/attachment.d.ts +40 -0
- package/dist/controls/attachment/attachment.js +70 -0
- package/dist/controls/avatar/avatar-initials.d.ts +4 -0
- package/dist/controls/avatar/avatar-initials.js +30 -0
- package/dist/controls/avatar/avatar.css +87 -0
- package/dist/controls/avatar/avatar.d.ts +40 -0
- package/dist/controls/avatar/avatar.js +77 -0
- package/dist/controls/badge/badge.css +175 -0
- package/dist/controls/badge/badge.d.ts +36 -0
- package/dist/controls/badge/badge.js +71 -0
- package/dist/controls/bar-chart/bar-chart.css +110 -0
- package/dist/controls/bar-chart/bar-chart.d.ts +26 -0
- package/dist/controls/bar-chart/bar-chart.js +80 -0
- package/dist/controls/bar-chart/bar-math.d.ts +31 -0
- package/dist/controls/bar-chart/bar-math.js +106 -0
- package/dist/controls/button/button.css +263 -0
- package/dist/controls/button/button.d.ts +61 -0
- package/dist/controls/button/button.js +115 -0
- package/dist/controls/calendar/calendar.css +495 -0
- package/dist/controls/calendar/calendar.d.ts +161 -0
- package/dist/controls/calendar/calendar.js +1004 -0
- package/dist/controls/card/card-content.d.ts +24 -0
- package/dist/controls/card/card-content.js +133 -0
- package/dist/controls/card/card-footer.d.ts +3 -0
- package/dist/controls/card/card-footer.js +16 -0
- package/dist/controls/card/card-header.d.ts +3 -0
- package/dist/controls/card/card-header.js +18 -0
- package/dist/controls/card/card.css +445 -0
- package/dist/controls/card/card.d.ts +51 -0
- package/dist/controls/card/card.js +61 -0
- package/dist/controls/checkbox/checkbox.css +204 -0
- package/dist/controls/checkbox/checkbox.d.ts +114 -0
- package/dist/controls/checkbox/checkbox.js +130 -0
- package/dist/controls/code/code.css +72 -0
- package/dist/controls/code/code.d.ts +23 -0
- package/dist/controls/code/code.js +40 -0
- package/dist/controls/color-picker/color-picker.css +209 -0
- package/dist/controls/color-picker/color-picker.d.ts +84 -0
- package/dist/controls/color-picker/color-picker.js +545 -0
- package/dist/controls/color-picker/color.d.ts +40 -0
- package/dist/controls/color-picker/color.js +159 -0
- package/dist/controls/column/column.css +151 -0
- package/dist/controls/column/column.d.ts +107 -0
- package/dist/controls/column/column.js +57 -0
- package/dist/controls/combo-box/combo-box.css +397 -0
- package/dist/controls/combo-box/combo-box.d.ts +133 -0
- package/dist/controls/combo-box/combo-box.js +680 -0
- package/dist/controls/command-modal/command-modal.css +226 -0
- package/dist/controls/command-modal/command-modal.d.ts +42 -0
- package/dist/controls/command-modal/command-modal.js +315 -0
- package/dist/controls/disclosure/disclosure.css +162 -0
- package/dist/controls/disclosure/disclosure.d.ts +37 -0
- package/dist/controls/disclosure/disclosure.js +207 -0
- package/dist/controls/field/field.css +140 -0
- package/dist/controls/field/field.d.ts +27 -0
- package/dist/controls/field/field.js +228 -0
- package/dist/controls/form-provider/form-provider.css +40 -0
- package/dist/controls/form-provider/form-provider.d.ts +42 -0
- package/dist/controls/form-provider/form-provider.js +105 -0
- package/dist/controls/grid/grid.css +72 -0
- package/dist/controls/grid/grid.d.ts +60 -0
- package/dist/controls/grid/grid.js +56 -0
- package/dist/controls/icon/icon.css +37 -0
- package/dist/controls/icon/icon.d.ts +25 -0
- package/dist/controls/icon/icon.js +55 -0
- package/dist/controls/index.d.ts +57 -0
- package/dist/controls/index.js +136 -0
- package/dist/controls/ladder/ladder.css +89 -0
- package/dist/controls/ladder/ladder.d.ts +27 -0
- package/dist/controls/ladder/ladder.js +78 -0
- package/dist/controls/list/list.css +118 -0
- package/dist/controls/list/list.d.ts +84 -0
- package/dist/controls/list/list.js +48 -0
- package/dist/controls/menu/menu.css +195 -0
- package/dist/controls/menu/menu.d.ts +44 -0
- package/dist/controls/menu/menu.js +248 -0
- package/dist/controls/modal/modal.css +99 -0
- package/dist/controls/modal/modal.d.ts +61 -0
- package/dist/controls/modal/modal.js +155 -0
- package/dist/controls/popover/popover.css +83 -0
- package/dist/controls/popover/popover.d.ts +44 -0
- package/dist/controls/popover/popover.js +164 -0
- package/dist/controls/progress/progress.css +106 -0
- package/dist/controls/progress/progress.d.ts +28 -0
- package/dist/controls/progress/progress.js +80 -0
- package/dist/controls/radio/radio-group.css +84 -0
- package/dist/controls/radio/radio-group.d.ts +152 -0
- package/dist/controls/radio/radio-group.js +350 -0
- package/dist/controls/radio/radio.css +219 -0
- package/dist/controls/radio/radio.d.ts +19 -0
- package/dist/controls/radio/radio.js +75 -0
- package/dist/controls/ramp/ramp.css +75 -0
- package/dist/controls/ramp/ramp.d.ts +29 -0
- package/dist/controls/ramp/ramp.js +72 -0
- package/dist/controls/row/row.css +152 -0
- package/dist/controls/row/row.d.ts +95 -0
- package/dist/controls/row/row.js +45 -0
- package/dist/controls/segment/segment.css +66 -0
- package/dist/controls/segment/segment.d.ts +3 -0
- package/dist/controls/segment/segment.js +26 -0
- package/dist/controls/segmented-control/segmented-control.css +189 -0
- package/dist/controls/segmented-control/segmented-control.d.ts +20 -0
- package/dist/controls/segmented-control/segmented-control.js +64 -0
- package/dist/controls/select/select.css +467 -0
- package/dist/controls/select/select.d.ts +147 -0
- package/dist/controls/select/select.js +538 -0
- package/dist/controls/slider/slider.css +231 -0
- package/dist/controls/slider/slider.d.ts +111 -0
- package/dist/controls/slider/slider.js +60 -0
- package/dist/controls/slider-multi/slider-multi.css +197 -0
- package/dist/controls/slider-multi/slider-multi.d.ts +149 -0
- package/dist/controls/slider-multi/slider-multi.js +380 -0
- package/dist/controls/sparkline/sparkline-math.d.ts +23 -0
- package/dist/controls/sparkline/sparkline-math.js +79 -0
- package/dist/controls/sparkline/sparkline.css +61 -0
- package/dist/controls/sparkline/sparkline.d.ts +27 -0
- package/dist/controls/sparkline/sparkline.js +74 -0
- package/dist/controls/split/constrain.d.ts +44 -0
- package/dist/controls/split/constrain.js +126 -0
- package/dist/controls/split/split-pane.css +63 -0
- package/dist/controls/split/split-pane.d.ts +49 -0
- package/dist/controls/split/split-pane.js +42 -0
- package/dist/controls/split/split.css +127 -0
- package/dist/controls/split/split.d.ts +42 -0
- package/dist/controls/split/split.js +364 -0
- package/dist/controls/stat/stat-model.d.ts +22 -0
- package/dist/controls/stat/stat-model.js +69 -0
- package/dist/controls/stat/stat.css +101 -0
- package/dist/controls/stat/stat.d.ts +30 -0
- package/dist/controls/stat/stat.js +73 -0
- package/dist/controls/status-stream/status-stream.css +151 -0
- package/dist/controls/status-stream/status-stream.d.ts +108 -0
- package/dist/controls/status-stream/status-stream.js +417 -0
- package/dist/controls/swatch/swatch.css +66 -0
- package/dist/controls/swatch/swatch.d.ts +28 -0
- package/dist/controls/swatch/swatch.js +74 -0
- package/dist/controls/swiper/swiper-item.css +17 -0
- package/dist/controls/swiper/swiper-item.d.ts +31 -0
- package/dist/controls/swiper/swiper-item.js +47 -0
- package/dist/controls/swiper/swiper-label.css +10 -0
- package/dist/controls/swiper/swiper-label.d.ts +4 -0
- package/dist/controls/swiper/swiper-label.js +20 -0
- package/dist/controls/swiper/swiper-paddles.css +26 -0
- package/dist/controls/swiper/swiper-paddles.d.ts +10 -0
- package/dist/controls/swiper/swiper-paddles.js +62 -0
- package/dist/controls/swiper/swiper-pagination.css +60 -0
- package/dist/controls/swiper/swiper-pagination.d.ts +31 -0
- package/dist/controls/swiper/swiper-pagination.js +78 -0
- package/dist/controls/swiper/swiper.css +153 -0
- package/dist/controls/swiper/swiper.d.ts +158 -0
- package/dist/controls/swiper/swiper.js +659 -0
- package/dist/controls/switch/switch.css +194 -0
- package/dist/controls/switch/switch.d.ts +5 -0
- package/dist/controls/switch/switch.js +18 -0
- package/dist/controls/table/table-model.d.ts +43 -0
- package/dist/controls/table/table-model.js +124 -0
- package/dist/controls/table/table.css +90 -0
- package/dist/controls/table/table.d.ts +29 -0
- package/dist/controls/table/table.js +178 -0
- package/dist/controls/tabs/tab-panel.d.ts +10 -0
- package/dist/controls/tabs/tab-panel.js +89 -0
- package/dist/controls/tabs/tab.d.ts +26 -0
- package/dist/controls/tabs/tab.js +67 -0
- package/dist/controls/tabs/tabs.css +181 -0
- package/dist/controls/tabs/tabs.d.ts +61 -0
- package/dist/controls/tabs/tabs.js +176 -0
- package/dist/controls/text/href.d.ts +26 -0
- package/dist/controls/text/href.js +48 -0
- package/dist/controls/text/text.css +328 -0
- package/dist/controls/text/text.d.ts +85 -0
- package/dist/controls/text/text.js +273 -0
- package/dist/controls/text-field/text-field.css +498 -0
- package/dist/controls/text-field/text-field.d.ts +226 -0
- package/dist/controls/text-field/text-field.js +905 -0
- package/dist/controls/textarea/textarea.css +251 -0
- package/dist/controls/textarea/textarea.d.ts +136 -0
- package/dist/controls/textarea/textarea.js +312 -0
- package/dist/controls/theme-provider/theme-provider.css +48 -0
- package/dist/controls/theme-provider/theme-provider.d.ts +59 -0
- package/dist/controls/theme-provider/theme-provider.js +40 -0
- package/dist/controls/timeline/timeline.css +33 -0
- package/dist/controls/timeline/timeline.d.ts +39 -0
- package/dist/controls/timeline/timeline.js +52 -0
- package/dist/controls/timeline-item/timeline-item.css +495 -0
- package/dist/controls/timeline-item/timeline-item.d.ts +79 -0
- package/dist/controls/timeline-item/timeline-item.js +360 -0
- package/dist/controls/toast/toast-region.css +56 -0
- package/dist/controls/toast/toast-region.d.ts +20 -0
- package/dist/controls/toast/toast-region.js +113 -0
- package/dist/controls/toast/toast.css +96 -0
- package/dist/controls/toast/toast.d.ts +28 -0
- package/dist/controls/toast/toast.js +191 -0
- package/dist/controls/toolbar/toolbar.css +125 -0
- package/dist/controls/toolbar/toolbar.d.ts +108 -0
- package/dist/controls/toolbar/toolbar.js +68 -0
- package/dist/controls/tooltip/tooltip.css +80 -0
- package/dist/controls/tooltip/tooltip.d.ts +57 -0
- package/dist/controls/tooltip/tooltip.js +205 -0
- package/dist/descriptor/component-descriptor.d.ts +112 -0
- package/dist/descriptor/component-descriptor.js +492 -0
- package/dist/descriptor/index.d.ts +1 -0
- package/dist/descriptor/index.js +5 -0
- package/dist/dom/container.d.ts +45 -0
- package/dist/dom/container.js +60 -0
- package/dist/dom/element.d.ts +98 -0
- package/dist/dom/element.js +221 -0
- package/dist/dom/form.d.ts +240 -0
- package/dist/dom/form.js +399 -0
- package/dist/dom/index.d.ts +10 -0
- package/dist/dom/index.js +31 -0
- package/dist/dom/props.d.ts +56 -0
- package/dist/dom/props.js +231 -0
- package/dist/dom/repeat.d.ts +10 -0
- package/dist/dom/repeat.js +202 -0
- package/dist/dom/template.d.ts +161 -0
- package/dist/dom/template.js +634 -0
- package/dist/dom/watch.d.ts +11 -0
- package/dist/dom/watch.js +82 -0
- package/dist/foundation-styles.css +9 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/reactive/graph.d.ts +65 -0
- package/dist/reactive/graph.js +310 -0
- package/dist/reactive/index.d.ts +3 -0
- package/dist/reactive/index.js +4 -0
- package/dist/reactive/scheduler.d.ts +13 -0
- package/dist/reactive/scheduler.js +49 -0
- package/dist/traits/area-drag.d.ts +12 -0
- package/dist/traits/area-drag.js +70 -0
- package/dist/traits/form-registry.d.ts +36 -0
- package/dist/traits/form-registry.js +108 -0
- package/dist/traits/index.d.ts +24 -0
- package/dist/traits/index.js +19 -0
- package/dist/traits/overlay.d.ts +50 -0
- package/dist/traits/overlay.js +277 -0
- package/dist/traits/pane-resize.d.ts +26 -0
- package/dist/traits/pane-resize.js +103 -0
- package/dist/traits/press-activation.d.ts +11 -0
- package/dist/traits/press-activation.js +55 -0
- package/dist/traits/roving-focus.d.ts +52 -0
- package/dist/traits/roving-focus.js +214 -0
- package/dist/traits/scroll-fade.d.ts +28 -0
- package/dist/traits/scroll-fade.js +120 -0
- package/dist/traits/selection-commit.d.ts +30 -0
- package/dist/traits/selection-commit.js +146 -0
- package/dist/traits/tabbable.d.ts +12 -0
- package/dist/traits/tabbable.js +59 -0
- package/dist/traits/track-user-invalid.d.ts +36 -0
- package/dist/traits/track-user-invalid.js +52 -0
- package/dist/traits/value-codec.d.ts +120 -0
- package/dist/traits/value-codec.js +497 -0
- package/dist/traits/value-drag.d.ts +18 -0
- package/dist/traits/value-drag.js +84 -0
- package/package.json +263 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
/* timeline-item.css — ui-timeline-item, the single-file component stylesheet (ADR-0003;
|
|
2
|
+
* timeline-family.lld.md §2.4/§5 · SPEC-R3/R4/R13/R15). Three sections:
|
|
3
|
+
*
|
|
4
|
+
* [0] THE MARKER-SYSTEM RAMP — a NEW explicit per-(scale × size) integer table (ADR-0122 F2's novelty
|
|
5
|
+
* leg, the ADR-0038 no-multiplier law, the ADR-0035/0036 hoisted-per-[scale] pattern). Bare
|
|
6
|
+
* `:root`/`[scale=...]` selectors (the dimensions.css idiom) declare the RAMP FAMILY
|
|
7
|
+
* `--ui-timeline-item-{marker-box,dot-size,connector-width,gutter,row-gap}-{sm,md,lg}` — literals,
|
|
8
|
+
* no calc/multiplier. Kept LOCAL to this file (not shared/dimensions.css) because the marker system
|
|
9
|
+
* is consumed by ONLY ui-timeline-item — a family-scoped novelty, the ADR-0048 calendar precedent's
|
|
10
|
+
* shape, not its substance (the calendar aliases the EXISTING --md-sys-height-* ramp; this table is
|
|
11
|
+
* genuinely new). Every declared/consumed token is prefixed `--ui-timeline-item-` (own-name, per
|
|
12
|
+
* family-coherence's B invariant) — a deliberate rename off the LLD's illustrative `--ui-timeline-*`
|
|
13
|
+
* spelling, since that prefix is NOT this control's own name and would cross-file-leak under the
|
|
14
|
+
* fleet's per-control token-ownership gate; ui-timeline/ui-status-stream never touch these tokens.
|
|
15
|
+
* [1] TOKEN BLOCK — `:where(ui-timeline-item)` DECLARES the CONSUMED `--ui-timeline-item-*` chain,
|
|
16
|
+
* picking a ramp row via `[size]` (Kim's (scale × size) → row lookup: `[scale]` (ambient) selects
|
|
17
|
+
* the register via [0]'s tiers; `size` (an author prop) picks the row within it) + status-keyed ink.
|
|
18
|
+
* [2] STYLES BLOCK — `@scope (ui-timeline-item)` CONSUMES only `--ui-timeline-item-*` (+ the shared
|
|
19
|
+
* focus-ring/type-scale allowlist): host-as-grid (marker | content | aside), the marker's `::before`
|
|
20
|
+
* dot/ring/pulse + `::after` connector (a REAL row-gap realized as `margin-block-end`, suppressed on
|
|
21
|
+
* `[data-last]` — so the item is its OWN row-rhythm authority, no cross-file host coordination), the
|
|
22
|
+
* `data-role` content cells (empty ones collapse), and a `forced-colors` block keeping every status
|
|
23
|
+
* marker legible by SHAPE (SPEC-R4 AC2).
|
|
24
|
+
*
|
|
25
|
+
* Standalone stylesheet — linked via the component-styles barrel; NEVER injected from timeline-item.ts.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/* ════════════════ [0] THE MARKER-SYSTEM RAMP — bare :root / [scale=…] (dimensions.css idiom) ════════════════ */
|
|
29
|
+
|
|
30
|
+
:root {
|
|
31
|
+
/* The default register (≡ [scale="ui-md"] / [scale="content-sm"] — Kim's band-overlap law, SPEC-R13 AC2's
|
|
32
|
+
frozen row: connector-width is deliberately 2 across every size AND every scale tier — the stepping
|
|
33
|
+
lesson the geometry probe must not assume away). */
|
|
34
|
+
--ui-timeline-item-marker-box-sm: 14px;
|
|
35
|
+
--ui-timeline-item-marker-box-md: 16px;
|
|
36
|
+
--ui-timeline-item-marker-box-lg: 20px;
|
|
37
|
+
--ui-timeline-item-dot-size-sm: 6px;
|
|
38
|
+
--ui-timeline-item-dot-size-md: 8px;
|
|
39
|
+
--ui-timeline-item-dot-size-lg: 10px;
|
|
40
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
41
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
42
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
43
|
+
--ui-timeline-item-gutter-sm: 18px;
|
|
44
|
+
--ui-timeline-item-gutter-md: 20px;
|
|
45
|
+
--ui-timeline-item-gutter-lg: 24px;
|
|
46
|
+
--ui-timeline-item-row-gap-sm: 8px;
|
|
47
|
+
--ui-timeline-item-row-gap-md: 12px;
|
|
48
|
+
--ui-timeline-item-row-gap-lg: 16px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* ui-sm — the compact register (tighter than the default). */
|
|
52
|
+
[scale='ui-sm'] {
|
|
53
|
+
--ui-timeline-item-marker-box-sm: 12px;
|
|
54
|
+
--ui-timeline-item-marker-box-md: 14px;
|
|
55
|
+
--ui-timeline-item-marker-box-lg: 18px;
|
|
56
|
+
--ui-timeline-item-dot-size-sm: 5px;
|
|
57
|
+
--ui-timeline-item-dot-size-md: 6px;
|
|
58
|
+
--ui-timeline-item-dot-size-lg: 8px;
|
|
59
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
60
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
61
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
62
|
+
--ui-timeline-item-gutter-sm: 16px;
|
|
63
|
+
--ui-timeline-item-gutter-md: 18px;
|
|
64
|
+
--ui-timeline-item-gutter-lg: 22px;
|
|
65
|
+
--ui-timeline-item-row-gap-sm: 6px;
|
|
66
|
+
--ui-timeline-item-row-gap-md: 8px;
|
|
67
|
+
--ui-timeline-item-row-gap-lg: 12px;
|
|
68
|
+
}
|
|
69
|
+
/* ui-md — the default register, restated explicitly (byte-identical to :root) so every [scale] tier is a
|
|
70
|
+
complete, self-contained row (the ADR-0038 discipline: no tier relies on falling through to :root). */
|
|
71
|
+
[scale='ui-md'] {
|
|
72
|
+
--ui-timeline-item-marker-box-sm: 14px;
|
|
73
|
+
--ui-timeline-item-marker-box-md: 16px;
|
|
74
|
+
--ui-timeline-item-marker-box-lg: 20px;
|
|
75
|
+
--ui-timeline-item-dot-size-sm: 6px;
|
|
76
|
+
--ui-timeline-item-dot-size-md: 8px;
|
|
77
|
+
--ui-timeline-item-dot-size-lg: 10px;
|
|
78
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
79
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
80
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
81
|
+
--ui-timeline-item-gutter-sm: 18px;
|
|
82
|
+
--ui-timeline-item-gutter-md: 20px;
|
|
83
|
+
--ui-timeline-item-gutter-lg: 24px;
|
|
84
|
+
--ui-timeline-item-row-gap-sm: 8px;
|
|
85
|
+
--ui-timeline-item-row-gap-md: 12px;
|
|
86
|
+
--ui-timeline-item-row-gap-lg: 16px;
|
|
87
|
+
}
|
|
88
|
+
/* ui-lg — a step up (also = the content-md register, Kim's 6-names→4-registers band overlap). */
|
|
89
|
+
[scale='ui-lg'] {
|
|
90
|
+
--ui-timeline-item-marker-box-sm: 16px;
|
|
91
|
+
--ui-timeline-item-marker-box-md: 20px;
|
|
92
|
+
--ui-timeline-item-marker-box-lg: 24px;
|
|
93
|
+
--ui-timeline-item-dot-size-sm: 7px;
|
|
94
|
+
--ui-timeline-item-dot-size-md: 10px;
|
|
95
|
+
--ui-timeline-item-dot-size-lg: 12px;
|
|
96
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
97
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
98
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
99
|
+
--ui-timeline-item-gutter-sm: 20px;
|
|
100
|
+
--ui-timeline-item-gutter-md: 24px;
|
|
101
|
+
--ui-timeline-item-gutter-lg: 28px;
|
|
102
|
+
--ui-timeline-item-row-gap-sm: 10px;
|
|
103
|
+
--ui-timeline-item-row-gap-md: 16px;
|
|
104
|
+
--ui-timeline-item-row-gap-lg: 20px;
|
|
105
|
+
}
|
|
106
|
+
/* content-sm ≡ ui-md (Kim's band-overlap law: the content-* band is the ui-* band shifted up one row —
|
|
107
|
+
6 [scale] names render 4 distinct marker-system registers, matching --md-sys-height-* and --md-sys-font-*). */
|
|
108
|
+
[scale='content-sm'] {
|
|
109
|
+
--ui-timeline-item-marker-box-sm: 14px;
|
|
110
|
+
--ui-timeline-item-marker-box-md: 16px;
|
|
111
|
+
--ui-timeline-item-marker-box-lg: 20px;
|
|
112
|
+
--ui-timeline-item-dot-size-sm: 6px;
|
|
113
|
+
--ui-timeline-item-dot-size-md: 8px;
|
|
114
|
+
--ui-timeline-item-dot-size-lg: 10px;
|
|
115
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
116
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
117
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
118
|
+
--ui-timeline-item-gutter-sm: 18px;
|
|
119
|
+
--ui-timeline-item-gutter-md: 20px;
|
|
120
|
+
--ui-timeline-item-gutter-lg: 24px;
|
|
121
|
+
--ui-timeline-item-row-gap-sm: 8px;
|
|
122
|
+
--ui-timeline-item-row-gap-md: 12px;
|
|
123
|
+
--ui-timeline-item-row-gap-lg: 16px;
|
|
124
|
+
}
|
|
125
|
+
/* content-md ≡ ui-lg (same band-overlap law). */
|
|
126
|
+
[scale='content-md'] {
|
|
127
|
+
--ui-timeline-item-marker-box-sm: 16px;
|
|
128
|
+
--ui-timeline-item-marker-box-md: 20px;
|
|
129
|
+
--ui-timeline-item-marker-box-lg: 24px;
|
|
130
|
+
--ui-timeline-item-dot-size-sm: 7px;
|
|
131
|
+
--ui-timeline-item-dot-size-md: 10px;
|
|
132
|
+
--ui-timeline-item-dot-size-lg: 12px;
|
|
133
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
134
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
135
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
136
|
+
--ui-timeline-item-gutter-sm: 20px;
|
|
137
|
+
--ui-timeline-item-gutter-md: 24px;
|
|
138
|
+
--ui-timeline-item-gutter-lg: 28px;
|
|
139
|
+
--ui-timeline-item-row-gap-sm: 10px;
|
|
140
|
+
--ui-timeline-item-row-gap-md: 16px;
|
|
141
|
+
--ui-timeline-item-row-gap-lg: 20px;
|
|
142
|
+
}
|
|
143
|
+
/* content-lg — the largest register, its own row (no overlap partner, mirroring --md-sys-height-*). */
|
|
144
|
+
[scale='content-lg'] {
|
|
145
|
+
--ui-timeline-item-marker-box-sm: 20px;
|
|
146
|
+
--ui-timeline-item-marker-box-md: 24px;
|
|
147
|
+
--ui-timeline-item-marker-box-lg: 28px;
|
|
148
|
+
--ui-timeline-item-dot-size-sm: 9px;
|
|
149
|
+
--ui-timeline-item-dot-size-md: 12px;
|
|
150
|
+
--ui-timeline-item-dot-size-lg: 14px;
|
|
151
|
+
--ui-timeline-item-connector-width-sm: 2px;
|
|
152
|
+
--ui-timeline-item-connector-width-md: 2px;
|
|
153
|
+
--ui-timeline-item-connector-width-lg: 2px;
|
|
154
|
+
--ui-timeline-item-gutter-sm: 24px;
|
|
155
|
+
--ui-timeline-item-gutter-md: 28px;
|
|
156
|
+
--ui-timeline-item-gutter-lg: 32px;
|
|
157
|
+
--ui-timeline-item-row-gap-sm: 12px;
|
|
158
|
+
--ui-timeline-item-row-gap-md: 20px;
|
|
159
|
+
--ui-timeline-item-row-gap-lg: 24px;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* ════════════════ [1] TOKEN BLOCK — :where(ui-timeline-item) declares --ui-timeline-item-* ════════════════ */
|
|
163
|
+
|
|
164
|
+
:where(ui-timeline-item) {
|
|
165
|
+
--ui-timeline-item-truncated-border: var(--md-sys-color-warning); /* TKT-0066: was a direct role read in @scope */
|
|
166
|
+
/* size → picks the row within the ambient [scale] register (Kim's (scale × size) → row lookup). Frame
|
|
167
|
+
quantities (marker-box/dot/connector/gutter) are density-INVARIANT (the centering law); row-gap is
|
|
168
|
+
the ONE rhythm quantity and rides [density] via the shared `--md-sys-density` multiplier below. */
|
|
169
|
+
--ui-timeline-item-marker-box: var(--ui-timeline-item-marker-box-md);
|
|
170
|
+
--ui-timeline-item-dot-size: var(--ui-timeline-item-dot-size-md);
|
|
171
|
+
--ui-timeline-item-connector-width: var(--ui-timeline-item-connector-width-md);
|
|
172
|
+
--ui-timeline-item-gutter: var(--ui-timeline-item-gutter-md);
|
|
173
|
+
--ui-timeline-item-column-gap: var(--md-sys-space-sm); /* TKT-0066 item 5 ruling: constants route through the own chain */
|
|
174
|
+
--ui-timeline-item-row-gap: calc(var(--ui-timeline-item-row-gap-md) * var(--md-sys-density));
|
|
175
|
+
/* a slotted/consumer marker icon reads the CONTENT-ICON register, not this table (LLD §5). */
|
|
176
|
+
--ui-timeline-item-icon-size: var(--md-sys-icon-md);
|
|
177
|
+
|
|
178
|
+
/* status-keyed ink — the SECONDARY, redundant channel (ADR-0057); the marker SHAPE is the primary one. */
|
|
179
|
+
--ui-timeline-item-marker-ink: var(--md-sys-color-neutral-on-surface-variant);
|
|
180
|
+
/* a structural DIVIDER, not text ink (the Figma reasoning-chain card's dimmer connector) — the
|
|
181
|
+
outline-variant role, not on-surface-variant (that role is reserved for legible secondary TEXT). */
|
|
182
|
+
--ui-timeline-item-connector-ink: var(--md-sys-color-neutral-outline-variant);
|
|
183
|
+
--ui-timeline-item-ink: var(--md-sys-color-neutral-on-surface);
|
|
184
|
+
--ui-timeline-item-muted-ink: var(--md-sys-color-neutral-on-surface-variant);
|
|
185
|
+
}
|
|
186
|
+
:where(ui-timeline-item[size='sm']) {
|
|
187
|
+
--ui-timeline-item-marker-box: var(--ui-timeline-item-marker-box-sm);
|
|
188
|
+
--ui-timeline-item-dot-size: var(--ui-timeline-item-dot-size-sm);
|
|
189
|
+
--ui-timeline-item-connector-width: var(--ui-timeline-item-connector-width-sm);
|
|
190
|
+
--ui-timeline-item-gutter: var(--ui-timeline-item-gutter-sm);
|
|
191
|
+
--ui-timeline-item-row-gap: calc(var(--ui-timeline-item-row-gap-sm) * var(--md-sys-density));
|
|
192
|
+
--ui-timeline-item-icon-size: var(--md-sys-icon-sm);
|
|
193
|
+
}
|
|
194
|
+
:where(ui-timeline-item[size='lg']) {
|
|
195
|
+
--ui-timeline-item-marker-box: var(--ui-timeline-item-marker-box-lg);
|
|
196
|
+
--ui-timeline-item-dot-size: var(--ui-timeline-item-dot-size-lg);
|
|
197
|
+
--ui-timeline-item-connector-width: var(--ui-timeline-item-connector-width-lg);
|
|
198
|
+
--ui-timeline-item-gutter: var(--ui-timeline-item-gutter-lg);
|
|
199
|
+
--ui-timeline-item-row-gap: calc(var(--ui-timeline-item-row-gap-lg) * var(--md-sys-density));
|
|
200
|
+
--ui-timeline-item-icon-size: var(--md-sys-icon-lg);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* status → the redundant ink channel (never the ONLY channel — SHAPE carries the state, styles block below). */
|
|
204
|
+
:where(ui-timeline-item[status='pending']) {
|
|
205
|
+
--ui-timeline-item-marker-ink: var(--md-sys-color-neutral-on-surface-variant);
|
|
206
|
+
}
|
|
207
|
+
:where(ui-timeline-item[status='active']) {
|
|
208
|
+
--ui-timeline-item-marker-ink: var(--md-sys-color-primary);
|
|
209
|
+
}
|
|
210
|
+
:where(ui-timeline-item[status='done']) {
|
|
211
|
+
--ui-timeline-item-marker-ink: var(--md-sys-color-success);
|
|
212
|
+
}
|
|
213
|
+
:where(ui-timeline-item[status='error']) {
|
|
214
|
+
--ui-timeline-item-marker-ink: var(--md-sys-color-danger);
|
|
215
|
+
}
|
|
216
|
+
/* warning (ADR-0146 F7) — a lesser advisory outcome the single `error` state cannot express. The SHAPE
|
|
217
|
+
(the injected triangle-exclamation glyph) is the primary signifier (ADR-0057); this warning-role ink is
|
|
218
|
+
the redundant secondary channel, the SAME role the completion-invariant truncated ring already reads. */
|
|
219
|
+
:where(ui-timeline-item[status='warning']) {
|
|
220
|
+
--ui-timeline-item-marker-ink: var(--md-sys-color-warning);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* ════════════════ [2] STYLES BLOCK — @scope (ui-timeline-item) consumes ONLY --ui-timeline-item-* ════════════════ */
|
|
224
|
+
|
|
225
|
+
@scope (ui-timeline-item) {
|
|
226
|
+
:scope {
|
|
227
|
+
display: grid;
|
|
228
|
+
grid-template-columns: var(--ui-timeline-item-gutter) 1fr auto;
|
|
229
|
+
grid-template-rows: auto auto;
|
|
230
|
+
column-gap: var(--ui-timeline-item-column-gap);
|
|
231
|
+
align-items: start;
|
|
232
|
+
color: var(--ui-timeline-item-ink);
|
|
233
|
+
/* the item is its OWN row-rhythm authority — a real margin, not a cross-file host-set gap (LLD §8's
|
|
234
|
+
accepted tradeoff: alignment/rhythm via inherited/local tokens, not subgrid). */
|
|
235
|
+
margin-block-end: var(--ui-timeline-item-row-gap);
|
|
236
|
+
}
|
|
237
|
+
/* the terminal row of a host (ui-timeline/ui-status-stream marks its last child `[data-last]`) carries
|
|
238
|
+
no trailing rhythm and no dangling connector (SPEC-R6 AC2). */
|
|
239
|
+
:scope[data-last] {
|
|
240
|
+
margin-block-end: 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* ── the marker cell — dot/ring/pulse (::before) + connector (::after), gutter column, full row span ── */
|
|
244
|
+
:scope [data-part='marker'] {
|
|
245
|
+
position: relative;
|
|
246
|
+
grid-column: 1;
|
|
247
|
+
grid-row: 1 / -1;
|
|
248
|
+
inline-size: var(--ui-timeline-item-marker-box);
|
|
249
|
+
block-size: var(--ui-timeline-item-marker-box);
|
|
250
|
+
display: flex;
|
|
251
|
+
align-items: center;
|
|
252
|
+
justify-content: center;
|
|
253
|
+
color: var(--ui-timeline-item-marker-ink);
|
|
254
|
+
}
|
|
255
|
+
/* the plain dot — '' (neutral) + 'active' share it (filled); 'pending' hollows it via a border instead
|
|
256
|
+
of a fill (SPEC-R4: a distinct SHAPE, not hue alone). 'done'/'error' suppress it entirely (below). */
|
|
257
|
+
:scope [data-part='marker']::before {
|
|
258
|
+
content: '';
|
|
259
|
+
position: absolute;
|
|
260
|
+
inline-size: var(--ui-timeline-item-dot-size);
|
|
261
|
+
block-size: var(--ui-timeline-item-dot-size);
|
|
262
|
+
border-radius: 50%;
|
|
263
|
+
background: var(--ui-timeline-item-marker-ink);
|
|
264
|
+
}
|
|
265
|
+
:scope[status='pending'] [data-part='marker']::before {
|
|
266
|
+
background: transparent;
|
|
267
|
+
border: var(--ui-timeline-item-connector-width) solid var(--ui-timeline-item-marker-ink);
|
|
268
|
+
}
|
|
269
|
+
/* 'active' — a consumer-opt-in pulse (SPEC-R4: "a pulse/spinner is a consumer-opt-in presentation
|
|
270
|
+
hint"), realized as a box-shadow ping so the dot's OWN box never resizes (the centering law); static
|
|
271
|
+
under reduced-motion (SPEC-R4 AC3). */
|
|
272
|
+
:scope[status='active'] [data-part='marker']::before {
|
|
273
|
+
animation: ui-timeline-item-pulse 1.6s ease-out infinite;
|
|
274
|
+
}
|
|
275
|
+
@media (prefers-reduced-motion: reduce) {
|
|
276
|
+
:scope[status='active'] [data-part='marker']::before {
|
|
277
|
+
animation: none;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
@keyframes ui-timeline-item-pulse {
|
|
281
|
+
0% {
|
|
282
|
+
box-shadow: 0 0 0 0 var(--ui-timeline-item-marker-ink);
|
|
283
|
+
}
|
|
284
|
+
100% {
|
|
285
|
+
box-shadow: 0 0 0 calc(var(--ui-timeline-item-dot-size) / 1.5) transparent;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* the GROUP-level `active` glyph (circle-notch, GROUP_STATUS_GLYPH) is Phosphor's own spinner shape —
|
|
290
|
+
it reads as "working" only once actually spinning; static under reduced-motion (the pulse precedent).
|
|
291
|
+
Gated on BOTH `[data-glyph='circle-notch']` AND `[status='active']` (component-review finding) — a
|
|
292
|
+
consumer who sets a STATIC `icon="circle-notch"` (a free marker glyph, orthogonal to status) must not
|
|
293
|
+
spin forever; only the group-glyph's OWN active-status meaning animates. */
|
|
294
|
+
:scope[status='active'] [data-role='marker'][data-glyph='circle-notch'] {
|
|
295
|
+
animation: ui-timeline-item-spin 1s linear infinite;
|
|
296
|
+
}
|
|
297
|
+
@media (prefers-reduced-motion: reduce) {
|
|
298
|
+
:scope[status='active'] [data-role='marker'][data-glyph='circle-notch'] {
|
|
299
|
+
animation: none;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
@keyframes ui-timeline-item-spin {
|
|
303
|
+
to {
|
|
304
|
+
transform: rotate(360deg);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* the connector — a REAL element, not a pseudo (bridges the item's own margin-block-end row-gap so the
|
|
309
|
+
line is visually continuous into the next item); suppressed on the host's terminal item. */
|
|
310
|
+
:scope [data-part='marker']::after {
|
|
311
|
+
content: '';
|
|
312
|
+
position: absolute;
|
|
313
|
+
top: 100%;
|
|
314
|
+
inset-inline-start: calc(50% - var(--ui-timeline-item-connector-width) / 2);
|
|
315
|
+
inline-size: var(--ui-timeline-item-connector-width);
|
|
316
|
+
block-size: var(--ui-timeline-item-row-gap);
|
|
317
|
+
background: var(--ui-timeline-item-connector-ink);
|
|
318
|
+
}
|
|
319
|
+
:scope[data-last] [data-part='marker']::after {
|
|
320
|
+
display: none;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/* a consumer-adopted / icon-prop-driven / status-glyph marker suppresses the plain dot (NOT the
|
|
324
|
+
connector — the two are independent facts) and sizes to the content-icon register (LLD §5). */
|
|
325
|
+
:scope:has([data-role='marker']) [data-part='marker']::before {
|
|
326
|
+
display: none;
|
|
327
|
+
}
|
|
328
|
+
:scope [data-role='marker'] {
|
|
329
|
+
inline-size: var(--ui-timeline-item-icon-size);
|
|
330
|
+
block-size: var(--ui-timeline-item-icon-size);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/* ── content cells — label/timestamp share row 1, description/trailing share row 2 ── */
|
|
334
|
+
:scope [data-role='label'] {
|
|
335
|
+
grid-column: 2;
|
|
336
|
+
grid-row: 1;
|
|
337
|
+
font-weight: 500;
|
|
338
|
+
}
|
|
339
|
+
:scope [data-role='timestamp'] {
|
|
340
|
+
grid-column: 3;
|
|
341
|
+
grid-row: 1;
|
|
342
|
+
color: var(--ui-timeline-item-muted-ink);
|
|
343
|
+
white-space: nowrap;
|
|
344
|
+
}
|
|
345
|
+
:scope [data-role='description'] {
|
|
346
|
+
grid-column: 2;
|
|
347
|
+
grid-row: 2;
|
|
348
|
+
color: var(--ui-timeline-item-muted-ink);
|
|
349
|
+
}
|
|
350
|
+
:scope [data-role='trailing'] {
|
|
351
|
+
grid-column: 3;
|
|
352
|
+
grid-row: 2;
|
|
353
|
+
}
|
|
354
|
+
/* empty cells collapse — no phantom gutter (SPEC-R3 AC1). */
|
|
355
|
+
:scope > [data-role]:empty {
|
|
356
|
+
display: none;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* ── a GROUP item (hosts a nested sub-timeline, ADR-0146 F5) reads as a denser CARD header: the
|
|
360
|
+
label + its dot-separated status text share row 1 with the elapsed time — the Figma reasoning-chain
|
|
361
|
+
card's single-line "Task Group · <status> ⋯ 32s" — rather than the leaf's two-row label/description
|
|
362
|
+
stack. `@scope (ui-timeline-item)` carries no `to()` bound, so these rules are NOT limited to the
|
|
363
|
+
matching group's own cells — the plain descendant selectors below (no `>`) also reach every ITEM
|
|
364
|
+
nested inside that group's `<ui-timeline>` (a "Task Step" row is itself a `ui-timeline-item`, several
|
|
365
|
+
DOM levels down, at any recursion depth — ADR-0143). That cascade-through is exactly what the Figma
|
|
366
|
+
card wants too — a step row ALSO reads "Task Step 02 · What went wrong 6s" on one line — so it is
|
|
367
|
+
kept, not fought. Only a leaf with NO grouped ancestor at all (never nested under any `:has([data-role=
|
|
368
|
+
'nested'])` item) keeps the original, unrelated two-row layout untouched.
|
|
369
|
+
|
|
370
|
+
Component-review correction: the FIRST cut of this rule repointed the cells (`description`/`timestamp`)
|
|
371
|
+
onto the new 4-column template via a plain descendant selector, but left `grid-template-columns` itself
|
|
372
|
+
scoped to ONLY the group root — so every nested "Task Step" row still laid out its CELLS against the
|
|
373
|
+
old 3-column template (a stray 1fr on the label column, the timestamp landing in an uncounted implicit
|
|
374
|
+
4th track). `grid-template-columns` must reach the SAME descendant set the cell placements do. */
|
|
375
|
+
:scope:has([data-role='nested']),
|
|
376
|
+
:scope:has([data-role='nested']) ui-timeline-item {
|
|
377
|
+
grid-template-columns: var(--ui-timeline-item-gutter) auto 1fr auto;
|
|
378
|
+
}
|
|
379
|
+
:scope:has([data-role='nested']) [data-role='description'] {
|
|
380
|
+
grid-column: 3;
|
|
381
|
+
grid-row: 1;
|
|
382
|
+
min-inline-size: 0;
|
|
383
|
+
overflow: hidden;
|
|
384
|
+
text-overflow: ellipsis; /* NOT flex — text-overflow only clips reliably on a block container's own inline content, not an anonymous flex item */
|
|
385
|
+
white-space: nowrap;
|
|
386
|
+
}
|
|
387
|
+
:scope:has([data-role='nested']) [data-role='description']::before {
|
|
388
|
+
content: '\00B7\0020'; /* a middle-dot separator + a spacer (the Metadata row's "Dot" glyph, Figma node 21:1403 et al.) — plain inline content, so it ellipses together with the text rather than as a separate flex item */
|
|
389
|
+
}
|
|
390
|
+
:scope:has([data-role='nested']) [data-role='timestamp'] {
|
|
391
|
+
grid-column: 4;
|
|
392
|
+
}
|
|
393
|
+
/* `trailing` (the collapsed-summary preview, ADR-0143 F3) is always meant to stack directly under
|
|
394
|
+
`timestamp` — it kept the base layout's literal `grid-column: 3` even though the group override above
|
|
395
|
+
repoints `timestamp` to column 4, landing the preview under `description` instead (code-review finding).
|
|
396
|
+
`grid-row` is untouched (still row 2, the base rule) — only the column follows timestamp's move. */
|
|
397
|
+
:scope:has([data-role='nested']) [data-role='trailing'] {
|
|
398
|
+
grid-column: 4;
|
|
399
|
+
}
|
|
400
|
+
/* elapsed-time readouts read as tabular mono figures (the Figma reasoning-chain CARD's "Label Mono" /
|
|
401
|
+
SF Mono treatment) — a telemetry/timestamp cell is machine-emitted data, not authored prose. Scoped to
|
|
402
|
+
the group block deliberately (code-review finding): an earlier cut left this unconditional, so a plain
|
|
403
|
+
leaf item's own human-authored timestamp prose (e.g. timeline-demo.ts's "Apr 15, 2:30 PM") silently
|
|
404
|
+
rendered in monospace too — outside this PR's stated "grouped cards" scope. */
|
|
405
|
+
:scope:has([data-role='nested']) [data-role='timestamp'],
|
|
406
|
+
:scope:has([data-role='nested']) [data-role='trailing'] {
|
|
407
|
+
font-family: var(--md-sys-typeface-mono);
|
|
408
|
+
font-variant-numeric: tabular-nums;
|
|
409
|
+
}
|
|
410
|
+
/* `detail`/`text` span columns 2 THROUGH THE END (`-1`), not the base layout's literal `2 / 4` — under
|
|
411
|
+
the group's 4-column template, `4` is the timestamp column, one short of the true last column. `-1`
|
|
412
|
+
stays correct regardless of column count instead of hard-coding a track index a sibling rule changes. */
|
|
413
|
+
:scope:has([data-role='nested']) [data-part='detail'],
|
|
414
|
+
:scope:has([data-role='nested']) [data-role='text'] {
|
|
415
|
+
grid-column: 2 / -1;
|
|
416
|
+
}
|
|
417
|
+
/* the composed detail toggle, contextually compacted (the disclosure's OWN declared --ui-disclosure-*
|
|
418
|
+
custom properties — the sanctioned override surface, never its internal [data-part] rendering) — a
|
|
419
|
+
full control-height row reads as a stray, oversized affordance below a now-single-line header. Reaches
|
|
420
|
+
every nested item's OWN detail too (no `>` — consistent with the cascade-through above: a "Task Step"
|
|
421
|
+
row's own continuation disclosure, if it has one, compacts the same way its ancestor group's does). */
|
|
422
|
+
:scope:has([data-role='nested']) [data-part='detail'] {
|
|
423
|
+
/* NOT `inherit` — an explicit `inherit` on a custom property re-triggers inheritance lookup instead of
|
|
424
|
+
reading the ambient computed value; since ui-timeline-item never declares --ui-disclosure-font, that
|
|
425
|
+
lookup dead-ends guaranteed-invalid, which cascades into --ui-disclosure-glyph (chevron sizing) also
|
|
426
|
+
going invalid — the chevron's inline/block-size then falls back to `auto`, and a same-box-referencing
|
|
427
|
+
`width="100%"` SVG with an indeterminate containing block resolves to the browser's 300×300 replaced-
|
|
428
|
+
element default (verified empirically — a real, reproduced regression, not a hypothetical). */
|
|
429
|
+
--ui-disclosure-height: 1.25em;
|
|
430
|
+
--ui-disclosure-ink: var(--ui-timeline-item-muted-ink);
|
|
431
|
+
--ui-disclosure-gap: var(--ui-timeline-item-column-gap);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* the streamed chain-of-thought text cell (ui-status-stream's #growText, timeline-item.md's residual
|
|
435
|
+
imperative fact) — an implicit row below the label/description/timestamp/trailing rows. */
|
|
436
|
+
:scope [data-role='text'] {
|
|
437
|
+
grid-column: 2 / 4;
|
|
438
|
+
grid-row: 3;
|
|
439
|
+
color: var(--ui-timeline-item-muted-ink);
|
|
440
|
+
white-space: pre-wrap;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/* the composed detail (ui-disclosure) spans the content+aside columns, an implicit row below any
|
|
444
|
+
streamed text (so a status-stream entry with BOTH reads top-to-bottom: text, then the detail toggle). */
|
|
445
|
+
:scope [data-part='detail'] {
|
|
446
|
+
grid-column: 2 / 4;
|
|
447
|
+
grid-row: 4;
|
|
448
|
+
}
|
|
449
|
+
/* the PRE-adoption consumer child (moved into [data-part='detail'] by #ensureAnatomy, synchronously in
|
|
450
|
+
connected()) — hidden in the brief window before upgrade/adoption so it never paints loose, unstyled
|
|
451
|
+
content outside the grid (the same anti-FOUC discipline the toast/disclosure adopted-part precedent
|
|
452
|
+
relies on implicitly; here made explicit since the source attribute survives the move). */
|
|
453
|
+
:scope > [data-role='detail'] {
|
|
454
|
+
display: none;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/* :state(truncated) — ui-status-stream's completion invariant (SPEC-R11): a dashed ring OVERRIDES
|
|
458
|
+
whatever status shape/glyph was showing (a torn stream never lies "still working"). The dash pattern
|
|
459
|
+
is a non-color-only signifier — `border-style` alone distinguishes it under forced-colors, where the
|
|
460
|
+
warning fill is not the sole cue. Wins over the injected done/error glyph by clearing it back to the
|
|
461
|
+
CSS dot (the marker glyph effect never runs for truncation — it is a pure CSS override). */
|
|
462
|
+
:scope:state(truncated) [data-part='marker']::before {
|
|
463
|
+
display: block;
|
|
464
|
+
background: transparent;
|
|
465
|
+
border: var(--ui-timeline-item-connector-width) dashed var(--ui-timeline-item-truncated-border);
|
|
466
|
+
/* an active entry's pulse must NOT survive truncation — a torn stream showing a still-pulsing marker
|
|
467
|
+
is exactly the "still working" cue SPEC-R11 exists to kill (component-review finding). Wins over the
|
|
468
|
+
[status='active']::before pulse rule above by source order (equal specificity). */
|
|
469
|
+
animation: none;
|
|
470
|
+
}
|
|
471
|
+
:scope:state(truncated) [data-role='marker'] {
|
|
472
|
+
display: none; /* the dashed ring is the sole marker once truncated — no competing built-in glyph */
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/* forced-colors (WHCM) — every marker SHAPE keeps a system-colour border/fill so the state survives
|
|
476
|
+
when fills flatten (SPEC-R4 AC2). The pending ring, the connector, and the label/description ink all
|
|
477
|
+
already resolve through a WHCM-mapped role at the token layer; this block is the explicit,
|
|
478
|
+
computed-style-provable belt-and-suspenders (the disclosure precedent). */
|
|
479
|
+
@media (forced-colors: active) {
|
|
480
|
+
:scope {
|
|
481
|
+
color: CanvasText;
|
|
482
|
+
}
|
|
483
|
+
:scope [data-part='marker']::before {
|
|
484
|
+
background: CanvasText;
|
|
485
|
+
border-color: CanvasText;
|
|
486
|
+
}
|
|
487
|
+
:scope [data-part='marker']::after {
|
|
488
|
+
background: CanvasText;
|
|
489
|
+
}
|
|
490
|
+
:scope [data-role='description'],
|
|
491
|
+
:scope [data-role='timestamp'] {
|
|
492
|
+
color: CanvasText;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { UIElement, type ReactiveProps } from '../../dom/index.js';
|
|
2
|
+
import '../disclosure/disclosure.js';
|
|
3
|
+
declare const props: {
|
|
4
|
+
status: {
|
|
5
|
+
reflect: true;
|
|
6
|
+
type: import("../../index.js").PropType<"" | "error" | "warning" | "pending" | "active" | "done">;
|
|
7
|
+
default: "" | "error" | "warning" | "pending" | "active" | "done";
|
|
8
|
+
attribute?: string | false;
|
|
9
|
+
};
|
|
10
|
+
label: {
|
|
11
|
+
reflect: true;
|
|
12
|
+
type: import("../../index.js").PropType<string>;
|
|
13
|
+
default: string;
|
|
14
|
+
attribute?: string | false;
|
|
15
|
+
};
|
|
16
|
+
description: import("../../index.js").PropConfig<string>;
|
|
17
|
+
timestamp: import("../../index.js").PropConfig<string>;
|
|
18
|
+
icon: import("../../index.js").PropConfig<string>;
|
|
19
|
+
size: {
|
|
20
|
+
reflect: true;
|
|
21
|
+
type: import("../../index.js").PropType<"sm" | "md" | "lg">;
|
|
22
|
+
default: "sm" | "md" | "lg";
|
|
23
|
+
attribute?: string | false;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export interface UITimelineItemElement extends ReactiveProps<typeof props> {
|
|
27
|
+
}
|
|
28
|
+
export declare class UITimelineItemElement extends UIElement {
|
|
29
|
+
#private;
|
|
30
|
+
static props: {
|
|
31
|
+
status: {
|
|
32
|
+
reflect: true;
|
|
33
|
+
type: import("../../index.js").PropType<"" | "error" | "warning" | "pending" | "active" | "done">;
|
|
34
|
+
default: "" | "error" | "warning" | "pending" | "active" | "done";
|
|
35
|
+
attribute?: string | false;
|
|
36
|
+
};
|
|
37
|
+
label: {
|
|
38
|
+
reflect: true;
|
|
39
|
+
type: import("../../index.js").PropType<string>;
|
|
40
|
+
default: string;
|
|
41
|
+
attribute?: string | false;
|
|
42
|
+
};
|
|
43
|
+
description: import("../../index.js").PropConfig<string>;
|
|
44
|
+
timestamp: import("../../index.js").PropConfig<string>;
|
|
45
|
+
icon: import("../../index.js").PropConfig<string>;
|
|
46
|
+
size: {
|
|
47
|
+
reflect: true;
|
|
48
|
+
type: import("../../index.js").PropType<"sm" | "md" | "lg">;
|
|
49
|
+
default: "sm" | "md" | "lg";
|
|
50
|
+
attribute?: string | false;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
constructor();
|
|
54
|
+
protected connected(): void;
|
|
55
|
+
protected disconnected(): void;
|
|
56
|
+
/** Reveal/collapse the detail region (used by ui-status-stream's update({detail})); no-op if no detail. */
|
|
57
|
+
toggleDetail(open?: boolean): void;
|
|
58
|
+
/**
|
|
59
|
+
* ADR-0146 F5 (the ADR-0143 2026-07-18 amendment — Kim's narrow, additive exception) — LAZILY ensure a
|
|
60
|
+
* `[data-role="nested"]` slot exists on an ALREADY-CONNECTED item, for ui-status-stream's GROUPED entries.
|
|
61
|
+
* Returns the nested host, composing it into the SAME shared `ui-disclosure` `#ensureAnatomy()` uses at
|
|
62
|
+
* connect (ADR-0143 F1/F2) — never a second nesting mechanism (the family-coherence law the amendment
|
|
63
|
+
* preserves). The collapsed-summary preview + its `MutationObserver` (ADR-0143 F3) are armed here EXACTLY as
|
|
64
|
+
* `connected()` arms them for an authored nested slot, so the group's collapse + preview work with ZERO
|
|
65
|
+
* bespoke nesting code. This is the ONLY new public surface the amendment adds; it is a dead code path for
|
|
66
|
+
* the durable authored-markup host (which composes `nested` eagerly at connect) — a live host is its sole
|
|
67
|
+
* caller. `factory` mints the host (ui-status-stream passes a fresh `<ui-timeline>`) so THIS file stays
|
|
68
|
+
* import-free of `ui-timeline` (the cycle guard, file header). Idempotent: a second call returns the
|
|
69
|
+
* existing slot untouched. Must run while connected — it registers a scope-owned effect (`this.effect`
|
|
70
|
+
* throws outside the connected lifetime); ui-status-stream only calls it on an item already appended live.
|
|
71
|
+
*/
|
|
72
|
+
ensureNestedSlot(factory: () => HTMLElement): HTMLElement;
|
|
73
|
+
/** Mark/unmark this item TRUNCATED — ui-status-stream's completion invariant (SPEC-R11): a distinct,
|
|
74
|
+
* non-color-only interrupted affordance via a real custom state (`:state(truncated)` in CSS), never a
|
|
75
|
+
* silent forever-spinner. `internals.states` is optional-chained (absent in jsdom, the fleet convention —
|
|
76
|
+
* button.ts/checkbox.ts/text-field.ts). Imperative/CSS-state, not a `static props` field (LLD §7/§8). */
|
|
77
|
+
markTruncated(truncated: boolean): void;
|
|
78
|
+
}
|
|
79
|
+
export {};
|