@urbicon-ui/blocks 6.21.2 → 6.21.3

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.
@@ -184,7 +184,7 @@
184
184
  }
185
185
 
186
186
  if (!wasTrigger) {
187
- effectiveTriggerElement?.focus();
187
+ focusTrigger();
188
188
  }
189
189
  }
190
190
  }
@@ -219,7 +219,7 @@
219
219
  open = false;
220
220
  onOpenChange?.(false);
221
221
  onEscapeProp?.();
222
- effectiveTriggerElement?.focus();
222
+ focusTrigger();
223
223
  }
224
224
  document.addEventListener('keydown', handleEscape);
225
225
  return () => document.removeEventListener('keydown', handleEscape);
@@ -276,8 +276,29 @@
276
276
 
277
277
  // ── Trigger handlers ───────────────────────────────────────
278
278
 
279
+ // Restore focus to the trigger after a dismiss. The snippet trigger is
280
+ // wrapped in a plain (non-focusable) div — `focus()` on it is a spec no-op —
281
+ // so target the interactive descendant instead (same query as the
282
+ // aria-expanded effect). An external `triggerElement` is the consumer's
283
+ // real control: focus it directly.
284
+ function focusTrigger() {
285
+ const target =
286
+ triggerElement ??
287
+ internalTriggerElement?.querySelector<HTMLElement>(
288
+ 'button, a[href], [role="button"], [tabindex]'
289
+ ) ??
290
+ internalTriggerElement;
291
+ target?.focus();
292
+ }
293
+
279
294
  function handleTriggerPointerDown() {
280
- if (open) dismissedByTrigger = true;
295
+ // Arm the "this pointerdown already dismissed it" guard only in auto
296
+ // mode, where the browser's light dismiss really closes the popover
297
+ // between pointerdown and click (the guard stops that click from
298
+ // re-opening it). In manual mode nothing light-dismisses — the click
299
+ // itself must toggle-close, so arming the guard there left the trigger
300
+ // unable to close its own popover.
301
+ if (open && popoverMode === 'auto') dismissedByTrigger = true;
281
302
  }
282
303
 
