@adia-ai/web-components 0.8.41 → 0.8.42

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 (63) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/MIGRATION.md +187 -0
  3. package/USAGE.md +4 -4
  4. package/components/action-list/action-item.a2ui.json +8 -3
  5. package/components/action-list/action-item.yaml +25 -7
  6. package/components/action-list/action-list.class.js +68 -6
  7. package/components/action-list/action-list.d.ts +3 -1
  8. package/components/chart/chart.a2ui.json +18 -3
  9. package/components/chart/chart.class.js +58 -16
  10. package/components/chart/chart.d.ts +9 -3
  11. package/components/chart/chart.yaml +35 -3
  12. package/components/chart-legend/chart-legend.a2ui.json +6 -1
  13. package/components/chart-legend/chart-legend.class.js +59 -6
  14. package/components/chart-legend/chart-legend.css +5 -2
  15. package/components/chart-legend/chart-legend.d.ts +3 -1
  16. package/components/chart-legend/chart-legend.yaml +15 -1
  17. package/components/color-area/color-area.a2ui.json +148 -0
  18. package/components/color-area/color-area.class.js +657 -0
  19. package/components/color-area/color-area.css +188 -0
  20. package/components/color-area/color-area.d.ts +66 -0
  21. package/components/color-area/color-area.examples.md +19 -0
  22. package/components/color-area/color-area.js +17 -0
  23. package/components/color-area/color-area.yaml +183 -0
  24. package/components/color-input/color-input.a2ui.json +5 -5
  25. package/components/color-input/color-input.class.js +9 -6
  26. package/components/color-input/color-input.css +1 -1
  27. package/components/color-input/color-input.js +2 -2
  28. package/components/color-input/color-input.yaml +14 -12
  29. package/components/color-picker/color-picker.a2ui.json +15 -12
  30. package/components/color-picker/color-picker.class.js +24 -633
  31. package/components/color-picker/color-picker.css +14 -182
  32. package/components/color-picker/color-picker.yaml +41 -41
  33. package/components/description-list/description-list.a2ui.json +1 -1
  34. package/components/description-list/description-list.css +1 -1
  35. package/components/description-list/description-list.d.ts +1 -1
  36. package/components/description-list/description-list.yaml +1 -1
  37. package/components/field/field.a2ui.json +1 -1
  38. package/components/field/field.class.js +4 -1
  39. package/components/field/field.yaml +1 -1
  40. package/components/index.js +1 -0
  41. package/components/integration-card/integration-card.examples.md +2 -1
  42. package/components/menu/menu-item.a2ui.json +8 -3
  43. package/components/menu/menu-item.yaml +24 -3
  44. package/components/menu/menu.class.js +34 -6
  45. package/components/menu/menu.d.ts +3 -1
  46. package/components/pane/pane.a2ui.json +11 -1
  47. package/components/pane/pane.class.js +32 -3
  48. package/components/pane/pane.css +15 -10
  49. package/components/pane/pane.d.ts +10 -7
  50. package/components/pane/pane.yaml +15 -1
  51. package/components/swatch/swatch.yaml +1 -1
  52. package/components/table-toolbar/table-toolbar.class.js +15 -3
  53. package/core/icons.js +5 -0
  54. package/custom-elements.json +191 -16
  55. package/dist/theme-provider.min.js +1 -1
  56. package/dist/web-components.min.css +1 -1
  57. package/dist/web-components.min.js +89 -89
  58. package/dist/web-components.sheet.js +1 -1
  59. package/index.d.ts +12 -1
  60. package/package.json +1 -1
  61. package/patterns/admin-shell/admin-shell.examples.html +2 -2
  62. package/patterns/form-system/form-system.examples.html +1 -1
  63. package/styles/components.css +1 -0
@@ -32,12 +32,13 @@
32
32
  * resizable — boolean, enables drag-to-resize (width)
33
33
  * min-width — minimum width when resizing (default: 200)
34
34
  * max-width — maximum width when resizing (default: 600)
35
- * side — 'leading' | 'trailing' | '' (default). When set, the
35
+ * edge — 'leading' | 'trailing' | '' (default). When set, the
36
36
  * pane is treated as a horizontal sibling: the default
37
37
  * four-sided border is suppressed, only the inner-edge
38
38
  * border is drawn, the resize grabber moves to that
39
39
  * inner edge, and the resize-drag direction flips so
