@adia-ai/web-components 0.6.32 → 0.6.34

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 (164) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/components/accordion/accordion.css +2 -2
  3. package/components/action-list/action-list.css +2 -2
  4. package/components/agent-artifact/agent-artifact.css +31 -31
  5. package/components/agent-feedback-bar/agent-feedback-bar.css +10 -10
  6. package/components/agent-questions/agent-questions.css +57 -57
  7. package/components/agent-reasoning/agent-reasoning.css +62 -62
  8. package/components/agent-suggestions/agent-suggestions.css +4 -4
  9. package/components/agent-trace/agent-trace.css +53 -53
  10. package/components/alert/alert.css +41 -41
  11. package/components/avatar/avatar.css +27 -27
  12. package/components/badge/badge.css +27 -27
  13. package/components/block/block.css +16 -16
  14. package/components/breadcrumb/breadcrumb.css +23 -23
  15. package/components/button/button.css +101 -91
  16. package/components/calendar-grid/calendar-grid.a2ui.json +136 -0
  17. package/components/calendar-grid/calendar-grid.css +226 -0
  18. package/components/calendar-grid/calendar-grid.d.ts +37 -0
  19. package/components/calendar-grid/calendar-grid.js +17 -0
  20. package/components/calendar-grid/calendar-grid.yaml +116 -0
  21. package/components/calendar-grid/class.js +300 -0
  22. package/components/calendar-picker/calendar-picker.css +139 -139
  23. package/components/canvas/canvas.css +12 -12
  24. package/components/card/card.css +83 -83
  25. package/components/chart/chart.css +224 -224
  26. package/components/chart-legend/chart-legend.css +26 -26
  27. package/components/check/check.css +40 -40
  28. package/components/code/code.css +125 -125
  29. package/components/col/col.css +15 -15
  30. package/components/color-picker/color-picker.css +55 -55
  31. package/components/combobox/class.js +861 -0
  32. package/components/combobox/combobox.a2ui.json +363 -0
  33. package/components/combobox/combobox.css +244 -0
  34. package/components/combobox/combobox.d.ts +113 -0
  35. package/components/combobox/combobox.examples.md +59 -0
  36. package/components/combobox/combobox.js +17 -0
  37. package/components/combobox/combobox.test.js +181 -0
  38. package/components/combobox/combobox.yaml +369 -0
  39. package/components/command/command.css +90 -90
  40. package/components/date-range-picker/class.js +775 -0
  41. package/components/date-range-picker/date-range-picker.a2ui.json +300 -0
  42. package/components/date-range-picker/date-range-picker.css +178 -0
  43. package/components/date-range-picker/date-range-picker.d.ts +82 -0
  44. package/components/date-range-picker/date-range-picker.examples.md +37 -0
  45. package/components/date-range-picker/date-range-picker.js +17 -0
  46. package/components/date-range-picker/date-range-picker.test.js +387 -0
  47. package/components/date-range-picker/date-range-picker.yaml +285 -0
  48. package/components/datetime-picker/class.js +706 -0
  49. package/components/datetime-picker/datetime-picker.a2ui.json +334 -0
  50. package/components/datetime-picker/datetime-picker.css +150 -0
  51. package/components/datetime-picker/datetime-picker.d.ts +86 -0
  52. package/components/datetime-picker/datetime-picker.examples.md +46 -0
  53. package/components/datetime-picker/datetime-picker.js +17 -0
  54. package/components/datetime-picker/datetime-picker.test.js +454 -0
  55. package/components/datetime-picker/datetime-picker.yaml +332 -0
  56. package/components/demo-toggle/demo-toggle.css +27 -27
  57. package/components/description-list/description-list.css +18 -18
  58. package/components/divider/divider.css +24 -24
  59. package/components/embed/embed.css +6 -6
  60. package/components/empty-state/empty-state.css +27 -27
  61. package/components/feed/feed.css +12 -12
  62. package/components/field/field.css +37 -28
  63. package/components/field/field.test.js +32 -0
  64. package/components/fields/fields.css +5 -5
  65. package/components/grid/grid.css +5 -5
  66. package/components/heatmap/heatmap.css +63 -63
  67. package/components/icon/icon.css +12 -12
  68. package/components/image/image.css +14 -14
  69. package/components/index.js +8 -0
  70. package/components/input/input.css +66 -66
  71. package/components/inspector/inspector.css +6 -6
  72. package/components/integration-card/class.js +410 -0
  73. package/components/integration-card/integration-card.a2ui.json +268 -0
  74. package/components/integration-card/integration-card.css +169 -0
  75. package/components/integration-card/integration-card.d.ts +63 -0
  76. package/components/integration-card/integration-card.examples.md +41 -0
  77. package/components/integration-card/integration-card.js +17 -0
  78. package/components/integration-card/integration-card.test.js +306 -0
  79. package/components/integration-card/integration-card.yaml +280 -0
  80. package/components/kbd/kbd.css +32 -32
  81. package/components/link/link.css +12 -12
  82. package/components/list/list.css +8 -8
  83. package/components/list-window/class.js +688 -0
  84. package/components/list-window/list-window.a2ui.json +277 -0
  85. package/components/list-window/list-window.css +124 -0
  86. package/components/list-window/list-window.d.ts +84 -0
  87. package/components/list-window/list-window.examples.md +73 -0
  88. package/components/list-window/list-window.js +17 -0
  89. package/components/list-window/list-window.test.js +303 -0
  90. package/components/list-window/list-window.yaml +270 -0
  91. package/components/menu/menu.css +8 -8
  92. package/components/modal/modal.css +43 -43
  93. package/components/nav/nav.css +40 -40
  94. package/components/nav-group/nav-group.css +52 -52
  95. package/components/nav-item/nav-item.css +44 -44
  96. package/components/noodles/noodles.css +31 -31
  97. package/components/option-card/option-card.css +69 -69
  98. package/components/otp-input/otp-input.css +30 -30
  99. package/components/page/page.css +18 -18
  100. package/components/pagination/pagination.css +61 -61
  101. package/components/pane/pane.css +57 -57
  102. package/components/pipeline-status/pipeline-status.css +65 -65
  103. package/components/popover/popover.css +17 -17
  104. package/components/progress/progress.css +23 -23
  105. package/components/progress-row/progress-row.css +17 -17
  106. package/components/radio/radio.css +39 -39
  107. package/components/range/range.css +55 -55
  108. package/components/rating/rating.css +28 -28
  109. package/components/richtext/richtext.css +133 -133
  110. package/components/row/row.css +19 -19
  111. package/components/search/search.css +5 -5
  112. package/components/segment/segment.css +24 -24
  113. package/components/segmented/segmented.css +25 -25
  114. package/components/select/select.css +84 -84
  115. package/components/skeleton/skeleton.css +14 -14
  116. package/components/slider/slider.css +46 -46
  117. package/components/spinner/class.js +69 -0
  118. package/components/spinner/spinner.a2ui.json +197 -0
  119. package/components/spinner/spinner.css +165 -0
  120. package/components/spinner/spinner.d.ts +26 -0
  121. package/components/spinner/spinner.examples.md +26 -0
  122. package/components/spinner/spinner.js +17 -0
  123. package/components/spinner/spinner.test.js +234 -0
  124. package/components/spinner/spinner.yaml +230 -0
  125. package/components/stack/stack.css +11 -11
  126. package/components/stat/stat.css +25 -25
  127. package/components/step-progress/step-progress.css +20 -20
  128. package/components/stepper/stepper.css +29 -29
  129. package/components/stream/stream.css +12 -12
  130. package/components/swatch/swatch.css +68 -68
  131. package/components/swiper/swiper.css +57 -57
  132. package/components/switch/switch.css +52 -52
  133. package/components/table/class.js +9 -0
  134. package/components/table/table.a2ui.json +1 -1
  135. package/components/table/table.css +162 -162
  136. package/components/table/table.d.ts +1 -1
  137. package/components/table/table.test.js +53 -0
  138. package/components/table/table.yaml +13 -1
  139. package/components/table-toolbar/table-toolbar.css +32 -32
  140. package/components/tabs/tabs.css +51 -51
  141. package/components/tag/tag.css +48 -48
  142. package/components/text/text.css +44 -44
  143. package/components/textarea/textarea.css +46 -46
  144. package/components/time-picker/class.js +693 -0
  145. package/components/time-picker/time-picker.a2ui.json +267 -0
  146. package/components/time-picker/time-picker.css +122 -0
  147. package/components/time-picker/time-picker.d.ts +75 -0
  148. package/components/time-picker/time-picker.examples.md +35 -0
  149. package/components/time-picker/time-picker.js +17 -0
  150. package/components/time-picker/time-picker.test.js +287 -0
  151. package/components/time-picker/time-picker.yaml +256 -0
  152. package/components/timeline/timeline.css +50 -50
  153. package/components/toast/toast.css +58 -58
  154. package/components/toggle-group/toggle-group.css +6 -6
  155. package/components/toggle-scheme/toggle-scheme.css +2 -2
  156. package/components/toolbar/toolbar.css +17 -17
  157. package/components/tooltip/tooltip.css +2 -2
  158. package/components/tree/tree.css +37 -37
  159. package/components/upload/upload.css +49 -49
  160. package/dist/icons-manifest.js +3 -3
  161. package/dist/web-components.min.css +1 -1
  162. package/dist/web-components.min.js +121 -83
  163. package/package.json +1 -1
  164. package/styles/components.css +8 -0
