@adia-ai/a2ui-corpus 0.7.19 → 0.7.21

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 (94) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/chunk-embeddings.json +1 -1
  3. package/chunks/_index.json +8208 -4773
  4. package/chunks/admin-shell-rounded-borderless.json +280 -0
  5. package/chunks/admin-shell-standard.json +303 -0
  6. package/chunks/agent-artifact-stub-card.json +115 -0
  7. package/chunks/agent-citations-source-chips.json +78 -0
  8. package/chunks/agent-pipeline-status-stages.json +69 -0
  9. package/chunks/agent-tool-call-accordion.json +109 -0
  10. package/chunks/avatar-stack-overflow.json +124 -0
  11. package/chunks/billing-cancel-subscription-danger.json +61 -0
  12. package/chunks/billing-invoice-history-table.json +75 -0
  13. package/chunks/billing-payment-method-card-on-file.json +157 -0
  14. package/chunks/bulk-selection-actions-bar.json +161 -0
  15. package/chunks/business-address-form.json +950 -0
  16. package/chunks/card-with-empty-state.json +96 -0
  17. package/chunks/card-with-form.json +143 -0
  18. package/chunks/card-with-sparkline.json +90 -0
  19. package/chunks/card-with-stat-kpi.json +95 -0
  20. package/chunks/chat-empty-state-hero.json +102 -0
  21. package/chunks/chat-message-assistant-byline.json +85 -0
  22. package/chunks/chat-message-user-byline.json +84 -0
  23. package/chunks/checkout-order-summary-card.json +140 -0
  24. package/chunks/col-form-stack.json +93 -0
  25. package/chunks/col-heading-body-action.json +79 -0
  26. package/chunks/col-stat-label.json +72 -0
  27. package/chunks/contact-form-card.json +197 -0
  28. package/chunks/contact-support-form.json +699 -0
  29. package/chunks/cta-banner-centered.json +102 -0
  30. package/chunks/data-import-wizard.json +12 -3
  31. package/chunks/departments-checkbox-form.json +387 -0
  32. package/chunks/drawer-record-detail.json +44 -0
  33. package/chunks/drawer-with-create-form.json +43 -0
  34. package/chunks/editor-statusbar-ready.json +99 -0
  35. package/chunks/editor-toolbar-import-export.json +195 -0
  36. package/chunks/extended-profile-form.json +509 -0
  37. package/chunks/feature-grid-three-cards.json +187 -0
  38. package/chunks/feature-toggle-switch-grid.json +213 -0
  39. package/chunks/file-upload-field.json +97 -0
  40. package/chunks/file-upload-form.json +248 -0
  41. package/chunks/form-field-with-error.json +151 -0
  42. package/chunks/grid-2col-entry-cards.json +158 -0
  43. package/chunks/grid-kpi-4col.json +164 -0
  44. package/chunks/grid-responsive-kpi.json +165 -0
  45. package/chunks/image-thumbnail-grid.json +77 -0
  46. package/chunks/integrations-api-keys-card-list.json +475 -0
  47. package/chunks/integrations-connect-form.json +547 -0
  48. package/chunks/integrations-webhooks-empty-state.json +66 -0
  49. package/chunks/key-value-detail-list.json +172 -0
  50. package/chunks/library-browser-search-filter.json +109 -0
  51. package/chunks/login-form-card.json +207 -0
  52. package/chunks/logo-cloud-trusted-by.json +235 -0
  53. package/chunks/map-with-location-list.json +291 -0
  54. package/chunks/marketing-page-shell.json +45 -11
  55. package/chunks/members-active-table-search-filter.json +184 -0
  56. package/chunks/members-pending-invites-cards.json +251 -0
  57. package/chunks/members-roles-permissions-list.json +104 -0
  58. package/chunks/multi-field-form-validation.json +391 -0
  59. package/chunks/order-confirmation-success-card.json +177 -0
  60. package/chunks/payment-checkout-form.json +338 -0
  61. package/chunks/plan-selection-form.json +526 -0
  62. package/chunks/rating-stars-review-summary.json +258 -0
  63. package/chunks/reg-step-shell.json +12 -3
  64. package/chunks/responsive-shell-sidebar.json +79 -0
  65. package/chunks/row-action-cluster.json +54 -0
  66. package/chunks/row-avatar-name-role.json +71 -0
  67. package/chunks/row-icon-label.json +52 -0
  68. package/chunks/row-spread-label-value.json +54 -0
  69. package/chunks/row-wrap-tags.json +112 -0
  70. package/chunks/schedule-meeting-form-card.json +229 -0
  71. package/chunks/searchable-picker-modal.json +164 -0
  72. package/chunks/security-active-sessions-devices.json +287 -0
  73. package/chunks/security-change-password-form.json +102 -0
  74. package/chunks/security-delete-account-danger.json +79 -0
  75. package/chunks/settings-admin-page.json +61 -34
  76. package/chunks/settings-danger-zone-delete-workspace.json +93 -0
  77. package/chunks/settings-notification-activity-checkboxes.json +108 -0
  78. package/chunks/settings-notification-channels-switches.json +101 -0
  79. package/chunks/signup-form-card.json +218 -0
  80. package/chunks/signup-team-size-form.json +256 -0
  81. package/chunks/single-select-card-form.json +228 -0
  82. package/chunks/stack-avatar-badge-overlay.json +53 -0
  83. package/chunks/stack-image-shimmer.json +51 -0
  84. package/chunks/stats-band-big-numbers.json +175 -0
  85. package/chunks/subscription-status-renewal-card.json +229 -0
  86. package/chunks/table-empty-state.json +116 -0
  87. package/chunks/table-toolbar-no-search.json +38 -0
  88. package/chunks/table-toolbar-with-table.json +231 -0
  89. package/chunks/table-with-toolbar-card.json +76 -0
  90. package/chunks/team-invite-form.json +377 -0
  91. package/chunks/testimonial-pull-quote.json +129 -0
  92. package/chunks/url-import-form.json +725 -0
  93. package/chunks/usage-quota-meter-card.json +217 -0
  94. package/package.json +1 -1
