@adia-ai/web-components 0.6.33 → 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 (157) hide show
  1. package/CHANGELOG.md +22 -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 +28 -28
  63. package/components/fields/fields.css +5 -5
  64. package/components/grid/grid.css +5 -5
  65. package/components/heatmap/heatmap.css +63 -63
  66. package/components/icon/icon.css +12 -12
  67. package/components/image/image.css +14 -14
  68. package/components/index.js +8 -0
  69. package/components/input/input.css +66 -66
  70. package/components/inspector/inspector.css +6 -6
  71. package/components/integration-card/class.js +410 -0
  72. package/components/integration-card/integration-card.a2ui.json +268 -0
  73. package/components/integration-card/integration-card.css +169 -0
  74. package/components/integration-card/integration-card.d.ts +63 -0
  75. package/components/integration-card/integration-card.examples.md +41 -0
  76. package/components/integration-card/integration-card.js +17 -0
  77. package/components/integration-card/integration-card.test.js +306 -0
  78. package/components/integration-card/integration-card.yaml +280 -0
  79. package/components/kbd/kbd.css +32 -32
  80. package/components/link/link.css +12 -12
  81. package/components/list/list.css +8 -8
  82. package/components/list-window/class.js +688 -0
  83. package/components/list-window/list-window.a2ui.json +277 -0
  84. package/components/list-window/list-window.css +124 -0
  85. package/components/list-window/list-window.d.ts +84 -0
  86. package/components/list-window/list-window.examples.md +73 -0
  87. package/components/list-window/list-window.js +17 -0
  88. package/components/list-window/list-window.test.js +303 -0
  89. package/components/list-window/list-window.yaml +270 -0
  90. package/components/menu/menu.css +8 -8
  91. package/components/modal/modal.css +43 -43
  92. package/components/nav/nav.css +40 -40
  93. package/components/nav-group/nav-group.css +52 -52
  94. package/components/nav-item/nav-item.css +44 -44
  95. package/components/noodles/noodles.css +31 -31
  96. package/components/option-card/option-card.css +69 -69
  97. package/components/otp-input/otp-input.css +30 -30
  98. package/components/page/page.css +18 -18
  99. package/components/pagination/pagination.css +61 -61
  100. package/components/pane/pane.css +57 -57
  101. package/components/pipeline-status/pipeline-status.css +65 -65
  102. package/components/popover/popover.css +17 -17
  103. package/components/progress/progress.css +23 -23
  104. package/components/progress-row/progress-row.css +17 -17
  105. package/components/radio/radio.css +39 -39
  106. package/components/range/range.css +55 -55
  107. package/components/rating/rating.css +28 -28
  108. package/components/richtext/richtext.css +133 -133
  109. package/components/row/row.css +19 -19
  110. package/components/search/search.css +5 -5
  111. package/components/segment/segment.css +24 -24
  112. package/components/segmented/segmented.css +25 -25
  113. package/components/select/select.css +84 -84
  114. package/components/skeleton/skeleton.css +14 -14
  115. package/components/slider/slider.css +46 -46
  116. package/components/spinner/class.js +69 -0
  117. package/components/spinner/spinner.a2ui.json +197 -0
  118. package/components/spinner/spinner.css +165 -0
  119. package/components/spinner/spinner.d.ts +26 -0
  120. package/components/spinner/spinner.examples.md +26 -0
  121. package/components/spinner/spinner.js +17 -0
  122. package/components/spinner/spinner.test.js +234 -0
  123. package/components/spinner/spinner.yaml +230 -0
  124. package/components/stack/stack.css +11 -11
  125. package/components/stat/stat.css +25 -25
  126. package/components/step-progress/step-progress.css +20 -20
  127. package/components/stepper/stepper.css +29 -29
  128. package/components/stream/stream.css +12 -12
  129. package/components/swatch/swatch.css +68 -68
  130. package/components/swiper/swiper.css +57 -57
  131. package/components/switch/switch.css +52 -52
  132. package/components/table/table.css +162 -162
  133. package/components/table-toolbar/table-toolbar.css +32 -32
  134. package/components/tabs/tabs.css +51 -51
  135. package/components/tag/tag.css +48 -48
  136. package/components/text/text.css +44 -44
  137. package/components/textarea/textarea.css +46 -46
  138. package/components/time-picker/class.js +693 -0
  139. package/components/time-picker/time-picker.a2ui.json +267 -0
  140. package/components/time-picker/time-picker.css +122 -0
  141. package/components/time-picker/time-picker.d.ts +75 -0
  142. package/components/time-picker/time-picker.examples.md +35 -0
  143. package/components/time-picker/time-picker.js +17 -0
  144. package/components/time-picker/time-picker.test.js +287 -0
  145. package/components/time-picker/time-picker.yaml +256 -0
  146. package/components/timeline/timeline.css +50 -50
  147. package/components/toast/toast.css +58 -58
  148. package/components/toggle-group/toggle-group.css +6 -6
  149. package/components/toggle-scheme/toggle-scheme.css +2 -2
  150. package/components/toolbar/toolbar.css +17 -17
  151. package/components/tooltip/tooltip.css +2 -2
  152. package/components/tree/tree.css +37 -37
  153. package/components/upload/upload.css +49 -49
  154. package/dist/web-components.min.css +1 -1
  155. package/dist/web-components.min.js +121 -83
  156. package/package.json +1 -1
  157. package/styles/components.css +8 -0
