sv5ui 1.1.3 → 1.2.0

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 (155) hide show
  1. package/README.md +6 -0
  2. package/dist/Alert/Alert.svelte +33 -22
  3. package/dist/Alert/Alert.svelte.d.ts +1 -1
  4. package/dist/Alert/alert.types.d.ts +4 -0
  5. package/dist/Avatar/Avatar.svelte +72 -46
  6. package/dist/Avatar/avatar.types.d.ts +36 -3
  7. package/dist/Avatar/avatar.variants.d.ts +138 -0
  8. package/dist/Avatar/avatar.variants.js +23 -12
  9. package/dist/Avatar/index.d.ts +1 -1
  10. package/dist/AvatarGroup/AvatarGroup.svelte +11 -6
  11. package/dist/AvatarGroup/AvatarGroup.svelte.d.ts +1 -1
  12. package/dist/AvatarGroup/avatar-group.types.d.ts +18 -3
  13. package/dist/AvatarGroup/avatar-group.variants.d.ts +85 -0
  14. package/dist/AvatarGroup/avatar-group.variants.js +19 -29
  15. package/dist/Badge/Badge.svelte +4 -3
  16. package/dist/Badge/Badge.svelte.d.ts +1 -1
  17. package/dist/Badge/badge.types.d.ts +9 -0
  18. package/dist/Breadcrumb/Breadcrumb.svelte +20 -7
  19. package/dist/Breadcrumb/Breadcrumb.svelte.d.ts +1 -1
  20. package/dist/Breadcrumb/breadcrumb.types.d.ts +5 -1
  21. package/dist/Breadcrumb/breadcrumb.variants.d.ts +15 -5
  22. package/dist/Breadcrumb/breadcrumb.variants.js +7 -3
  23. package/dist/Button/Button.svelte +71 -16
  24. package/dist/Button/Button.svelte.d.ts +0 -1
  25. package/dist/Button/button.types.d.ts +61 -2
  26. package/dist/Calendar/Calendar.svelte +4 -0
  27. package/dist/Calendar/Calendar.svelte.d.ts +1 -1
  28. package/dist/Calendar/calendar.types.d.ts +4 -0
  29. package/dist/Card/Card.svelte +5 -4
  30. package/dist/Card/Card.svelte.d.ts +1 -1
  31. package/dist/Card/card.types.d.ts +5 -1
  32. package/dist/Checkbox/Checkbox.svelte +37 -11
  33. package/dist/Checkbox/Checkbox.svelte.d.ts +1 -1
  34. package/dist/Checkbox/checkbox.types.d.ts +16 -1
  35. package/dist/Checkbox/checkbox.variants.d.ts +90 -0
  36. package/dist/Checkbox/checkbox.variants.js +73 -4
  37. package/dist/Chip/Chip.svelte +3 -2
  38. package/dist/Chip/Chip.svelte.d.ts +1 -1
  39. package/dist/Chip/chip.types.d.ts +5 -1
  40. package/dist/Chip/chip.variants.d.ts +135 -45
  41. package/dist/Chip/chip.variants.js +9 -9
  42. package/dist/ContextMenu/ContextMenu.svelte +87 -77
  43. package/dist/ContextMenu/ContextMenu.svelte.d.ts +1 -1
  44. package/dist/ContextMenu/context-menu.types.d.ts +9 -3
  45. package/dist/ContextMenu/context-menu.types.js +1 -1
  46. package/dist/ContextMenu/context-menu.variants.d.ts +74 -160
  47. package/dist/ContextMenu/context-menu.variants.js +63 -95
  48. package/dist/DropdownMenu/DropdownMenu.svelte +37 -43
  49. package/dist/DropdownMenu/DropdownMenu.svelte.d.ts +1 -1
  50. package/dist/DropdownMenu/dropdown-menu.types.d.ts +9 -3
  51. package/dist/DropdownMenu/dropdown-menu.types.js +1 -1
  52. package/dist/DropdownMenu/dropdown-menu.variants.d.ts +79 -230
  53. package/dist/DropdownMenu/dropdown-menu.variants.js +68 -111
  54. package/dist/DropdownMenu/index.d.ts +1 -1
  55. package/dist/Empty/Empty.svelte +68 -33
  56. package/dist/Empty/Empty.svelte.d.ts +1 -1
  57. package/dist/Empty/empty.types.d.ts +26 -9
  58. package/dist/Empty/empty.variants.d.ts +150 -130
  59. package/dist/Empty/empty.variants.js +33 -324
  60. package/dist/FieldGroup/FieldGroup.svelte +11 -6
  61. package/dist/FieldGroup/FieldGroup.svelte.d.ts +1 -1
  62. package/dist/FieldGroup/field-group.types.d.ts +4 -0
  63. package/dist/FormField/FormField.svelte +17 -18
  64. package/dist/FormField/FormField.svelte.d.ts +1 -1
  65. package/dist/FormField/form-field.types.d.ts +4 -0
  66. package/dist/Icon/Icon.svelte +13 -7
  67. package/dist/Icon/icon.types.d.ts +18 -9
  68. package/dist/Input/Input.svelte +30 -29
  69. package/dist/Kbd/Kbd.svelte +13 -3
  70. package/dist/Kbd/Kbd.svelte.d.ts +1 -1
  71. package/dist/Kbd/index.d.ts +1 -1
  72. package/dist/Kbd/kbd.types.d.ts +15 -1
  73. package/dist/Kbd/kbd.variants.d.ts +92 -30
  74. package/dist/Kbd/kbd.variants.js +55 -35
  75. package/dist/Kbd/useKbd.svelte.d.ts +2 -2
  76. package/dist/Kbd/useKbd.svelte.js +34 -41
  77. package/dist/Link/Link.svelte +69 -24
  78. package/dist/Link/Link.svelte.d.ts +1 -1
  79. package/dist/Link/link.types.d.ts +26 -8
  80. package/dist/Link/link.variants.d.ts +35 -60
  81. package/dist/Link/link.variants.js +8 -110
  82. package/dist/Modal/Modal.svelte +9 -1
  83. package/dist/Modal/modal.types.d.ts +5 -0
  84. package/dist/Modal/modal.variants.d.ts +5 -0
  85. package/dist/Modal/modal.variants.js +1 -0
  86. package/dist/Pagination/Pagination.svelte +143 -94
  87. package/dist/Pagination/Pagination.svelte.d.ts +1 -1
  88. package/dist/Pagination/index.d.ts +1 -1
  89. package/dist/Pagination/pagination.types.d.ts +21 -2
  90. package/dist/Pagination/pagination.variants.d.ts +21 -387
  91. package/dist/Pagination/pagination.variants.js +63 -59
  92. package/dist/Popover/Popover.svelte +9 -12
  93. package/dist/Popover/Popover.svelte.d.ts +1 -1
  94. package/dist/Popover/popover.types.d.ts +4 -0
  95. package/dist/Popover/popover.variants.d.ts +5 -75
  96. package/dist/Popover/popover.variants.js +6 -16
  97. package/dist/Progress/Progress.svelte +58 -30
  98. package/dist/Progress/progress.types.d.ts +9 -1
  99. package/dist/Progress/progress.variants.d.ts +55 -25
  100. package/dist/Progress/progress.variants.js +34 -28
  101. package/dist/RadioGroup/RadioGroup.svelte +105 -61
  102. package/dist/RadioGroup/RadioGroup.svelte.d.ts +1 -1
  103. package/dist/RadioGroup/radio-group.types.d.ts +16 -1
  104. package/dist/RadioGroup/radio-group.variants.d.ts +90 -0
  105. package/dist/RadioGroup/radio-group.variants.js +73 -4
  106. package/dist/Select/Select.svelte +9 -6
  107. package/dist/Select/Select.svelte.d.ts +1 -1
  108. package/dist/Select/select.types.d.ts +4 -0
  109. package/dist/SelectMenu/SelectMenu.svelte +436 -0
  110. package/dist/SelectMenu/SelectMenu.svelte.d.ts +5 -0
  111. package/dist/SelectMenu/index.d.ts +2 -0
  112. package/dist/SelectMenu/index.js +1 -0
  113. package/dist/SelectMenu/select-menu.types.d.ts +262 -0
  114. package/dist/SelectMenu/select-menu.types.js +1 -0
  115. package/dist/SelectMenu/select-menu.variants.d.ts +759 -0
  116. package/dist/SelectMenu/select-menu.variants.js +33 -0
  117. package/dist/Separator/Separator.svelte +1 -2
  118. package/dist/Separator/separator.variants.d.ts +1 -5
  119. package/dist/Separator/separator.variants.js +2 -2
  120. package/dist/Skeleton/Skeleton.svelte +18 -2
  121. package/dist/Skeleton/Skeleton.svelte.d.ts +1 -1
  122. package/dist/Skeleton/skeleton.types.d.ts +10 -1
  123. package/dist/Slideover/Slideover.svelte +9 -1
  124. package/dist/Slideover/slideover.types.d.ts +5 -0
  125. package/dist/Slideover/slideover.variants.d.ts +20 -5
  126. package/dist/Slideover/slideover.variants.js +4 -29
  127. package/dist/Switch/Switch.svelte +32 -31
  128. package/dist/Switch/Switch.svelte.d.ts +1 -1
  129. package/dist/Switch/switch.types.d.ts +6 -1
  130. package/dist/Switch/switch.variants.js +6 -6
  131. package/dist/Tabs/Tabs.svelte +6 -9
  132. package/dist/Tabs/Tabs.svelte.d.ts +1 -1
  133. package/dist/Tabs/tabs.types.d.ts +4 -0
  134. package/dist/Tabs/tabs.variants.js +2 -0
  135. package/dist/Textarea/Textarea.svelte +26 -25
  136. package/dist/ThemeModeButton/theme-mode-button.types.d.ts +7 -2
  137. package/dist/Timeline/Timeline.svelte +62 -19
  138. package/dist/Timeline/Timeline.svelte.d.ts +1 -1
  139. package/dist/Timeline/index.d.ts +1 -1
  140. package/dist/Timeline/timeline.types.d.ts +8 -0
  141. package/dist/Tooltip/Tooltip.svelte +12 -10
  142. package/dist/Tooltip/Tooltip.svelte.d.ts +1 -1
  143. package/dist/Tooltip/tooltip.types.d.ts +8 -4
  144. package/dist/Tooltip/tooltip.variants.d.ts +10 -75
  145. package/dist/Tooltip/tooltip.variants.js +8 -17
  146. package/dist/User/User.svelte +13 -9
  147. package/dist/User/User.svelte.d.ts +1 -1
  148. package/dist/User/user.types.d.ts +4 -0
  149. package/dist/User/user.variants.d.ts +60 -0
  150. package/dist/User/user.variants.js +13 -1
  151. package/dist/config.d.ts +4 -0
  152. package/dist/config.js +4 -0
  153. package/dist/index.d.ts +1 -0
  154. package/dist/index.js +1 -0
  155. package/package.json +2 -2
