@urbicon-ui/blocks 6.21.0 → 6.21.2

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 (142) hide show
  1. package/dist/components/Calendar/calendar.variants.d.ts +132 -419
  2. package/dist/components/CommandPalette/commandPalette.variants.d.ts +24 -51
  3. package/dist/components/CompositionBar/CompositionBar.svelte +6 -1
  4. package/dist/components/CompositionBar/composition-bar.variants.d.ts +23 -83
  5. package/dist/components/CompositionBar/composition-bar.variants.js +9 -3
  6. package/dist/components/EmptyState/emptyState.variants.d.ts +11 -27
  7. package/dist/components/FileUpload/fileUpload.variants.d.ts +24 -93
  8. package/dist/components/Guide/GuidePanel.svelte +38 -0
  9. package/dist/components/Guide/guide.variants.d.ts +69 -124
  10. package/dist/components/Guide/guide.variants.js +6 -1
  11. package/dist/components/NumberInput/NumberInput.svelte +197 -0
  12. package/dist/components/NumberInput/NumberInput.svelte.d.ts +4 -0
  13. package/dist/components/NumberInput/index.d.ts +55 -0
  14. package/dist/components/NumberInput/index.js +1 -0
  15. package/dist/components/Planner/planner.variants.d.ts +23 -94
  16. package/dist/components/Sankey/sankey.variants.d.ts +15 -48
  17. package/dist/components/SidebarLayout/sidebar-layout.variants.d.ts +10 -38
  18. package/dist/components/SidebarLayout/sidebar-layout.variants.js +12 -2
  19. package/dist/components/ThemeSwitcher/themeSwitcher.variants.d.ts +9 -36
  20. package/dist/components/index.d.ts +2 -0
  21. package/dist/components/index.js +1 -0
  22. package/dist/i18n/index.d.ts +8 -372
  23. package/dist/internal/charts/variants.d.ts +18 -31
  24. package/dist/primitives/Accordion/Accordion.svelte +11 -0
  25. package/dist/primitives/Accordion/AccordionItem.svelte +9 -3
  26. package/dist/primitives/Accordion/accordion.variants.d.ts +12 -43
  27. package/dist/primitives/Accordion/accordion.variants.js +6 -2
  28. package/dist/primitives/Accordion/index.d.ts +12 -0
  29. package/dist/primitives/Alert/alert.variants.d.ts +21 -62
  30. package/dist/primitives/Avatar/avatar.variants.d.ts +18 -138
  31. package/dist/primitives/Badge/Badge.svelte +12 -4
  32. package/dist/primitives/Badge/badge.variants.d.ts +19 -92
  33. package/dist/primitives/Badge/badge.variants.js +11 -4
  34. package/dist/primitives/Badge/index.d.ts +26 -6
  35. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +11 -6
  36. package/dist/primitives/Breadcrumb/breadcrumb.variants.d.ts +13 -40
  37. package/dist/primitives/Breadcrumb/index.d.ts +2 -2
  38. package/dist/primitives/Button/button.variants.d.ts +19 -98
  39. package/dist/primitives/Button/button.variants.js +13 -9
  40. package/dist/primitives/ButtonGroup/buttongroup.variants.d.ts +9 -29
  41. package/dist/primitives/ButtonGroup/buttongroup.variants.js +3 -1
  42. package/dist/primitives/Card/card.variants.d.ts +14 -81
  43. package/dist/primitives/Checkbox/Checkbox.svelte +3 -3
  44. package/dist/primitives/Checkbox/checkbox.variants.d.ts +18 -77
  45. package/dist/primitives/Collapsible/Collapsible.svelte +10 -0
  46. package/dist/primitives/Collapsible/collapsible.variants.d.ts +11 -40
  47. package/dist/primitives/Collapsible/collapsible.variants.js +7 -2
  48. package/dist/primitives/Collapsible/index.d.ts +16 -0
  49. package/dist/primitives/Combobox/Combobox.svelte +478 -104
  50. package/dist/primitives/Combobox/combobox.variants.d.ts +112 -94
  51. package/dist/primitives/Combobox/combobox.variants.js +94 -13
  52. package/dist/primitives/Combobox/index.d.ts +166 -51
  53. package/dist/primitives/ConfirmDialog/index.d.ts +19 -0
  54. package/dist/primitives/Dialog/Dialog.svelte +95 -10
  55. package/dist/primitives/Dialog/dialog.variants.d.ts +15 -54
  56. package/dist/primitives/Dialog/index.d.ts +12 -1
  57. package/dist/primitives/Drawer/Drawer.svelte +23 -11
  58. package/dist/primitives/Drawer/drawer.variants.d.ts +22 -49
  59. package/dist/primitives/Drawer/drawer.variants.js +45 -10
  60. package/dist/primitives/Drawer/index.d.ts +13 -4
  61. package/dist/primitives/FormField/FormField.svelte +6 -6
  62. package/dist/primitives/FormField/index.d.ts +13 -4
  63. package/dist/primitives/Input/Input.svelte +8 -4
  64. package/dist/primitives/Input/input.variants.d.ts +32 -139
  65. package/dist/primitives/Input/input.variants.js +12 -10
  66. package/dist/primitives/JourneyTimeline/journey-timeline.variants.d.ts +55 -197
  67. package/dist/primitives/JourneyTimeline/journey-timeline.variants.js +4 -1
  68. package/dist/primitives/Menu/Menu.svelte +66 -4
  69. package/dist/primitives/Menu/index.d.ts +25 -0
  70. package/dist/primitives/Menu/menu.variants.d.ts +29 -93
  71. package/dist/primitives/Pagination/Pagination.svelte +28 -13
  72. package/dist/primitives/Pagination/index.d.ts +44 -0
  73. package/dist/primitives/Pagination/pagination.variants.d.ts +16 -54
  74. package/dist/primitives/Pagination/pagination.variants.js +16 -14
  75. package/dist/primitives/Popover/Popover.svelte +11 -1
  76. package/dist/primitives/Popover/index.d.ts +3 -3
  77. package/dist/primitives/Popover/popover.variants.d.ts +4 -2
  78. package/dist/primitives/Progress/progress.variants.d.ts +19 -83
  79. package/dist/primitives/Progress/progress.variants.js +2 -1
  80. package/dist/primitives/RadioGroup/RadioGroup.svelte +3 -3
  81. package/dist/primitives/RadioGroup/radioGroup.variants.d.ts +28 -109
  82. package/dist/primitives/SegmentGroup/SegmentGroup.svelte +14 -6
  83. package/dist/primitives/SegmentGroup/segmentgroup.variants.d.ts +12 -53
  84. package/dist/primitives/SegmentGroup/segmentgroup.variants.js +10 -10
  85. package/dist/primitives/Select/Select.svelte +21 -11
  86. package/dist/primitives/Select/index.d.ts +7 -0
  87. package/dist/primitives/Select/select.variants.d.ts +61 -150
  88. package/dist/primitives/Select/select.variants.js +24 -4
  89. package/dist/primitives/Separator/separator.variants.d.ts +4 -2
  90. package/dist/primitives/Sidebar/Sidebar.svelte +10 -15
  91. package/dist/primitives/Sidebar/sidebar.variants.d.ts +11 -29
  92. package/dist/primitives/Skeleton/skeleton.variants.d.ts +9 -36
  93. package/dist/primitives/Slider/Slider.svelte +4 -8
  94. package/dist/primitives/Slider/slider.variants.d.ts +37 -136
  95. package/dist/primitives/Slider/slider.variants.js +8 -5
  96. package/dist/primitives/Spinner/spinner.variants.d.ts +38 -135
  97. package/dist/primitives/Stepper/stepper.variants.d.ts +32 -130
  98. package/dist/primitives/Tab/Tab.svelte +14 -6
  99. package/dist/primitives/Tab/tab.variants.d.ts +17 -78
  100. package/dist/primitives/Textarea/Textarea.svelte +4 -5
  101. package/dist/primitives/Textarea/textarea.variants.d.ts +33 -118
  102. package/dist/primitives/Textarea/textarea.variants.js +17 -12
  103. package/dist/primitives/Toast/Toaster.svelte +58 -5
  104. package/dist/primitives/Toast/index.d.ts +39 -0
  105. package/dist/primitives/Toast/toast.store.svelte.d.ts +25 -1
  106. package/dist/primitives/Toast/toast.store.svelte.js +91 -1
  107. package/dist/primitives/Toast/toast.variants.d.ts +40 -78
  108. package/dist/primitives/Toast/toast.variants.js +15 -0
  109. package/dist/primitives/Toggle/Toggle.svelte +17 -3
  110. package/dist/primitives/Toggle/index.d.ts +8 -2
  111. package/dist/primitives/Toggle/toggle.variants.d.ts +24 -71
  112. package/dist/primitives/Toggle/toggle.variants.js +26 -0
  113. package/dist/primitives/Toolbar/toolbar.variants.d.ts +9 -60
  114. package/dist/primitives/Tooltip/Tooltip.svelte +58 -21
  115. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +1 -1
  116. package/dist/primitives/Tooltip/index.d.ts +45 -3
  117. package/dist/primitives/Tooltip/tooltip.variants.d.ts +14 -53
  118. package/dist/primitives/Tooltip/tooltip.variants.js +9 -3
  119. package/dist/primitives/index.d.ts +3 -3
  120. package/dist/style/foundation.css +4 -1
  121. package/dist/style/interaction.css +39 -11
  122. package/dist/style/semantic.css +2 -2
  123. package/dist/style/themes/index.css +1 -1
  124. package/dist/translations/de.d.ts +3 -0
  125. package/dist/translations/de.js +4 -1
  126. package/dist/translations/en.d.ts +3 -0
  127. package/dist/translations/en.js +4 -1
  128. package/dist/utils/guide.svelte.d.ts +8 -2
  129. package/dist/utils/guide.svelte.js +86 -5
  130. package/dist/utils/index.d.ts +2 -1
  131. package/dist/utils/index.js +5 -0
  132. package/dist/utils/overlay.d.ts +33 -4
  133. package/dist/utils/overlay.js +61 -18
  134. package/dist/utils/roving.d.ts +15 -0
  135. package/dist/utils/roving.js +44 -0
  136. package/dist/utils/use-floating-panel.svelte.d.ts +4 -1
  137. package/dist/utils/use-floating-panel.svelte.js +23 -1
  138. package/dist/utils/use-form-field.svelte.d.ts +9 -9
  139. package/dist/utils/use-form-field.svelte.js +12 -12
  140. package/dist/utils/variants.d.ts +60 -16
  141. package/dist/utils/variants.js +424 -123
  142. package/package.json +9 -6
