@adia-ai/web-components 0.6.21 → 0.6.22
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/CHANGELOG.md +58 -0
- package/components/accordion/accordion-item.a2ui.json +20 -3
- package/components/accordion/accordion-item.yaml +24 -0
- package/components/accordion/accordion.a2ui.json +1 -1
- package/components/accordion/accordion.d.ts +8 -1
- package/components/accordion/accordion.yaml +15 -2
- package/components/action-list/action-item.a2ui.json +19 -3
- package/components/action-list/action-item.yaml +24 -0
- package/components/action-list/action-list.a2ui.json +12 -2
- package/components/action-list/action-list.yaml +13 -3
- package/components/agent-artifact/agent-artifact.a2ui.json +9 -2
- package/components/agent-artifact/agent-artifact.d.ts +1 -1
- package/components/agent-artifact/agent-artifact.yaml +17 -3
- package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +9 -2
- package/components/agent-feedback-bar/agent-feedback-bar.d.ts +8 -1
- package/components/agent-feedback-bar/agent-feedback-bar.yaml +19 -3
- package/components/agent-questions/agent-questions.a2ui.json +8 -2
- package/components/agent-questions/agent-questions.d.ts +8 -1
- package/components/agent-questions/agent-questions.yaml +19 -3
- package/components/agent-reasoning/agent-reasoning.yaml +9 -1
- package/components/agent-suggestions/agent-suggestions.a2ui.json +9 -2
- package/components/agent-suggestions/agent-suggestions.d.ts +7 -1
- package/components/agent-suggestions/agent-suggestions.yaml +18 -3
- package/components/agent-trace/agent-trace.a2ui.json +9 -2
- package/components/agent-trace/agent-trace.d.ts +1 -1
- package/components/agent-trace/agent-trace.yaml +16 -3
- package/components/alert/alert.a2ui.json +1 -1
- package/components/alert/alert.css +8 -0
- package/components/alert/alert.d.ts +9 -1
- package/components/alert/alert.yaml +16 -2
- package/components/aside/aside.a2ui.json +7 -1
- package/components/aside/aside.yaml +33 -2
- package/components/avatar/avatar-group.a2ui.json +20 -3
- package/components/avatar/avatar-group.yaml +24 -0
- package/components/avatar/avatar.a2ui.json +1 -1
- package/components/avatar/avatar.d.ts +7 -1
- package/components/avatar/avatar.yaml +14 -2
- package/components/badge/badge.a2ui.json +1 -1
- package/components/badge/badge.d.ts +7 -1
- package/components/badge/badge.yaml +14 -2
- package/components/block/block.a2ui.json +9 -4
- package/components/block/block.d.ts +9 -3
- package/components/block/block.yaml +25 -5
- package/components/block/class.js +23 -0
- package/components/breadcrumb/breadcrumb.a2ui.json +5 -1
- package/components/breadcrumb/breadcrumb.yaml +33 -2
- package/components/button/button.a2ui.json +22 -2
- package/components/button/button.yaml +21 -3
- package/components/calendar-picker/calendar-picker.a2ui.json +1 -1
- package/components/calendar-picker/calendar-picker.yaml +13 -2
- package/components/canvas/canvas.a2ui.json +6 -2
- package/components/canvas/canvas.yaml +20 -3
- package/components/card/card.css +23 -2
- package/components/card/card.yaml +12 -0
- package/components/chart/chart.css +4 -2
- package/components/chart/chart.yaml +9 -1
- package/components/chart-legend/chart-legend.yaml +7 -1
- package/components/chat-thread/chat-thread.a2ui.json +6 -2
- package/components/chat-thread/chat-thread.d.ts +8 -1
- package/components/chat-thread/chat-thread.yaml +21 -3
- package/components/check/check.a2ui.json +13 -3
- package/components/check/check.yaml +18 -3
- package/components/code/code.a2ui.json +1 -1
- package/components/code/code.yaml +13 -2
- package/components/col/class.js +39 -0
- package/components/col/col.a2ui.json +12 -5
- package/components/col/col.d.ts +12 -4
- package/components/col/col.yaml +27 -7
- package/components/color-input/color-input.yaml +27 -1
- package/components/color-picker/color-picker.a2ui.json +8 -2
- package/components/color-picker/color-picker.yaml +15 -3
- package/components/command/command.a2ui.json +7 -2
- package/components/command/command.d.ts +9 -1
- package/components/command/command.yaml +39 -3
- package/components/demo-toggle/demo-toggle.yaml +7 -1
- package/components/description-list/description-list.a2ui.json +5 -1
- package/components/description-list/description-list.yaml +11 -2
- package/components/divider/divider.a2ui.json +1 -1
- package/components/divider/divider.d.ts +8 -1
- package/components/divider/divider.yaml +15 -2
- package/components/drawer/drawer.yaml +32 -1
- package/components/embed/embed.a2ui.json +1 -1
- package/components/embed/embed.d.ts +8 -1
- package/components/embed/embed.yaml +17 -2
- package/components/empty-state/empty-state.a2ui.json +19 -2
- package/components/empty-state/empty-state.css +14 -0
- package/components/empty-state/empty-state.d.ts +3 -1
- package/components/empty-state/empty-state.yaml +50 -3
- package/components/feed/feed-item.a2ui.json +21 -3
- package/components/feed/feed-item.yaml +25 -0
- package/components/feed/feed.a2ui.json +23 -3
- package/components/feed/feed.yaml +26 -0
- package/components/fields/fields.yaml +7 -1
- package/components/footer/footer.a2ui.json +7 -1
- package/components/footer/footer.yaml +27 -2
- package/components/grid/class.js +57 -0
- package/components/grid/grid.a2ui.json +3 -3
- package/components/grid/grid.d.ts +3 -3
- package/components/grid/grid.yaml +22 -8
- package/components/header/header.a2ui.json +8 -1
- package/components/header/header.yaml +30 -2
- package/components/heatmap/heatmap.yaml +7 -1
- package/components/icon/icon.a2ui.json +9 -2
- package/components/icon/icon.d.ts +1 -1
- package/components/icon/icon.yaml +32 -3
- package/components/image/image.yaml +7 -1
- package/components/input/input.yaml +29 -1
- package/components/inspector/inspector.a2ui.json +7 -2
- package/components/inspector/inspector.d.ts +9 -1
- package/components/inspector/inspector.yaml +23 -3
- package/components/kbd/kbd.a2ui.json +1 -1
- package/components/kbd/kbd.d.ts +1 -1
- package/components/kbd/kbd.yaml +11 -2
- package/components/list/list-item.a2ui.json +21 -3
- package/components/list/list-item.yaml +25 -0
- package/components/list/list.a2ui.json +7 -2
- package/components/list/list.d.ts +9 -1
- package/components/list/list.yaml +21 -3
- package/components/menu/menu-divider.a2ui.json +17 -3
- package/components/menu/menu-divider.yaml +35 -0
- package/components/menu/menu-item.a2ui.json +19 -3
- package/components/menu/menu-item.yaml +42 -0
- package/components/menu/menu.a2ui.json +7 -1
- package/components/menu/menu.yaml +33 -2
- package/components/modal/modal.a2ui.json +7 -2
- package/components/modal/modal.d.ts +10 -1
- package/components/modal/modal.yaml +48 -3
- package/components/nav/nav.a2ui.json +16 -2
- package/components/nav/nav.yaml +40 -3
- package/components/nav-group/nav-group.a2ui.json +12 -2
- package/components/nav-group/nav-group.yaml +37 -3
- package/components/nav-item/nav-item.a2ui.json +13 -2
- package/components/nav-item/nav-item.yaml +40 -3
- package/components/noodles/noodles.a2ui.json +12 -2
- package/components/noodles/noodles.yaml +14 -3
- package/components/option-card/option-card.yaml +27 -1
- package/components/otp-input/otp-input.yaml +24 -1
- package/components/page/page.a2ui.json +7 -1
- package/components/page/page.yaml +9 -2
- package/components/pagination/pagination.a2ui.json +1 -1
- package/components/pagination/pagination.d.ts +1 -1
- package/components/pagination/pagination.yaml +13 -2
- package/components/pane/pane.a2ui.json +1 -1
- package/components/pane/pane.d.ts +7 -1
- package/components/pane/pane.yaml +33 -2
- package/components/pipeline-status/pipeline-status.a2ui.json +6 -2
- package/components/pipeline-status/pipeline-status.d.ts +1 -1
- package/components/pipeline-status/pipeline-status.yaml +18 -3
- package/components/popover/popover.yaml +30 -1
- package/components/progress/progress.a2ui.json +1 -1
- package/components/progress/progress.d.ts +1 -1
- package/components/progress/progress.yaml +13 -2
- package/components/progress-row/progress-row.a2ui.json +12 -2
- package/components/progress-row/progress-row.yaml +13 -3
- package/components/radio/radio.a2ui.json +1 -1
- package/components/radio/radio.yaml +9 -1
- package/components/range/range.yaml +7 -1
- package/components/rating/rating.a2ui.json +4 -1
- package/components/rating/rating.yaml +10 -2
- package/components/richtext/richtext.a2ui.json +6 -2
- package/components/richtext/richtext.d.ts +9 -1
- package/components/richtext/richtext.yaml +20 -3
- package/components/row/class.js +34 -0
- package/components/row/row.a2ui.json +11 -5
- package/components/row/row.d.ts +11 -4
- package/components/row/row.yaml +25 -7
- package/components/search/search.a2ui.json +5 -1
- package/components/search/search.yaml +11 -2
- package/components/section/section.a2ui.json +7 -1
- package/components/section/section.yaml +36 -2
- package/components/segment/segment.a2ui.json +8 -2
- package/components/segment/segment.d.ts +7 -1
- package/components/segment/segment.yaml +16 -3
- package/components/segmented/segmented.a2ui.json +6 -1
- package/components/segmented/segmented.css +5 -0
- package/components/segmented/segmented.yaml +12 -2
- package/components/select/select.a2ui.json +1 -1
- package/components/select/select.yaml +34 -2
- package/components/skeleton/skeleton.a2ui.json +7 -2
- package/components/skeleton/skeleton.d.ts +1 -1
- package/components/skeleton/skeleton.yaml +17 -3
- package/components/slider/slider.yaml +7 -1
- package/components/stack/stack.a2ui.json +14 -3
- package/components/stack/stack.d.ts +9 -1
- package/components/stack/stack.yaml +22 -4
- package/components/stat/stat.a2ui.json +6 -2
- package/components/stat/stat.css +5 -2
- package/components/stat/stat.d.ts +1 -1
- package/components/stat/stat.yaml +16 -3
- package/components/step-progress/step-progress.yaml +7 -1
- package/components/stepper/stepper-item.a2ui.json +20 -3
- package/components/stepper/stepper-item.yaml +24 -0
- package/components/stepper/stepper.a2ui.json +1 -1
- package/components/stepper/stepper.d.ts +1 -1
- package/components/stepper/stepper.yaml +13 -2
- package/components/stream/stream.a2ui.json +12 -2
- package/components/stream/stream.yaml +15 -3
- package/components/swatch/swatch.yaml +7 -1
- package/components/swiper/swiper.yaml +7 -1
- package/components/switch/switch.a2ui.json +6 -2
- package/components/switch/switch.yaml +16 -2
- package/components/table/cell-types.js +23 -10
- package/components/table/class.js +6 -2
- package/components/table/table.css +49 -1
- package/components/table/table.yaml +27 -1
- package/components/table-toolbar/table-toolbar.yaml +27 -1
- package/components/tabs/tab.a2ui.json +17 -3
- package/components/tabs/tab.yaml +39 -0
- package/components/tabs/tabs.a2ui.json +1 -1
- package/components/tabs/tabs.d.ts +1 -1
- package/components/tabs/tabs.yaml +36 -2
- package/components/tag/tag.a2ui.json +6 -2
- package/components/tag/tag.d.ts +9 -1
- package/components/tag/tag.yaml +38 -3
- package/components/text/class.js +13 -0
- package/components/text/text.a2ui.json +9 -2
- package/components/text/text.d.ts +1 -1
- package/components/text/text.yaml +12 -5
- package/components/textarea/textarea.a2ui.json +15 -3
- package/components/textarea/textarea.yaml +41 -4
- package/components/timeline/timeline-item.a2ui.json +20 -3
- package/components/timeline/timeline-item.yaml +24 -0
- package/components/timeline/timeline.a2ui.json +8 -1
- package/components/timeline/timeline.yaml +9 -2
- package/components/toast/toast.a2ui.json +6 -2
- package/components/toast/toast.yaml +19 -3
- package/components/toggle-group/toggle-group.a2ui.json +13 -3
- package/components/toggle-group/toggle-group.d.ts +1 -1
- package/components/toggle-group/toggle-group.yaml +19 -4
- package/components/toggle-group/toggle-option.a2ui.json +18 -3
- package/components/toggle-group/toggle-option.yaml +23 -0
- package/components/toggle-scheme/toggle-scheme.yaml +4 -0
- package/components/toolbar/toolbar-group.a2ui.json +18 -3
- package/components/toolbar/toolbar-group.yaml +23 -0
- package/components/toolbar/toolbar.yaml +7 -1
- package/components/tooltip/tooltip.yaml +24 -1
- package/components/tree/tree-item.a2ui.json +19 -3
- package/components/tree/tree-item.yaml +42 -0
- package/components/tree/tree.a2ui.json +6 -1
- package/components/tree/tree.yaml +31 -2
- package/components/upload/upload.yaml +7 -1
- package/core/index.js +1 -0
- package/core/responsive.d.ts +29 -0
- package/core/responsive.js +120 -0
- package/core/responsive.test.js +121 -0
- package/package.json +1 -1
- package/styles/tokens.css +6 -6
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
:where(:scope) {
|
|
3
3
|
/* ── Tokens ── */
|
|
4
4
|
--table-font-size: var(--a-ui-size);
|
|
5
|
-
--table-heading-size: var(--a-ui-
|
|
5
|
+
--table-heading-size: var(--a-ui-xs);
|
|
6
6
|
--table-heading-weight: var(--a-weight-medium);
|
|
7
7
|
--table-heading-tracking: 0.06em;
|
|
8
8
|
--table-heading-fg: var(--a-fg-muted);
|
|
@@ -165,6 +165,19 @@
|
|
|
165
165
|
letter-spacing: var(--table-heading-tracking);
|
|
166
166
|
white-space: nowrap;
|
|
167
167
|
position: relative;
|
|
168
|
+
display: flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Label span truncates; sort icon + filter button remain visible.
|
|
173
|
+
Cannot put overflow:hidden on the columnheader itself — it would
|
|
174
|
+
clip the position:absolute filter dropdown. */
|
|
175
|
+
[role="columnheader"] > span {
|
|
176
|
+
flex: 1;
|
|
177
|
+
min-width: 0;
|
|
178
|
+
overflow: hidden;
|
|
179
|
+
text-overflow: ellipsis;
|
|
180
|
+
white-space: nowrap;
|
|
168
181
|
}
|
|
169
182
|
|
|
170
183
|
/* ═══════ Sortable headers ═══════ */
|
|
@@ -226,6 +239,31 @@
|
|
|
226
239
|
text-overflow: ellipsis;
|
|
227
240
|
}
|
|
228
241
|
|
|
242
|
+
/* text-overflow on a flex container doesn't reach text nodes (anonymous
|
|
243
|
+
flex items). Built-in cell types now wrap text in <span>; link type
|
|
244
|
+
creates <a>; avatar/progress composite types use row-ui > span. */
|
|
245
|
+
[data-body] [role="gridcell"] > span,
|
|
246
|
+
[data-body] [role="gridcell"] > a {
|
|
247
|
+
min-width: 0;
|
|
248
|
+
flex: 1;
|
|
249
|
+
overflow: hidden;
|
|
250
|
+
text-overflow: ellipsis;
|
|
251
|
+
white-space: nowrap;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
[data-body] [role="gridcell"] > row-ui {
|
|
255
|
+
min-width: 0;
|
|
256
|
+
overflow: hidden;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
[data-body] [role="gridcell"] > row-ui > span {
|
|
260
|
+
flex: 1;
|
|
261
|
+
min-width: 0;
|
|
262
|
+
overflow: hidden;
|
|
263
|
+
text-overflow: ellipsis;
|
|
264
|
+
white-space: nowrap;
|
|
265
|
+
}
|
|
266
|
+
|
|
229
267
|
/* Wrap opt-in: per-table (all body cells) or per-cell (one column).
|
|
230
268
|
Restores the legacy `overflow-wrap: anywhere` behavior so wrapped
|
|
231
269
|
content can break inside long unbroken tokens (URLs, IDs). Row
|
|
@@ -238,6 +276,16 @@
|
|
|
238
276
|
overflow-wrap: anywhere;
|
|
239
277
|
}
|
|
240
278
|
|
|
279
|
+
:scope[wrap] [data-body] [role="gridcell"] > span,
|
|
280
|
+
:scope[wrap] [data-body] [role="gridcell"] > a,
|
|
281
|
+
[data-body] [role="gridcell"][data-wrap] > span,
|
|
282
|
+
[data-body] [role="gridcell"][data-wrap] > a {
|
|
283
|
+
white-space: normal;
|
|
284
|
+
overflow: visible;
|
|
285
|
+
text-overflow: clip;
|
|
286
|
+
overflow-wrap: anywhere;
|
|
287
|
+
}
|
|
288
|
+
|
|
241
289
|
[data-align="right"] {
|
|
242
290
|
text-align: right;
|
|
243
291
|
justify-content: flex-end;
|
|
@@ -229,7 +229,33 @@ requiredIcons:
|
|
|
229
229
|
- funnel-simple
|
|
230
230
|
- funnel-simple-fill
|
|
231
231
|
a2ui:
|
|
232
|
-
rules:
|
|
232
|
+
rules:
|
|
233
|
+
- >-
|
|
234
|
+
Canonical composition: wrap <table-ui> in <card-ui><section bleed>
|
|
235
|
+
for edge-to-edge tables. The [bleed] removes section padding so
|
|
236
|
+
columns span the full card width (see apps/saas/members,
|
|
237
|
+
billing, admin-dashboard).
|
|
238
|
+
- >-
|
|
239
|
+
Pair with <table-toolbar-ui for="<table-id>"> for any table that
|
|
240
|
+
needs search / filter / sort / columns visibility. Do NOT
|
|
241
|
+
re-implement those affordances in the card header — the toolbar
|
|
242
|
+
auto-wires search/filter/sort/columns changes into the bound
|
|
243
|
+
table.
|
|
244
|
+
- >-
|
|
245
|
+
Cells truncate single-line by default (v0.6.21 §403
|
|
246
|
+
truncate-default). Opt out per-table with [wrap] for whole-table
|
|
247
|
+
multiline, or per-cell with [data-wrap] on a single column /
|
|
248
|
+
cell.
|
|
249
|
+
- >-
|
|
250
|
+
Use [raw] in production app consumers — it disables the demo
|
|
251
|
+
seed data so the table renders only consumer-provided rows /
|
|
252
|
+
columns / data props.
|
|
253
|
+
- >-
|
|
254
|
+
Listen for the `sort` event with detail.key + detail.dir (NOT
|
|
255
|
+
.column / .direction). `cell-click` detail carries {key, row,
|
|
256
|
+
value, dataIndex}. Per ADR-0027, table-ui composes check-ui,
|
|
257
|
+
icon-ui, progress-ui, pagination-ui, skeleton-ui, badge-ui —
|
|
258
|
+
consumer pages must explicitly import the ones they use.
|
|
233
259
|
anti_patterns: []
|
|
234
260
|
examples:
|
|
235
261
|
- name: api-key-table
|
|
@@ -118,7 +118,33 @@ requiredIcons:
|
|
|
118
118
|
- arrow-down
|
|
119
119
|
- caret-up-down
|
|
120
120
|
a2ui:
|
|
121
|
-
rules:
|
|
121
|
+
rules:
|
|
122
|
+
- >-
|
|
123
|
+
Pair <table-toolbar-ui> with <table-ui> via [for="<table-id>"]
|
|
124
|
+
(or rely on first-sibling fallback when both are inside the
|
|
125
|
+
same parent). One toolbar per table. Do NOT also use
|
|
126
|
+
<card-ui>'s <header> on the same card — that produces a doubled
|
|
127
|
+
chrome row.
|
|
128
|
+
- >-
|
|
129
|
+
All four affordances (search, filter, sort, columns) default ON.
|
|
130
|
+
Opt out individually via [no-search] / [no-filter] / [no-sort]
|
|
131
|
+
/ [no-columns]. The previous [searchable] / [filterable]
|
|
132
|
+
attributes are deprecated — do NOT emit them.
|
|
133
|
+
- >-
|
|
134
|
+
Place the toolbar ABOVE the <card-ui> containing the table-ui,
|
|
135
|
+
or use [variant="card"] when standing alone outside a card-ui
|
|
136
|
+
parent (the variant wraps the toolbar in card-style chrome).
|
|
137
|
+
- >-
|
|
138
|
+
Use slot="action" (or [slot="actions"]) for trailing primary
|
|
139
|
+
buttons (Invite, Export, +New). Use [text] / [count] props for
|
|
140
|
+
the left cluster, or slotted [slot="title"] / [slot="count"]
|
|
141
|
+
when content is markup (a <span> + <badge-ui>, etc.).
|
|
142
|
+
- >-
|
|
143
|
+
Listen for toolbar events (`search`, `filter-change`,
|
|
144
|
+
`sort-change`, `columns-change`) only to mirror state to URL /
|
|
145
|
+
persistence / analytics. The toolbar already wires its changes
|
|
146
|
+
into the bound table — you don't need to manually update the
|
|
147
|
+
table.
|
|
122
148
|
anti_patterns: []
|
|
123
149
|
examples:
|
|
124
150
|
- name: members-toolbar
|
|
@@ -44,12 +44,26 @@
|
|
|
44
44
|
"composes": [],
|
|
45
45
|
"events": {},
|
|
46
46
|
"examples": [],
|
|
47
|
-
"keywords": [
|
|
47
|
+
"keywords": [
|
|
48
|
+
"tab",
|
|
49
|
+
"tab-panel",
|
|
50
|
+
"view-switcher-child",
|
|
51
|
+
"tabs-child"
|
|
52
|
+
],
|
|
48
53
|
"name": "UITab",
|
|
49
|
-
"related": [
|
|
54
|
+
"related": [
|
|
55
|
+
"Tabs",
|
|
56
|
+
"Nav",
|
|
57
|
+
"Segmented"
|
|
58
|
+
],
|
|
50
59
|
"slots": {},
|
|
51
60
|
"states": [],
|
|
52
|
-
"synonyms": {
|
|
61
|
+
"synonyms": {
|
|
62
|
+
"tab": [
|
|
63
|
+
"view-tab",
|
|
64
|
+
"switcher-tab"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
53
67
|
"tag": "tab-ui",
|
|
54
68
|
"tokens": {},
|
|
55
69
|
"traits": [],
|
package/components/tabs/tab.yaml
CHANGED
|
@@ -31,3 +31,42 @@ props:
|
|
|
31
31
|
description: Whether the tab is selectable.
|
|
32
32
|
type: boolean
|
|
33
33
|
default: false
|
|
34
|
+
|
|
35
|
+
a2ui:
|
|
36
|
+
rules:
|
|
37
|
+
- >-
|
|
38
|
+
<tab-ui> only renders inside <tabs-ui>. Never use it standalone.
|
|
39
|
+
The parent reads each tab's [text] + [icon] + [value] to render
|
|
40
|
+
the button strip; the tab's default slot is the panel content
|
|
41
|
+
that the parent auto-hides when inactive.
|
|
42
|
+
- >-
|
|
43
|
+
[value] is required and must be unique among siblings — the
|
|
44
|
+
parent <tabs-ui> matches its own [value] against each
|
|
45
|
+
<tab-ui>[value] to decide which is active. [text] is the visible
|
|
46
|
+
button label; optional [icon] is a Phosphor icon name shown
|
|
47
|
+
leading the label.
|
|
48
|
+
- >-
|
|
49
|
+
Use the default slot for panel content. Inactive <tab-ui>
|
|
50
|
+
children are auto-hidden by the parent's [hidden] toggling; do
|
|
51
|
+
NOT set [hidden] yourself unless you want to remove the button
|
|
52
|
+
from the strip entirely (i.e. a temporarily-disabled tab whose
|
|
53
|
+
strip button shouldn't render at all).
|
|
54
|
+
- >-
|
|
55
|
+
Use [disabled] to keep a tab visible in the strip but
|
|
56
|
+
non-selectable. Do not pair <tab-ui> with <button-ui> wrappers —
|
|
57
|
+
the strip button is parent-rendered. Do not nest <tab-ui> inside
|
|
58
|
+
another <tab-ui>.
|
|
59
|
+
|
|
60
|
+
keywords:
|
|
61
|
+
- tab
|
|
62
|
+
- tab-panel
|
|
63
|
+
- view-switcher-child
|
|
64
|
+
- tabs-child
|
|
65
|
+
|
|
66
|
+
related:
|
|
67
|
+
- Tabs
|
|
68
|
+
- Nav
|
|
69
|
+
- Segmented
|
|
70
|
+
|
|
71
|
+
synonyms:
|
|
72
|
+
tab: [view-tab, switcher-tab]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://adiaui.dev/a2ui/v0_9/components/Tabs.json",
|
|
4
4
|
"title": "Tabs",
|
|
5
|
-
"description": "Tabbed panel switcher. Renders button strip from child tab-ui elements.",
|
|
5
|
+
"description": "Tabbed panel switcher. Renders a button strip from child <tab-ui> elements and toggles their associated panel via the active attribute. Use for switching between equivalent peer views in one region; for navigation between routes use <nav-ui> instead.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"allOf": [
|
|
8
8
|
{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `<tabs-ui>` — Tabbed panel switcher. Renders button strip from child tab-ui elements.
|
|
2
|
+
* `<tabs-ui>` — Tabbed panel switcher. Renders a button strip from child <tab-ui> elements and toggles their associated panel via the active attribute. Use for switching between equivalent peer views in one region; for navigation between routes use <nav-ui> instead.
|
|
3
3
|
*
|
|
4
4
|
* @see https://ui-kit.exe.xyz/site/components/tabs
|
|
5
5
|
*
|
|
@@ -6,7 +6,11 @@ tag: tabs-ui
|
|
|
6
6
|
component: Tabs
|
|
7
7
|
category: container
|
|
8
8
|
version: 1
|
|
9
|
-
description:
|
|
9
|
+
description: >-
|
|
10
|
+
Tabbed panel switcher. Renders a button strip from child <tab-ui>
|
|
11
|
+
elements and toggles their associated panel via the active attribute.
|
|
12
|
+
Use for switching between equivalent peer views in one region; for
|
|
13
|
+
navigation between routes use <nav-ui> instead.
|
|
10
14
|
# Per ADR-0027 — primitives that programmatically create other primitives
|
|
11
15
|
# do NOT auto-import them. Consumer (or demo shell) must explicitly import.
|
|
12
16
|
composes:
|
|
@@ -76,7 +80,37 @@ tokens:
|
|
|
76
80
|
--tabs-radius:
|
|
77
81
|
description: Override base border radius
|
|
78
82
|
a2ui:
|
|
79
|
-
rules:
|
|
83
|
+
rules:
|
|
84
|
+
- >-
|
|
85
|
+
Decision rule: use <tabs-ui> when switching VIEWS within the same
|
|
86
|
+
logical page (no route change, no URL change). For navigating
|
|
87
|
+
AWAY (different page / route / anchor), use <nav-ui> instead. For
|
|
88
|
+
a form-control segmented selector that returns a value, use
|
|
89
|
+
<segmented-ui>.
|
|
90
|
+
- >-
|
|
91
|
+
Children of <tabs-ui> MUST be <tab-ui> elements. The button strip
|
|
92
|
+
is rendered from each child's [text] + optional [icon]; the
|
|
93
|
+
parent auto-toggles [hidden] on inactive <tab-ui> children. Do
|
|
94
|
+
not place arbitrary markup directly inside <tabs-ui> — wrap it
|
|
95
|
+
in <tab-ui>.
|
|
96
|
+
- >-
|
|
97
|
+
Canonical placements: inside <card-ui>'s <header> for in-card
|
|
98
|
+
section switching; inside <editor-canvas-toolbar> for editor
|
|
99
|
+
sub-views (see the editor sub-views recipe in patterns-recipes.md);
|
|
100
|
+
or standalone as an in-page switcher. When standalone, wire
|
|
101
|
+
sibling <div data-view="…"> panels via the `change` event
|
|
102
|
+
(detail.value); for tabs whose content lives inside the <tab-ui>
|
|
103
|
+
child, the auto-hide handles visibility.
|
|
104
|
+
- >-
|
|
105
|
+
Set [value] to the initially active tab. If omitted, the first
|
|
106
|
+
non-disabled <tab-ui> becomes active on connect. Set
|
|
107
|
+
[orientation="vertical"] for left-rail tab strips.
|
|
108
|
+
- >-
|
|
109
|
+
Variant caveat: only [variant="bordered"] is implemented (adds a
|
|
110
|
+
subtle divider). [variant="underline"] is widely used in source
|
|
111
|
+
but is equivalent to default (no-op). [variant="pills"] and
|
|
112
|
+
[variant="segmented"] are declared in the enum but NOT styled —
|
|
113
|
+
do NOT emit them; for a form-style selector use <segmented-ui>.
|
|
80
114
|
anti_patterns: []
|
|
81
115
|
examples:
|
|
82
116
|
- name: tabs-panels
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://adiaui.dev/a2ui/v0_9/components/Tag.json",
|
|
4
4
|
"title": "Tag",
|
|
5
|
-
"description": "Inline
|
|
5
|
+
"description": "Inline INTERACTIVE chip / pill with optional dismiss affordance.\nText rendered via CSS `attr(text)`. Use for filter chips\n(removable=true + `remove` event), autocomplete tokens, and\nuser-managed labels. Distinct from <badge-ui>, which is READ-ONLY\nand includes the [status] shorthand for Beta / New / Deprecated\nmarkers — badge-ui has no remove event. For navigation grouping\nuse <nav-group-ui>; for inline command actions use\n<action-list-ui>.\n",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"allOf": [
|
|
8
8
|
{
|
|
@@ -97,7 +97,11 @@
|
|
|
97
97
|
"pill"
|
|
98
98
|
],
|
|
99
99
|
"name": "UITag",
|
|
100
|
-
"related": [
|
|
100
|
+
"related": [
|
|
101
|
+
"Badge",
|
|
102
|
+
"NavGroup",
|
|
103
|
+
"ActionList"
|
|
104
|
+
],
|
|
101
105
|
"slots": {},
|
|
102
106
|
"states": [
|
|
103
107
|
{
|
package/components/tag/tag.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `<tag-ui>` — Inline
|
|
2
|
+
* `<tag-ui>` — Inline INTERACTIVE chip / pill with optional dismiss affordance.
|
|
3
|
+
Text rendered via CSS `attr(text)`. Use for filter chips
|
|
4
|
+
(removable=true + `remove` event), autocomplete tokens, and
|
|
5
|
+
user-managed labels. Distinct from <badge-ui>, which is READ-ONLY
|
|
6
|
+
and includes the [status] shorthand for Beta / New / Deprecated
|
|
7
|
+
markers — badge-ui has no remove event. For navigation grouping
|
|
8
|
+
use <nav-group-ui>; for inline command actions use
|
|
9
|
+
<action-list-ui>.
|
|
10
|
+
|
|
3
11
|
*
|
|
4
12
|
* @see https://ui-kit.exe.xyz/site/components/tag
|
|
5
13
|
*
|
package/components/tag/tag.yaml
CHANGED
|
@@ -6,7 +6,15 @@ tag: tag-ui
|
|
|
6
6
|
component: Tag
|
|
7
7
|
category: display
|
|
8
8
|
version: 1
|
|
9
|
-
description:
|
|
9
|
+
description: |
|
|
10
|
+
Inline INTERACTIVE chip / pill with optional dismiss affordance.
|
|
11
|
+
Text rendered via CSS `attr(text)`. Use for filter chips
|
|
12
|
+
(removable=true + `remove` event), autocomplete tokens, and
|
|
13
|
+
user-managed labels. Distinct from <badge-ui>, which is READ-ONLY
|
|
14
|
+
and includes the [status] shorthand for Beta / New / Deprecated
|
|
15
|
+
markers — badge-ui has no remove event. For navigation grouping
|
|
16
|
+
use <nav-group-ui>; for inline command actions use
|
|
17
|
+
<action-list-ui>.
|
|
10
18
|
props:
|
|
11
19
|
disabled:
|
|
12
20
|
description: Disables interaction and dims the tag.
|
|
@@ -64,7 +72,31 @@ tokens: {}
|
|
|
64
72
|
requiredIcons:
|
|
65
73
|
- x
|
|
66
74
|
a2ui:
|
|
67
|
-
rules:
|
|
75
|
+
rules:
|
|
76
|
+
- >-
|
|
77
|
+
Use <tag-ui> for INTERACTIVE / DISMISSABLE labels — filter chips,
|
|
78
|
+
autocomplete tokens, user-managed labels. Tag-ui fires a `remove`
|
|
79
|
+
event when [removable] is set. For READ-ONLY status flags
|
|
80
|
+
(counts, Beta / New / Deprecated markers, notification dots) use
|
|
81
|
+
<badge-ui> instead — badge has no remove event and includes the
|
|
82
|
+
[status] shorthand.
|
|
83
|
+
- >-
|
|
84
|
+
Set [removable] and listen for the `remove` event (detail:
|
|
85
|
+
{text, value}) when the tag represents a user-applied filter or
|
|
86
|
+
selection that can be cleared.
|
|
87
|
+
- >-
|
|
88
|
+
[variant] maps to semantic state of the underlying record:
|
|
89
|
+
success = active / approved, warning = pending,
|
|
90
|
+
danger = blocked / error, info = neutral-emphasis. Default
|
|
91
|
+
(no variant) for unlabeled categories.
|
|
92
|
+
- >-
|
|
93
|
+
Use [size="sm"] for inline-with-text contexts (doc page headers,
|
|
94
|
+
table cells, badges next to titles); [size="md"] (default) for
|
|
95
|
+
filter-bar chips and standalone tag rows.
|
|
96
|
+
- >-
|
|
97
|
+
Group multiple tags inside a <row-ui gap="2"> — never stack them
|
|
98
|
+
vertically; vertical lists of dismissable items are an
|
|
99
|
+
<action-list-ui> use case, not <tag-ui>.
|
|
68
100
|
anti_patterns: []
|
|
69
101
|
examples:
|
|
70
102
|
- name: basic-tag
|
|
@@ -131,4 +163,7 @@ synonyms:
|
|
|
131
163
|
pill:
|
|
132
164
|
- badge
|
|
133
165
|
- tag
|
|
134
|
-
related:
|
|
166
|
+
related:
|
|
167
|
+
- Badge
|
|
168
|
+
- NavGroup
|
|
169
|
+
- ActionList
|
package/components/text/class.js
CHANGED
|
@@ -25,6 +25,10 @@
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
27
|
import { UIElement } from '../../core/element.js';
|
|
28
|
+
import { parseResponsive, breakpoint } from '../../core/responsive.js';
|
|
29
|
+
|
|
30
|
+
const _SIZE = { sm: 'var(--a-body-sm)', md: 'var(--a-body-md)', lg: 'var(--a-body-lg)' };
|
|
31
|
+
function _sizeToCss(v) { return _SIZE[v] ?? v; }
|
|
28
32
|
|
|
29
33
|
export class UIText extends UIElement {
|
|
30
34
|
static properties = {
|
|
@@ -52,5 +56,14 @@ export class UIText extends UIElement {
|
|
|
52
56
|
} else {
|
|
53
57
|
this.style.removeProperty('--_text-lines');
|
|
54
58
|
}
|
|
59
|
+
|
|
60
|
+
// Responsive size — e.g. size="sm sm@md lg@lg"
|
|
61
|
+
const size = this.size;
|
|
62
|
+
if (size?.includes('@')) {
|
|
63
|
+
const bp = breakpoint.value; // subscribe only when needed
|
|
64
|
+
this.style.setProperty('--text-size', _sizeToCss(parseResponsive(size, bp)));
|
|
65
|
+
} else {
|
|
66
|
+
this.style.removeProperty('--text-size');
|
|
67
|
+
}
|
|
55
68
|
}
|
|
56
69
|
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"default": 0
|
|
37
37
|
},
|
|
38
38
|
"size": {
|
|
39
|
-
"description": "Override the variant's font-size on the body ladder
|
|
39
|
+
"description": "Override the variant's font-size on the body ladder (sm/md/lg → --a-body-sm/md/lg). Accepts `@bp` notation: size=\"sm md@lg\" = sm below lg, md from lg up. Added v0.6.18 (FB-10).",
|
|
40
40
|
"type": "string",
|
|
41
41
|
"enum": [
|
|
42
42
|
"sm",
|
|
@@ -154,7 +154,14 @@
|
|
|
154
154
|
"name": "idle"
|
|
155
155
|
}
|
|
156
156
|
],
|
|
157
|
-
"synonyms": {
|
|
157
|
+
"synonyms": {
|
|
158
|
+
"text": [
|
|
159
|
+
"typography",
|
|
160
|
+
"prose",
|
|
161
|
+
"label-text",
|
|
162
|
+
"paragraph"
|
|
163
|
+
]
|
|
164
|
+
},
|
|
158
165
|
"tag": "text-ui",
|
|
159
166
|
"tokens": {},
|
|
160
167
|
"traits": [],
|
|
@@ -43,7 +43,7 @@ export class UIText extends UIElement {
|
|
|
43
43
|
color: 'default' | 'subtle' | 'strong' | 'accent' | 'danger' | 'success' | 'warning';
|
|
44
44
|
/** Multi-line clamp count (0 = no clamp) */
|
|
45
45
|
lines: number;
|
|
46
|
-
/** Override the variant's font-size on the body ladder
|
|
46
|
+
/** Override the variant's font-size on the body ladder (sm/md/lg → --a-body-sm/md/lg). Accepts `@bp` notation: size="sm md@lg" = sm below lg, md from lg up. Added v0.6.18 (FB-10). */
|
|
47
47
|
size: 'sm' | 'md' | 'lg';
|
|
48
48
|
/** When true, applies stronger emphasis (heavier weight + accent color). Styled via :scope[strong] in text.css. Use instead of variant=heading when you want a single emphasized word inline in body copy. */
|
|
49
49
|
strong: boolean;
|
|
@@ -22,9 +22,9 @@ props:
|
|
|
22
22
|
default: 0
|
|
23
23
|
size:
|
|
24
24
|
description: >-
|
|
25
|
-
Override the variant's font-size on the body ladder
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
Override the variant's font-size on the body ladder (sm/md/lg → --a-body-sm/md/lg).
|
|
26
|
+
Accepts `@bp` notation: size="sm md@lg" = sm below lg, md from lg up.
|
|
27
|
+
Added v0.6.18 (FB-10).
|
|
28
28
|
type: string
|
|
29
29
|
enum: ["sm", "md", "lg"]
|
|
30
30
|
default: ""
|
|
@@ -112,7 +112,13 @@ states:
|
|
|
112
112
|
traits: []
|
|
113
113
|
tokens: {}
|
|
114
114
|
a2ui:
|
|
115
|
-
rules:
|
|
115
|
+
rules:
|
|
116
|
+
- rule: 'Use for typographic content with semantic role (heading, body, label, caption). Variant attribute sets the role.'
|
|
117
|
+
reason: 'Token-driven font/size/weight per variant — better than raw <p>/<h*> with overrides.'
|
|
118
|
+
- rule: 'For inline-flow rich content with multiple paragraphs, use <richtext-ui> instead.'
|
|
119
|
+
reason: 'Richtext handles paragraph rhythm + rich formatting.'
|
|
120
|
+
- rule: 'Heading variants (h1, h2, ...) are not auto-tagged — set the role explicitly via variant.'
|
|
121
|
+
reason: 'Visual variant decoupled from DOM tag.'
|
|
116
122
|
anti_patterns: []
|
|
117
123
|
examples:
|
|
118
124
|
- name: chat-interface
|
|
@@ -414,7 +420,8 @@ examples:
|
|
|
414
420
|
]
|
|
415
421
|
keywords:
|
|
416
422
|
- text
|
|
417
|
-
synonyms:
|
|
423
|
+
synonyms:
|
|
424
|
+
text: [typography, prose, label-text, paragraph]
|
|
418
425
|
related:
|
|
419
426
|
- avatar
|
|
420
427
|
- input
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://adiaui.dev/a2ui/v0_9/components/Textarea.json",
|
|
4
4
|
"title": "Textarea",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Multi-line text input primitive — the host IS the contenteditable\nsurface (per ADR-0025, no native <textarea> wrapped underneath).\nForm-bearing via UIFormElement: [name], [value], [required],\n[disabled], [readonly], fires `change` on blur and `input` per\nkeystroke. Enter inserts a newline — does NOT fire `submit` (for\nEnter-to-send composers use <chat-input-ui submit-on-enter> inside\n<chat-composer>). Wrap in <field-ui label=\"…\"> for the canonical\nlabeled stack.\n",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"allOf": [
|
|
8
8
|
{
|
|
@@ -110,7 +110,12 @@
|
|
|
110
110
|
"textarea"
|
|
111
111
|
],
|
|
112
112
|
"name": "UITextarea",
|
|
113
|
-
"related": [
|
|
113
|
+
"related": [
|
|
114
|
+
"Input",
|
|
115
|
+
"Field",
|
|
116
|
+
"ChatInput",
|
|
117
|
+
"Code"
|
|
118
|
+
],
|
|
114
119
|
"slots": {},
|
|
115
120
|
"states": [
|
|
116
121
|
{
|
|
@@ -118,7 +123,14 @@
|
|
|
118
123
|
"name": "idle"
|
|
119
124
|
}
|
|
120
125
|
],
|
|
121
|
-
"synonyms": {
|
|
126
|
+
"synonyms": {
|
|
127
|
+
"textarea": [
|
|
128
|
+
"multiline-input",
|
|
129
|
+
"text-area",
|
|
130
|
+
"comment-input",
|
|
131
|
+
"long-text-input"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
122
134
|
"tag": "textarea-ui",
|
|
123
135
|
"tokens": {},
|
|
124
136
|
"traits": [],
|
|
@@ -6,7 +6,15 @@ tag: textarea-ui
|
|
|
6
6
|
component: Textarea
|
|
7
7
|
category: layout
|
|
8
8
|
version: 1
|
|
9
|
-
description:
|
|
9
|
+
description: |
|
|
10
|
+
Multi-line text input primitive — the host IS the contenteditable
|
|
11
|
+
surface (per ADR-0025, no native <textarea> wrapped underneath).
|
|
12
|
+
Form-bearing via UIFormElement: [name], [value], [required],
|
|
13
|
+
[disabled], [readonly], fires `change` on blur and `input` per
|
|
14
|
+
keystroke. Enter inserts a newline — does NOT fire `submit` (for
|
|
15
|
+
Enter-to-send composers use <chat-input-ui submit-on-enter> inside
|
|
16
|
+
<chat-composer>). Wrap in <field-ui label="…"> for the canonical
|
|
17
|
+
labeled stack.
|
|
10
18
|
props:
|
|
11
19
|
disabled:
|
|
12
20
|
description: Disables interaction, removes contenteditable, and dims the control. Inherited from UIFormElement.
|
|
@@ -86,7 +94,31 @@ states:
|
|
|
86
94
|
traits: []
|
|
87
95
|
tokens: {}
|
|
88
96
|
a2ui:
|
|
89
|
-
rules:
|
|
97
|
+
rules:
|
|
98
|
+
- >-
|
|
99
|
+
<textarea-ui> is the canonical multi-line text input. The host
|
|
100
|
+
IS the contenteditable surface — NEVER use a native <textarea>
|
|
101
|
+
(banned by ADR-0025).
|
|
102
|
+
- >-
|
|
103
|
+
Wrap <textarea-ui> in <field-ui label="…" hint="…" error="…"> for
|
|
104
|
+
the canonical labeled stack. The inline [label] / [hint] /
|
|
105
|
+
[error] props are also supported on the primitive for compact
|
|
106
|
+
use.
|
|
107
|
+
- >-
|
|
108
|
+
Form participation is implicit via UIFormElement. Set [name] for
|
|
109
|
+
FormData submission; [required] / [disabled] / [readonly]
|
|
110
|
+
reflect; listen for `change` (on blur after value change) and
|
|
111
|
+
`input` (per keystroke).
|
|
112
|
+
- >-
|
|
113
|
+
Use [rows] to set initial height (default 3) and [resize]
|
|
114
|
+
(vertical | horizontal | both | none; default vertical) to
|
|
115
|
+
control user resize. Never substitute a native <textarea> just
|
|
116
|
+
to get rows / resize.
|
|
117
|
+
- >-
|
|
118
|
+
Enter inserts a newline — <textarea-ui> does NOT emit a `submit`
|
|
119
|
+
event. For Enter-to-send multi-line composers, use
|
|
120
|
+
<chat-input-ui submit-on-enter> inside <chat-composer>, not
|
|
121
|
+
textarea-ui.
|
|
90
122
|
anti_patterns: []
|
|
91
123
|
examples:
|
|
92
124
|
- name: basic-textarea
|
|
@@ -116,5 +148,10 @@ examples:
|
|
|
116
148
|
]
|
|
117
149
|
keywords:
|
|
118
150
|
- textarea
|
|
119
|
-
synonyms:
|
|
120
|
-
|
|
151
|
+
synonyms:
|
|
152
|
+
textarea: [multiline-input, text-area, comment-input, long-text-input]
|
|
153
|
+
related:
|
|
154
|
+
- Input
|
|
155
|
+
- Field
|
|
156
|
+
- ChatInput
|
|
157
|
+
- Code
|
|
@@ -62,12 +62,29 @@
|
|
|
62
62
|
"composes": [],
|
|
63
63
|
"events": {},
|
|
64
64
|
"examples": [],
|
|
65
|
-
"keywords": [
|
|
65
|
+
"keywords": [
|
|
66
|
+
"timeline-item",
|
|
67
|
+
"timeline-row",
|
|
68
|
+
"activity-entry",
|
|
69
|
+
"event-entry",
|
|
70
|
+
"history-row"
|
|
71
|
+
],
|
|
66
72
|
"name": "UITimelineItem",
|
|
67
|
-
"related": [
|
|
73
|
+
"related": [
|
|
74
|
+
"Timeline",
|
|
75
|
+
"FeedItem",
|
|
76
|
+
"Stepper"
|
|
77
|
+
],
|
|
68
78
|
"slots": {},
|
|
69
79
|
"states": [],
|
|
70
|
-
"synonyms": {
|
|
80
|
+
"synonyms": {
|
|
81
|
+
"timeline-item": [
|
|
82
|
+
"timeline-row",
|
|
83
|
+
"activity-row",
|
|
84
|
+
"event-row",
|
|
85
|
+
"history-entry"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
71
88
|
"tag": "timeline-item-ui",
|
|
72
89
|
"tokens": {},
|
|
73
90
|
"traits": [],
|
|
@@ -45,3 +45,27 @@ props:
|
|
|
45
45
|
description: Show a spinner instead of the icon while status=pending.
|
|
46
46
|
type: boolean
|
|
47
47
|
default: false
|
|
48
|
+
|
|
49
|
+
keywords:
|
|
50
|
+
- timeline-item
|
|
51
|
+
- timeline-row
|
|
52
|
+
- activity-entry
|
|
53
|
+
- event-entry
|
|
54
|
+
- history-row
|
|
55
|
+
|
|
56
|
+
synonyms:
|
|
57
|
+
timeline-item: [timeline-row, activity-row, event-row, history-entry]
|
|
58
|
+
|
|
59
|
+
related:
|
|
60
|
+
- Timeline
|
|
61
|
+
- FeedItem
|
|
62
|
+
- Stepper
|
|
63
|
+
|
|
64
|
+
a2ui:
|
|
65
|
+
rules:
|
|
66
|
+
- rule: 'Child of <timeline-ui> — one chronological event with timestamp + content + optional icon dot.'
|
|
67
|
+
reason: 'Timeline cluster contract.'
|
|
68
|
+
- rule: 'Different from <stepper-item-ui> (process steps with completion state) — timeline-item is event history.'
|
|
69
|
+
reason: 'Process vs history.'
|
|
70
|
+
- rule: 'Order is DOM-order — no auto-sort by timestamp.'
|
|
71
|
+
reason: 'Author-controlled order.'
|