@@ -0,0 +1,300 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://adiaui.dev/a2ui/v0_9/components/DateRangePicker.json",
4
+ "title": "DateRangePicker",
5
+ "description": "Compound form primitive for selecting a start + end date pair with optional named preset shortcuts (\"Today\", \"Last 7 days\", \"This month\", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-picker-ui> twice; emits {from, to} ISO 8601 dates. Optional comparison-range mode emits a secondary range for analytics surfaces.",
6
+ "type": "object",
7
+ "allOf": [
8
+ {
9
+ "$ref": "common_types.json#/$defs/ComponentCommon"
10
+ },
11
+ {
12
+ "$ref": "common_types.json#/$defs/CatalogComponentCommon"
13
+ }
14
+ ],
15
+ "properties": {
16
+ "required": {
17
+ "description": "Required for validation when inside a `<form>`.",
18
+ "type": "boolean",
19
+ "default": false
20
+ },
21
+ "compareValue": {
22
+ "description": "Comparison range when `[comparison]` is set. Same `{from, to}` shape as `value`.",
23
+ "$ref": "common_types.json#/$defs/DynamicString"
24
+ },
25
+ "comparison": {
26
+ "description": "Enable comparison-range mode. Renders a second preset cluster and emits a secondary range under `<name>-compare`.",
27
+ "type": "boolean",
28
+ "default": false
29
+ },
30
+ "component": {
31
+ "const": "DateRangePicker"
32
+ },
33
+ "disabled": {
34
+ "description": "Block all interaction. Trigger remains rendered but does not open the popover.",
35
+ "type": "boolean",
36
+ "default": false
37
+ },
38
+ "format": {
39
+ "description": "Trigger button date format. `short`: `Jan 1, 2026`; `long`: `January 1, 2026`; `iso`: `2026-01-01`.",
40
+ "type": "string",
41
+ "enum": [
42
+ "short",
43
+ "long",
44
+ "iso"
45
+ ],
46
+ "default": "short"
47
+ },
48
+ "max": {
49
+ "description": "Latest selectable ISO date (inclusive). Days after are disabled in both panes.",
50
+ "type": "string",
51
+ "default": ""
52
+ },
53
+ "min": {
54
+ "description": "Earliest selectable ISO date (inclusive). Days before are disabled in both panes.",
55
+ "type": "string",
56
+ "default": ""
57
+ },
58
+ "name": {
59
+ "description": "Form field name for form data submission. The selected range serializes as JSON `{\"from\":\"...\",\"to\":\"...\"}` under this key.",
60
+ "type": "string",
61
+ "default": ""
62
+ },
63
+ "noPresets": {
64
+ "description": "Hide the preset side rail.",
65
+ "type": "boolean",
66
+ "default": false
67
+ },
68
+ "open": {
69
+ "description": "Whether the popover is currently open.",
70
+ "type": "boolean",
71
+ "default": false
72
+ },
73
+ "placeholder": {
74
+ "description": "Text shown in the trigger when the value is empty.",
75
+ "type": "string",
76
+ "default": "Select range"
77
+ },
78
+ "readonly": {
79
+ "description": "Block edits; allow keyboard navigation for screen-reader inspection.",
80
+ "type": "boolean",
81
+ "default": false
82
+ },
83
+ "value": {
84
+ "description": "Selected range as `{from, to}` ISO 8601 dates. Null when empty. Emitted on commit.",
85
+ "$ref": "common_types.json#/$defs/DynamicString"
86
+ }
87
+ },
88
+ "required": [
89
+ "component"
90
+ ],
91
+ "unevaluatedProperties": false,
92
+ "x-adiaui": {
93
+ "anti_patterns": [
94
+ {
95
+ "fix": "{\"component\": \"DateRangePicker\", \"value\": {\"from\": \"2026-01-01\", \"to\": \"2026-01-31\"}}\n",
96
+ "why": "`value` is a string, not an object. The contract is `{from, to}` ISO 8601 dates.\n",
97
+ "wrong": "{\"component\": \"DateRangePicker\", \"value\": \"2026-01-01 to 2026-01-31\"}\n"
98
+ },
99
+ {
100
+ "fix": "{\"component\": \"DateRangePicker\", \"value\": {\"from\": \"2026-01-01\", \"to\": \"2026-12-31\"}}\n",
101
+ "why": "Reversed range — `to < from`. This fires `invalid` and never commits.\n",
102
+ "wrong": "{\"component\": \"DateRangePicker\", \"value\": {\"from\": \"2026-12-31\", \"to\": \"2026-01-01\"}}\n"
103
+ },
104
+ {
105
+ "fix": "Use <date-range-picker-ui>.\n",
106
+ "why": "This is the pattern the primitive replaces. Reinvents linked-pane behavior,\nmisses preset rail, has no a11y range-announcement.\n",
107
+ "wrong": "Two adjacent <calendar-picker-ui> instances + JS synchronization.\n"
108
+ }
109
+ ],
110
+ "category": "input",
111
+ "composes": [
112
+ "calendar-grid-ui",
113
+ "button-ui",
114
+ "popover-ui",
115
+ "text-ui",
116
+ "divider-ui"
117
+ ],
118
+ "events": {
119
+ "change": {
120
+ "description": "Fired when the range commits (both `from` AND `to` selected, OR a preset clicked).",
121
+ "detail": {
122
+ "compareValue": "object",
123
+ "presetLabel": "string",
124
+ "value": "object"
125
+ }
126
+ },
127
+ "close": {
128
+ "description": "Popover closed (without commit, or after commit).",
129
+ "detail": {
130
+ "reason": "string"
131
+ }
132
+ },
133
+ "input": {
134
+ "description": "Fired during selection — e.g. user clicked `from` but has not yet picked `to`.",
135
+ "detail": {
136
+ "value": "object"
137
+ }
138
+ },
139
+ "invalid": {
140
+ "description": "A constraint failed (out of range, end < start).",
141
+ "detail": {
142
+ "reason": "string",
143
+ "value": "object"
144
+ }
145
+ },
146
+ "open": {
147
+ "description": "Popover opened (user clicked the trigger or pressed Enter / Space).",
148
+ "detail": {
149
+ "trigger": "string"
150
+ }
151
+ }
152
+ },
153
+ "examples": [
154
+ {
155
+ "description": "Form-field-wrapped picker with default presets.",
156
+ "a2ui": "[\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Report period\",\n \"children\": [\"dr\"]\n },\n {\n \"id\": \"dr\",\n \"component\": \"DateRangePicker\",\n \"name\": \"report-period\",\n \"min\": \"2026-01-01\",\n \"max\": \"2026-12-31\"\n }\n]\n",
157
+ "name": "canonical"
158
+ },
159
+ {
160
+ "description": "Analytics-surface picker with comparison range enabled.",
161
+ "a2ui": "[\n {\n \"id\": \"dr\",\n \"component\": \"DateRangePicker\",\n \"name\": \"period\",\n \"comparison\": true,\n \"value\": {\"from\": \"2026-05-01\", \"to\": \"2026-05-31\"},\n \"compareValue\": {\"from\": \"2026-04-01\", \"to\": \"2026-04-30\"}\n }\n]\n",
162
+ "name": "comparison"
163
+ },
164
+ {
165
+ "description": "Custom-only picker with the preset rail hidden.",
166
+ "a2ui": "[\n {\n \"id\": \"dr\",\n \"component\": \"DateRangePicker\",\n \"name\": \"period\",\n \"noPresets\": true\n }\n]\n",
167
+ "name": "no-presets"
168
+ }
169
+ ],
170
+ "keywords": [
171
+ "daterangepicker",
172
+ "date-range-picker",
173
+ "date-range",
174
+ "range",
175
+ "daterange",
176
+ "period",
177
+ "reporting-period"
178
+ ],
179
+ "name": "UIDateRangePicker",
180
+ "related": [
181
+ "calendar-picker",
182
+ "popover",
183
+ "field",
184
+ "button"
185
+ ],
186
+ "slots": {
187
+ "footer": {
188
+ "description": "Optional footer area below the calendars (e.g., \"Apply\" / \"Cancel\" buttons for explicit-commit flows)."
189
+ },
190
+ "presets": {
191
+ "description": "Custom preset content replacing the default preset rail."
192
+ },
193
+ "trigger": {
194
+ "description": "Custom trigger replacement. When omitted, a default `<button-ui>` is stamped."
195
+ }
196
+ },
197
+ "states": [
198
+ {
199
+ "description": "Closed, no pending selection.",
200
+ "name": "idle"
201
+ },
202
+ {
203
+ "description": "Popover open, user has not yet clicked a start date.",
204
+ "attribute": "open",
205
+ "name": "open-pending-from"
206
+ },
207
+ {
208
+ "description": "Start clicked, awaiting end click; hover preview active.",
209
+ "attribute": "open",
210
+ "name": "open-pending-to"
211
+ },
212
+ {
213
+ "description": "Both ends clicked, awaiting Apply (only in explicit-commit mode with `footer` slot).",
214
+ "attribute": "open",
215
+ "name": "open-committed"
216
+ },
217
+ {
218
+ "description": "Non-interactive; dimmed.",
219
+ "attribute": "disabled",
220
+ "name": "disabled"
221
+ },
222
+ {
223
+ "description": "Read-only; trigger keyboard-focusable but popover does not open.",
224
+ "attribute": "readonly",
225
+ "name": "readonly"
226
+ }
227
+ ],
228
+ "status": "experimental",
229
+ "synonyms": {
230
+ "period": [
231
+ "date-range",
232
+ "range",
233
+ "reporting-period"
234
+ ],
235
+ "range": [
236
+ "date-range",
237
+ "period",
238
+ "report-period"
239
+ ],
240
+ "tags": [
241
+ "DateRangePicker",
242
+ "DateRange",
243
+ "DateRangeInput"
244
+ ]
245
+ },
246
+ "tag": "date-range-picker-ui",
247
+ "tokens": {
248
+ "--date-range-picker-bg": {
249
+ "description": "Host background.",
250
+ "default": "var(--a-bg)"
251
+ },
252
+ "--date-range-picker-popover-bg": {
253
+ "description": "Popover background.",
254
+ "default": "var(--a-bg-subtle)"
255
+ },
256
+ "--date-range-picker-popover-border": {
257
+ "description": "Popover border color.",
258
+ "default": "var(--a-border-subtle)"
259
+ },
260
+ "--date-range-picker-popover-radius": {
261
+ "description": "Popover border radius.",
262
+ "default": "var(--a-radius-lg)"
263
+ },
264
+ "--date-range-picker-popover-shadow": {
265
+ "description": "Popover box shadow.",
266
+ "default": "var(--a-shadow-lg)"
267
+ },
268
+ "--date-range-picker-preset-bg": {
269
+ "description": "Preset row background (idle).",
270
+ "default": "transparent"
271
+ },
272
+ "--date-range-picker-preset-bg-hover": {
273
+ "description": "Preset row background on hover.",
274
+ "default": "var(--a-bg-hover)"
275
+ },
276
+ "--date-range-picker-preview-bg": {
277
+ "description": "In-range preview background (between from and pending to).",
278
+ "default": "var(--a-accent-muted)"
279
+ },
280
+ "--date-range-picker-px": {
281
+ "description": "Horizontal popover padding.",
282
+ "default": "var(--a-space-3)"
283
+ },
284
+ "--date-range-picker-py": {
285
+ "description": "Vertical popover padding.",
286
+ "default": "var(--a-space-2)"
287
+ },
288
+ "--date-range-picker-selected-bg": {
289
+ "description": "Selected day-cell background (cascaded into the inner calendar via --calendar-picker-day-bg-selected).",
290
+ "default": "var(--a-accent)"
291
+ },
292
+ "--date-range-picker-selected-fg": {
293
+ "description": "Selected day-cell foreground.",
294
+ "default": "var(--a-accent-fg)"
295
+ }
296
+ },
297
+ "traits": [],
298
+ "version": 1
299
+ }
300
+ }
@@ -0,0 +1,178 @@
1
+ /* ============================================================
2
+ date-range-picker — two-block @scope per ADR-0003.
3
+ Block 1 (TOKENS): :where(:scope) — token defaults.
4
+ Block 2 (BASE): :scope + descendant selectors.
5
+ Popover surfaces live OUTSIDE @scope because the Popover API
6
+ lifts them into the top layer; custom-property inheritance
7
+ still cascades from the host so --date-range-picker-* tokens
8
+ reach the popover.
9
+ ============================================================ */
10
+
11
+ @scope (date-range-picker-ui) {
12
+ /* ── Block 1 — TOKENS ── */
13
+ :where(:scope) {
14
+ --date-range-picker-bg-default: var(--a-bg);
15
+ --date-range-picker-fg-default: var(--a-fg);
16
+
17
+ /* Popover surface */
18
+ --date-range-picker-popover-bg-default: var(--a-bg-subtle);
19
+ --date-range-picker-popover-border-default: var(--a-border-subtle);
20
+ --date-range-picker-popover-radius-default: var(--a-radius-lg);
21
+ --date-range-picker-popover-shadow-default: var(--a-shadow-lg);
22
+ --date-range-picker-popover-padding-default: var(--a-space-3);
23
+ --date-range-picker-popover-gap-default: var(--a-space-3);
24
+
25
+ /* Preset rail */
26
+ --date-range-picker-preset-bg-default: transparent;
27
+ --date-range-picker-preset-bg-hover-default: var(--a-bg-hover);
28
+ --date-range-picker-preset-min-width-default: 10em;
29
+ --date-range-picker-preset-gap-default: var(--a-space-1);
30
+
31
+ /* Selected / preview day cells (cascade into calendar) */
32
+ --date-range-picker-selected-bg-default: var(--a-accent);
33
+ --date-range-picker-selected-fg-default: var(--a-accent-fg);
34
+ --date-range-picker-preview-bg-default: var(--a-accent-muted);
35
+
36
+ /* Trigger */
37
+ --date-range-picker-trigger-min-width-default: 14em;
38
+
39
+ /* Padding */
40
+ --date-range-picker-px-default: var(--a-space-3);
41
+ --date-range-picker-py-default: var(--a-space-2);
42
+
43
+ /* Motion */
44
+ --date-range-picker-duration-default: var(--a-duration-fast);
45
+ --date-range-picker-easing-default: var(--a-easing);
46
+ }
47
+
48
+ /* ── Block 2 — BASE ── */
49
+ :scope {
50
+ box-sizing: border-box;
51
+ position: relative;
52
+ display: inline-block;
53
+ background: var(--date-range-picker-bg, var(--date-range-picker-bg-default));
54
+ color: var(--date-range-picker-fg, var(--date-range-picker-fg-default));
55
+ font-size: var(--a-ui-size);
56
+ }
57
+
58
+ /* Default trigger sizing — composes button-ui's surface; just
59
+ stretches the min-width so the formatted-range label fits. */
60
+ :scope > [slot="trigger"] {
61
+ min-width: var(--date-range-picker-trigger-min-width, var(--date-range-picker-trigger-min-width-default));
62
+ }
63
+
64
+ /* States */
65
+ :scope[disabled] {
66
+ opacity: 0.5;
67
+ pointer-events: none;
68
+ }
69
+ :scope[readonly] > [slot="trigger"] {
70
+ cursor: default;
71
+ }
72
+ }
73
+
74
+ /* ============================================================
75
+ Popover surface — outside @scope (lifted to top layer).
76
+ Custom properties inherit from the host so
77
+ --date-range-picker-* tokens are available here.
78
+ ============================================================ */
79
+
80
+ /* §FB-Wave1-QA — `display: grid` MUST be guarded by `:popover-open` so the
81
+ popover honors the UA `popover` `display: none` while closed. Without
82
+ the guard, the popover renders in normal flow on first paint. Mirrors
83
+ the popover-ui pattern that uses `:not(:popover-open) { display: none }`. */
84
+ date-range-picker-ui [slot="popover"] {
85
+ margin: 0;
86
+ padding: var(--date-range-picker-py, var(--date-range-picker-py-default)) var(--date-range-picker-px, var(--date-range-picker-px-default));
87
+ border: 1px solid var(--date-range-picker-popover-border, var(--date-range-picker-popover-border-default));
88
+ border-radius: var(--date-range-picker-popover-radius, var(--date-range-picker-popover-radius-default));
89
+ background: var(--date-range-picker-popover-bg, var(--date-range-picker-popover-bg-default));
90
+ box-shadow: var(--date-range-picker-popover-shadow, var(--date-range-picker-popover-shadow-default));
91
+ color: var(--a-fg);
92
+ /* Anchor-positioning fallback — popover.css and anchor.js handle
93
+ placement; layout here just sets the grid. */
94
+ inset: auto;
95
+ /* Fade + lift in on first paint via @starting-style. */
96
+ opacity: 1;
97
+ translate: 0 0;
98
+ transition:
99
+ opacity var(--date-range-picker-duration, var(--date-range-picker-duration-default)) var(--date-range-picker-easing, var(--date-range-picker-easing-default)),
100
+ translate var(--date-range-picker-duration, var(--date-range-picker-duration-default)) var(--date-range-picker-easing, var(--date-range-picker-easing-default));
101
+ }
102
+
103
+ date-range-picker-ui [slot="popover"]:popover-open {
104
+ display: grid;
105
+ grid-template-columns: auto 1fr;
106
+ gap: var(--date-range-picker-popover-gap, var(--date-range-picker-popover-gap-default));
107
+ }
108
+
109
+ date-range-picker-ui [slot="popover"]:popover-open {
110
+ @starting-style {
111
+ opacity: 0;
112
+ translate: 0 -4px;
113
+ }
114
+ }
115
+
116
+ @media (prefers-reduced-motion: reduce) {
117
+ date-range-picker-ui [slot="popover"] { transition: none; }
118
+ }
119
+
120
+ /* Preset rail — single-column flex of button-ui buttons. */
121
+ date-range-picker-ui [data-preset-rail],
122
+ date-range-picker-ui [slot="presets"] {
123
+ grid-column: 1;
124
+ display: flex;
125
+ flex-direction: column;
126
+ align-items: stretch;
127
+ gap: var(--date-range-picker-preset-gap, var(--date-range-picker-preset-gap-default));
128
+ min-width: var(--date-range-picker-preset-min-width, var(--date-range-picker-preset-min-width-default));
129
+ }
130
+
131
+ /* When [no-presets] is set OR no preset rail exists, collapse the
132
+ grid to a single column. */
133
+ date-range-picker-ui[no-presets] [slot="popover"],
134
+ date-range-picker-ui [slot="popover"]:not(:has([data-preset-rail])):not(:has([slot="presets"])) {
135
+ grid-template-columns: 1fr;
136
+ }
137
+
138
+ date-range-picker-ui [data-preset-rail] button-ui {
139
+ justify-content: flex-start;
140
+ }
141
+
142
+ /* Calendar area — horizontal layout of two calendar panes. */
143
+ date-range-picker-ui [data-calendar-area] {
144
+ grid-column: 2;
145
+ display: flex;
146
+ gap: var(--a-space-3);
147
+ align-items: flex-start;
148
+ }
149
+
150
+ date-range-picker-ui [data-calendar-area] calendar-grid-ui {
151
+ flex: 0 0 auto;
152
+ }
153
+
154
+ /* Cascade range-aware tokens into the inner calendar panes so the
155
+ linked-range coloring uses the date-range-picker palette.
156
+ §FB-Wave1-QA — now consumes calendar-grid-ui tokens (the extracted
157
+ substrate primitive). */
158
+ date-range-picker-ui calendar-grid-ui {
159
+ --calendar-grid-day-bg-selected: var(--date-range-picker-selected-bg, var(--date-range-picker-selected-bg-default));
160
+ --calendar-grid-day-fg-selected: var(--date-range-picker-selected-fg, var(--date-range-picker-selected-fg-default));
161
+ --calendar-grid-day-bg-hover: var(--date-range-picker-preview-bg, var(--date-range-picker-preview-bg-default));
162
+ }
163
+
164
+ /* Comparison mode — split preset rail visual via the divider. */
165
+ date-range-picker-ui[comparison] [data-preset-rail] [data-preset-divider] {
166
+ margin-block: var(--a-space-1);
167
+ }
168
+
169
+ /* Footer area (author-supplied [slot="footer"]) — spans both columns
170
+ under the calendar area. */
171
+ date-range-picker-ui [slot="footer"] {
172
+ grid-column: 1 / -1;
173
+ display: flex;
174
+ justify-content: flex-end;
175
+ gap: var(--a-space-2);
176
+ padding-block-start: var(--a-space-2);
177
+ border-block-start: 1px solid var(--a-border-subtle);
178
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * `<date-range-picker-ui>` — Compound form primitive for selecting a start + end date pair with optional named preset shortcuts ("Today", "Last 7 days", "This month", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-picker-ui> twice; emits {from, to} ISO 8601 dates. Optional comparison-range mode emits a secondary range for analytics surfaces.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/date-range-picker
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar(s). Edit the source `.yaml`,
8
+ * run `npm run build:components`, then `npm run codegen:dts` to
9
+ * regenerate; or hand-author this file fully if rich event types are
10
+ * needed beyond what the yaml `events:` block can express.
11
+ */
12
+
13
+ import { UIElement } from '../../core/element.js';
14
+
15
+ export interface DateRangePickerChangeEventDetail {
16
+ compareValue: string;
17
+ presetLabel: string;
18
+ value: string;
19
+ }
20
+
21
+ export type DateRangePickerChangeEvent = CustomEvent<DateRangePickerChangeEventDetail>;
22
+ export interface DateRangePickerCloseEventDetail {
23
+ reason: string;
24
+ }
25
+
26
+ export type DateRangePickerCloseEvent = CustomEvent<DateRangePickerCloseEventDetail>;
27
+ export interface DateRangePickerInputEventDetail {
28
+ value: string;
29
+ }
30
+
31
+ export type DateRangePickerInputEvent = CustomEvent<DateRangePickerInputEventDetail>;
32
+ export interface DateRangePickerInvalidEventDetail {
33
+ reason: string;
34
+ value: string;
35
+ }
36
+
37
+ export type DateRangePickerInvalidEvent = CustomEvent<DateRangePickerInvalidEventDetail>;
38
+ export interface DateRangePickerOpenEventDetail {
39
+ trigger: string;
40
+ }
41
+
42
+ export type DateRangePickerOpenEvent = CustomEvent<DateRangePickerOpenEventDetail>;
43
+
44
+ export class UIDateRangePicker extends UIElement {
45
+ /** Required for validation when inside a `<form>`. */
46
+ required: boolean;
47
+ /** Comparison range when `[comparison]` is set. Same `{from, to}` shape as `value`. */
48
+ compareValue: string;
49
+ /** Enable comparison-range mode. Renders a second preset cluster and emits a secondary range under `<name>-compare`. */
50
+ comparison: boolean;
51
+ /** Block all interaction. Trigger remains rendered but does not open the popover. */
52
+ disabled: boolean;
53
+ /** Trigger button date format. `short`: `Jan 1, 2026`; `long`: `January 1, 2026`; `iso`: `2026-01-01`. */
54
+ format: 'short' | 'long' | 'iso';
55
+ /** Latest selectable ISO date (inclusive). Days after are disabled in both panes. */
56
+ max: string;
57
+ /** Earliest selectable ISO date (inclusive). Days before are disabled in both panes. */
58
+ min: string;
59
+ /** Form field name for form data submission. The selected range serializes as JSON `{"from":"...","to":"..."}` under this key. */
60
+ name: string;
61
+ /** Hide the preset side rail. */
62
+ noPresets: boolean;
63
+ /** Whether the popover is currently open. */
64
+ open: boolean;
65
+ /** Text shown in the trigger when the value is empty. */
66
+ placeholder: string;
67
+ /** Block edits; allow keyboard navigation for screen-reader inspection. */
68
+ readonly: boolean;
69
+ /** Selected range as `{from, to}` ISO 8601 dates. Null when empty. Emitted on commit. */
70
+ value: string;
71
+
72
+ addEventListener<K extends keyof HTMLElementEventMap>(
73
+ type: K,
74
+ listener: (this: UIDateRangePicker, ev: HTMLElementEventMap[K]) => unknown,
75
+ options?: boolean | AddEventListenerOptions,
76
+ ): void;
77
+ addEventListener(type: 'change', listener: (ev: DateRangePickerChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
78
+ addEventListener(type: 'close', listener: (ev: DateRangePickerCloseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
79
+ addEventListener(type: 'input', listener: (ev: DateRangePickerInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
80
+ addEventListener(type: 'invalid', listener: (ev: DateRangePickerInvalidEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
81
+ addEventListener(type: 'open', listener: (ev: DateRangePickerOpenEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
82
+ }
@@ -0,0 +1,37 @@
1
+ # date-range-picker — Examples
2
+
3
+ ## Canonical
4
+
5
+ ```html
6
+ <field-ui label="Report period">
7
+ <date-range-picker-ui
8
+ name="report-period"
9
+ min="2026-01-01"
10
+ max="2026-12-31">
11
+ </date-range-picker-ui>
12
+ </field-ui>
13
+ ```
14
+
15
+ ## Comparison mode
16
+
17
+ ```html
18
+ <date-range-picker-ui
19
+ name="period"
20
+ comparison
21
+ value='{"from":"2026-05-01","to":"2026-05-31"}'
22
+ compare-value='{"from":"2026-04-01","to":"2026-04-30"}'>
23
+ </date-range-picker-ui>
24
+ ```
25
+
26
+ ## Custom presets
27
+
28
+ ```html
29
+ <date-range-picker-ui id="dr" name="period"></date-range-picker-ui>
30
+ <script>
31
+ document.getElementById('dr').presets = [
32
+ { label: 'Q1', range: { from: '2026-01-01', to: '2026-03-31' } },
33
+ { label: 'Q2', range: { from: '2026-04-01', to: '2026-06-30' } },
34
+ { label: 'YTD', range: { from: '2026-01-01', to: '2026-05-24' } },
35
+ ];
36
+ </script>
37
+ ```
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `<date-range-picker-ui>` — auto-registers the tag on import.
3
+ *
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UIDateRangePicker } from '@adia-ai/web-components/components/date-range-picker/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
10
+ */
11
+
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIDateRangePicker } from './class.js';
14
+
15
+ defineIfFree('date-range-picker-ui', UIDateRangePicker);
16
+
17
+ export { UIDateRangePicker };