40
- * trailing panes grow when dragged leftward.
40
+ * trailing panes grow when dragged leftward. `side` is a
41
+ * deprecated dual-read alias (ADR-0063, gh#1563).
41
42
  *
42
43
  * JS API:
43
44
  * pane.collapsed = true/false
@@ -58,11 +59,20 @@ export class UIPane extends UIElement {
58
59
  resizable: { type: Boolean, default: false, reflect: true },
59
60
  minWidth: { type: Number, default: 200, attribute: 'min-width', reflect: true },
60
61
  maxWidth: { type: Number, default: 9999, attribute: 'max-width', reflect: true },
62
+ // ADR-0063 (gh#1563) — `side` is DEPRECATED; `edge` is the canonical
63
+ // spelling (same type/default/enum). `side` stays declared (dual-read
64
+ // compat, 0.8.42); `#resolveEdge()` (called from connected()) mirrors
65
+ // an old-only value onto `edge` + warns once. Internal usage below
66
+ // reads `edge` exclusively.
61
67
  side: { type: String, default: '', reflect: true },
68
+ edge: { type: String, default: '', reflect: true },
62
69
  };
63
70
 
64
71
  static template = () => null;
65
72
 
73
+ // ADR-0063 (gh#1563) one-shot-per-class deprecation warn for [side].
74
+ static #warnedSide = false;
75
+
66
76
  #resizeEl = null;
67
77
  #dragging = false;
68
78
  #startX = 0;
@@ -72,6 +82,25 @@ export class UIPane extends UIElement {
72
82
  #bound = false;
73
83
 
74
84
  connected() {
85
+ // ADR-0063 (gh#1563) compat shim — resolve BEFORE the first render so
86
+ // there's no wrong-then-right flash. New-name precedence: [edge] wins
87
+ // outright when present; only fall back to (and mirror) [side] when
88
+ // [edge] is absent from markup. `edge` defaults `''` (not a
89
+ // true-default Boolean), so a live hasAttribute() check here is
90
+ // reliable — no gh#961 self-stamp interference (see chart-legend.class.js
91
+ // for that failure mode with a true-default Boolean).
92
+ if (!this.hasAttribute('edge') && this.hasAttribute('side')) {
93
+ this.edge = this.side;
94
+ if (!UIPane.#warnedSide) {
95
+ UIPane.#warnedSide = true;
96
+ // eslint-disable-next-line no-console
97
+ console.warn(
98
+ '[AdiaUI] <pane-ui [side]> is deprecated — use [edge] instead ' +
99
+ '(ADR-0063, gh#1563). Kept working as-is; no behavior change.',
100
+ );
101
+ }
102
+ }
103
+
75
104
  if (!this.#bound) {
76
105
  this.#bound = true;
77
106
 
@@ -164,7 +193,7 @@ export class UIPane extends UIElement {
164
193
  // is anchored on the RIGHT side of its flex row — dragging leftward
165
194
  // should GROW the pane (grabber moves further left = more width),
166
195
  // not shrink it. Negate dx in that case.
167
- const sign = this.side === 'trailing' ? -1 : 1;
196
+ const sign = this.edge === 'trailing' ? -1 : 1;
168
197
  const dx = (e.clientX - this.#startX) * sign;
169
198
  const w = Math.max(this.minWidth, Math.min(this.maxWidth, this.#startW + dx));
170
199
  this.style.width = `${w}px`;
@@ -63,20 +63,23 @@
63
63
  transition: none;
64
64
  }
65
65
 
66
- /* Side-aware border treatment.
66
+ /* Edge-aware border treatment. ADR-0063 (gh#1563): `[edge]` is the
67
+ canonical attribute — pane.class.js's connected() mirrors an
68
+ old-only `[side]` value onto `[edge]` before the first render, so
69
+ selecting on `[edge=...]` alone covers both spellings.
67
70
  `leading` — pane sits at the leading edge of a horizontal row, so
68
71
  the only visual separator it needs is on its trailing
69
72
  edge (right in LTR).
70
73
  `trailing` — mirror: only a leading-edge border (left in LTR).
71
- Default (no side attr) keeps the full 4-sided border. */
72
- :scope[side="leading"],
73
- :scope[side="trailing"] {
74
+ Default (no edge attr) keeps the full 4-sided border. */
75
+ :scope[edge="leading"],
76
+ :scope[edge="trailing"] {
74
77
  border: none;
75
78
  }
76
- :scope[side="leading"] {
79
+ :scope[edge="leading"] {
77
80
  border-inline-end: 1px solid var(--pane-border);
78
81
  }
79
- :scope[side="trailing"] {
82
+ :scope[edge="trailing"] {
80
83
  border-inline-start: 1px solid var(--pane-border);
81
84
  }
82
85
 
@@ -184,11 +187,13 @@
184
187
  }
185
188
 
186
189
  /* ── Resize handle ──
187
- Default (no side) positions the grabber on the right edge. When
188
- `side="trailing"` is set, flip the grabber to the left edge so it
190
+ Default (no edge) positions the grabber on the right edge. When
191
+ `edge="trailing"` is set, flip the grabber to the left edge so it
189
192
  sits on the pane's "inner" side (where it meets the sibling
190
193
  content/pane in a horizontal row). `inset-inline-*` lets the rules
191
- stay LTR/RTL-safe. */
194
+ stay LTR/RTL-safe. `side="trailing"` is a deprecated dual-read alias
195
+ (ADR-0063, gh#1563) — pane.class.js's connected() mirrors it onto
196
+ `[edge]` before the first render, so this selector alone covers both. */
192
197
  [slot="resize"] {
193
198
  position: absolute;
194
199
  top: 0;
@@ -202,7 +207,7 @@
202
207
  z-index: 1;
203
208
  }
204
209
 
205
- :scope[side="trailing"] > [slot="resize"] {
210
+ :scope[edge="trailing"] > [slot="resize"] {
206
211
  inset-inline-end: auto;
207
212
  inset-inline-start: 0;
208
213
  }
@@ -23,19 +23,22 @@ export type PaneToggleEvent = CustomEvent<unknown>;
23
23
  export class UIPane extends UIElement {
24
24
  /** Component property: collapsed. */
25
25
  collapsed: boolean;
26
- /** Component property: maxWidth. */
27
- maxWidth: number;
28
- /** Component property: minWidth. */
29
- minWidth: number;
30
- /** Component property: resizable. */
31
- resizable: boolean;
32
26
  /** Opts a pane into horizontal-sibling chrome: suppresses the default
33
27
  four-sided border and moves the resize grabber to the inner edge
34
28
  (right edge for `leading`, left edge for `trailing`). Also flips the
35
29
  resize-drag direction so `trailing` panes grow when dragged leftward.
36
30
  Unset keeps the pane-intrinsic chrome (full border, right-edge
37
- grabber when resizable).
31
+ grabber when resizable). Canonical spelling (ADR-0063, gh#1563)
32
+ replacing `side`.
38
33
  */
34
+ edge: '' | 'leading' | 'trailing';
35
+ /** Component property: maxWidth. */
36
+ maxWidth: number;
37
+ /** Component property: minWidth. */
38
+ minWidth: number;
39
+ /** Component property: resizable. */
40
+ resizable: boolean;
41
+ /** DEPRECATED (ADR-0063, gh#1563) — use `edge` instead. Same type/default/enum; kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0. */
39
42
  side: '' | 'leading' | 'trailing';
40
43
 
41
44
  addEventListener(type: 'toggle', listener: (ev: PaneToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
@@ -36,6 +36,18 @@ props:
36
36
  type: boolean
37
37
  default: false
38
38
  side:
39
+ description: >-
40
+ DEPRECATED (ADR-0063, gh#1563) — use `edge` instead. Same
41
+ type/default/enum; kept working as a dual-read compat shim (one-time
42
+ console.warn when it's the name that resolves). Removed in 0.9.0.
43
+ type: string
44
+ default: ''
45
+ enum:
46
+ - ''
47
+ - leading
48
+ - trailing
49
+ reflect: true
50
+ edge:
39
51
  description: 'Opts a pane into horizontal-sibling chrome: suppresses the default
40
52
 
41
53
  four-sided border and moves the resize grabber to the inner edge
@@ -46,7 +58,9 @@ props:
46
58
 
47
59
  Unset keeps the pane-intrinsic chrome (full border, right-edge
48
60
 
49
- grabber when resizable).
61
+ grabber when resizable). Canonical spelling (ADR-0063, gh#1563)
62
+
63
+ replacing `side`.
50
64
 
51
65
  '
52
66
  type: string
@@ -154,7 +154,7 @@ tokens:
154
154
  description: Color of the focus + selected ring when [selectable] is set.
155
155
  a2ui:
156
156
  rules:
157
- - rule: 'Use to display a single color sample with optional label. For interactive color picking use <color-picker-ui>.'
157
+ - rule: 'Use to display a single color sample with optional label. For interactive color picking use <color-area-ui>.'
158
158
  reason: 'Swatch is read-only display; picker is input.'
159
159
  - rule: 'Inside design-token displays or palette grids; not for general decoration.'
160
160
  reason: 'Semantic purpose: color sample.'
@@ -57,6 +57,18 @@ function popoverHead(text) {
57
57
  return el;
58
58
  }
59
59
 
60
+ // `col.label` is sometimes set to an nbsp or a bare space — the idiom
61
+ // consumers use on render-only columns (e.g. `_cancel` / `_download` /
62
+ // `_replay`) to keep the TABLE header cell blank while still rendering a
63
+ // custom cell. That whitespace is truthy, so a plain `col.label || col.key`
64
+ // fallback never engages and popover rows (filter / sort / columns) render
65
+ // with no visible text. Trim before testing so the fallback only skips when
66
+ // a label is genuinely present, never when it's intentional whitespace.
67
+ function columnLabel(col) {
68
+ const label = col.label;
69
+ return typeof label === 'string' && label.trim() ? label : col.key;
70
+ }
71
+
60
72
  const SELECT_THRESHOLD = 50;
61
73
  const SAMPLE_LIMIT = 500;
62
74
 
@@ -530,7 +542,7 @@ export class UITableToolbar extends UIElement {
530
542
  const row = document.createElement('field-ui');
531
543
  row.setAttribute('data-filter-row', '');
532
544
  row.setAttribute('inline', '');
533
- row.setAttribute('label', col.label || col.key);
545
+ row.setAttribute('label', columnLabel(col));
534
546
 
535
547
  const shape = detectFilterShape(col, data);
536
548
  const current = filters[col.key];
@@ -637,7 +649,7 @@ export class UITableToolbar extends UIElement {
637
649
  const dir = dirByKey.get(col.key);
638
650
  const row = document.createElement('menu-item-ui');
639
651
  row.setAttribute('data-sort-row', '');
640
- row.setAttribute('text', col.label || col.key);
652
+ row.setAttribute('text', columnLabel(col));
641
653
  row.dataset.key = col.key;
642
654
  if (dir) row.dataset.active = dir;
643
655
 
@@ -731,7 +743,7 @@ export class UITableToolbar extends UIElement {
731
743
  const row = document.createElement('field-ui');
732
744
  row.setAttribute('data-columns-row', '');
733
745
  row.setAttribute('inline', '');
734
- row.setAttribute('label', col.label || col.key);
746
+ row.setAttribute('label', columnLabel(col));
735
747
 
736
748
  const check = document.createElement('check-ui');
737
749
  if (!col.hidden) check.setAttribute('checked', '');
package/core/icons.js CHANGED
@@ -306,6 +306,11 @@ function discoverRequiredIcons() {
306
306
  'agent-trace-ui',
307
307
  'calendar-picker-ui',
308
308
  'color-picker-ui',
309
+ // ADR-0063 (gh#1563) — color-picker-ui's real implementation moved to
310
+ // color-area-ui (the new canonical tag); color-picker-ui is now a thin
311
+ // deprecated alias. Both need to resolve here since either tag may be
312
+ // the one actually defined+used on a given page.
313
+ 'color-area-ui',
309
314
  'command-ui',
310
315
  'pane-ui',
311
316
  'select-ui',
@@ -137,7 +137,7 @@
137
137
  "declarations": [
138
138
  {
139
139
  "kind": "class",
140
- "description": "Child of <action-list-ui>. One actionable row — icon + label + optional subtitle, forwards activation to the parent action-list. Row contract converges on <menu-item-ui>: icon/text/subtitle/value/variant/disabled props and icon/text/subtitle/trailing slot overrides (#1363 C5).",
140
+ "description": "Child of <action-list-ui>. One actionable row — icon + label + optional description, forwards activation to the parent action-list. Row contract converges on <menu-item-ui>: icon/text/description/value/variant/disabled props and icon/text/subtitle/trailing slot overrides (#1363 C5). (`subtitle` is a deprecated alias for `description` — ADR-0063, gh#1571.)",
141
141
  "name": "UIActionItem",
142
142
  "tagName": "action-item-ui",
143
143
  "superclass": {
@@ -164,7 +164,14 @@
164
164
  "type": {
165
165
  "text": "string"
166
166
  },
167
- "description": "Optional secondary description line rendered under the label."
167
+ "description": "DEPRECATED (ADR-0063, gh#1571) — use `description` instead. Same type/default/rendered position; kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0. (The `subtitle` SLOT below is a separate surface, deliberately left unrenamed in this pass — see its own description.)"
168
+ },
169
+ {
170
+ "name": "description",
171
+ "type": {
172
+ "text": "string"
173
+ },
174
+ "description": "Optional secondary description line rendered under the label. Canonical spelling (ADR-0063, gh#1571) replacing `subtitle` — converges action-item onto the same spelling <menu-item-ui> adopted under gh#1563."
168
175
  },
169
176
  {
170
177
  "name": "value",
@@ -201,7 +208,7 @@
201
208
  },
202
209
  {
203
210
  "name": "subtitle",
204
- "description": "Custom secondary-line content override; falls through to [subtitle] prop if not slotted."
211
+ "description": "Custom secondary-line content override; falls through to the [description] prop (or its deprecated [subtitle] alias — ADR-0063, gh#1571) if not slotted. The slot's own name is unchanged by that rename — this is a distinct, deliberately-unrenamed surface."
205
212
  },
206
213
  {
207
214
  "name": "trailing",
@@ -2151,7 +2158,15 @@
2151
2158
  "text": "boolean"
2152
2159
  },
2153
2160
  "default": "false",
2154
- "description": "When set, rows are non-interactive <span>s (no click, no toggle)."
2161
+ "description": "DEPRECATED (ADR-0063, gh#1563) — use `interactive` instead. When set (and `interactive` is absent), rows are non-interactive <span>s (no click, no toggle). Kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0."
2162
+ },
2163
+ {
2164
+ "name": "interactive",
2165
+ "type": {
2166
+ "text": "boolean"
2167
+ },
2168
+ "default": "true",
2169
+ "description": "Canonical opt-in spelling (ADR-0063, gh#1563) replacing `static`'s opt-out polarity. Rows are interactive <button>-role badges by default — this default stays `true` in 0.8.42 (deliberately NOT flipped yet; the 0.9.0 cut inverts it to `false` after a full consumer scan of every `<chart-legend-ui>` tag per the ADR)."
2155
2170
  },
2156
2171
  {
2157
2172
  "name": "on-toggle",
@@ -2233,7 +2248,15 @@
2233
2248
  "text": "boolean"
2234
2249
  },
2235
2250
  "default": "false",
2236
- "description": "When true, suppress the overlaid average line"
2251
+ "description": "DEPRECATED (ADR-0063, gh#1563) — use `noAverage` instead. Same meaning, same default; kept working as a dual-read compat shim (one- time console.warn when it's the name that resolves). Removed in 0.9.0."
2252
+ },
2253
+ {
2254
+ "name": "no-average",
2255
+ "type": {
2256
+ "text": "boolean"
2257
+ },
2258
+ "default": "false",
2259
+ "description": "When true, suppress the overlaid average line. Canonical spelling (ADR-0063, gh#1563) replacing `hideAverage`."
2237
2260
  },
2238
2261
  {
2239
2262
  "name": "hide-grid",
@@ -2241,7 +2264,15 @@
2241
2264
  "text": "boolean"
2242
2265
  },
2243
2266
  "default": "false",
2244
- "description": "Hide gridlines"
2267
+ "description": "DEPRECATED (ADR-0063, gh#1563) — use `noGrid` instead. Same meaning, same default; kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0."
2268
+ },
2269
+ {
2270
+ "name": "no-grid",
2271
+ "type": {
2272
+ "text": "boolean"
2273
+ },
2274
+ "default": "false",
2275
+ "description": "Hide gridlines. Canonical spelling (ADR-0063, gh#1563) replacing `hideGrid`."
2245
2276
  },
2246
2277
  {
2247
2278
  "name": "hide-values",
@@ -2249,7 +2280,15 @@
2249
2280
  "text": "boolean"
2250
2281
  },
2251
2282
  "default": "false",
2252
- "description": "Hide value labels"
2283
+ "description": "DEPRECATED (ADR-0063, gh#1563) — use `noValues` instead. Same meaning, same default; kept working as a dual-read compat shim (one- time console.warn when it's the name that resolves). Removed in 0.9.0."
2284
+ },
2285
+ {
2286
+ "name": "no-values",
2287
+ "type": {
2288
+ "text": "boolean"
2289
+ },
2290
+ "default": "false",
2291
+ "description": "Hide value labels. Canonical spelling (ADR-0063, gh#1563) replacing `hideValues`."
2253
2292
  },
2254
2293
  {
2255
2294
  "name": "corner-radius",
@@ -2844,13 +2883,135 @@
2844
2883
  }
2845
2884
  ]
2846
2885
  },
2886
+ {
2887
+ "kind": "javascript-module",
2888
+ "path": "components/color-area/color-area.js",
2889
+ "declarations": [
2890
+ {
2891
+ "kind": "class",
2892
+ "description": "OKLCH-native color picker with 2D area and H/C/L sliders. Form-associated input emitting OKLCH color strings; canonical color authoring surface in the AdiaUI token system. Use for color input in design tools or theming UIs; for simple color swatches use <swatch-ui> or <color-input-ui> instead. Renamed from `<color-picker-ui>` (ADR-0063, gh#1563 — `-picker` is reserved for the outer trigger + popover composite shape; this is the inline substrate, mirroring <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` is now a thin deprecated alias subclassing this component.",
2893
+ "name": "UIColorArea",
2894
+ "tagName": "color-area-ui",
2895
+ "superclass": {
2896
+ "name": "UIElement",
2897
+ "module": "/core/element.js"
2898
+ },
2899
+ "attributes": [
2900
+ {
2901
+ "name": "name",
2902
+ "type": {
2903
+ "text": "string"
2904
+ },
2905
+ "description": "Form field name"
2906
+ },
2907
+ {
2908
+ "name": "disabled",
2909
+ "type": {
2910
+ "text": "boolean"
2911
+ },
2912
+ "default": "false",
2913
+ "description": "Disables all interaction"
2914
+ },
2915
+ {
2916
+ "name": "format",
2917
+ "type": {
2918
+ "text": "string"
2919
+ },
2920
+ "default": "hex",
2921
+ "description": "Output format for the value property"
2922
+ },
2923
+ {
2924
+ "name": "value",
2925
+ "type": {
2926
+ "text": "string"
2927
+ },
2928
+ "default": "#3b82f6",
2929
+ "description": "Current color as hex string"
2930
+ },
2931
+ {
2932
+ "name": "maxChroma",
2933
+ "type": {
2934
+ "text": "number"
2935
+ },
2936
+ "default": "Infinity",
2937
+ "description": "Generation constraint (v0.4.9 §99h, FEEDBACK-02 OKLCH chroma channel to at most this value before commit. Out-of- bound mutations round-trip to the nearest in-bound equivalent + fire `constraint-clamp`. Default Infinity (no constraint)."
2938
+ },
2939
+ {
2940
+ "name": "maxL",
2941
+ "type": {
2942
+ "text": "number"
2943
+ },
2944
+ "default": "1",
2945
+ "description": "Generation constraint — clamp OKLCH lightness to at most this value (0..1). Default 1 (no constraint)."
2946
+ },
2947
+ {
2948
+ "name": "minL",
2949
+ "type": {
2950
+ "text": "number"
2951
+ },
2952
+ "default": "0",
2953
+ "description": "Generation constraint — clamp OKLCH lightness to at least this value (0..1). Default 0 (no constraint)."
2954
+ },
2955
+ {
2956
+ "name": "hueDriftMax",
2957
+ "type": {
2958
+ "text": "number"
2959
+ },
2960
+ "default": "NaN",
2961
+ "description": "Generation constraint — maximum allowed signed-shortest-path hue deviation (degrees) from [base-hue] (or the first-committed hue if [base-hue] is unset). Default NaN (no constraint). Wrap-aware so a drift of 350 degrees resolves as -10."
2962
+ },
2963
+ {
2964
+ "name": "baseHue",
2965
+ "type": {
2966
+ "text": "number"
2967
+ },
2968
+ "default": "NaN",
2969
+ "description": "Reference hue (degrees) for the [hue-drift-max] constraint. Default NaN — falls back to the picker's hue at first commit so the consumer can pre-seed the picker and constrain drift from that initial value."
2970
+ }
2971
+ ],
2972
+ "events": [
2973
+ {
2974
+ "name": "change",
2975
+ "type": {
2976
+ "text": "CustomEvent"
2977
+ },
2978
+ "description": "Fired on every color change"
2979
+ },
2980
+ {
2981
+ "name": "input",
2982
+ "type": {
2983
+ "text": "CustomEvent"
2984
+ },
2985
+ "description": "Fired during continuous interaction (drag)"
2986
+ },
2987
+ {
2988
+ "name": "constraint-clamp",
2989
+ "type": {
2990
+ "text": "CustomEvent"
2991
+ },
2992
+ "description": "Fired immediately before `change` / `input` when one or more consumer-declared constraints (max-chroma / max-l / min-l / hue-drift-max) clamped a channel away from the user-requested value. detail.clamps is an array of axis-specific clamp records."
2993
+ }
2994
+ ]
2995
+ }
2996
+ ],
2997
+ "exports": [
2998
+ {
2999
+ "kind": "custom-element-definition",
3000
+ "name": "color-area-ui",
3001
+ "declaration": {
3002
+ "name": "UIColorArea",
3003
+ "module": "./components/color-area/color-area.js"
3004
+ }
3005
+ }
3006
+ ]
3007
+ },
2847
3008
  {
2848
3009
  "kind": "javascript-module",
2849
3010
  "path": "components/color-input/color-input.js",
2850
3011
  "declarations": [
2851
3012
  {
2852
3013
  "kind": "class",
2853
- "description": "Compact form-bearing color input — opens a popover-anchored `<color-picker-ui>` from an inline swatch button. §302 (v0.5.12, FEEDBACK-29 re-bucket from v0.6.0). Canonicalizes the USAGE.md §221f Option B recipe (popover + button + color-picker) into a single form-associated tag for inline form contexts (settings drawer \"source color\" field, swatch-row inline-edit, etc.).",
3014
+ "description": "Compact form-bearing color input — opens a popover-anchored `<color-area-ui>` from an inline swatch button. §302 (v0.5.12, FEEDBACK-29 re-bucket from v0.6.0). Canonicalizes the USAGE.md §221f Option B recipe (popover + button + color-area) into a single form-associated tag for inline form contexts (settings drawer \"source color\" field, swatch-row inline-edit, etc.). Composes `<color-area-ui>` (ADR-0063, gh#1563 — renamed from `<color-picker-ui>`, which is now a deprecated alias); `color-input-ui`'s own tag/name is unaffected.",
2854
3015
  "name": "UIColorInput",
2855
3016
  "tagName": "color-input-ui",
2856
3017
  "superclass": {
@@ -2895,7 +3056,7 @@
2895
3056
  "text": "string"
2896
3057
  },
2897
3058
  "default": "bottom",
2898
- "description": "Popover placement relative to the trigger. Default `bottom` centers the color-picker panel under the swatch button (ADR-0034 Rule 2 — panel wider than trigger)."
3059
+ "description": "Popover placement relative to the trigger. Default `bottom` centers the color-area panel under the swatch button (ADR-0034 Rule 2 — panel wider than trigger)."
2899
3060
  },
2900
3061
  {
2901
3062
  "name": "open",
@@ -2911,7 +3072,7 @@
2911
3072
  "text": "number"
2912
3073
  },
2913
3074
  "default": "Infinity",
2914
- "description": "Generation constraint forwarded to the inner `<color-picker-ui>` (v0.5.13 §-TBD, FB-33 §1). Clamp the OKLCH chroma channel to at most this value. Default Infinity (no constraint)."
3075
+ "description": "Generation constraint forwarded to the inner `<color-area-ui>` (v0.5.13 §-TBD, FB-33 §1). Clamp the OKLCH chroma channel to at most this value. Default Infinity (no constraint)."
2915
3076
  },
2916
3077
  {
2917
3078
  "name": "maxL",
@@ -2981,7 +3142,7 @@
2981
3142
  "declarations": [
2982
3143
  {
2983
3144
  "kind": "class",
2984
- "description": "OKLCH-native color picker with 2D area and H/C/L sliders. Form-associated input emitting OKLCH color strings; canonical color authoring surface in the AdiaUI token system. Use for color input in design tools or theming UIs; for simple color swatches use <swatch-ui> or <color-input-ui> instead.",
3145
+ "description": "DEPRECATED (ADR-0063, gh#1563, gh#1377 B11) — `-picker` is reserved for the outer, trigger + popover, form-associated composite shape (`calendar-picker-ui` / `date-range-picker-ui` / `datetime-picker-ui` / `time-picker-ui`); `color-picker-ui` was the sole violator, playing `calendar-grid-ui`'s inline-substrate role under a `-picker` name. `<color-picker-ui>` is now a thin `UIColorArea` subclass (see color-picker.class.js) rather than an independent implementation every prop/event/token is inherited unchanged from `<color-area-ui>`. Existing markup keeps working, but new markup should reach for `<color-area-ui>` directly. See `<color-area-ui>` for the full contract.",
2985
3146
  "name": "UIColorPicker",
2986
3147
  "tagName": "color-picker-ui",
2987
3148
  "superclass": {
@@ -3792,7 +3953,7 @@
3792
3953
  "text": "string"
3793
3954
  },
3794
3955
  "default": "start",
3795
- "description": "Alignment for inline layout. `start` (default): term and value pack to the term column edge. `between`: term left, value right-aligned with `text-align: end`. `stretch`: value fills the remaining track width (e.g. for a `<slider-ui>` / `<select-ui>` / `<color-picker-ui>` as `<dd>` that should span the full row). Sets `justify-self: stretch` and `width: 100%` on `dd` so block-level form controls inside reach the column edge rather than shrink-wrapping to content."
3956
+ "description": "Alignment for inline layout. `start` (default): term and value pack to the term column edge. `between`: term left, value right-aligned with `text-align: end`. `stretch`: value fills the remaining track width (e.g. for a `<slider-ui>` / `<select-ui>` / `<color-area-ui>` as `<dd>` that should span the full row). Sets `justify-self: stretch` and `width: 100%` on `dd` so block-level form controls inside reach the column edge rather than shrink-wrapping to content."
3796
3957
  },
3797
3958
  {
3798
3959
  "name": "items",
@@ -4514,7 +4675,7 @@
4514
4675
  "slots": [
4515
4676
  {
4516
4677
  "name": "default",
4517
- "description": "The form control — a WIDE control like input-ui, select-ui, textarea-ui, slider-ui, range-ui, calendar-picker-ui, color-picker-ui, upload-ui, otp-input-ui. Auto-id'd for the label's [for] binding. DO NOT wrap small self-labeling widgets here. check-ui, switch-ui, radio-ui, toggle-ui all carry their own [label] attribute that renders inline next to the control — wrapping them in field-ui produces broken layouts (settings-row `justify-self: end` rule pushes the control to the trailing edge, away from the label that field-ui stamps; the widget's own label then renders again on the right, creating a doubled / right-justified affordance). See anti_patterns below for the canonical alternatives."
4678
+ "description": "The form control — a WIDE control like input-ui, select-ui, textarea-ui, slider-ui, range-ui, calendar-picker-ui, color-area-ui, upload-ui, otp-input-ui. Auto-id'd for the label's [for] binding. DO NOT wrap small self-labeling widgets here. check-ui, switch-ui, radio-ui, toggle-ui all carry their own [label] attribute that renders inline next to the control — wrapping them in field-ui produces broken layouts (settings-row `justify-self: end` rule pushes the control to the trailing edge, away from the label that field-ui stamps; the widget's own label then renders again on the right, creating a doubled / right-justified affordance). See anti_patterns below for the canonical alternatives."
4518
4679
  },
4519
4680
  {
4520
4681
  "name": "trailing",
@@ -6153,7 +6314,7 @@
6153
6314
  },
6154
6315
  {
6155
6316
  "kind": "class",
6156
- "description": "Child of `<menu-ui>`. One actionable row inside a menu, with optional leading icon + label + subtitle + value.",
6317
+ "description": "Child of `<menu-ui>`. One actionable row inside a menu, with optional leading icon + label + description + value. (`subtitle` is a deprecated alias for `description` — ADR-0063, gh#1563.)",
6157
6318
  "name": "UIMenuItem",
6158
6319
  "tagName": "menu-item-ui",
6159
6320
  "superclass": {
@@ -6180,7 +6341,14 @@
6180
6341
  "type": {
6181
6342
  "text": "string"
6182
6343
  },
6183
- "description": "Optional secondary description line rendered under the label."
6344
+ "description": "DEPRECATED (ADR-0063, gh#1563) — use `description` instead. Same type/default/rendered position; kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0. (The `subtitle` SLOT below is a separate surface, deliberately left unrenamed in this pass — see its own description.)"
6345
+ },
6346
+ {
6347
+ "name": "description",
6348
+ "type": {
6349
+ "text": "string"
6350
+ },
6351
+ "description": "Optional secondary description line rendered under the label. Canonical spelling (ADR-0063, gh#1563) replacing `subtitle` — converges menu-item onto the ~20-component corpus majority that already names this concept `description`."
6184
6352
  },
6185
6353
  {
6186
6354
  "name": "value",
@@ -6217,7 +6385,7 @@
6217
6385
  },
6218
6386
  {
6219
6387
  "name": "subtitle",
6220
- "description": "Custom secondary-line content override; falls through to `[subtitle]` prop if not slotted."
6388
+ "description": "Custom secondary-line content override; falls through to the `[description]` prop (or its deprecated `[subtitle]` alias — ADR-0063, gh#1563) if not slotted. The slot's own name is unchanged by that rename — this is a distinct, deliberately-unrenamed surface."
6221
6389
  },
6222
6390
  {
6223
6391
  "name": "trailing",
@@ -7382,6 +7550,13 @@
7382
7550
  "type": {
7383
7551
  "text": "string"
7384
7552
  },
7553
+ "description": "DEPRECATED (ADR-0063, gh#1563) — use `edge` instead. Same type/default/enum; kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0."
7554
+ },
7555
+ {
7556
+ "name": "edge",
7557
+ "type": {
7558
+ "text": "string"
7559
+ },
7385
7560
  "description": "'Opts a pane into horizontal-sibling chrome: suppresses the default"
7386
7561
  }
7387
7562
  ],