@@ -0,0 +1,280 @@
1
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
2
+ name: UIIntegrationCard
3
+ tag: integration-card-ui
4
+ status: stable
5
+ component: IntegrationCard
6
+ category: display
7
+ version: 1
8
+ description: >-
9
+ Single-tile primitive representing one third-party integration
10
+ (Slack, GitHub, Stripe, …). Shows the provider logo + name +
11
+ description + status pill + a single primary action button whose
12
+ label and variant are derived from `status`. Composes into a grid
13
+ via the SPEC-063 integrations-page composite. One tile = one
14
+ provider; the button variant is computed from `status`, not a
15
+ separate prop. Distinct from <option-card-ui> (a single-select
16
+ radio with no status / async action) and <card-ui> (the generic
17
+ bordered surface this specializes).
18
+ # Per ADR-0027 — primitives that programmatically create other primitives
19
+ # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
20
+ composes:
21
+ - icon-ui
22
+ - badge-ui
23
+ - button-ui
24
+ props:
25
+ provider:
26
+ description: Provider key — `slack`, `github`, etc. — used for analytics + a11y label. Required.
27
+ type: string
28
+ default: ""
29
+ required: true
30
+ reflect: true
31
+ name:
32
+ description: Display name shown as the card title. Required.
33
+ type: string
34
+ default: ""
35
+ required: true
36
+ logo:
37
+ description: Logo URL (preferred — renders as <img>) or icon name (renders as <icon-ui>). URLs are sniffed by presence of `/`.
38
+ type: string
39
+ default: ""
40
+ description:
41
+ description: One-line description of what the integration does.
42
+ type: string
43
+ default: ""
44
+ status:
45
+ description: Current connection state — drives the button label, variant, and visibility. `available` shows a primary `Connect`; `connected` shows an outline `Configure`; `error` shows an outline `Retry`; `pending` shows a non-interactive spinner; `coming-soon` hides the button.
46
+ type: string
47
+ default: available
48
+ enum:
49
+ - available
50
+ - connected
51
+ - error
52
+ - pending
53
+ - coming-soon
54
+ reflect: true
55
+ dynamic: true
56
+ error-message:
57
+ description: When `status="error"`, the message to show below the description. Ignored for other statuses.
58
+ type: string
59
+ default: ""
60
+ dynamic: true
61
+ disabled:
62
+ description: Disables the action button.
63
+ type: boolean
64
+ default: false
65
+ reflect: true
66
+ events:
67
+ connect:
68
+ description: Fired when the user clicks the action button while `status="available"`.
69
+ detail:
70
+ provider:
71
+ type: string
72
+ description: The provider key for this card.
73
+ configure:
74
+ description: Fired when the user clicks the action button while `status="connected"`.
75
+ detail:
76
+ provider:
77
+ type: string
78
+ description: The provider key for this card.
79
+ disconnect:
80
+ description: Fired when the consumer wires a `<menu-ui slot="actions">` overflow with a `disconnect` item. The card does not stamp this menu — it bubbles whatever consumer markup dispatches.
81
+ detail:
82
+ provider:
83
+ type: string
84
+ description: The provider key for this card.
85
+ retry:
86
+ description: Fired when the user clicks the action button while `status="error"`.
87
+ detail:
88
+ provider:
89
+ type: string
90
+ description: The provider key for this card.
91
+ slots:
92
+ default:
93
+ description: Optional override for the description. When a non-empty default slot is provided it supersedes the `description` prop.
94
+ actions:
95
+ description: Optional secondary actions — typically a <menu-ui> overflow carrying `Reauthenticate` / `Disconnect` entries. Collapses when empty.
96
+ states:
97
+ - name: idle
98
+ description: Default — `[status="available"]`.
99
+ - name: available
100
+ description: Ready to connect.
101
+ attribute: status="available"
102
+ - name: connected
103
+ description: Linked — success-tinted border, check badge, outline `Configure` button.
104
+ attribute: status="connected"
105
+ - name: error
106
+ description: Connection failed — danger-tinted border, error message visible, outline `Retry` button.
107
+ attribute: status="error"
108
+ - name: pending
109
+ description: Awaiting response — button shows spinner, non-interactive.
110
+ attribute: status="pending"
111
+ - name: coming-soon
112
+ description: Listed but not yet enabled — opacity reduced, button hidden, "Coming soon" badge shown.
113
+ attribute: status="coming-soon"
114
+ - name: disabled
115
+ description: Non-interactive; dimmed.
116
+ attribute: disabled
117
+ traits: []
118
+ tokens:
119
+ --integration-card-bg:
120
+ description: Card background. Defaults to `--a-bg`.
121
+ --integration-card-border:
122
+ description: Card border color. Defaults to `--a-border`.
123
+ --integration-card-radius:
124
+ description: Card corner radius. Defaults to `--a-radius-md`.
125
+ --integration-card-px:
126
+ description: Horizontal padding. Defaults to `--a-space-4`.
127
+ --integration-card-py:
128
+ description: Vertical padding. Defaults to `--a-space-4`.
129
+ --integration-card-gap:
130
+ description: Vertical rhythm between header / body / footer.
131
+ --integration-card-logo-size:
132
+ description: Logo square dimension. Defaults to `--a-space-7`.
133
+ --integration-card-heading-fg:
134
+ description: Provider name color.
135
+ --integration-card-description-fg:
136
+ description: Description text color.
137
+ --integration-card-error-fg:
138
+ description: Error-message text color (used when `status="error"`).
139
+ requiredIcons:
140
+ - check
141
+ - warning-circle
142
+ - arrow-clockwise
143
+ a2ui:
144
+ rules:
145
+ - >-
146
+ Use <integration-card-ui> for one tile in an integrations grid.
147
+ Set `provider` and `name` — both are required for analytics
148
+ keys and the accessible name. Set `description` so users
149
+ don't have to look the integration up externally.
150
+ - >-
151
+ `status` MUST be one of `available | connected | error |
152
+ pending | coming-soon`. The button label and variant are
153
+ DERIVED from `status` — never slot a <button-ui> directly in
154
+ the card body. Use the `actions` slot for an overflow
155
+ <menu-ui> with secondary actions like Reauthenticate or
156
+ Disconnect.
157
+ - >-
158
+ When `status="error"`, set `error-message` — otherwise the
159
+ user sees a Retry button with no context. The message renders
160
+ below the description in danger-text color.
161
+ - >-
162
+ `logo` accepts a URL (containing `/`, renders as <img>) or a
163
+ registered icon name (renders as <icon-ui>). Don't mix — one
164
+ provider gets one logo source.
165
+ - >-
166
+ Group integration cards in <grid-ui columns="auto-fit"> or
167
+ use <integrations-page-ui> (SPEC-063) for the canonical
168
+ Settings-panel grid. Never nest <card-ui> around an
169
+ <integration-card-ui> — it IS a card variant.
170
+ anti_patterns:
171
+ - wrong: |
172
+ {"component": "IntegrationCard", "provider": "slack",
173
+ "children": [{"component": "Button", "label": "Connect"}]}
174
+ why: |
175
+ Manually slotting a Button bypasses the card's status-driven
176
+ button semantics. The card renders its own button AND the
177
+ slotted one, producing two actions side-by-side.
178
+ fix: |
179
+ {"component": "IntegrationCard", "provider": "slack",
180
+ "name": "Slack", "status": "available"}
181
+ - wrong: |
182
+ {"component": "Card", "children": [
183
+ {"component": "Image", "src": "/slack.svg"},
184
+ {"component": "Text", "value": "Slack"},
185
+ {"component": "Button", "label": "Connect"}]}
186
+ why: |
187
+ Re-implements IntegrationCard with primitives. Loses status
188
+ badge semantics, accessible-name wiring, and the typed
189
+ connect/configure events.
190
+ fix: |
191
+ {"component": "IntegrationCard", "provider": "slack",
192
+ "name": "Slack", "logo": "/slack.svg", "status": "available"}
193
+ examples:
194
+ - name: available
195
+ description: Available integration with logo, description, and primary Connect button.
196
+ a2ui: >-
197
+ {
198
+ "id": "card-slack",
199
+ "component": "IntegrationCard",
200
+ "provider": "slack",
201
+ "name": "Slack",
202
+ "logo": "/integrations/slack.svg",
203
+ "description": "Send AI replies and notifications to channels.",
204
+ "status": "available"
205
+ }
206
+ - name: connected
207
+ description: Connected integration with success badge and outline Configure button.
208
+ a2ui: >-
209
+ {
210
+ "id": "card-github",
211
+ "component": "IntegrationCard",
212
+ "provider": "github",
213
+ "name": "GitHub",
214
+ "logo": "/integrations/github.svg",
215
+ "description": "Sync issues and pull requests.",
216
+ "status": "connected"
217
+ }
218
+ - name: error
219
+ description: Error integration with danger badge, error message, and Retry button.
220
+ a2ui: >-
221
+ {
222
+ "id": "card-stripe",
223
+ "component": "IntegrationCard",
224
+ "provider": "stripe",
225
+ "name": "Stripe",
226
+ "description": "Charge customers and reconcile invoices.",
227
+ "status": "error",
228
+ "error-message": "Token expired — re-authenticate."
229
+ }
230
+ - name: coming-soon
231
+ description: Coming-soon integration with no action button.
232
+ a2ui: >-
233
+ {
234
+ "id": "card-zapier",
235
+ "component": "IntegrationCard",
236
+ "provider": "zapier",
237
+ "name": "Zapier",
238
+ "description": "Trigger Zaps from AdiaUI events.",
239
+ "status": "coming-soon"
240
+ }
241
+ keywords:
242
+ - integration
243
+ - connect
244
+ - provider
245
+ - slack
246
+ - github
247
+ - stripe
248
+ - oauth
249
+ - third-party
250
+ - settings
251
+ - integrations
252
+ - card
253
+ - tile
254
+ synonyms:
255
+ integration:
256
+ - integration
257
+ - connect
258
+ - provider
259
+ - third-party
260
+ connect:
261
+ - integration
262
+ - oauth
263
+ - connection
264
+ provider:
265
+ - integration
266
+ - third-party
267
+ - service
268
+ oauth:
269
+ - integration
270
+ - connect
271
+ - auth
272
+ settings:
273
+ - settings
274
+ - integration
275
+ - account
276
+ related:
277
+ - card
278
+ - badge
279
+ - button
280
+ - menu
@@ -1,28 +1,28 @@
1
1
  @scope (kbd-ui) {
2
2
  :where(:scope) {
3
3
  /* ── Tokens ── */
4
- --kbd-bg: var(--a-bg-muted);
5
- --kbd-fg: var(--a-fg);
6
- --kbd-border: var(--a-border-subtle);
7
- --kbd-radius: var(--a-radius-sm);
8
- --kbd-font: var(--a-font-family-code);
4
+ --kbd-bg-default: var(--a-bg-muted);
5
+ --kbd-fg-default: var(--a-fg);
6
+ --kbd-border-default: var(--a-border-subtle);
7
+ --kbd-radius-default: var(--a-radius-sm);
8
+ --kbd-font-default: var(--a-font-family-code);
9
9
 
10
10
  /* Size — defaults to md */
11
- --kbd-font-size: var(--a-ui-tiny);
12
- --kbd-height: 1.25rem;
13
- --kbd-min-width: 1.25rem;
14
- --kbd-px: var(--a-space-1);
15
- --kbd-weight: var(--a-weight-medium);
11
+ --kbd-font-size-default: var(--a-ui-tiny);
12
+ --kbd-height-default: 1.25rem;
13
+ --kbd-min-width-default: 1.25rem;
14
+ --kbd-px-default: var(--a-space-1);
15
+ --kbd-weight-default: var(--a-weight-medium);
16
16
 
17
17
  /* Size: sm */
18
- --kbd-font-size-sm: var(--a-ui-tiny);
19
- --kbd-height-sm: 1rem;
20
- --kbd-min-width-sm: 1rem;
18
+ --kbd-font-size-sm-default: var(--a-ui-tiny);
19
+ --kbd-height-sm-default: 1rem;
20
+ --kbd-min-width-sm-default: 1rem;
21
21
 
22
22
  /* Size: lg */
23
- --kbd-font-size-lg: var(--a-ui-sm);
24
- --kbd-height-lg: 1.5rem;
25
- --kbd-min-width-lg: 1.5rem;
23
+ --kbd-font-size-lg-default: var(--a-ui-sm);
24
+ --kbd-height-lg-default: 1.5rem;
25
+ --kbd-min-width-lg-default: 1.5rem;
26
26
  text-align: start; /* §text-align-reset — blocks inheritance from centered ancestors */
27
27
  }
28
28
 
@@ -32,18 +32,18 @@
32
32
  display: inline-flex;
33
33
  align-items: center;
34
34
  justify-content: center;
35
- min-width: var(--kbd-min-width);
36
- height: var(--kbd-height);
37
- padding-inline: var(--kbd-px);
38
- font-family: var(--kbd-font);
39
- font-size: var(--kbd-font-size);
40
- font-weight: var(--kbd-weight);
35
+ min-width: var(--kbd-min-width, var(--kbd-min-width-default));
36
+ height: var(--kbd-height, var(--kbd-height-default));
37
+ padding-inline: var(--kbd-px, var(--kbd-px-default));
38
+ font-family: var(--kbd-font, var(--kbd-font-default));
39
+ font-size: var(--kbd-font-size, var(--kbd-font-size-default));
40
+ font-weight: var(--kbd-weight, var(--kbd-weight-default));
41
41
  line-height: 1;
42
- color: var(--kbd-fg);
43
- background: var(--kbd-bg);
44
- border: 1px solid var(--kbd-border);
42
+ color: var(--kbd-fg, var(--kbd-fg-default));
43
+ background: var(--kbd-bg, var(--kbd-bg-default));
44
+ border: 1px solid var(--kbd-border, var(--kbd-border-default));
45
45
  border-bottom-width: 2px;
46
- border-radius: var(--kbd-radius);
46
+ border-radius: var(--kbd-radius, var(--kbd-radius-default));
47
47
  vertical-align: middle;
48
48
  white-space: nowrap;
49
49
  user-select: none;
@@ -51,13 +51,13 @@
51
51
 
52
52
  /* Sizes */
53
53
  :scope[size="sm"] {
54
- --kbd-font-size: var(--kbd-font-size-sm);
55
- --kbd-height: var(--kbd-height-sm);
56
- --kbd-min-width: var(--kbd-min-width-sm);
54
+ --kbd-font-size-default: var(--kbd-font-size-sm, var(--kbd-font-size-sm-default));
55
+ --kbd-height-default: var(--kbd-height-sm, var(--kbd-height-sm-default));
56
+ --kbd-min-width-default: var(--kbd-min-width-sm, var(--kbd-min-width-sm-default));
57
57
  }
58
58
  :scope[size="lg"] {
59
- --kbd-font-size: var(--kbd-font-size-lg);
60
- --kbd-height: var(--kbd-height-lg);
61
- --kbd-min-width: var(--kbd-min-width-lg);
59
+ --kbd-font-size-default: var(--kbd-font-size-lg, var(--kbd-font-size-lg-default));
60
+ --kbd-height-default: var(--kbd-height-lg, var(--kbd-height-lg-default));
61
+ --kbd-min-width-default: var(--kbd-min-width-lg, var(--kbd-min-width-lg-default));
62
62
  }
63
63
  }