@@ -0,0 +1,258 @@
1
+ {
2
+ "name": "rating-stars-review-summary",
3
+ "kind": "block",
4
+ "primary": "section",
5
+ "page": "/catalog/ui-patterns/v050-content-blocks/v050-content-blocks.contents.html",
6
+ "slots": [],
7
+ "nested": [],
8
+ "attrs": {},
9
+ "html": "<section>\n <card-ui>\n <header>\n <text-ui strong>Customer reviews</text-ui>\n </header>\n <section>\n <col-ui gap=\"4\">\n <row-ui gap=\"4\" align=\"center\">\n <col-ui gap=\"0\" align=\"center\">\n <text-ui variant=\"display\" size=\"md\">4.6</text-ui>\n <rating-ui value=\"4.5\" allow-half readonly></rating-ui>\n <text-ui size=\"sm\" color=\"subtle\">1,284 reviews</text-ui>\n </col-ui>\n <col-ui gap=\"2\" style=\"flex: 1\">\n <row-ui gap=\"2\" align=\"center\">\n <text-ui size=\"sm\" color=\"subtle\">5★</text-ui>\n <progress-ui value=\"72\" total=\"100\"></progress-ui>\n </row-ui>\n <row-ui gap=\"2\" align=\"center\">\n <text-ui size=\"sm\" color=\"subtle\">4★</text-ui>\n <progress-ui value=\"18\" total=\"100\"></progress-ui>\n </row-ui>\n <row-ui gap=\"2\" align=\"center\">\n <text-ui size=\"sm\" color=\"subtle\">3★</text-ui>\n <progress-ui value=\"6\" total=\"100\"></progress-ui>\n </row-ui>\n <row-ui gap=\"2\" align=\"center\">\n <text-ui size=\"sm\" color=\"subtle\">2★</text-ui>\n <progress-ui value=\"3\" total=\"100\"></progress-ui>\n </row-ui>\n <row-ui gap=\"2\" align=\"center\">\n <text-ui size=\"sm\" color=\"subtle\">1★</text-ui>\n <progress-ui value=\"1\" total=\"100\"></progress-ui>\n </row-ui>\n </col-ui>\n </row-ui>\n </col-ui>\n </section>\n </card-ui>\n </section>",
10
+ "source": "catalog/ui-patterns/v050-content-blocks/v050-content-blocks.contents.html",
11
+ "metadata": {
12
+ "domain": "display",
13
+ "description": "Rating review summary — a large average score beside a read-only star rating and total-review count, above a breakdown of star-level bars (5★ down to 1★) showing how many reviews fell at each level. The 'customer reviews / ratings overview' header on a product or listing page.",
14
+ "keywords": [
15
+ "rating",
16
+ "stars",
17
+ "review",
18
+ "summary",
19
+ "average",
20
+ "score",
21
+ "reviews",
22
+ "count",
23
+ "breakdown",
24
+ "distribution",
25
+ "feedback",
26
+ "testimonials",
27
+ "product",
28
+ "ratings",
29
+ "five",
30
+ "star",
31
+ "out",
32
+ "of",
33
+ "customer",
34
+ "reviews",
35
+ "overall",
36
+ "rating",
37
+ "bars",
38
+ "histogram",
39
+ "star",
40
+ "levels",
41
+ "review",
42
+ "score",
43
+ "reviews",
44
+ "overview",
45
+ "ratings",
46
+ "panel"
47
+ ]
48
+ },
49
+ "captured_at": "2026-06-10T19:45:40.486Z",
50
+ "template": [
51
+ {
52
+ "id": "text",
53
+ "component": "Text",
54
+ "strong": true,
55
+ "textContent": "Customer reviews"
56
+ },
57
+ {
58
+ "id": "header",
59
+ "component": "Header",
60
+ "children": [
61
+ "text"
62
+ ]
63
+ },
64
+ {
65
+ "id": "text-2",
66
+ "component": "Text",
67
+ "size": "md",
68
+ "variant": "display",
69
+ "textContent": "4.6"
70
+ },
71
+ {
72
+ "id": "rating",
73
+ "component": "Rating",
74
+ "readonly": true,
75
+ "value": 4.5
76
+ },
77
+ {
78
+ "id": "text-3",
79
+ "component": "Text",
80
+ "color": "subtle",
81
+ "size": "sm",
82
+ "textContent": "1,284 reviews"
83
+ },
84
+ {
85
+ "id": "column-2",
86
+ "component": "Column",
87
+ "align": "center",
88
+ "gap": "0",
89
+ "children": [
90
+ "text-2",
91
+ "rating",
92
+ "text-3"
93
+ ]
94
+ },
95
+ {
96
+ "id": "text-4",
97
+ "component": "Text",
98
+ "color": "subtle",
99
+ "size": "sm",
100
+ "textContent": "5★"
101
+ },
102
+ {
103
+ "id": "progress",
104
+ "component": "Progress",
105
+ "value": 72
106
+ },
107
+ {
108
+ "id": "row-2",
109
+ "component": "Row",
110
+ "align": "center",
111
+ "gap": "2",
112
+ "children": [
113
+ "text-4",
114
+ "progress"
115
+ ]
116
+ },
117
+ {
118
+ "id": "text-5",
119
+ "component": "Text",
120
+ "color": "subtle",
121
+ "size": "sm",
122
+ "textContent": "4★"
123
+ },
124
+ {
125
+ "id": "progress-2",
126
+ "component": "Progress",
127
+ "value": 18
128
+ },
129
+ {
130
+ "id": "row-3",
131
+ "component": "Row",
132
+ "align": "center",
133
+ "gap": "2",
134
+ "children": [
135
+ "text-5",
136
+ "progress-2"
137
+ ]
138
+ },
139
+ {
140
+ "id": "text-6",
141
+ "component": "Text",
142
+ "color": "subtle",
143
+ "size": "sm",
144
+ "textContent": "3★"
145
+ },
146
+ {
147
+ "id": "progress-3",
148
+ "component": "Progress",
149
+ "value": 6
150
+ },
151
+ {
152
+ "id": "row-4",
153
+ "component": "Row",
154
+ "align": "center",
155
+ "gap": "2",
156
+ "children": [
157
+ "text-6",
158
+ "progress-3"
159
+ ]
160
+ },
161
+ {
162
+ "id": "text-7",
163
+ "component": "Text",
164
+ "color": "subtle",
165
+ "size": "sm",
166
+ "textContent": "2★"
167
+ },
168
+ {
169
+ "id": "progress-4",
170
+ "component": "Progress",
171
+ "value": 3
172
+ },
173
+ {
174
+ "id": "row-5",
175
+ "component": "Row",
176
+ "align": "center",
177
+ "gap": "2",
178
+ "children": [
179
+ "text-7",
180
+ "progress-4"
181
+ ]
182
+ },
183
+ {
184
+ "id": "text-8",
185
+ "component": "Text",
186
+ "color": "subtle",
187
+ "size": "sm",
188
+ "textContent": "1★"
189
+ },
190
+ {
191
+ "id": "progress-5",
192
+ "component": "Progress",
193
+ "value": 1
194
+ },
195
+ {
196
+ "id": "row-6",
197
+ "component": "Row",
198
+ "align": "center",
199
+ "gap": "2",
200
+ "children": [
201
+ "text-8",
202
+ "progress-5"
203
+ ]
204
+ },
205
+ {
206
+ "id": "column-3",
207
+ "component": "Column",
208
+ "gap": "2",
209
+ "children": [
210
+ "row-2",
211
+ "row-3",
212
+ "row-4",
213
+ "row-5",
214
+ "row-6"
215
+ ]
216
+ },
217
+ {
218
+ "id": "row",
219
+ "component": "Row",
220
+ "align": "center",
221
+ "gap": "4",
222
+ "children": [
223
+ "column-2",
224
+ "column-3"
225
+ ]
226
+ },
227
+ {
228
+ "id": "column",
229
+ "component": "Column",
230
+ "gap": "4",
231
+ "children": [
232
+ "row"
233
+ ]
234
+ },
235
+ {
236
+ "id": "section",
237
+ "component": "Section",
238
+ "children": [
239
+ "column"
240
+ ]
241
+ },
242
+ {
243
+ "id": "card",
244
+ "component": "Card",
245
+ "children": [
246
+ "header",
247
+ "section"
248
+ ]
249
+ },
250
+ {
251
+ "id": "root",
252
+ "component": "Section",
253
+ "children": [
254
+ "card"
255
+ ]
256
+ }
257
+ ]
258
+ }
@@ -27,6 +27,7 @@
27
27
  ],