@@ -1,35 +1,17 @@
1
1
  import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
- export declare const radioGroupVariants: (props?: import("../../utils/variants.js").TVProps<{
3
- orientation: {
4
- horizontal: {
5
- group: string;
6
- };
7
- vertical: {
8
- group: string;
9
- };
10
- };
11
- required: {
12
- true: {
13
- label: string;
14
- };
15
- };
16
- error: {
17
- true: {
18
- message: string;
19
- };
20
- };
21
- disabled: {
22
- true: {};
23
- };
24
- }> | undefined) => {
2
+ export declare const radioGroupVariants: ((props?: {
3
+ orientation?: "horizontal" | "vertical" | undefined;
4
+ required?: boolean | undefined;
5
+ error?: boolean | undefined;
6
+ disabled?: boolean | undefined;
7
+ } | undefined) => {
25
8
  root: (props?: ({
26
9
  orientation?: "horizontal" | "vertical" | undefined;
27
10
  required?: boolean | undefined;
28
11
  error?: boolean | undefined;
29
12
  disabled?: boolean | undefined;
30
13
  } & {
31
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
32
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
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;
33
15
  }) | undefined) => string;
34
16
  group: (props?: ({
35
17
  orientation?: "horizontal" | "vertical" | undefined;
@@ -37,8 +19,7 @@ export declare const radioGroupVariants: (props?: import("../../utils/variants.j
37
19
  error?: boolean | undefined;
38
20
  disabled?: boolean | undefined;
39
21
  } & {
40
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
41
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
22
+ 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;
42
23
  }) | undefined) => string;
43
24
  label: (props?: ({
44
25
  orientation?: "horizontal" | "vertical" | undefined;
@@ -46,8 +27,7 @@ export declare const radioGroupVariants: (props?: import("../../utils/variants.j
46
27
  error?: boolean | undefined;
47
28
  disabled?: boolean | undefined;
48
29
  } & {
49
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
50
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
30
+ 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;
51
31
  }) | undefined) => string;
52
32
  message: (props?: ({
53
33
  orientation?: "horizontal" | "vertical" | undefined;
@@ -55,78 +35,20 @@ export declare const radioGroupVariants: (props?: import("../../utils/variants.j
55
35
  error?: boolean | undefined;
56
36
  disabled?: boolean | undefined;
57
37
  } & {
58
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
59
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
38
+ 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;
60
39
  }) | undefined) => string;
40
+ }) & {
41
+ readonly config: import("../../utils/variants.js").TVConfig;
61
42
  };
62
- export declare const radioItemVariants: (props?: import("../../utils/variants.js").TVProps<{
63
- tier: {
64
- commit: {
65
- indicator: string;
66
- dot: string;
67
- };
68
- modify: {
69
- indicator: string;
70
- dot: string;
71
- };
72
- };
73
- size: {
74
- xs: {
75
- item: string;
76
- indicator: string;
77
- dot: string;
78
- label: string;
79
- description: string;
80
- };
81
- sm: {
82
- item: string;
83
- indicator: string;
84
- dot: string;
85
- label: string;
86
- description: string;
87
- };
88
- md: {
89
- item: string;
90
- indicator: string;
91
- dot: string;
92
- label: string;
93
- description: string;
94
- };
95
- lg: {
96
- item: string;
97
- indicator: string;
98
- dot: string;
99
- label: string;
100
- description: string;
101
- };
102
- };
103
- intent: {
104
- primary: {};
105
- secondary: {};
106
- success: {};
107
- warning: {};
108
- danger: {};
109
- neutral: {};
110
- };
111
- variant: {
112
- outlined: {};
113
- filled: {};
114
- ghost: {};
115
- };
116
- checked: {
117
- true: {
118
- dot: string;
119
- };
120
- };
121
- disabled: {
122
- true: {
123
- item: string;
124
- };
125
- };
126
- error: {
127
- true: {};
128
- };
129
- }> | undefined) => {
43
+ export declare const radioItemVariants: ((props?: {
44
+ tier?: "commit" | "modify" | undefined;
45
+ size?: "sm" | "md" | "lg" | "xs" | undefined;
46
+ intent?: "primary" | "secondary" | "success" | "warning" | "danger" | "neutral" | undefined;
47
+ variant?: "ghost" | "filled" | "outlined" | undefined;
48
+ checked?: boolean | undefined;
49
+ disabled?: boolean | undefined;
50
+ error?: boolean | undefined;
51
+ } | undefined) => {
130
52
  item: (props?: ({
131
53
  tier?: "commit" | "modify" | undefined;
132
54
  size?: "sm" | "md" | "lg" | "xs" | undefined;
@@ -136,8 +58,7 @@ export declare const radioItemVariants: (props?: import("../../utils/variants.js
136
58
  disabled?: boolean | undefined;
137
59
  error?: boolean | undefined;
138
60
  } & {
139
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
140
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
61
+ 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;
141
62
  }) | undefined) => string;
142
63
  indicator: (props?: ({
143
64
  tier?: "commit" | "modify" | undefined;
@@ -148,8 +69,7 @@ export declare const radioItemVariants: (props?: import("../../utils/variants.js
148
69
  disabled?: boolean | undefined;
149
70
  error?: boolean | undefined;
150
71
  } & {
151
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
152
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
72
+ 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;
153
73
  }) | undefined) => string;
154
74
  dot: (props?: ({
155
75
  tier?: "commit" | "modify" | undefined;
@@ -160,8 +80,7 @@ export declare const radioItemVariants: (props?: import("../../utils/variants.js
160
80
  disabled?: boolean | undefined;
161
81
  error?: boolean | undefined;
162
82
  } & {
163
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
164
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
83
+ 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;
165
84
  }) | undefined) => string;
166
85
  label: (props?: ({
167
86
  tier?: "commit" | "modify" | undefined;
@@ -172,8 +91,7 @@ export declare const radioItemVariants: (props?: import("../../utils/variants.js
172
91
  disabled?: boolean | undefined;
173
92
  error?: boolean | undefined;
174
93
  } & {
175
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
176
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
94
+ 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;
177
95
  }) | undefined) => string;
178
96
  description: (props?: ({
179
97
  tier?: "commit" | "modify" | undefined;
@@ -184,9 +102,10 @@ export declare const radioItemVariants: (props?: import("../../utils/variants.js
184
102
  disabled?: boolean | undefined;
185
103
  error?: boolean | undefined;
186
104
  } & {
187
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
188
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
105
+ 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;
189
106
  }) | undefined) => string;
107
+ }) & {
108
+ readonly config: import("../../utils/variants.js").TVConfig;
190
109
  };
191
110
  export type RadioGroupVariants = VariantProps<typeof radioGroupVariants>;
192
111
  export type RadioItemVariants = VariantProps<typeof radioItemVariants>;
@@ -2,7 +2,7 @@
2
2
  import { untrack } from 'svelte';
3
3
  import { SvelteMap } from 'svelte/reactivity';
4
4
  import { getBlocksConfig, resolveSlotClasses } from '../../provider';
5
- import { getTierContext } from '../../utils';
5
+ import { edgeEnabledIndex, getTierContext, nextEnabledIndex } from '../../utils';
6
6
  import { segmentGroupVariants, type SegmentGroupVariants } from './segmentgroup.variants';
7
7
  import { setSegmentGroupContext } from './segmentGroup.context';
8
8
  import type { SegmentGroupContext, SegmentGroupProps } from './index';
@@ -189,37 +189,45 @@
189
189
  return () => ro.disconnect();
190
190
  });
191
191
 
192
+ // A disabled SegmentItem renders a `<button disabled>`, which can't hold focus,
193
+ // so roving navigation must skip it — otherwise selection strands on an
194
+ // unfocusable segment (aria-checked set, focus stuck on the previous one). The
195
+ // index math lives in the shared roving helpers (utils/roving).
192
196
  function handleKeyDown(event: KeyboardEvent) {
193
197
  if (disabled) return;
194
198
 
195
199
  const itemValues = Array.from(registeredItems.keys());
196
200
  const currentIndex = value ? itemValues.indexOf(value) : -1;
201
+ const isDisabled = (i: number) => {
202
+ const el = registeredItems.get(itemValues[i]);
203
+ return !el || (el as HTMLButtonElement).disabled;
204
+ };
197
205
  let newIndex: number;
198
206
 
199
207
  switch (event.key) {
200
208
  case 'ArrowRight':
201
209
  case 'ArrowDown':
202
210
  event.preventDefault();
203
- newIndex = (currentIndex + 1) % itemValues.length;
211
+ newIndex = nextEnabledIndex(itemValues.length, currentIndex, 1, isDisabled);
204
212
  break;
205
213
  case 'ArrowLeft':
206
214
  case 'ArrowUp':
207
215
  event.preventDefault();
208
- newIndex = currentIndex - 1 < 0 ? itemValues.length - 1 : currentIndex - 1;
216
+ newIndex = nextEnabledIndex(itemValues.length, currentIndex, -1, isDisabled);
209
217
  break;
210
218
  case 'Home':
211
219
  event.preventDefault();
212
- newIndex = 0;
220
+ newIndex = edgeEnabledIndex(itemValues.length, 1, isDisabled);
213
221
  break;
214
222
  case 'End':
215
223
  event.preventDefault();
216
- newIndex = itemValues.length - 1;
224
+ newIndex = edgeEnabledIndex(itemValues.length, -1, isDisabled);
217
225
  break;
218
226
  default:
219
227
  return;
220
228
  }
221
229
 
222
- if (newIndex !== currentIndex && itemValues[newIndex]) {
230
+ if (newIndex !== currentIndex && newIndex >= 0 && itemValues[newIndex]) {
223
231
  segmentContext.selectItem(itemValues[newIndex]);
224
232
  const newItem = registeredItems.get(itemValues[newIndex]);
225
233
  newItem?.focus();
@@ -1,51 +1,11 @@
1
1
  import { type SlotNames, type VariantProps } from '../../utils/variants.js';
2
- export declare const segmentGroupVariants: (props?: import("../../utils/variants.js").TVProps<{
3
- tier: {
4
- commit: {
5
- base: string;
6
- indicator: string;
7
- item: string;
8
- };
9
- modify: {
10
- base: string;
11
- indicator: string;
12
- item: string;
13
- };
14
- };
15
- appearance: {
16
- default: {};
17
- text: {
18
- base: string;
19
- indicator: string;
20
- item: string[];
21
- };
22
- };
23
- size: {
24
- sm: {
25
- base: string;
26
- item: string;
27
- };
28
- md: {
29
- base: string;
30
- item: string;
31
- };
32
- lg: {
33
- base: string;
34
- item: string;
35
- };
36
- };
37
- fullWidth: {
38
- true: {
39
- base: string;
40
- item: string;
41
- };
42
- };
43
- disabled: {
44
- true: {
45
- base: string;
46
- };
47
- };
48
- }> | undefined) => {
2
+ export declare const segmentGroupVariants: ((props?: {
3
+ tier?: "commit" | "modify" | undefined;
4
+ appearance?: "text" | "default" | undefined;
5
+ size?: "sm" | "md" | "lg" | undefined;
6
+ fullWidth?: boolean | undefined;
7
+ disabled?: boolean | undefined;
8
+ } | undefined) => {
49
9
  base: (props?: ({
50
10
  tier?: "commit" | "modify" | undefined;
51
11
  appearance?: "text" | "default" | undefined;
@@ -53,8 +13,7 @@ export declare const segmentGroupVariants: (props?: import("../../utils/variants
53
13
  fullWidth?: boolean | undefined;
54
14
  disabled?: boolean | undefined;
55
15
  } & {
56
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
57
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
16
+ 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;
58
17
  }) | undefined) => string;
59
18
  indicator: (props?: ({
60
19
  tier?: "commit" | "modify" | undefined;
@@ -63,8 +22,7 @@ export declare const segmentGroupVariants: (props?: import("../../utils/variants
63
22
  fullWidth?: boolean | undefined;
64
23
  disabled?: boolean | undefined;
65
24
  } & {
66
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
67
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
25
+ 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;
68
26
  }) | undefined) => string;
69
27
  item: (props?: ({
70
28
  tier?: "commit" | "modify" | undefined;
@@ -73,9 +31,10 @@ export declare const segmentGroupVariants: (props?: import("../../utils/variants
73
31
  fullWidth?: boolean | undefined;
74
32
  disabled?: boolean | undefined;
75
33
  } & {
76
- class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
77
- className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
34
+ 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;
78
35
  }) | undefined) => string;
36
+ }) & {
37
+ readonly config: import("../../utils/variants.js").TVConfig;
79
38
  };
80
39
  export type SegmentGroupVariants = VariantProps<typeof segmentGroupVariants>;
81
40
  /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
@@ -79,10 +79,11 @@ export const segmentGroupVariants = tv({
79
79
  appearance: {
80
80
  default: {},
81
81
  text: {
82
- // Radius flattening (`rounded-none`) lives in compoundVariants
83
- // below so it strips the tier-stage `rounded-{commit|modify}`
84
- // cleanly tv() only strips across stages, not within them.
85
- base: 'bg-transparent p-0 gap-1',
82
+ // Radius flattening (`rounded-none`) and track-padding reset (`p-0`)
83
+ // live in compoundVariants below so they strip the tier-stage
84
+ // `rounded-{commit|modify}` and the size-stage `p-*` those axes
85
+ // are declared after this one and would win the fold otherwise.
86
+ base: 'bg-transparent gap-1',
86
87
  indicator: 'hidden',
87
88
  item: [
88
89
  'border-b-[1.5px] border-b-transparent',
@@ -124,12 +125,11 @@ export const segmentGroupVariants = tv({
124
125
  }
125
126
  },
126
127
  compoundVariants: [
127
- // Text-appearance flattens the corner radius regardless of tier. This
128
- // sits in compoundVariants so it strips the `rounded-{commit|modify}`
129
- // emitted by the tier variant tv() does not dedupe within a single
130
- // variant stage, only across stages, so the override has to live one
131
- // stage later.
132
- { appearance: 'text', class: { base: 'rounded-none', item: 'rounded-none' } },
128
+ // Text-appearance flattens the corner radius (regardless of tier) and
129
+ // zeroes the track padding (regardless of size). Compounds resolve after
130
+ // every variant axis, so these deterministically replace the tier-stage
131
+ // `rounded-{commit|modify}` and the size-stage `p-*`.
132
+ { appearance: 'text', class: { base: 'rounded-none p-0', item: 'rounded-none' } },
133
133
  // Text-appearance sizing: padding/sizing more compact than the pill-track,
134
134
  // but still WCAG 2.5.5 AA (≥ 24px tap height). For touch-first contexts
135
135
  // the `default` appearance should be used — text is primarily intended
@@ -38,6 +38,7 @@
38
38
  mint = 'none',
39
39
  onValueChange,
40
40
  open = $bindable(false),
41
+ onOpenChange,
41
42
  usePortal = true,
42
43
  syncWidth = true,
43
44
  customTrigger,
@@ -101,7 +102,7 @@
101
102
  const labelId = $derived(label ? `${uid}-label` : undefined);
102
103
  const ff = useFormField(() => ({
103
104
  fieldId: uid,
104
- hint: helper,
105
+ helper,
105
106
  error,
106
107
  required,
107
108
  disabled
@@ -235,12 +236,21 @@
235
236
  syncWidth: () => syncWidth
236
237
  });
237
238
 
239
+ // Single mutation point for internally-driven open changes, so
240
+ // `onOpenChange` fires exactly once per transition (and never when the
241
+ // consumer writes `bind:open` directly).
242
+ function setOpen(next: boolean) {
243
+ if (open === next) return;
244
+ open = next;
245
+ onOpenChange?.(next);
246
+ }
247
+
238
248
  function toggle() {
239
249
  if (disabled) return;
240
250
  // Pointer-driven open (trigger onclick). Mark modality so the open effect
241
251
  // doesn't pre-highlight the first row for a mouse/touch user.
242
252
  if (!open) openedViaKeyboard = false;
243
- open = !open;
253
+ setOpen(!open);
244
254
  if (!open) activeIndex = -1;
245
255
  }
246
256
 
@@ -271,7 +281,7 @@
271
281
  dispatchValueChange?.(nextValue);
272
282
  }
273
283
  if (effectiveCloseOnSelect) {
274
- open = false;
284
+ setOpen(false);
275
285
  activeIndex = -1;
276
286
  focusTrigger();
277
287
  }
@@ -297,7 +307,7 @@
297
307
  // explicitly intent to focus elsewhere)
298
308
  function dismissByEscape() {
299
309
  if (!closeOnEscape) return false;
300
- open = false;
310
+ setOpen(false);
301
311
  activeIndex = -1;
302
312
  onEscape?.();
303
313
  return true;
@@ -319,7 +329,7 @@
319
329
  event.preventDefault();
320
330
  if (!open) {
321
331
  openedViaKeyboard = true;
322
- open = true;
332
+ setOpen(true);
323
333
  } else {
324
334
  activeIndex = activeIndex < enabledOptions.length - 1 ? activeIndex + 1 : 0;
325
335
  }
@@ -328,7 +338,7 @@
328
338
  event.preventDefault();
329
339
  if (!open) {
330
340
  openedViaKeyboard = true;
331
- open = true;
341
+ setOpen(true);
332
342
  } else {
333
343
  activeIndex = activeIndex > 0 ? activeIndex - 1 : enabledOptions.length - 1;
334
344
  }
@@ -338,7 +348,7 @@
338
348
  event.preventDefault();
339
349
  if (!open) {
340
350
  openedViaKeyboard = true;
341
- open = true;
351
+ setOpen(true);
342
352
  } else if (activeIndex >= 0 && activeIndex < enabledOptions.length) {
343
353
  selectOption(enabledOptions[activeIndex]);
344
354
  }
@@ -353,7 +363,7 @@
353
363
  // Tab leaves the widget — close (focus moves on via the default tab),
354
364
  // independent of closeOnEscape/closeOnClickOutside.
355
365
  if (open) {
356
- open = false;
366
+ setOpen(false);
357
367
  activeIndex = -1;
358
368
  }
359
369
  break;
@@ -382,7 +392,7 @@
382
392
  !listboxRef.contains(target)
383
393
  ) {
384
394
  if (!closeOnClickOutside) return;
385
- open = false;
395
+ setOpen(false);
386
396
  activeIndex = -1;
387
397
  onClickOutside?.();
388
398
  }
@@ -725,9 +735,9 @@
725
735
  >
726
736
  {error}
727
737
  </div>
728
- {:else if ff.hintId}
738
+ {:else if ff.helperId}
729
739
  <div
730
- id={ff.hintId}
740
+ id={ff.helperId}
731
741
  class={unstyled
732
742
  ? (slotClasses?.message ?? '')
733
743
  : styles.message({ class: slotClasses?.message })}
@@ -164,6 +164,13 @@ interface SelectBaseProps<T extends SelectValue = string> extends Omit<SelectVar
164
164
  * the Select wrapper). @default false
165
165
  */
166
166
  open?: boolean;
167
+ /**
168
+ * Fires when the listbox opens or closes from user interaction (trigger
169
+ * click, keyboard, selection, Escape, Tab-out, outside click). Receives the
170
+ * new open state — use it e.g. to lazy-load options on first open. Not
171
+ * called when the consumer writes `bind:open` directly.
172
+ */
173
+ onOpenChange?: (open: boolean) => void;
167
174
  /**
168
175
  * When true, the listbox is rendered into the browser top layer via the native
169
176
  * `popover` API, so it cannot be clipped by `overflow: auto` ancestors. When