@@ -7,16 +7,16 @@
7
7
 
8
8
  @scope (link-ui) {
9
9
  :where(:scope) {
10
- --link-fg: var(--a-link);
11
- --link-fg-hover: var(--a-link-hover);
12
- --link-fg-visited: var(--a-link-visited);
13
- --link-underline-offset: 2px;
14
- --link-focus-ring: var(--a-focus-ring);
10
+ --link-fg-default: var(--a-link);
11
+ --link-fg-hover-default: var(--a-link-hover);
12
+ --link-fg-visited-default: var(--a-link-visited);
13
+ --link-underline-offset-default: 2px;
14
+ --link-focus-ring-default: var(--a-focus-ring);
15
15
  }
16
16
 
17
17
  :scope {
18
18
  display: inline;
19
- color: var(--link-fg);
19
+ color: var(--link-fg, var(--link-fg-default));
20
20
  /* The text-decoration is on the inner <a>, not the host, so that
21
21
  host-level color overrides cascade correctly. */
22
22
  }
@@ -24,7 +24,7 @@
24
24
  :scope > a {
25
25
  color: inherit;
26
26
  text-decoration: underline;
27
- text-underline-offset: var(--link-underline-offset);
27
+ text-underline-offset: var(--link-underline-offset, var(--link-underline-offset-default));
28
28
  cursor: pointer;
29
29
  /* Standard transition for color hover. */
30
30
  transition: color var(--a-duration-fast) var(--a-easing);
@@ -38,17 +38,17 @@
38
38
  }
39
39
 
40
40
  :scope > a:hover {
41
- color: var(--link-fg-hover);
41
+ color: var(--link-fg-hover, var(--link-fg-hover-default));
42
42
  }
43
43
 
44
44
  :scope > a:visited {
45
- color: var(--link-fg-visited);
45
+ color: var(--link-fg-visited, var(--link-fg-visited-default));
46
46
  }
47
47
 
48
48
  /* Focus ring on the anchor (the actual focusable element). */
49
49
  :scope > a:focus-visible {
50
50
  outline: none;
51
- box-shadow: var(--link-focus-ring);
51
+ box-shadow: var(--link-focus-ring, var(--link-focus-ring-default));
52
52
  border-radius: var(--a-radius-sm);
53
53
  }
54
54
 
@@ -67,8 +67,8 @@
67
67
  affordance is implied by hover behavior + cursor. For "Already
68
68
  have an account?" type prose where the link role is contextual. */
69
69
  :scope[variant="quiet"] {
70
- --link-fg: inherit;
71
- --link-fg-hover: var(--a-link-hover);
70
+ --link-fg-default: inherit;
71
+ --link-fg-hover-default: var(--a-link-hover);
72
72
  }
73
73
  :scope[variant="quiet"] > a {
74
74
  text-decoration: none;
@@ -1,10 +1,10 @@
1
1
  @scope (list-ui) {
2
2
  :where(:scope) {
3
3
  /* ── Colors ── */
4
- --list-divider-color: var(--a-border-subtle);
5
- --list-bg-selected: var(--a-accent-muted);
6
- --list-fg-selected: var(--a-accent-strong);
7
- --list-border-selected: var(--a-accent-strong);
4
+ --list-divider-color-default: var(--a-border-subtle);
5
+ --list-bg-selected-default: var(--a-accent-muted);
6
+ --list-fg-selected-default: var(--a-accent-strong);
7
+ --list-border-selected-default: var(--a-accent-strong);
8
8
  }
9
9
 
10
10
  :scope {
@@ -17,7 +17,7 @@
17
17
 
18
18
  /* ── Divider ── */
19
19
  :scope[divider] list-item-ui + list-item-ui {
20
- border-top: 1px solid var(--list-divider-color);
20
+ border-top: 1px solid var(--list-divider-color, var(--list-divider-color-default));
21
21
  }
22
22
 
23
23
  /* ── Item padding / margin (controlled by list-ui attributes) ──
@@ -68,9 +68,9 @@
68
68
  }
69
69
 
70
70
  :scope[selectable] > [role="listitem"][aria-selected="true"] {
71
- background: var(--list-bg-selected);
72
- color: var(--list-fg-selected);
73
- border-inline-start-color: var(--list-border-selected);
71
+ background: var(--list-bg-selected, var(--list-bg-selected-default));
72
+ color: var(--list-fg-selected, var(--list-fg-selected-default));
73
+ border-inline-start-color: var(--list-border-selected, var(--list-border-selected-default));
74
74
  }
75
75
 
76
76
  :scope[selectable] > [role="listitem"]:focus-visible {