28
28
  "nested": [
29
29
  "reg-story-pane",
30
+ "extended-profile-form",
30
31
  "reg-step-header",
31
32
  "reg-extended-profile",
32
33
  "reg-step-footer",
@@ -36,7 +37,7 @@
36
37
  "data-reg": "",
37
38
  "prose": ""
38
39
  },
39
- "html": "<main data-reg prose>\n <aside data-reg-story data-chunk-slot=\"page-story\"><!-- nested: reg-story-pane --></aside>\n\n <form data-reg-input action=\"/site/examples/registration/done\" method=\"get\">\n <header data-reg-heading data-chunk-slot=\"page-header\"><!-- nested: reg-step-header --></header>\n\n <section data-reg-form data-chunk-slot=\"page-content\"><!-- nested: reg-extended-profile --></section>\n\n <footer data-chunk-slot=\"page-footer\"><!-- nested: reg-step-footer --></footer>\n </form>\n </main>",
40
+ "html": "<main data-reg prose>\n <aside data-reg-story data-chunk-slot=\"page-story\"><!-- nested: reg-story-pane --></aside>\n\n <form data-reg-input action=\"/site/examples/registration/done\" method=\"get\"><!-- nested: extended-profile-form --></form>\n </main>",
40
41
  "source": "apps/user-flow/app/registration/personal/personal.contents.html",
41
42
  "metadata": {
42
43
  "domain": "onboarding",
@@ -64,7 +65,7 @@
64
65
  "layout": "page"
65
66
  }