@@ -2,7 +2,10 @@
2
2
  import type {
3
3
  ContextMenuProps,
4
4
  ContextMenuItem,
5
- ContextMenuItemAction
5
+ ContextMenuItemAction,
6
+ ContextMenuItemCheckbox,
7
+ ContextMenuItemRadio,
8
+ ContextMenuItemSub
6
9
  } from './context-menu.types.js'
7
10
 
8
11
  export type Props = ContextMenuProps
@@ -13,21 +16,23 @@
13
16
  import {
14
17
  contextMenuVariants,
15
18
  contextMenuDefaults,
16
- type ContextMenuVariantProps
19
+ itemColorClasses
17
20
  } from './context-menu.variants.js'
18
21
  import { getComponentConfig, iconsDefaults } from '../config.js'
19
22
  import Icon from '../Icon/Icon.svelte'
20
23
  import Kbd from '../Kbd/Kbd.svelte'
21
24
 
22
25
  const config = getComponentConfig('contextMenu', contextMenuDefaults)
26
+ const icons = getComponentConfig('icons', iconsDefaults)
23
27
 
24
28
  let {
29
+ ref = $bindable(null),
25
30
  open = $bindable(false),
26
31
  onOpenChange,
27
32
  items = [],
28
33
  radioGroups = [],
29
- checkedIcon = iconsDefaults.check,
30
- submenuIcon = iconsDefaults.chevronRight,
34
+ checkedIcon = icons.check,
35
+ submenuIcon = icons.chevronRight,
31
36
  sideOffset = 4,
32
37
  alignOffset = 0,
33
38
  avoidCollisions = true,
@@ -57,73 +62,63 @@
57
62
  const hasRadioItems = $derived(items.some((i) => i.type === 'radio'))
58
63
  const firstRadioGroup = $derived(radioGroups[0])
59
64
 
60
- // Compute variant classes once per transition/size/ui change
61
65
  const variantSlots = $derived(contextMenuVariants({ transition, size }))
62
-
63
- function resolveSlot(slot: keyof ReturnType<typeof contextMenuVariants>) {
64
- return variantSlots[slot]({
65
- class: [config.slots[slot], ui?.[slot]]
66
- })
67
- }
68
-
69
66
  const classes = $derived({
70
- content: resolveSlot('content'),
71
- group: resolveSlot('group'),
72
- separator: resolveSlot('separator'),
73
- label: resolveSlot('label'),
74
- item: resolveSlot('item'),
75
- itemIcon: resolveSlot('itemIcon'),
76
- itemLabel: resolveSlot('itemLabel'),
77
- itemKbd: resolveSlot('itemKbd'),
78
- subTrigger: resolveSlot('subTrigger'),
79
- subTriggerIcon: resolveSlot('subTriggerIcon'),
80
- subContent: resolveSlot('subContent'),
81
- checkboxIndicator: resolveSlot('checkboxIndicator'),
82
- radioIndicator: resolveSlot('radioIndicator')
83
- })
84
-
85
- // Cache color variant computations per color — avoids re-calling contextMenuVariants
86
- // for every action item with the same color in a single render cycle
87
- type ColorKey = NonNullable<ContextMenuVariantProps['color']>
88
-
89
- const getColorVariant = $derived.by(() => {
90
- const cache: Partial<Record<ColorKey, ReturnType<typeof contextMenuVariants>>> = {}
91
- return (color: ColorKey) => {
92
- cache[color] ??= contextMenuVariants({ size, color })
93
- return cache[color]
94
- }
67
+ content: variantSlots.content({ class: [config.slots.content, ui?.content] }),
68
+ group: variantSlots.group({ class: [config.slots.group, ui?.group] }),
69
+ separator: variantSlots.separator({ class: [config.slots.separator, ui?.separator] }),
70
+ label: variantSlots.label({ class: [config.slots.label, ui?.label] }),
71
+ item: variantSlots.item({ class: [config.slots.item, ui?.item] }),
72
+ itemLeadingIcon: variantSlots.itemLeadingIcon({
73
+ class: [config.slots.itemLeadingIcon, ui?.itemLeadingIcon]
74
+ }),
75
+ itemLabel: variantSlots.itemLabel({ class: [config.slots.itemLabel, ui?.itemLabel] }),
76
+ itemTrailingKbds: variantSlots.itemTrailingKbds({
77
+ class: [config.slots.itemTrailingKbds, ui?.itemTrailingKbds]
78
+ }),
79
+ itemIndicator: variantSlots.itemIndicator({
80
+ class: [config.slots.itemIndicator, ui?.itemIndicator]
81
+ }),
82
+ subTrigger: variantSlots.subTrigger({ class: [config.slots.subTrigger, ui?.subTrigger] }),
83
+ subTriggerIcon: variantSlots.subTriggerIcon({
84
+ class: [config.slots.subTriggerIcon, ui?.subTriggerIcon]
85
+ }),
86
+ subContent: variantSlots.subContent({ class: [config.slots.subContent, ui?.subContent] })
95
87
  })
96
88
 
97
89
  function close() {
98
90
  open = false
99
91
  }
100
92
 
101
- function handleOpenChange(value: boolean) {
102
- open = value
103
- onOpenChange?.(value)
93
+ // Type guards
94
+ function isActionItem(item: ContextMenuItem): item is ContextMenuItemAction {
95
+ return !item.type || item.type === 'item'
104
96
  }
105
97
 
106
- function getItemClasses(item: ContextMenuItemAction) {
107
- const colorVariant = getColorVariant(item.color ?? 'default')
108
- return {
109
- item: colorVariant.item({ class: [config.slots.item, ui?.item, item.class] }),
110
- itemIcon: colorVariant.itemIcon({ class: [config.slots.itemIcon, ui?.itemIcon] })
111
- }
98
+ function isCheckboxItem(item: ContextMenuItem): item is ContextMenuItemCheckbox {
99
+ return item.type === 'checkbox'
112
100
  }
113
101
 
114
- // Collision props shared between Content and SubContent
115
- const collisionProps = $derived({
116
- sideOffset,
117
- alignOffset,
118
- avoidCollisions,
119
- collisionBoundary,
120
- collisionPadding
121
- })
102
+ function isRadioItem(item: ContextMenuItem): item is ContextMenuItemRadio {
103
+ return item.type === 'radio'
104
+ }
105
+
106
+ function isSubItem(item: ContextMenuItem): item is ContextMenuItemSub {
107
+ return item.type === 'sub'
108
+ }
109
+
110
+ function isSeparator(item: ContextMenuItem): item is { type: 'separator' } {
111
+ return item.type === 'separator'
112
+ }
113
+
114
+ function isLabel(item: ContextMenuItem): item is { type: 'label'; label: string } {
115
+ return item.type === 'label'
116
+ }
122
117
  </script>
123
118
 
124
119
  {#snippet renderKbds(kbds: ContextMenuItemAction['kbds'])}
125
120
  {#if kbds?.length}
126
- <span class={classes.itemKbd}>
121
+ <span class={classes.itemTrailingKbds}>
127
122
  {#each kbds as kbd, i (i)}
128
123
  {#if typeof kbd === 'string'}
129
124
  <Kbd value={kbd} size="sm" variant="subtle" />
@@ -136,22 +131,25 @@
136
131
  {/snippet}
137
132
 
138
133
  {#snippet renderItem(item: ContextMenuItem, index: number)}
139
- {#if item.type === 'separator'}
134
+ {#if isSeparator(item)}
140
135
  <ContextMenu.Separator class={classes.separator} />
141
- {:else if item.type === 'label'}
136
+ {:else if isLabel(item)}
142
137
  <ContextMenu.GroupHeading class={classes.label}>{item.label}</ContextMenu.GroupHeading>
143
- {:else if !item.type || item.type === 'item'}
144
- {@const cls = getItemClasses(item as ContextMenuItemAction)}
138
+ {:else if isActionItem(item)}
139
+ {@const colorCls = itemColorClasses[item.color ?? 'default']}
145
140
  <ContextMenu.Item
146
141
  disabled={item.disabled}
147
- closeOnSelect={(item as ContextMenuItemAction).closeOnSelect}
148
- onSelect={(item as ContextMenuItemAction).onSelect}
149
- class={cls.item}
142
+ closeOnSelect={item.closeOnSelect}
143
+ onSelect={item.onSelect}
144
+ class={[classes.item, colorCls.item, item.class]}
150
145
  >
151
146
  {#if itemLeading}
152
147
  {@render itemLeading({ item, index })}
153
148
  {:else if item.icon}
154
- <Icon name={item.icon} class={cls.itemIcon} />
149
+ <Icon
150
+ name={item.icon}
151
+ class={[classes.itemLeadingIcon, colorCls.itemLeadingIcon]}
152
+ />
155
153
  {/if}
156
154
 
157
155
  {#if itemLabel}
@@ -163,10 +161,10 @@
163
161
  {#if itemTrailing}
164
162
  {@render itemTrailing({ item, index })}
165
163
  {:else}
166
- {@render renderKbds((item as ContextMenuItemAction).kbds)}
164
+ {@render renderKbds(item.kbds)}
167
165
  {/if}
168
166
  </ContextMenu.Item>
169
- {:else if item.type === 'checkbox'}
167
+ {:else if isCheckboxItem(item)}
170
168
  <ContextMenu.CheckboxItem
171
169
  checked={item.checked}
172
170
  disabled={item.disabled}
@@ -177,9 +175,9 @@
177
175
  {#if itemLeading}
178
176
  {@render itemLeading({ item, index })}
179
177
  {:else}
180
- <span class={classes.checkboxIndicator}>
178
+ <span class={classes.itemIndicator}>
181
179
  {#if item.checked}
182
- <Icon name={checkedIcon} class={classes.checkboxIndicator} />
180
+ <Icon name={checkedIcon} />
183
181
  {/if}
184
182
  </span>
185
183
  {/if}
@@ -196,7 +194,7 @@
196
194
  {@render renderKbds(item.kbds)}
197
195
  {/if}
198
196
  </ContextMenu.CheckboxItem>
199
- {:else if item.type === 'radio'}
197
+ {:else if isRadioItem(item)}
200
198
  <ContextMenu.RadioItem
201
199
  value={item.value}
202
200
  disabled={item.disabled}
@@ -206,9 +204,9 @@
206
204
  {#if itemLeading}
207
205
  {@render itemLeading({ item, index })}
208
206
  {:else}
209
- <span class={classes.radioIndicator}>
207
+ <span class={classes.itemIndicator}>
210
208
  {#if firstRadioGroup?.value === item.value}
211
- <Icon name={checkedIcon} class={classes.radioIndicator} />
209
+ <Icon name={checkedIcon} />
212
210
  {/if}
213
211
  </span>
214
212
  {/if}
@@ -225,7 +223,7 @@
225
223
  {@render renderKbds(item.kbds)}
226
224
  {/if}
227
225
  </ContextMenu.RadioItem>
228
- {:else if item.type === 'sub'}
226
+ {:else if isSubItem(item)}
229
227
  <ContextMenu.Sub open={item.open} onOpenChange={item.onOpenChange}>
230
228
  <ContextMenu.SubTrigger
231
229
  disabled={item.disabled}
@@ -234,7 +232,7 @@
234
232
  {#if itemLeading}
235
233
  {@render itemLeading({ item, index })}
236
234
  {:else if item.icon}
237
- <Icon name={item.icon} class={classes.itemIcon} />
235
+ <Icon name={item.icon} class={classes.itemLeadingIcon} />
238
236
  {/if}
239
237
 
240
238
  {#if itemLabel}
@@ -246,7 +244,14 @@
246
244
  <Icon name={submenuIcon} class={classes.subTriggerIcon} />
247
245
  </ContextMenu.SubTrigger>
248
246
 
249
- <ContextMenu.SubContent {...collisionProps} class={classes.subContent}>
247
+ <ContextMenu.SubContent
248
+ {sideOffset}
249
+ {alignOffset}
250
+ {avoidCollisions}
251
+ {collisionBoundary}
252
+ {collisionPadding}
253
+ class={classes.subContent}
254
+ >
250
255
  <div class={classes.group}>
251
256
  {#each item.items as subItem, subIndex (subIndex)}
252
257
  {@render renderItem(subItem, subIndex)}
@@ -276,7 +281,12 @@
276
281
 
277
282
  {#snippet contextMenuContentEl()}
278
283
  <ContextMenu.Content
279
- {...collisionProps}
284
+ bind:ref
285
+ {sideOffset}
286
+ {alignOffset}
287
+ {avoidCollisions}
288
+ {collisionBoundary}
289
+ {collisionPadding}
280
290
  {hideWhenDetached}
281
291
  {onEscapeKeydown}
282
292
  {onInteractOutside}
@@ -295,9 +305,9 @@
295
305
  <ContextMenu.Group class={classes.group}>
296
306
  {#if itemSlot}
297
307
  {#each items as item, index (index)}
298
- {#if item.type === 'separator'}
308
+ {#if isSeparator(item)}
299
309
  <ContextMenu.Separator class={classes.separator} />
300
- {:else if item.type === 'label'}
310
+ {:else if isLabel(item)}
301
311
  <ContextMenu.GroupHeading class={classes.label}
302
312
  >{item.label}</ContextMenu.GroupHeading
303
313
  >
@@ -317,7 +327,7 @@
317
327
  </ContextMenu.Content>
318
328
  {/snippet}
319
329
 
320
- <ContextMenu.Root bind:open onOpenChange={handleOpenChange}>
330
+ <ContextMenu.Root bind:open {onOpenChange}>
321
331
  {#if children}
322
332
  <ContextMenu.Trigger class={className as string}>
323
333
  {@render children({ open })}
@@ -1,6 +1,6 @@
1
1
  import type { ContextMenuProps } from './context-menu.types.js';
2
2
  export type Props = ContextMenuProps;
3
3
  import { ContextMenu } from 'bits-ui';
4
- declare const ContextMenu: import("svelte").Component<ContextMenuProps, {}, "open">;
4
+ declare const ContextMenu: import("svelte").Component<ContextMenuProps, {}, "ref" | "open">;
5
5
  type ContextMenu = ReturnType<typeof ContextMenu>;
6
6
  export default ContextMenu;
@@ -3,6 +3,8 @@ import type { ClassNameValue } from 'tailwind-merge';
3
3
  import type { ContextMenuSlots, ContextMenuVariantProps } from './context-menu.variants.js';
4
4
  import type { KbdProps } from '../Kbd/kbd.types.js';
5
5
  import type { ContextMenuRootPropsWithoutHTML, ContextMenuContentPropsWithoutHTML } from 'bits-ui';
6
+ import { itemColorClasses } from './context-menu.variants.js';
7
+ export type ContextMenuItemColor = Exclude<keyof typeof itemColorClasses, 'default'>;
6
8
  /**
7
9
  * Base item properties shared across all item types.
8
10
  */
@@ -49,7 +51,7 @@ export interface ContextMenuItemAction extends ContextMenuItemBase {
49
51
  /**
50
52
  * Color variant for the item (useful for destructive actions).
51
53
  */
52
- color?: ContextMenuVariantProps['color'];
54
+ color?: ContextMenuItemColor;
53
55
  }
54
56
  /**
55
57
  * Checkbox menu item for toggling boolean state.
@@ -166,6 +168,10 @@ type ContentProps = Pick<ContextMenuContentPropsWithoutHTML, 'sideOffset' | 'ali
166
168
  * @see https://bits-ui.com/docs/components/context-menu
167
169
  */
168
170
  export interface ContextMenuProps extends RootProps, ContentProps {
171
+ /**
172
+ * Bindable reference to the content DOM element.
173
+ */
174
+ ref?: HTMLElement | null;
169
175
  /**
170
176
  * Array of menu items to render.
171
177
  * Each item can be an action, checkbox, radio, separator, label, or submenu.
@@ -190,7 +196,7 @@ export interface ContextMenuProps extends RootProps, ContentProps {
190
196
  * Animate the context menu on open and close.
191
197
  * @default true
192
198
  */
193
- transition?: ContextMenuVariantProps['transition'];
199
+ transition?: NonNullable<ContextMenuVariantProps['transition']>;
194
200
  /**
195
201
  * Render the context menu content in a portal.
196
202
  * @default true
@@ -200,7 +206,7 @@ export interface ContextMenuProps extends RootProps, ContentProps {
200
206
  * Size variant for the context menu.
201
207
  * @default 'md'
202
208
  */
203
- size?: ContextMenuVariantProps['size'];
209
+ size?: NonNullable<ContextMenuVariantProps['size']>;
204
210
  /**
205
211
  * Additional CSS class for the trigger wrapper.
206
212
  */
@@ -1 +1 @@
1
- export {};
1
+ import { itemColorClasses } from './context-menu.variants.js';