283
304
  function handleTriggerClick(event: MouseEvent) {
@@ -2,7 +2,7 @@ import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
2
  export declare const selectVariants: ((props?: {
3
3
  tier?: "commit" | "modify" | undefined;
4
4
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
5
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
5
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
6
6
  open?: boolean | undefined;
7
7
  disabled?: boolean | undefined;
8
8
  messageType?: "error" | "helper" | undefined;
@@ -13,7 +13,7 @@ export declare const selectVariants: ((props?: {
13
13
  wrapper: (props?: ({
14
14
  tier?: "commit" | "modify" | undefined;
15
15
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
16
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
16
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
17
17
  open?: boolean | undefined;
18
18
  disabled?: boolean | undefined;
19
19
  messageType?: "error" | "helper" | undefined;
@@ -26,7 +26,7 @@ export declare const selectVariants: ((props?: {
26
26
  base: (props?: ({
27
27
  tier?: "commit" | "modify" | undefined;
28
28
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
29
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
29
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
30
30
  open?: boolean | undefined;
31
31
  disabled?: boolean | undefined;
32
32
  messageType?: "error" | "helper" | undefined;
@@ -39,7 +39,7 @@ export declare const selectVariants: ((props?: {
39
39
  trigger: (props?: ({
40
40
  tier?: "commit" | "modify" | undefined;
41
41
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
42
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
42
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
43
43
  open?: boolean | undefined;
44
44
  disabled?: boolean | undefined;
45
45
  messageType?: "error" | "helper" | undefined;
@@ -52,7 +52,7 @@ export declare const selectVariants: ((props?: {
52
52
  triggerText: (props?: ({
53
53
  tier?: "commit" | "modify" | undefined;
54
54
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
55
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
55
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
56
56
  open?: boolean | undefined;
57
57
  disabled?: boolean | undefined;
58
58
  messageType?: "error" | "helper" | undefined;
@@ -65,7 +65,7 @@ export declare const selectVariants: ((props?: {
65
65
  placeholder: (props?: ({
66
66
  tier?: "commit" | "modify" | undefined;
67
67
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
68
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
68
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
69
69
  open?: boolean | undefined;
70
70
  disabled?: boolean | undefined;
71
71
  messageType?: "error" | "helper" | undefined;
@@ -78,7 +78,7 @@ export declare const selectVariants: ((props?: {
78
78
  chevron: (props?: ({
79
79
  tier?: "commit" | "modify" | undefined;
80
80
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
81
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
81
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
82
82
  open?: boolean | undefined;
83
83
  disabled?: boolean | undefined;
84
84
  messageType?: "error" | "helper" | undefined;
@@ -91,7 +91,7 @@ export declare const selectVariants: ((props?: {
91
91
  clear: (props?: ({
92
92
  tier?: "commit" | "modify" | undefined;
93
93
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
94
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
94
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
95
95
  open?: boolean | undefined;
96
96
  disabled?: boolean | undefined;
97
97
  messageType?: "error" | "helper" | undefined;
@@ -104,7 +104,7 @@ export declare const selectVariants: ((props?: {
104
104
  listbox: (props?: ({
105
105
  tier?: "commit" | "modify" | undefined;
106
106
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
107
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
107
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
108
108
  open?: boolean | undefined;
109
109
  disabled?: boolean | undefined;
110
110
  messageType?: "error" | "helper" | undefined;
@@ -117,7 +117,7 @@ export declare const selectVariants: ((props?: {
117
117
  option: (props?: ({
118
118
  tier?: "commit" | "modify" | undefined;
119
119
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
120
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
120
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
121
121
  open?: boolean | undefined;
122
122
  disabled?: boolean | undefined;
123
123
  messageType?: "error" | "helper" | undefined;
@@ -130,7 +130,7 @@ export declare const selectVariants: ((props?: {
130
130
  optionLabel: (props?: ({
131
131
  tier?: "commit" | "modify" | undefined;
132
132
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
133
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
133
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
134
134
  open?: boolean | undefined;
135
135
  disabled?: boolean | undefined;
136
136
  messageType?: "error" | "helper" | undefined;
@@ -143,7 +143,7 @@ export declare const selectVariants: ((props?: {
143
143
  optionCheck: (props?: ({
144
144
  tier?: "commit" | "modify" | undefined;
145
145
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
146
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
146
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
147
147
  open?: boolean | undefined;
148
148
  disabled?: boolean | undefined;
149
149
  messageType?: "error" | "helper" | undefined;
@@ -156,7 +156,7 @@ export declare const selectVariants: ((props?: {
156
156
  optionCheckbox: (props?: ({
157
157
  tier?: "commit" | "modify" | undefined;
158
158
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
159
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
159
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
160
160
  open?: boolean | undefined;
161
161
  disabled?: boolean | undefined;
162
162
  messageType?: "error" | "helper" | undefined;
@@ -169,7 +169,7 @@ export declare const selectVariants: ((props?: {
169
169
  group: (props?: ({
170
170
  tier?: "commit" | "modify" | undefined;
171
171
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
172
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
172
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
173
173
  open?: boolean | undefined;
174
174
  disabled?: boolean | undefined;
175
175
  messageType?: "error" | "helper" | undefined;
@@ -182,7 +182,7 @@ export declare const selectVariants: ((props?: {
182
182
  groupLabel: (props?: ({
183
183
  tier?: "commit" | "modify" | undefined;
184
184
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
185
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
185
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
186
186
  open?: boolean | undefined;
187
187
  disabled?: boolean | undefined;
188
188
  messageType?: "error" | "helper" | undefined;
@@ -195,7 +195,7 @@ export declare const selectVariants: ((props?: {
195
195
  label: (props?: ({
196
196
  tier?: "commit" | "modify" | undefined;
197
197
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
198
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
198
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
199
199
  open?: boolean | undefined;
200
200
  disabled?: boolean | undefined;
201
201
  messageType?: "error" | "helper" | undefined;
@@ -208,7 +208,7 @@ export declare const selectVariants: ((props?: {
208
208
  message: (props?: ({
209
209
  tier?: "commit" | "modify" | undefined;
210
210
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
211
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
211
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
212
212
  open?: boolean | undefined;
213
213
  disabled?: boolean | undefined;
214
214
  messageType?: "error" | "helper" | undefined;
@@ -1,19 +1,19 @@
1
1
  import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
2
  export declare const skeletonVariants: ((props?: {
3
3
  variant?: "rounded" | "text" | "circular" | "rectangular" | undefined;
4
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
4
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
5
5
  animation?: "none" | "pulse" | "wave" | undefined;
6
6
  } | undefined) => {
7
7
  base: (props?: ({
8
8
  variant?: "rounded" | "text" | "circular" | "rectangular" | undefined;
9
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
9
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
10
10
  animation?: "none" | "pulse" | "wave" | undefined;
11
11
  } & {
12
12
  class?: string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | /*elided*/ any | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined;
13
13
  }) | undefined) => string;
14
14
  wrapper: (props?: ({
15
15
  variant?: "rounded" | "text" | "circular" | "rectangular" | undefined;
16
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
16
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
17
17
  animation?: "none" | "pulse" | "wave" | undefined;
18
18
  } & {
19
19
  class?: string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | /*elided*/ any | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined;
@@ -1,13 +1,13 @@
1
1
  import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
2
  export declare const spinnerVariants: ((props?: {
3
3
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
4
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
4
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
5
5
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
6
6
  speed?: "fast" | "slow" | "normal" | undefined;
7
7
  } | undefined) => {
8
8
  base: (props?: ({
9
9
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
10
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
10
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
11
11
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
12
12
  speed?: "fast" | "slow" | "normal" | undefined;
13
13
  } & {
@@ -15,7 +15,7 @@ export declare const spinnerVariants: ((props?: {
15
15
  }) | undefined) => string;
16
16
  svg: (props?: ({
17
17
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
18
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
18
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
19
19
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
20
20
  speed?: "fast" | "slow" | "normal" | undefined;
21
21
  } & {
@@ -23,7 +23,7 @@ export declare const spinnerVariants: ((props?: {
23
23
  }) | undefined) => string;
24
24
  svgCircle: (props?: ({
25
25
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
26
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
26
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
27
27
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
28
28
  speed?: "fast" | "slow" | "normal" | undefined;
29
29
  } & {
@@ -31,7 +31,7 @@ export declare const spinnerVariants: ((props?: {
31
31
  }) | undefined) => string;
32
32
  svgPath: (props?: ({
33
33
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
34
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
34
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
35
35
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
36
36
  speed?: "fast" | "slow" | "normal" | undefined;
37
37
  } & {
@@ -39,7 +39,7 @@ export declare const spinnerVariants: ((props?: {
39
39
  }) | undefined) => string;
40
40
  dots: (props?: ({
41
41
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
42
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
42
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
43
43
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
44
44
  speed?: "fast" | "slow" | "normal" | undefined;
45
45
  } & {
@@ -47,7 +47,7 @@ export declare const spinnerVariants: ((props?: {
47
47
  }) | undefined) => string;
48
48
  dot: (props?: ({
49
49
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
50
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
50
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
51
51
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
52
52
  speed?: "fast" | "slow" | "normal" | undefined;
53
53
  } & {
@@ -55,7 +55,7 @@ export declare const spinnerVariants: ((props?: {
55
55
  }) | undefined) => string;
56
56
  pulse: (props?: ({
57
57
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
58
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
58
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
59
59
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
60
60
  speed?: "fast" | "slow" | "normal" | undefined;
61
61
  } & {
@@ -63,7 +63,7 @@ export declare const spinnerVariants: ((props?: {
63
63
  }) | undefined) => string;
64
64
  pulseCenter: (props?: ({
65
65
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
66
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
66
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
67
67
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
68
68
  speed?: "fast" | "slow" | "normal" | undefined;
69
69
  } & {
@@ -71,7 +71,7 @@ export declare const spinnerVariants: ((props?: {
71
71
  }) | undefined) => string;
72
72
  pulseRing: (props?: ({
73
73
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
74
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
74
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
75
75
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
76
76
  speed?: "fast" | "slow" | "normal" | undefined;
77
77
  } & {
@@ -79,7 +79,7 @@ export declare const spinnerVariants: ((props?: {
79
79
  }) | undefined) => string;
80
80
  ring: (props?: ({
81
81
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
82
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
82
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
83
83
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
84
84
  speed?: "fast" | "slow" | "normal" | undefined;
85
85
  } & {
@@ -87,7 +87,7 @@ export declare const spinnerVariants: ((props?: {
87
87
  }) | undefined) => string;
88
88
  ringElement: (props?: ({
89
89
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
90
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
90
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
91
91
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
92
92
  speed?: "fast" | "slow" | "normal" | undefined;
93
93
  } & {
@@ -95,7 +95,7 @@ export declare const spinnerVariants: ((props?: {
95
95
  }) | undefined) => string;
96
96
  bars: (props?: ({
97
97
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
98
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
98
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
99
99
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
100
100
  speed?: "fast" | "slow" | "normal" | undefined;
101
101
  } & {
@@ -103,7 +103,7 @@ export declare const spinnerVariants: ((props?: {
103
103
  }) | undefined) => string;
104
104
  bar: (props?: ({
105
105
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
106
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
106
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
107
107
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
108
108
  speed?: "fast" | "slow" | "normal" | undefined;
109
109
  } & {
@@ -111,7 +111,7 @@ export declare const spinnerVariants: ((props?: {
111
111
  }) | undefined) => string;
112
112
  content: (props?: ({
113
113
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
114
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
114
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
115
115
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
116
116
  speed?: "fast" | "slow" | "normal" | undefined;
117
117
  } & {
@@ -119,7 +119,7 @@ export declare const spinnerVariants: ((props?: {
119
119
  }) | undefined) => string;
120
120
  srOnly: (props?: ({
121
121
  variant?: "pulse" | "default" | "ring" | "bars" | "dots" | undefined;
122
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
122
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
123
123
  intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | "current" | undefined;
124
124
  speed?: "fast" | "slow" | "normal" | undefined;
125
125
  } & {
@@ -28,6 +28,7 @@
28
28
  unstyled: unstyledProp = false,
29
29
  slotClasses: slotClassesProp = {},
30
30
  preset,
31
+ oninput: userOnInput,
31
32
  ...restProps
32
33
  }: TextareaProps = $props();
33
34
 
@@ -103,6 +104,14 @@
103
104
  }
104
105
  });
105
106
 
107
+ function handleInput(event: Event & { currentTarget: EventTarget & HTMLTextAreaElement }) {
108
+ if (autoResize) adjustHeight();
109
+ // Forward the consumer's oninput — Textarea's own handler sits after
110
+ // `{...restProps}` on the element, so without this it would swallow it
111
+ // (same class as Input's onkeydown forward).
112
+ userOnInput?.(event);
113
+ }
114
+
106
115
  $effect(() => {
107
116
  if (textareaRef && mint && mint !== 'none' && !disabled) {
108
117
  return mintRegistry.apply(textareaRef, mint);
@@ -137,7 +146,7 @@
137
146
  {required}
138
147
  aria-invalid={ff.invalid ? 'true' : undefined}
139
148
  aria-describedby={ff.describedBy}
140
- oninput={autoResize ? adjustHeight : undefined}></textarea>
149
+ oninput={handleInput}></textarea>
141
150
 
142
151
  {#if showFooter}
143
152
  <div
@@ -2,7 +2,7 @@ import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
2
  export declare const textareaVariants: ((props?: {
3
3
  tier?: "commit" | "modify" | undefined;
4
4
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
5
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
5
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
6
6
  intent?: "default" | "success" | "warning" | "danger" | undefined;
7
7
  autoResize?: boolean | undefined;
8
8
  disabled?: boolean | undefined;
@@ -15,7 +15,7 @@ export declare const textareaVariants: ((props?: {
15
15
  wrapper: (props?: ({
16
16
  tier?: "commit" | "modify" | undefined;
17
17
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
18
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
18
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
19
19
  intent?: "default" | "success" | "warning" | "danger" | undefined;
20
20
  autoResize?: boolean | undefined;
21
21
  disabled?: boolean | undefined;
@@ -30,7 +30,7 @@ export declare const textareaVariants: ((props?: {
30
30
  base: (props?: ({
31
31
  tier?: "commit" | "modify" | undefined;
32
32
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
33
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
33
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
34
34
  intent?: "default" | "success" | "warning" | "danger" | undefined;
35
35
  autoResize?: boolean | undefined;
36
36
  disabled?: boolean | undefined;
@@ -45,7 +45,7 @@ export declare const textareaVariants: ((props?: {
45
45
  label: (props?: ({
46
46
  tier?: "commit" | "modify" | undefined;
47
47
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
48
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
48
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
49
49
  intent?: "default" | "success" | "warning" | "danger" | undefined;
50
50
  autoResize?: boolean | undefined;
51
51
  disabled?: boolean | undefined;
@@ -60,7 +60,7 @@ export declare const textareaVariants: ((props?: {
60
60
  footer: (props?: ({
61
61
  tier?: "commit" | "modify" | undefined;
62
62
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
63
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
63
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
64
64
  intent?: "default" | "success" | "warning" | "danger" | undefined;
65
65
  autoResize?: boolean | undefined;
66
66
  disabled?: boolean | undefined;
@@ -75,7 +75,7 @@ export declare const textareaVariants: ((props?: {
75
75
  message: (props?: ({
76
76
  tier?: "commit" | "modify" | undefined;
77
77
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
78
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
78
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
79
79
  intent?: "default" | "success" | "warning" | "danger" | undefined;
80
80
  autoResize?: boolean | undefined;
81
81
  disabled?: boolean | undefined;
@@ -90,7 +90,7 @@ export declare const textareaVariants: ((props?: {
90
90
  counter: (props?: ({
91
91
  tier?: "commit" | "modify" | undefined;
92
92
  variant?: "ghost" | "filled" | "outlined" | "underline" | undefined;
93
- size?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
93
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
94
94
  intent?: "default" | "success" | "warning" | "danger" | undefined;
95
95
  autoResize?: boolean | undefined;
96
96
  disabled?: boolean | undefined;
@@ -1,15 +1,15 @@
1
1
  import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
2
  export declare const toolbarVariants: ((props?: {
3
- variant?: "ghost" | "elevated" | "outlined" | "quiet" | undefined;
3
+ variant?: "ghost" | "quiet" | "elevated" | "outlined" | undefined;
4
4
  orientation?: "horizontal" | "vertical" | undefined;
5
- gap?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
6
- padding?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
5
+ gap?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
6
+ padding?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
7
7
  } | undefined) => {
8
8
  base: (props?: ({
9
- variant?: "ghost" | "elevated" | "outlined" | "quiet" | undefined;
9
+ variant?: "ghost" | "quiet" | "elevated" | "outlined" | undefined;
10
10
  orientation?: "horizontal" | "vertical" | undefined;
11
- gap?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
12
- padding?: "sm" | "md" | "lg" | "xl" | "xs" | undefined;
11
+ gap?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
12
+ padding?: "sm" | "md" | "lg" | "xs" | "xl" | undefined;
13
13
  } & {
14
14
  class?: string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | (string | number | false | /*elided*/ any | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined)[] | Record<string, boolean | null | undefined> | null | undefined;
15
15
  }) | undefined) => string;
@@ -183,7 +183,12 @@
183
183
 
184
184
  /* === SHADOWS ===
185
185
  Dark mode uses higher alpha to compensate for low contrast against
186
- dark surfaces. light-dark() handles the whole multi-layer shadow.
186
+ dark surfaces. light-dark() may wrap ONLY the per-layer <color> —
187
+ it is a color function, and layers must stay top-level
188
+ comma-separated. Wrapping the whole multi-layer list made every
189
+ `box-shadow: var(--blocks-shadow-*)` invalid at computed-value time
190
+ (shadows silently rendered as none, library-wide) — verified in
191
+ chromium before the 2026-07-13 fix.
187
192
 
188
193
  The shadow tint (`--blocks-shadow-tint`) is an oklch L C H triplet
189
194
  WITHOUT the alpha channel — declared on `:root` (not inside @theme)
@@ -192,34 +197,55 @@
192
197
  their shadow palette — e.g. editorial sets it to a dark brown so
193
198
  shadows blend with cream surfaces instead of reading as cool
194
199
  smudges. */
195
- --color-shadow-xs: light-dark(
196
- 0 1px 2px 0 oklch(var(--blocks-shadow-tint) / 0.05),
197
- 0 1px 2px 0 oklch(var(--blocks-shadow-tint) / 0.2)
198
- );
199
- --color-shadow-sm: light-dark(
200
- 0 1px 3px 0 oklch(var(--blocks-shadow-tint) / 0.1) 0 1px 2px -1px
201
- oklch(var(--blocks-shadow-tint) / 0.1),
202
- 0 1px 3px 0 oklch(var(--blocks-shadow-tint) / 0.3) 0 1px 2px -1px
203
- oklch(var(--blocks-shadow-tint) / 0.3)
204
- );
205
- --color-shadow-base: light-dark(
206
- 0 4px 6px -1px oklch(var(--blocks-shadow-tint) / 0.1) 0 2px 4px -2px
207
- oklch(var(--blocks-shadow-tint) / 0.1),
208
- 0 4px 6px -1px oklch(var(--blocks-shadow-tint) / 0.4) 0 2px 4px -2px
209
- oklch(var(--blocks-shadow-tint) / 0.4)
210
- );
211
- --color-shadow-md: light-dark(
212
- 0 10px 15px -3px oklch(var(--blocks-shadow-tint) / 0.1) 0 4px 6px -4px
213
- oklch(var(--blocks-shadow-tint) / 0.1),
214
- 0 10px 15px -3px oklch(var(--blocks-shadow-tint) / 0.4) 0 4px 6px -4px
215
- oklch(var(--blocks-shadow-tint) / 0.4)
216
- );
217
- --color-shadow-lg: light-dark(
218
- 0 20px 25px -5px oklch(var(--blocks-shadow-tint) / 0.1) 0 8px 10px -6px
219
- oklch(var(--blocks-shadow-tint) / 0.1),
220
- 0 20px 25px -5px oklch(var(--blocks-shadow-tint) / 0.5) 0 8px 10px -6px
221
- oklch(var(--blocks-shadow-tint) / 0.5)
222
- );
200
+ --color-shadow-xs: 0 1px 2px 0
201
+ light-dark(
202
+ oklch(var(--blocks-shadow-tint) / 0.05),
203
+ oklch(var(--blocks-shadow-tint) / 0.2)
204
+ );
205
+ --color-shadow-sm:
206
+ 0 1px 3px 0
207
+ light-dark(
208
+ oklch(var(--blocks-shadow-tint) / 0.1),
209
+ oklch(var(--blocks-shadow-tint) / 0.3)
210
+ ),
211
+ 0 1px 2px -1px
212
+ light-dark(
213
+ oklch(var(--blocks-shadow-tint) / 0.1),
214
+ oklch(var(--blocks-shadow-tint) / 0.3)
215
+ );
216
+ --color-shadow-base:
217
+ 0 4px 6px -1px
218
+ light-dark(
219
+ oklch(var(--blocks-shadow-tint) / 0.1),
220
+ oklch(var(--blocks-shadow-tint) / 0.4)
221
+ ),
222
+ 0 2px 4px -2px
223
+ light-dark(
224
+ oklch(var(--blocks-shadow-tint) / 0.1),
225
+ oklch(var(--blocks-shadow-tint) / 0.4)
226
+ );
227
+ --color-shadow-md:
228
+ 0 10px 15px -3px
229
+ light-dark(
230
+ oklch(var(--blocks-shadow-tint) / 0.1),
231
+ oklch(var(--blocks-shadow-tint) / 0.4)
232
+ ),
233
+ 0 4px 6px -4px
234
+ light-dark(
235
+ oklch(var(--blocks-shadow-tint) / 0.1),
236
+ oklch(var(--blocks-shadow-tint) / 0.4)
237
+ );
238
+ --color-shadow-lg:
239
+ 0 20px 25px -5px
240
+ light-dark(
241
+ oklch(var(--blocks-shadow-tint) / 0.1),
242
+ oklch(var(--blocks-shadow-tint) / 0.5)
243
+ ),
244
+ 0 8px 10px -6px
245
+ light-dark(
246
+ oklch(var(--blocks-shadow-tint) / 0.1),
247
+ oklch(var(--blocks-shadow-tint) / 0.5)
248
+ );
223
249
  }
224
250
 
225
251
  /* Shadow tint — declared on :root rather than inside @theme because
@@ -4,6 +4,19 @@
4
4
  * Generates a Tokens Studio-compatible JSON export from the Urbicon UI
5
5
  * OKLCH design token system. Suitable for Figma plugins like "Tokens Studio
6
6
  * for Figma" (formerly Figma Tokens).
7
+ *
8
+ * The values below mirror the token truth in `../style/foundation.css`
9
+ * (palettes, radii) and `../style/semantic.css` (surface/text/border roles,
10
+ * shadows). They are hardcoded — this module runs in the browser and cannot
11
+ * read the CSS files at runtime — but guarded against drift by the
12
+ * co-located `figma-token-export.test.ts`, which parses both CSS files and
13
+ * compares every value. If you change a token in the CSS, that test fails
14
+ * until the export here is updated to match.
15
+ *
16
+ * Semantic tokens resolve light/dark via CSS `light-dark()`; this export
17
+ * carries the **light-mode** resolution (Figma has no mode-aware token
18
+ * values in plain Tokens Studio JSON). Dark mode swaps at the foundation
19
+ * layer, so the palette ramps below contain every shade both modes use.
7
20
  */
8
21
  export interface FigmaToken {
9
22
  value: string;