66
67
  },
67
- "captured_at": "2026-06-07T19:28:13.657Z",
68
+ "captured_at": "2026-06-10T14:28:57.979Z",
68
69
  "template": [
69
70
  {
70
71
  "id": "image",
@@ -571,7 +572,7 @@
571
572
  ]
572
573
  },
573
574
  {
574
- "id": "form-container",
575
+ "id": "form-container-2",
575
576
  "component": "FormContainer",
576
577
  "data-reg-input": "",
577
578
  "children": [
@@ -580,6 +581,14 @@
580
581
  "footer"
581
582
  ]
582
583
  },
584
+ {
585
+ "id": "form-container",
586
+ "component": "FormContainer",
587
+ "data-reg-input": "",
588
+ "children": [
589
+ "form-container-2"
590
+ ]
591
+ },
583
592
  {
584
593
  "id": "root",
585
594
  "component": "Column",
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "responsive-shell-sidebar",
3
+ "kind": "page",
4
+ "primary": "body",
5
+ "page": "/packages/web-components/patterns/responsive-shell-sidebar/responsive-shell-sidebar.examples.html",
6
+ "slots": [
7
+ {
8
+ "name": "leading-inline",
9
+ "tagName": "aside",
10
+ "html": "<pane-ui>\n <header>\n <h3>Tokens</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Primary</list-item-ui>\n <list-item-ui>Secondary</list-item-ui>\n <list-item-ui>Neutral</list-item-ui>\n <list-item-ui>Surface</list-item-ui>\n </list-ui>\n </section>\n </pane-ui>"
11
+ },
12
+ {
13
+ "name": "main",
14
+ "tagName": "main",
15
+ "html": "<!-- ═══ Narrow toolbar (drawer triggers) ═══ -->\n <row-ui class=\"toolbar\" data-chunk-slot=\"narrow-toolbar\">\n <button-ui id=\"open-leading\" text=\"Tokens\" icon=\"list\" variant=\"ghost\" size=\"sm\"></button-ui>\n <button-ui id=\"open-trailing\" text=\"Settings\" icon=\"sliders\" variant=\"ghost\" size=\"sm\"></button-ui>\n </row-ui>\n\n <card-ui>\n <header>\n <h2>Responsive Shell Sidebar pattern</h2>\n </header>\n <section>\n <text-ui>\n Resize this viewport: at ≤900px the leading + trailing sidebars collapse\n to drawers triggered by the toolbar buttons. Above 900px the sidebars are\n inline. The same content is mounted in both surfaces; consumer signals\n drive both copies via the parent template's re-read.\n </text-ui>\n </section>\n </card-ui>\n\n <div class=\"doc-body\">\n <h2>The pattern</h2>\n <p>Three pieces:</p>\n <ol>\n <li><strong>Inline mounts</strong> for the sidebars wrapped in <code>.wide-only</code> (display: contents at &gt;900px; display: none at ≤900px).</li>\n <li><strong>Drawer twins</strong> with the same children, mounted outside the shell's named slots, controlled by toolbar buttons inside <code>.narrow-only</code>.</li>\n <li><strong>MediaQueryList</strong> listener that auto-closes the drawers on viewport widening (the gap FEEDBACK-06 §3 explicitly flagged).</li>\n </ol>\n\n <h2>Dual-mount caveat</h2>\n <p>Components with <strong>local DOM state</strong> (uncontrolled form inputs, scroll position, focused element) will lose state when the viewport crosses the breakpoint — the inline copy unmounts and the drawer copy mounts (or vice versa). <strong>Signal-bound components are safe</strong> because their state lives in the signal, not the DOM. Most AdiaUI primitives are signal-backed; the affected cases are:</p>\n <ul>\n <li>Native <code>&lt;input&gt;</code>/<code>&lt;textarea&gt;</code> with no signal binding</li>\n <li>Components using <code>this.querySelector(...)</code> with imperative state</li>\n <li>Scroll-position-sensitive containers (e.g. chat threads at a specific scroll)</li>\n </ul>\n <p>For these, either: (a) lift the state to a signal in the parent, or (b) document the unmount-on-resize edge.</p>\n\n <h2>Auto-close on viewport widening</h2>\n <code-ui language=\"javascript\">const mql = window.matchMedia('(max-width: 900px)');\nmql.addEventListener('change', (e) =&gt; {\n if (!e.matches) {\n // Viewport widened past breakpoint — close any open drawers\n document.getElementById('leading-drawer').open = false;\n document.getElementById('trailing-drawer').open = false;\n }\n});</code-ui>\n\n <h2>State sharing</h2>\n <p>Single signal source consumed by both copies. The parent template reads the signal once and passes the extracted value to both the inline mount AND the drawer mount; on signal change the parent re-renders both:</p>\n <code-ui language=\"javascript\">import { signal } from '@adia-ai/web-components/core';\n\nconst activeToken = signal('primary');\n\nstatic template = () =&gt; {\n const current = activeToken.value; // dep read here\n return html`\n &lt;aside class=\"wide-only\"&gt;\n &lt;list-ui&gt; ... .active=${current === 'primary'} ... &lt;/list-ui&gt;\n &lt;/aside&gt;\n &lt;drawer-ui id=\"leading-drawer\"&gt;\n &lt;list-ui&gt; ... .active=${current === 'primary'} ... &lt;/list-ui&gt;\n &lt;/drawer-ui&gt;\n `;\n}</code-ui>\n\n <h2>Future v0.6.0: built-in <code>responsive-breakpoint</code></h2>\n <p>FEEDBACK-06 §3 Option A proposed a built-in <code>&lt;editor-sidebar responsive-breakpoint=\"900\"&gt;</code> attribute that auto-stamps the drawer twin. Deferred to v0.6.0 — requires editor-shell + pane-ui semantics audit (focus handoff at the inline↔drawer transition, dual-mount event-listener deduplication, etc.). Pairs with a <code>&lt;show-when breakpoint=\"...\"&gt;</code> trait. Until then, the pattern above is the canonical recipe.</p>\n </div>"
16
+ },
17
+ {
18
+ "name": "narrow-toolbar",
19
+ "tagName": "row-ui",
20
+ "html": "<button-ui id=\"open-leading\" text=\"Tokens\" icon=\"list\" variant=\"ghost\" size=\"sm\"></button-ui>\n <button-ui id=\"open-trailing\" text=\"Settings\" icon=\"sliders\" variant=\"ghost\" size=\"sm\"></button-ui>"
21
+ },
22
+ {
23
+ "name": "trailing-inline",
24
+ "tagName": "aside",
25
+ "html": "<pane-ui>\n <header>\n <h3>Settings</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Lightness</list-item-ui>\n <list-item-ui>Chroma</list-item-ui>\n <list-item-ui>Hue</list-item-ui>\n </list-ui>\n </section>\n </pane-ui>"
26
+ },
27
+ {
28
+ "name": "leading-drawer",
29
+ "tagName": "drawer-ui",
30
+ "html": "<header>\n <h3>Tokens</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Primary</list-item-ui>\n <list-item-ui>Secondary</list-item-ui>\n <list-item-ui>Neutral</list-item-ui>\n <list-item-ui>Surface</list-item-ui>\n </list-ui>\n </section>"
31
+ },
32
+ {
33
+ "name": "trailing-drawer",
34
+ "tagName": "drawer-ui",
35
+ "html": "<header>\n <h3>Settings</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Lightness</list-item-ui>\n <list-item-ui>Chroma</list-item-ui>\n <list-item-ui>Hue</list-item-ui>\n </list-ui>\n </section>"
36
+ }
37
+ ],
38
+ "nested": [],
39
+ "attrs": {
40
+ "with": "",
41
+ "leading": "",
42
+ "trailing": "",
43
+ "sidebars": "",
44
+ "that": "",
45
+ "collapse": "",
46
+ "to": "",
47
+ "drawers": "",
48
+ "below": "",
49
+ "a": "",
50
+ "px": "",
51
+ "viewport": "",
52
+ "breakpoint": "",
53
+ "dual-mount": "",
54
+ "same": "",
55
+ "content": "",
56
+ "renders": "",
57
+ "inline": "",
58
+ "on": "",
59
+ "wide": "",
60
+ "viewports": "",
61
+ "inside": "",
62
+ "drawer-ui": ""
63
+ },
64
+ "html": "<body>\n\n <!-- ═══ INLINE shell (wide-only) ═══ -->\n <div class=\"shell\">\n <!-- Leading sidebar — inline mount (wide-only) -->\n <aside class=\"wide-only\" data-chunk-slot=\"leading-inline\">\n <pane-ui>\n <header>\n <h3>Tokens</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Primary</list-item-ui>\n <list-item-ui>Secondary</list-item-ui>\n <list-item-ui>Neutral</list-item-ui>\n <list-item-ui>Surface</list-item-ui>\n </list-ui>\n </section>\n </pane-ui>\n </aside>\n\n <!-- Main content (always inline) -->\n <main data-chunk-slot=\"main\">\n <!-- ═══ Narrow toolbar (drawer triggers) ═══ -->\n <row-ui class=\"toolbar\" data-chunk-slot=\"narrow-toolbar\">\n <button-ui id=\"open-leading\" text=\"Tokens\" icon=\"list\" variant=\"ghost\" size=\"sm\"></button-ui>\n <button-ui id=\"open-trailing\" text=\"Settings\" icon=\"sliders\" variant=\"ghost\" size=\"sm\"></button-ui>\n </row-ui>\n\n <card-ui>\n <header>\n <h2>Responsive Shell Sidebar pattern</h2>\n </header>\n <section>\n <text-ui>\n Resize this viewport: at ≤900px the leading + trailing sidebars collapse\n to drawers triggered by the toolbar buttons. Above 900px the sidebars are\n inline. The same content is mounted in both surfaces; consumer signals\n drive both copies via the parent template's re-read.\n </text-ui>\n </section>\n </card-ui>\n\n <div class=\"doc-body\">\n <h2>The pattern</h2>\n <p>Three pieces:</p>\n <ol>\n <li><strong>Inline mounts</strong> for the sidebars wrapped in <code>.wide-only</code> (display: contents at &gt;900px; display: none at ≤900px).</li>\n <li><strong>Drawer twins</strong> with the same children, mounted outside the shell's named slots, controlled by toolbar buttons inside <code>.narrow-only</code>.</li>\n <li><strong>MediaQueryList</strong> listener that auto-closes the drawers on viewport widening (the gap FEEDBACK-06 §3 explicitly flagged).</li>\n </ol>\n\n <h2>Dual-mount caveat</h2>\n <p>Components with <strong>local DOM state</strong> (uncontrolled form inputs, scroll position, focused element) will lose state when the viewport crosses the breakpoint — the inline copy unmounts and the drawer copy mounts (or vice versa). <strong>Signal-bound components are safe</strong> because their state lives in the signal, not the DOM. Most AdiaUI primitives are signal-backed; the affected cases are:</p>\n <ul>\n <li>Native <code>&lt;input&gt;</code>/<code>&lt;textarea&gt;</code> with no signal binding</li>\n <li>Components using <code>this.querySelector(...)</code> with imperative state</li>\n <li>Scroll-position-sensitive containers (e.g. chat threads at a specific scroll)</li>\n </ul>\n <p>For these, either: (a) lift the state to a signal in the parent, or (b) document the unmount-on-resize edge.</p>\n\n <h2>Auto-close on viewport widening</h2>\n <code-ui language=\"javascript\">const mql = window.matchMedia('(max-width: 900px)');\nmql.addEventListener('change', (e) =&gt; {\n if (!e.matches) {\n // Viewport widened past breakpoint — close any open drawers\n document.getElementById('leading-drawer').open = false;\n document.getElementById('trailing-drawer').open = false;\n }\n});</code-ui>\n\n <h2>State sharing</h2>\n <p>Single signal source consumed by both copies. The parent template reads the signal once and passes the extracted value to both the inline mount AND the drawer mount; on signal change the parent re-renders both:</p>\n <code-ui language=\"javascript\">import { signal } from '@adia-ai/web-components/core';\n\nconst activeToken = signal('primary');\n\nstatic template = () =&gt; {\n const current = activeToken.value; // dep read here\n return html`\n &lt;aside class=\"wide-only\"&gt;\n &lt;list-ui&gt; ... .active=${current === 'primary'} ... &lt;/list-ui&gt;\n &lt;/aside&gt;\n &lt;drawer-ui id=\"leading-drawer\"&gt;\n &lt;list-ui&gt; ... .active=${current === 'primary'} ... &lt;/list-ui&gt;\n &lt;/drawer-ui&gt;\n `;\n}</code-ui>\n\n <h2>Future v0.6.0: built-in <code>responsive-breakpoint</code></h2>\n <p>FEEDBACK-06 §3 Option A proposed a built-in <code>&lt;editor-sidebar responsive-breakpoint=\"900\"&gt;</code> attribute that auto-stamps the drawer twin. Deferred to v0.6.0 — requires editor-shell + pane-ui semantics audit (focus handoff at the inline↔drawer transition, dual-mount event-listener deduplication, etc.). Pairs with a <code>&lt;show-when breakpoint=\"...\"&gt;</code> trait. Until then, the pattern above is the canonical recipe.</p>\n </div>\n </main>\n\n <!-- Trailing sidebar — inline mount (wide-only) -->\n <aside class=\"wide-only\" data-chunk-slot=\"trailing-inline\">\n <pane-ui>\n <header>\n <h3>Settings</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Lightness</list-item-ui>\n <list-item-ui>Chroma</list-item-ui>\n <list-item-ui>Hue</list-item-ui>\n </list-ui>\n </section>\n </pane-ui>\n </aside>\n </div>\n\n <!-- ═══ DRAWER twins (narrow-only) ═══ -->\n <drawer-ui id=\"leading-drawer\" side=\"left\" size=\"sm\" data-chunk-slot=\"leading-drawer\">\n <header>\n <h3>Tokens</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Primary</list-item-ui>\n <list-item-ui>Secondary</list-item-ui>\n <list-item-ui>Neutral</list-item-ui>\n <list-item-ui>Surface</list-item-ui>\n </list-ui>\n </section>\n </drawer-ui>\n\n <drawer-ui id=\"trailing-drawer\" side=\"right\" size=\"sm\" data-chunk-slot=\"trailing-drawer\">\n <header>\n <h3>Settings</h3>\n </header>\n <section>\n <list-ui>\n <list-item-ui>Lightness</list-item-ui>\n <list-item-ui>Chroma</list-item-ui>\n <list-item-ui>Hue</list-item-ui>\n </list-ui>\n </section>\n </drawer-ui>\n\n <script type=\"module\">\n // Wire toolbar buttons to drawer triggers\n document.getElementById('open-leading')?.addEventListener('press', () => {\n document.getElementById('leading-drawer').open = true;\n });\n document.getElementById('open-trailing')?.addEventListener('press', () => {\n document.getElementById('trailing-drawer').open = true;\n });\n\n // Auto-close drawers when viewport crosses breakpoint (widening)\n const mql = window.matchMedia('(max-width: 900px)');\n mql.addEventListener('change', (e) => {\n if (!e.matches) {\n document.getElementById('leading-drawer').open = false;\n document.getElementById('trailing-drawer').open = false;\n }\n });\n </script>\n</body>",
65
+ "source": "packages/web-components/patterns/responsive-shell-sidebar/responsive-shell-sidebar.examples.html",
66
+ "metadata": {
67
+ "domain": "layout",
68
+ "description": "\"Editor-shell"
69
+ },
70
+ "captured_at": "2026-06-10T20:25:14.783Z",
71
+ "template": [
72
+ {
73
+ "id": "root",
74
+ "component": "Text",
75
+ "textContent": "Tokens Primary Secondary Neutral Surface Responsive Shell Sidebar pattern Resize this viewport: at ≤900px the leading + trailing sidebars collapse to drawers triggered by the toolbar buttons. Above 900px the sidebars are inline. The same content is mounted in both surfaces; consumer signals drive both copies via the parent template's re-read. The pattern Three pieces: Inline mounts for the sidebars wrapped in .wide-only (display: contents at &gt;900px; display: none at ≤900px). Drawer twins with the same children, mounted outside the shell's named slots, controlled by toolbar buttons inside .narrow-only . MediaQueryList listener that auto-closes the drawers on viewport widening (the gap FEEDBACK-06 §3 explicitly flagged). Dual-mount caveat Components with local DOM state (uncontrolled form inputs, scroll position, focused element) will lose state when the viewport crosses the breakpoint — the inline copy unmounts and the drawer copy mounts (or vice versa). Signal-bound components are safe because their state lives in the signal, not the DOM. Most AdiaUI primitives are signal-backed; the affected cases are: Native &lt;input&gt; / &lt;textarea&gt; with no signal binding Components using this.querySelector(...) with imperative state Scroll-position-sensitive containers (e.g. chat threads at a specific scroll) For these, either: (a) lift the state to a signal in the parent, or (b) document the unmount-on-resize edge. Auto-close on viewport widening const mql = window.matchMedia('(max-width: 900px)'); mql.addEventListener('change', (e) =&gt; { if (!e.matches) { // Viewport widened past breakpoint — close any open drawers document.getElementById('leading-drawer').open = false; document.getElementById('trailing-drawer').open = false; } }); State sharing Single signal source consumed by both copies. The parent template reads the signal once and passes the extracted value to both the inline mount AND the drawer mount; on signal change the parent re-renders both: import { signal } from '@adia-ai/web-components/core'; const activeToken = signal('primary'); static template = () =&gt; { const current = activeToken.value; // dep read here return html` &lt;aside class=\"wide-only\"&gt; &lt;list-ui&gt; ... .active=${current === 'primary'} ... &lt;/list-ui&gt; &lt;/aside&gt; &lt;drawer-ui id=\"leading-drawer\"&gt; &lt;list-ui&gt; ... .active=${current === 'primary'} ... &lt;/list-ui&gt; &lt;/drawer-ui&gt; `; } Future v0.6.0: built-in responsive-breakpoint FEEDBACK-06 §3 Option A proposed a built-in &lt;editor-sidebar responsive-breakpoint=\"900\"&gt; attribute that auto-stamps the drawer twin. Deferred to v0.6.0 — requires editor-shell + pane-ui semantics audit (focus handoff at the inline↔drawer transition, dual-mount event-listener deduplication, etc.). Pairs with a &lt;show-when breakpoint=\"...\"&gt; trait. Until then, the pattern above is the canonical recipe. Settings Lightness Chroma Hue Tokens Primary Secondary Neutral Surface Settings Lightness Chroma Hue // Wire toolbar buttons to drawer triggers document.getElementById('open-leading')?.addEventListener('press', () => { document.getElementById('leading-drawer').open = true; }); document.getElementById('open-trailing')?.addEventListener('press', () => { document.getElementById('trailing-drawer').open = true; }); // Auto-close drawers when viewport crosses breakpoint (widening) const mql = window.matchMedia('(max-width: 900px)'); mql.addEventListener('change', (e) => { if (!e.matches) { document.getElementById('leading-drawer').open = false; document.getElementById('trailing-drawer').open = false; } });",
76
+ "variant": "body"
77
+ }
78
+ ]
79
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "row-action-cluster",
3
+ "kind": "block",
4
+ "primary": "div",
5
+ "page": "/packages/web-components/components/row/row.examples.html",
6
+ "slots": [],
7
+ "nested": [],
8
+ "attrs": {
9
+ "data-artifact-item": "",
10
+ "data-artifact-label": "action cluster"
11
+ },
12
+ "html": "<row-ui gap=\"2\">\n <button-ui text=\"Cancel\" variant=\"ghost\"></button-ui>\n <button-ui text=\"Save changes\" variant=\"primary\"></button-ui>\n </row-ui>",
13
+ "source": "packages/web-components/components/row/row.examples.html",
14
+ "metadata": {
15
+ "domain": "layout",
16
+ "description": "Horizontal action cluster — button group in a row with gap. Default shape for cancel + submit.",
17
+ "keywords": [
18
+ "row",
19
+ "buttons",
20
+ "actions",
21
+ "cluster",
22
+ "inline",
23
+ "flex",
24
+ "gap",
25
+ "horizontal",
26
+ "cancel",
27
+ "submit"
28
+ ]
29
+ },
30
+ "captured_at": "2026-06-10T20:25:14.783Z",
31
+ "template": [
32
+ {
33
+ "id": "button",
34
+ "component": "Button",
35
+ "text": "Cancel",
36
+ "variant": "ghost"
37
+ },
38
+ {
39
+ "id": "button-2",
40
+ "component": "Button",
41
+ "text": "Save changes",
42
+ "variant": "primary"
43
+ },
44
+ {
45
+ "id": "root",
46
+ "component": "Row",
47
+ "gap": "2",
48
+ "children": [
49
+ "button",
50
+ "button-2"
51
+ ]
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "row-avatar-name-role",
3
+ "kind": "block",
4
+ "primary": "div",
5
+ "page": "/packages/web-components/components/row/row.examples.html",
6
+ "slots": [],
7
+ "nested": [],
8
+ "attrs": {
9
+ "data-artifact-item": "",
10
+ "data-artifact-label": "avatar + name + role"
11
+ },
12
+ "html": "<row-ui gap=\"3\" align=\"center\">\n <avatar-ui text=\"KG\" size=\"sm\"></avatar-ui>\n <col-ui gap=\"0\">\n <text-ui strong>Kim Granlund</text-ui>\n <text-ui variant=\"caption\">Owner</text-ui>\n </col-ui>\n </row-ui>",
13
+ "source": "packages/web-components/components/row/row.examples.html",
14
+ "metadata": {
15
+ "domain": "layout",
16
+ "description": "User identity row — avatar beside name and role. Common in tables, sidebars, and user lists.",
17
+ "keywords": [
18
+ "row",
19
+ "avatar",
20
+ "name",
21
+ "role",
22
+ "user",
23
+ "identity",
24
+ "inline",
25
+ "person",
26
+ "member",
27
+ "team",
28
+ "horizontal"
29
+ ]
30
+ },
31
+ "captured_at": "2026-06-10T20:25:14.783Z",
32
+ "template": [
33
+ {
34
+ "id": "avatar",
35
+ "component": "Avatar",
36
+ "size": "sm",
37
+ "text": "KG"
38
+ },
39
+ {
40
+ "id": "text",
41
+ "component": "Text",
42
+ "strong": true,
43
+ "textContent": "Kim Granlund"
44
+ },
45
+ {
46
+ "id": "text-2",
47
+ "component": "Text",
48
+ "variant": "caption",
49
+ "textContent": "Owner"
50
+ },
51
+ {
52
+ "id": "column",
53
+ "component": "Column",
54
+ "gap": "0",
55
+ "children": [
56
+ "text",
57
+ "text-2"
58
+ ]
59
+ },
60
+ {
61
+ "id": "root",
62
+ "component": "Row",
63
+ "align": "center",
64
+ "gap": "3",
65
+ "children": [
66
+ "avatar",
67
+ "column"
68
+ ]
69
+ }
70
+ ]
71
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "row-icon-label",
3
+ "kind": "block",
4
+ "primary": "div",
5
+ "page": "/packages/web-components/components/row/row.examples.html",
6
+ "slots": [],
7
+ "nested": [],
8
+ "attrs": {
9
+ "data-artifact-item": "",
10
+ "data-artifact-label": "icon + label inline"
11
+ },
12
+ "html": "<row-ui gap=\"2\" align=\"center\">\n <icon-ui name=\"check-circle\" style=\"color:var(--a-success)\"></icon-ui>\n <text-ui>Payment confirmed</text-ui>\n </row-ui>",
13
+ "source": "packages/web-components/components/row/row.examples.html",
14
+ "metadata": {
15
+ "domain": "layout",
16
+ "description": "Icon beside text label — status indicator row with leading icon and text.",
17
+ "keywords": [
18
+ "row",
19
+ "icon",
20
+ "label",
21
+ "status",
22
+ "indicator",
23
+ "inline",
24
+ "leading",
25
+ "icon-text",
26
+ "horizontal"
27
+ ]
28
+ },
29
+ "captured_at": "2026-06-10T20:25:14.783Z",
30
+ "template": [
31
+ {
32
+ "id": "check-circle",
33
+ "component": "Icon",
34
+ "name": "check-circle"
35
+ },
36
+ {
37
+ "id": "text",
38
+ "component": "Text",
39
+ "textContent": "Payment confirmed"
40
+ },
41
+ {
42
+ "id": "root",
43
+ "component": "Row",
44
+ "align": "center",
45
+ "gap": "2",
46
+ "children": [
47
+ "check-circle",
48
+ "text"
49
+ ]
50
+ }
51
+ ]
52
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "row-spread-label-value",
3
+ "kind": "block",
4
+ "primary": "div",
5
+ "page": "/packages/web-components/components/row/row.examples.html",
6
+ "slots": [],
7
+ "nested": [],
8
+ "attrs": {
9
+ "data-artifact-item": "",
10
+ "data-artifact-label": "spread — label + value"
11
+ },
12
+ "html": "<row-ui justify=\"space-between\" align=\"center\">\n <text-ui>Monthly total</text-ui>\n <text-ui strong>$12,400</text-ui>\n </row-ui>",
13
+ "source": "packages/web-components/components/row/row.examples.html",
14
+ "metadata": {
15
+ "domain": "layout",
16
+ "description": "Spread row — label pushed left, value pushed right via justify=space-between. Common in summary rows and list items.",
17
+ "keywords": [
18
+ "row",
19
+ "spread",
20
+ "justify",
21
+ "space-between",
22
+ "label",
23
+ "value",
24
+ "summary",
25
+ "stat",
26
+ "horizontal",
27
+ "flex"
28
+ ]
29
+ },
30
+ "captured_at": "2026-06-10T20:25:14.783Z",
31
+ "template": [
32
+ {
33
+ "id": "text",
34
+ "component": "Text",
35
+ "textContent": "Monthly total"
36
+ },
37
+ {
38
+ "id": "text-2",
39
+ "component": "Text",
40
+ "strong": true,
41
+ "textContent": "$12,400"
42
+ },
43
+ {
44
+ "id": "root",
45
+ "component": "Row",
46
+ "align": "center",
47
+ "justify": "space-between",
48
+ "children": [
49
+ "text",
50
+ "text-2"
51
+ ]
52
+ }
53
+ ]
54
+ }