@noxlovette/material 0.3.2 → 0.4.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 (299) hide show
  1. package/README.md +1 -0
  2. package/dist/actions/index.d.ts +1 -0
  3. package/dist/actions/index.js +1 -0
  4. package/dist/actions/rovingFocusGroup.d.ts +20 -0
  5. package/dist/actions/rovingFocusGroup.js +82 -0
  6. package/dist/components/badge/theme.d.ts +8 -8
  7. package/dist/components/buttons/button-group/ButtonGroup.stories.svelte +83 -0
  8. package/dist/components/buttons/button-group/ButtonGroup.stories.svelte.d.ts +19 -0
  9. package/dist/components/buttons/button-group/ButtonGroup.svelte +10 -29
  10. package/dist/components/buttons/button-group/ButtonGroup.svelte.d.ts +7 -3
  11. package/dist/components/buttons/button-group/index.d.ts +0 -1
  12. package/dist/components/buttons/button-group/index.js +3 -1
  13. package/dist/components/buttons/button-group/theme.d.ts +17 -103
  14. package/dist/components/buttons/button-group/theme.js +7 -35
  15. package/dist/components/buttons/button-group/types.d.ts +9 -20
  16. package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte +118 -0
  17. package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte.d.ts +19 -0
  18. package/dist/components/buttons/connected/ConnectedButtonGroup.svelte +52 -0
  19. package/dist/components/buttons/connected/ConnectedButtonGroup.svelte.d.ts +12 -0
  20. package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte +37 -0
  21. package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte.d.ts +9 -0
  22. package/dist/components/buttons/connected/index.d.ts +3 -1
  23. package/dist/components/buttons/connected/index.js +3 -1
  24. package/dist/components/buttons/connected/theme.d.ts +125 -0
  25. package/dist/components/buttons/connected/theme.js +38 -0
  26. package/dist/components/buttons/connected/types.d.ts +32 -13
  27. package/dist/components/buttons/index.d.ts +1 -0
  28. package/dist/components/buttons/index.js +1 -0
  29. package/dist/components/buttons/split-button/SplitButton.stories.svelte +103 -0
  30. package/dist/components/buttons/split-button/SplitButton.stories.svelte.d.ts +19 -0
  31. package/dist/components/buttons/split-button/SplitButton.svelte +104 -0
  32. package/dist/components/buttons/split-button/SplitButton.svelte.d.ts +19 -0
  33. package/dist/components/buttons/split-button/index.d.ts +3 -0
  34. package/dist/components/{containers/panes → buttons/split-button}/index.js +1 -3
  35. package/dist/components/buttons/split-button/theme.d.ts +35 -0
  36. package/dist/components/buttons/split-button/theme.js +26 -0
  37. package/dist/components/buttons/split-button/types.d.ts +33 -0
  38. package/dist/components/buttons/theme.d.ts +142 -142
  39. package/dist/components/buttons/theme.js +2 -2
  40. package/dist/components/cards/Card.stories.svelte +58 -0
  41. package/dist/components/cards/Card.stories.svelte.d.ts +2 -17
  42. package/dist/components/cards/Card.svelte +76 -8
  43. package/dist/components/cards/theme.d.ts +26 -14
  44. package/dist/components/cards/theme.js +5 -1
  45. package/dist/components/cards/types.d.ts +39 -1
  46. package/dist/components/chips/Chip.stories.svelte +64 -0
  47. package/dist/components/chips/Chip.stories.svelte.d.ts +19 -0
  48. package/dist/components/chips/Chip.svelte +115 -0
  49. package/dist/components/chips/Chip.svelte.d.ts +14 -0
  50. package/dist/components/chips/index.d.ts +3 -0
  51. package/dist/components/chips/index.js +6 -0
  52. package/dist/components/chips/theme.d.ts +78 -0
  53. package/dist/components/chips/theme.js +72 -0
  54. package/dist/components/chips/types.d.ts +43 -0
  55. package/dist/components/containers/action-rail/ActionRail.stories.svelte +36 -0
  56. package/dist/components/containers/{panes/SinglePane.stories.svelte.d.ts → action-rail/ActionRail.stories.svelte.d.ts} +4 -4
  57. package/dist/components/containers/action-rail/ActionRail.svelte +35 -0
  58. package/dist/components/containers/action-rail/ActionRail.svelte.d.ts +17 -0
  59. package/dist/components/containers/action-rail/index.d.ts +3 -0
  60. package/dist/components/containers/action-rail/index.js +6 -0
  61. package/dist/components/containers/action-rail/theme.d.ts +45 -0
  62. package/dist/components/containers/action-rail/theme.js +26 -0
  63. package/dist/components/containers/action-rail/types.d.ts +20 -0
  64. package/dist/components/containers/action-rail/types.js +1 -0
  65. package/dist/components/containers/app/App.svelte +6 -6
  66. package/dist/components/containers/app/App.svelte.d.ts +4 -2
  67. package/dist/components/containers/app/theme.d.ts +1 -1
  68. package/dist/components/containers/app/types.d.ts +9 -4
  69. package/dist/components/containers/bottom-sheet/BottomSheet.stories.svelte +1 -1
  70. package/dist/components/containers/bottom-sheet/BottomSheet.svelte +1 -1
  71. package/dist/components/containers/context-menu/ContextMenu.stories.svelte +44 -0
  72. package/dist/components/containers/context-menu/ContextMenu.svelte +21 -5
  73. package/dist/components/containers/context-menu/ContextMenu.svelte.d.ts +11 -0
  74. package/dist/components/containers/context-menu/theme.d.ts +20 -2
  75. package/dist/components/containers/context-menu/theme.js +31 -8
  76. package/dist/components/containers/context-menu/types.d.ts +14 -2
  77. package/dist/components/containers/dialogue/theme.d.ts +20 -20
  78. package/dist/components/containers/divider/theme.d.ts +17 -17
  79. package/dist/components/containers/index.d.ts +2 -3
  80. package/dist/components/containers/index.js +2 -3
  81. package/dist/components/containers/link-preview/theme.d.ts +11 -11
  82. package/dist/components/containers/list/ListItem.stories.svelte +100 -0
  83. package/dist/components/containers/list/ListItem.stories.svelte.d.ts +19 -0
  84. package/dist/components/containers/list/theme.d.ts +14 -14
  85. package/dist/components/containers/list/theme.js +3 -3
  86. package/dist/components/containers/menu/Menu.stories.svelte +105 -3
  87. package/dist/components/containers/menu/Menu.stories.svelte.d.ts +2 -17
  88. package/dist/components/containers/menu/Menu.svelte +9 -7
  89. package/dist/components/containers/menu/MenuCheckboxItem.svelte +55 -0
  90. package/dist/components/containers/menu/MenuCheckboxItem.svelte.d.ts +25 -0
  91. package/dist/components/containers/menu/MenuGroup.svelte +43 -0
  92. package/dist/components/containers/menu/MenuGroup.svelte.d.ts +28 -0
  93. package/dist/components/containers/menu/MenuRadioGroup.svelte +39 -0
  94. package/dist/components/containers/menu/MenuRadioGroup.svelte.d.ts +27 -0
  95. package/dist/components/containers/menu/MenuRadioItem.svelte +49 -0
  96. package/dist/components/containers/menu/MenuRadioItem.svelte.d.ts +17 -0
  97. package/dist/components/containers/menu/MenuSub.svelte +91 -0
  98. package/dist/components/containers/menu/MenuSub.svelte.d.ts +29 -0
  99. package/dist/components/containers/menu/index.d.ts +7 -0
  100. package/dist/components/containers/menu/index.js +8 -0
  101. package/dist/components/containers/menu/menu-item/MenuItem.svelte +71 -0
  102. package/dist/components/containers/{menu-item → menu/menu-item}/MenuItem.svelte.d.ts +2 -1
  103. package/dist/components/containers/{menu-item → menu/menu-item}/types.d.ts +5 -1
  104. package/dist/components/containers/menu/menu-item/types.js +1 -0
  105. package/dist/components/containers/menu/theme.d.ts +68 -0
  106. package/dist/components/containers/menu/theme.js +36 -0
  107. package/dist/components/containers/menu/types.d.ts +113 -2
  108. package/dist/components/containers/pane/DraggablePane.stories.svelte +199 -0
  109. package/dist/components/containers/pane/DraggablePane.stories.svelte.d.ts +4 -0
  110. package/dist/components/containers/pane/DraggablePane.svelte +533 -0
  111. package/dist/components/containers/pane/DraggablePane.svelte.d.ts +29 -0
  112. package/dist/components/containers/pane/Pane.stories.svelte +104 -0
  113. package/dist/components/containers/pane/Pane.stories.svelte.d.ts +19 -0
  114. package/dist/components/containers/pane/Pane.svelte +78 -0
  115. package/dist/components/containers/pane/Pane.svelte.d.ts +18 -0
  116. package/dist/components/containers/pane/PaneGrid.stories.svelte +134 -0
  117. package/dist/components/containers/pane/PaneGrid.stories.svelte.d.ts +19 -0
  118. package/dist/components/containers/pane/PaneGrid.svelte +43 -0
  119. package/dist/components/containers/pane/PaneGrid.svelte.d.ts +13 -0
  120. package/dist/components/containers/pane/PaneHandle.svelte +90 -0
  121. package/dist/components/containers/pane/PaneHandle.svelte.d.ts +12 -0
  122. package/dist/components/containers/pane/dragStore.svelte.d.ts +16 -0
  123. package/dist/components/containers/pane/dragStore.svelte.js +38 -0
  124. package/dist/components/containers/pane/index.d.ts +8 -0
  125. package/dist/components/containers/pane/index.js +11 -0
  126. package/dist/components/containers/pane/resizeStore.svelte.d.ts +10 -0
  127. package/dist/components/containers/pane/resizeStore.svelte.js +30 -0
  128. package/dist/components/containers/pane/theme.d.ts +571 -0
  129. package/dist/components/containers/pane/theme.js +211 -0
  130. package/dist/components/containers/pane/types.d.ts +249 -0
  131. package/dist/components/containers/pane/types.js +1 -0
  132. package/dist/components/containers/popover/Popover.stories.svelte +4 -4
  133. package/dist/components/containers/popover/Popover.svelte +3 -1
  134. package/dist/components/containers/popover/theme.d.ts +20 -20
  135. package/dist/components/containers/popover/types.d.ts +6 -2
  136. package/dist/components/containers/scroll-area/theme.d.ts +2 -2
  137. package/dist/components/containers/side-sheet/SideSheet.stories.svelte +16 -24
  138. package/dist/components/containers/side-sheet/SideSheet.svelte +73 -7
  139. package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +5 -0
  140. package/dist/components/containers/stack/theme.d.ts +44 -44
  141. package/dist/components/date/DateField.stories.svelte +57 -0
  142. package/dist/components/{containers/panes/SplitPane.stories.svelte.d.ts → date/DateField.stories.svelte.d.ts} +4 -4
  143. package/dist/components/date/DateField.svelte +11 -2
  144. package/dist/components/date/DateRangeField.stories.svelte +53 -0
  145. package/dist/components/{containers/panes/SupportingPane.stories.svelte.d.ts → date/DateRangeField.stories.svelte.d.ts} +4 -4
  146. package/dist/components/date/DateRangeField.svelte +2 -1
  147. package/dist/components/date/theme.d.ts +73 -4
  148. package/dist/components/date/theme.js +95 -26
  149. package/dist/components/date/types.d.ts +5 -0
  150. package/dist/components/forms/checkbox/Checkbox.svelte +7 -9
  151. package/dist/components/forms/checkbox/theme.d.ts +8 -8
  152. package/dist/components/forms/checkbox/theme.js +31 -9
  153. package/dist/components/forms/command/Command.stories.svelte +86 -0
  154. package/dist/components/forms/command/Command.stories.svelte.d.ts +19 -0
  155. package/dist/components/forms/command/theme.d.ts +35 -35
  156. package/dist/components/forms/command/theme.js +4 -4
  157. package/dist/components/forms/pin/theme.d.ts +2 -2
  158. package/dist/components/forms/radio-group/theme.d.ts +2 -2
  159. package/dist/components/forms/search/theme.d.ts +8 -8
  160. package/dist/components/forms/select/Select.svelte +3 -2
  161. package/dist/components/forms/select/theme.d.ts +26 -2
  162. package/dist/components/forms/select/theme.js +56 -22
  163. package/dist/components/forms/slider/theme.d.ts +20 -20
  164. package/dist/components/forms/switch/theme.d.ts +2 -2
  165. package/dist/components/forms/textfield/Textfield.stories.svelte +22 -0
  166. package/dist/components/forms/textfield/Textfield.svelte +10 -1
  167. package/dist/components/forms/textfield/theme.d.ts +44 -2
  168. package/dist/components/forms/textfield/theme.js +56 -16
  169. package/dist/components/forms/toggle-group/ToggleGroup.svelte +2 -2
  170. package/dist/components/forms/toggle-group/ToggleGroup.svelte.d.ts +2 -2
  171. package/dist/components/forms/toggle-group/ToggleGroupItem.svelte +1 -1
  172. package/dist/components/forms/toggle-group/ToggleGroupItem.svelte.d.ts +1 -1
  173. package/dist/components/forms/toggle-group/theme.d.ts +16 -16
  174. package/dist/components/forms/toggle-group/types.d.ts +2 -2
  175. package/dist/components/forms/tooltip/Tooltip.stories.svelte +90 -0
  176. package/dist/components/forms/tooltip/Tooltip.stories.svelte.d.ts +19 -0
  177. package/dist/components/forms/tooltip/Tooltip.svelte +5 -4
  178. package/dist/components/forms/tooltip/theme.d.ts +5 -2
  179. package/dist/components/forms/tooltip/theme.js +6 -5
  180. package/dist/components/index.d.ts +1 -0
  181. package/dist/components/index.js +1 -0
  182. package/dist/components/misc/Avatar.stories.svelte +63 -0
  183. package/dist/components/misc/Avatar.stories.svelte.d.ts +19 -0
  184. package/dist/components/misc/Avatar.svelte +35 -10
  185. package/dist/components/misc/DicebearAvatarBuilder.d.ts +59 -0
  186. package/dist/components/misc/DicebearAvatarBuilder.js +115 -0
  187. package/dist/components/misc/ThemeSettings.svelte +1 -1
  188. package/dist/components/misc/ThemeSwitcher.svelte +2 -2
  189. package/dist/components/misc/dicebearStyles.d.ts +21 -0
  190. package/dist/components/misc/dicebearStyles.js +169 -0
  191. package/dist/components/misc/index.d.ts +3 -0
  192. package/dist/components/misc/index.js +3 -0
  193. package/dist/components/misc/materialAvatarPalette.d.ts +6 -0
  194. package/dist/components/misc/materialAvatarPalette.js +44 -0
  195. package/dist/components/misc/theme.d.ts +20 -2
  196. package/dist/components/misc/theme.js +9 -3
  197. package/dist/components/misc/types.d.ts +20 -2
  198. package/dist/components/nav/appbar/AppBar.stories.svelte +1 -1
  199. package/dist/components/nav/appbar/AppBar.svelte +46 -15
  200. package/dist/components/nav/appbar/AppBar.svelte.d.ts +5 -0
  201. package/dist/components/nav/appbar/theme.d.ts +20 -14
  202. package/dist/components/nav/appbar/theme.js +11 -7
  203. package/dist/components/nav/appbar/types.d.ts +3 -1
  204. package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte +50 -0
  205. package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte.d.ts +19 -0
  206. package/dist/components/nav/breadcrumb/Breadcrumb.svelte +46 -0
  207. package/dist/components/nav/breadcrumb/Breadcrumb.svelte.d.ts +13 -0
  208. package/dist/components/nav/breadcrumb/index.d.ts +3 -0
  209. package/dist/components/nav/breadcrumb/index.js +6 -0
  210. package/dist/components/nav/breadcrumb/theme.d.ts +84 -0
  211. package/dist/components/nav/breadcrumb/theme.js +35 -0
  212. package/dist/components/nav/breadcrumb/types.d.ts +14 -0
  213. package/dist/components/nav/breadcrumb/types.js +1 -0
  214. package/dist/components/nav/index.d.ts +1 -0
  215. package/dist/components/nav/index.js +1 -0
  216. package/dist/components/nav/navbar/theme.d.ts +19 -19
  217. package/dist/components/nav/rail/Rail.stories.svelte +1 -5
  218. package/dist/components/nav/rail/Rail.svelte +3 -25
  219. package/dist/components/nav/rail/theme.d.ts +4 -4
  220. package/dist/components/nav/rail/types.d.ts +0 -5
  221. package/dist/components/nav/tabs/TabHolder.svelte +2 -1
  222. package/dist/components/nav/tabs/theme.d.ts +21 -21
  223. package/dist/components/nav/tabs/theme.js +6 -0
  224. package/dist/components/nav/tabs/types.d.ts +2 -2
  225. package/dist/components/pill/theme.d.ts +35 -35
  226. package/dist/components/snackbar/theme.d.ts +8 -8
  227. package/dist/components/table/Table.stories.svelte +267 -0
  228. package/dist/components/table/Table.stories.svelte.d.ts +19 -0
  229. package/dist/components/table/Table.svelte +1 -1
  230. package/dist/components/table/TableBody.svelte +16 -3
  231. package/dist/components/table/TableBody.svelte.d.ts +5 -1
  232. package/dist/components/table/TableRow.svelte +1 -1
  233. package/dist/components/table/theme.d.ts +2 -2
  234. package/dist/components/table/theme.js +2 -2
  235. package/dist/components/table/types.d.ts +7 -0
  236. package/dist/components/time/theme.d.ts +29 -29
  237. package/dist/components/time/theme.js +2 -2
  238. package/dist/components/toolbar/Toolbar.stories.svelte +71 -0
  239. package/dist/components/toolbar/Toolbar.stories.svelte.d.ts +19 -0
  240. package/dist/components/toolbar/Toolbar.svelte +19 -3
  241. package/dist/components/toolbar/Toolbar.svelte.d.ts +8 -2
  242. package/dist/components/toolbar/ToolbarButton.svelte +28 -4
  243. package/dist/components/toolbar/ToolbarDivider.svelte +4 -3
  244. package/dist/components/toolbar/ToolbarGroup.svelte +7 -2
  245. package/dist/components/toolbar/ToolbarGroupItem.svelte +29 -4
  246. package/dist/components/toolbar/ToolbarSection.svelte +35 -0
  247. package/dist/components/toolbar/ToolbarSection.svelte.d.ts +9 -0
  248. package/dist/components/toolbar/ToolbarSpacer.svelte +18 -0
  249. package/dist/components/toolbar/ToolbarSpacer.svelte.d.ts +9 -0
  250. package/dist/components/toolbar/index.d.ts +2 -0
  251. package/dist/components/toolbar/index.js +2 -0
  252. package/dist/components/toolbar/theme.d.ts +36 -21
  253. package/dist/components/toolbar/theme.js +27 -11
  254. package/dist/components/toolbar/types.d.ts +37 -4
  255. package/dist/components/typography/body/theme.d.ts +14 -14
  256. package/dist/components/typography/display/theme.d.ts +14 -14
  257. package/dist/components/typography/headline/theme.d.ts +14 -14
  258. package/dist/components/typography/kbd/Kbd.stories.svelte +41 -0
  259. package/dist/components/typography/kbd/Kbd.stories.svelte.d.ts +19 -0
  260. package/dist/components/typography/kbd/theme.d.ts +9 -9
  261. package/dist/components/typography/kbd/theme.js +2 -2
  262. package/dist/components/typography/label/theme.d.ts +14 -14
  263. package/dist/components/typography/title/theme.d.ts +14 -14
  264. package/dist/styles/component.css +126 -4
  265. package/dist/styles/motion.css +6 -3
  266. package/dist/utils/Layer.svelte +7 -3
  267. package/dist/utils/Theme.svelte +20 -20
  268. package/dist/utils/ThemeScript.svelte +1 -1
  269. package/dist/utils/icon/theme.d.ts +14 -14
  270. package/package.json +38 -37
  271. package/bin/install-skill.js +0 -29
  272. package/dist/components/buttons/button-group/ButtonGroupItem.svelte +0 -41
  273. package/dist/components/buttons/button-group/ButtonGroupItem.svelte.d.ts +0 -8
  274. package/dist/components/buttons/connected/ConnectedButtons.svelte +0 -14
  275. package/dist/components/buttons/connected/ConnectedButtons.svelte.d.ts +0 -8
  276. package/dist/components/containers/menu-item/MenuItem.svelte +0 -74
  277. package/dist/components/containers/merger/InputMerger.svelte +0 -29
  278. package/dist/components/containers/merger/InputMerger.svelte.d.ts +0 -14
  279. package/dist/components/containers/merger/index.d.ts +0 -1
  280. package/dist/components/containers/merger/index.js +0 -3
  281. package/dist/components/containers/panes/SinglePane.stories.svelte +0 -67
  282. package/dist/components/containers/panes/SinglePane.svelte +0 -32
  283. package/dist/components/containers/panes/SinglePane.svelte.d.ts +0 -5
  284. package/dist/components/containers/panes/SplitPane.stories.svelte +0 -124
  285. package/dist/components/containers/panes/SplitPane.svelte +0 -144
  286. package/dist/components/containers/panes/SplitPane.svelte.d.ts +0 -8
  287. package/dist/components/containers/panes/SupportingPane.stories.svelte +0 -113
  288. package/dist/components/containers/panes/SupportingPane.svelte +0 -175
  289. package/dist/components/containers/panes/SupportingPane.svelte.d.ts +0 -9
  290. package/dist/components/containers/panes/index.d.ts +0 -5
  291. package/dist/components/containers/panes/theme.d.ts +0 -490
  292. package/dist/components/containers/panes/theme.js +0 -185
  293. package/dist/components/containers/panes/types.d.ts +0 -108
  294. package/dist/components/nav/rail/RailNavContext.svelte +0 -14
  295. package/dist/components/nav/rail/RailNavContext.svelte.d.ts +0 -8
  296. /package/dist/components/{containers/menu-item → buttons/split-button}/types.js +0 -0
  297. /package/dist/components/{containers/panes → chips}/types.js +0 -0
  298. /package/dist/components/containers/{menu-item → menu/menu-item}/index.d.ts +0 -0
  299. /package/dist/components/containers/{menu-item → menu/menu-item}/index.js +0 -0
@@ -0,0 +1,49 @@
1
+ <!--
2
+ @component
3
+ A single selectable option inside a `MenuRadioGroup`.
4
+
5
+ Wraps bits-ui's `DropdownMenu.RadioItem`. Only one radio item within the
6
+ same `MenuRadioGroup` can be checked at a time; selecting one unchecks any
7
+ previously-checked sibling. Renders a leading radio indicator that fills
8
+ in when selected.
9
+
10
+ Contrast with `MenuCheckboxItem`, whose checked state is independent of any
11
+ sibling item.
12
+
13
+ @see https://m3.material.io/components/menus/guidelines
14
+ -->
15
+ <script lang="ts">
16
+ import { DropdownMenu } from 'bits-ui';
17
+ import Icon from '../../../utils/icon/Icon.svelte';
18
+ import Layer from '../../../utils/Layer.svelte';
19
+ import { menu as menuCls } from './theme.js';
20
+ import type { MenuRadioItemProps } from './types.js';
21
+
22
+ let {
23
+ value,
24
+ disabled = false,
25
+ closeOnSelect = true,
26
+ helper,
27
+ children,
28
+ class: className
29
+ }: MenuRadioItemProps = $props();
30
+ </script>
31
+
32
+ <DropdownMenu.RadioItem {value} {disabled} {closeOnSelect}>
33
+ {#snippet child({ props, checked })}
34
+ {@const cls = menuCls({ checked })}
35
+ <div {...props} class={cls.item({ class: className })}>
36
+ <Icon
37
+ name={checked ? 'radio_button_checked' : 'radio_button_unchecked'}
38
+ class={cls.indicator()}
39
+ />
40
+ <div class={cls.itemContent()}>
41
+ {@render children()}
42
+ {#if helper}
43
+ <span class={cls.helper()}>{helper}</span>
44
+ {/if}
45
+ </div>
46
+ <Layer />
47
+ </div>
48
+ {/snippet}
49
+ </DropdownMenu.RadioItem>
@@ -0,0 +1,17 @@
1
+ import type { MenuRadioItemProps } from './types.js';
2
+ /**
3
+ * A single selectable option inside a `MenuRadioGroup`.
4
+ *
5
+ * Wraps bits-ui's `DropdownMenu.RadioItem`. Only one radio item within the
6
+ * same `MenuRadioGroup` can be checked at a time; selecting one unchecks any
7
+ * previously-checked sibling. Renders a leading radio indicator that fills
8
+ * in when selected.
9
+ *
10
+ * Contrast with `MenuCheckboxItem`, whose checked state is independent of any
11
+ * sibling item.
12
+ *
13
+ * @see https://m3.material.io/components/menus/guidelines
14
+ */
15
+ declare const MenuRadioItem: import("svelte").Component<MenuRadioItemProps, {}, "">;
16
+ type MenuRadioItem = ReturnType<typeof MenuRadioItem>;
17
+ export default MenuRadioItem;
@@ -0,0 +1,91 @@
1
+ <!--
2
+ @component
3
+ A `MenuItem`-like row that opens a nested submenu panel on hover or press,
4
+ instead of firing a selection itself.
5
+
6
+ Wraps bits-ui's `DropdownMenu.Sub` + `SubTrigger` + `SubContent`. The
7
+ trigger row (`iconProps`/`helper`/`children` label) behaves like a
8
+ `MenuItem`; pass the nested rows — `MenuItem`, `MenuCheckboxItem`,
9
+ `MenuRadioItem`, `MenuGroup`, more `MenuSub`, etc. — as `submenu`.
10
+
11
+ @example
12
+ ```svelte
13
+ <Menu label="File">
14
+ <MenuItem iconProps={{ name: 'draft' }}>New</MenuItem>
15
+ <MenuSub iconProps={{ name: 'ios_share' }}>
16
+ Share
17
+ {#snippet submenu()}
18
+ <MenuItem>Email</MenuItem>
19
+ <MenuItem>Link</MenuItem>
20
+ {/snippet}
21
+ </MenuSub>
22
+ </Menu>
23
+ ```
24
+
25
+ @see https://m3.material.io/components/menus/guidelines
26
+ -->
27
+ <script lang="ts">
28
+ import { DropdownMenu } from 'bits-ui';
29
+ import clsx from 'clsx';
30
+ import Icon from '../../../utils/icon/Icon.svelte';
31
+ import Layer from '../../../utils/Layer.svelte';
32
+ import { menu as menuCls } from './theme.js';
33
+ import { enterExit } from '../../../animation/enterExit.js';
34
+ import { easeEmphasizedDecel } from '../../../animation/easing.js';
35
+ import type { MenuSubProps } from './types.js';
36
+
37
+ let {
38
+ iconProps,
39
+ disabled = false,
40
+ helper,
41
+ children,
42
+ submenu,
43
+ open = $bindable(false),
44
+ class: className,
45
+ submenuClass
46
+ }: MenuSubProps = $props();
47
+
48
+ const cls = $derived(menuCls());
49
+ </script>
50
+
51
+ <DropdownMenu.Sub bind:open>
52
+ <DropdownMenu.SubTrigger {disabled}>
53
+ {#snippet child({ props })}
54
+ <div {...props} class={cls.item({ class: className })}>
55
+ {#if iconProps}
56
+ <Icon class={cls.icon()} {...iconProps} />
57
+ {/if}
58
+ <div class={cls.itemContent()}>
59
+ {@render children()}
60
+ {#if helper}
61
+ <span class={cls.helper()}>{helper}</span>
62
+ {/if}
63
+ </div>
64
+ <Icon name="chevron_right" class={cls.rightSlot()} />
65
+ <Layer />
66
+ </div>
67
+ {/snippet}
68
+ </DropdownMenu.SubTrigger>
69
+
70
+ <DropdownMenu.Portal>
71
+ <DropdownMenu.SubContent forceMount sideOffset={4} class="z-100">
72
+ {#snippet child({ wrapperProps, props, open: isOpen })}
73
+ {#if isOpen}
74
+ <div {...wrapperProps} class={wrapperProps.class as any}>
75
+ <div
76
+ {...props}
77
+ class={clsx(cls.content(), props.class as any, submenuClass)}
78
+ transition:enterExit={{
79
+ duration: 200,
80
+ easing: easeEmphasizedDecel,
81
+ mode: 'scale'
82
+ }}
83
+ >
84
+ {@render submenu()}
85
+ </div>
86
+ </div>
87
+ {/if}
88
+ {/snippet}
89
+ </DropdownMenu.SubContent>
90
+ </DropdownMenu.Portal>
91
+ </DropdownMenu.Sub>
@@ -0,0 +1,29 @@
1
+ import type { MenuSubProps } from './types.js';
2
+ /**
3
+ * A `MenuItem`-like row that opens a nested submenu panel on hover or press,
4
+ * instead of firing a selection itself.
5
+ *
6
+ * Wraps bits-ui's `DropdownMenu.Sub` + `SubTrigger` + `SubContent`. The
7
+ * trigger row (`iconProps`/`helper`/`children` label) behaves like a
8
+ * `MenuItem`; pass the nested rows — `MenuItem`, `MenuCheckboxItem`,
9
+ * `MenuRadioItem`, `MenuGroup`, more `MenuSub`, etc. — as `submenu`.
10
+ *
11
+ * @example
12
+ * ```svelte
13
+ * <Menu label="File">
14
+ * <MenuItem iconProps={{ name: 'draft' }}>New</MenuItem>
15
+ * <MenuSub iconProps={{ name: 'ios_share' }}>
16
+ * Share
17
+ * {#snippet submenu()}
18
+ * <MenuItem>Email</MenuItem>
19
+ * <MenuItem>Link</MenuItem>
20
+ * {/snippet}
21
+ * </MenuSub>
22
+ * </Menu>
23
+ * ```
24
+ *
25
+ * @see https://m3.material.io/components/menus/guidelines
26
+ */
27
+ declare const MenuSub: import("svelte").Component<MenuSubProps, {}, "open">;
28
+ type MenuSub = ReturnType<typeof MenuSub>;
29
+ export default MenuSub;
@@ -1,2 +1,9 @@
1
+ export * from './menu-item/index.js';
2
+ export * from './theme.js';
1
3
  export * from './types.js';
2
4
  export { default as Menu } from './Menu.svelte';
5
+ export { default as MenuCheckboxItem } from './MenuCheckboxItem.svelte';
6
+ export { default as MenuGroup } from './MenuGroup.svelte';
7
+ export { default as MenuRadioGroup } from './MenuRadioGroup.svelte';
8
+ export { default as MenuRadioItem } from './MenuRadioItem.svelte';
9
+ export { default as MenuSub } from './MenuSub.svelte';
@@ -1,5 +1,13 @@
1
1
  // THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
2
+ // folder re-exports (export everything from these folders)
3
+ export * from './menu-item/index.js';
2
4
  // re-export TS/JS modules from this folder
5
+ export * from './theme.js';
3
6
  export * from './types.js';
4
7
  // default exports for components in this folder
5
8
  export { default as Menu } from './Menu.svelte';
9
+ export { default as MenuCheckboxItem } from './MenuCheckboxItem.svelte';
10
+ export { default as MenuGroup } from './MenuGroup.svelte';
11
+ export { default as MenuRadioGroup } from './MenuRadioGroup.svelte';
12
+ export { default as MenuRadioItem } from './MenuRadioItem.svelte';
13
+ export { default as MenuSub } from './MenuSub.svelte';
@@ -0,0 +1,71 @@
1
+ <!--
2
+ @component
3
+ A single interactive row inside a `Menu`.
4
+
5
+ `MenuItem` is the leaf node of the menu system. It wraps bits-ui's
6
+ `DropdownMenu.Item` so each row automatically gets keyboard navigation,
7
+ focus management, and the ARIA `menuitem` role.
8
+
9
+ Pass `onclick` (or `onSelect`) for the action; use `iconProps` for a
10
+ leading icon and `helper` for a supporting line below the label.
11
+
12
+ Contrast with `Menu`, which is just the shell (open state + floating panel),
13
+ and `ContextMenu`, which owns its own item list and is right-click triggered.
14
+
15
+ @see https://m3.material.io/components/menus/guidelines
16
+ -->
17
+ <script lang="ts">
18
+ import type { MenuItemProps } from './types.js';
19
+ import type { DropdownMenuItemProps } from 'bits-ui';
20
+ import Icon from '../../../../utils/icon/Icon.svelte';
21
+ import Layer from '../../../../utils/Layer.svelte';
22
+ import { DropdownMenu } from 'bits-ui';
23
+ import { menu as menuCls } from '../theme.js';
24
+
25
+ let {
26
+ iconProps,
27
+ disabled = false,
28
+ onclick,
29
+ onSelect,
30
+ isGap,
31
+ selected,
32
+ helper,
33
+ children,
34
+ class: className,
35
+ ...restProps
36
+ }: MenuItemProps & DropdownMenuItemProps = $props();
37
+
38
+ // bits-ui fires onSelect at the Item level; avoid wiring onclick to the
39
+ // native button as well or it would fire twice on every click.
40
+ const handleSelect = $derived(onSelect ?? (onclick ? () => onclick() : undefined));
41
+
42
+ const cls = $derived(menuCls({ selected }));
43
+ </script>
44
+
45
+ {#if !isGap}
46
+ <DropdownMenu.Item
47
+ {...restProps}
48
+ {disabled}
49
+ onSelect={handleSelect}
50
+ class={cls.item({ class: className as string })}
51
+ >
52
+ {#if iconProps}
53
+ <Icon class={cls.icon()} {...iconProps} />
54
+ {/if}
55
+
56
+ <div class={cls.itemContent()}>
57
+ {@render children()}
58
+ {#if helper}
59
+ <span class={cls.helper()}>
60
+ {helper}
61
+ </span>
62
+ {/if}
63
+ </div>
64
+ <Layer />
65
+ </DropdownMenu.Item>
66
+ {:else}
67
+ <!-- Render as a gap -->
68
+ <DropdownMenu.Item>
69
+ <hr class="h-1" />
70
+ </DropdownMenu.Item>
71
+ {/if}
@@ -1,5 +1,6 @@
1
1
  import type { MenuItemProps } from './types.js';
2
- type $$ComponentProps = MenuItemProps & Record<string, any>;
2
+ import type { DropdownMenuItemProps } from 'bits-ui';
3
+ type $$ComponentProps = MenuItemProps & DropdownMenuItemProps;
3
4
  /**
4
5
  * A single interactive row inside a `Menu`.
5
6
  *
@@ -1,4 +1,4 @@
1
- import type { IconProps } from '../../../utils/icon/types.js';
1
+ import type { IconProps } from '../../../../utils/icon/types.js';
2
2
  import type { Snippet } from 'svelte';
3
3
  /**
4
4
  * Props for the MenuItem component.
@@ -33,4 +33,8 @@ export interface MenuItemProps {
33
33
  * The content of the menu item, typically a label.
34
34
  */
35
35
  children: Snippet;
36
+ /**
37
+ * Whether this item is in fact a gap
38
+ */
39
+ isGap?: boolean;
36
40
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,68 @@
1
+ import { type VariantProps } from 'tailwind-variants';
2
+ /**
3
+ * Shared styling for every row-shaped element inside a `Menu`'s floating
4
+ * panel: `MenuItem`, `MenuCheckboxItem`, `MenuRadioItem`, and `MenuSub`'s
5
+ * trigger row all pull from this one `tv()` so they stay visually identical.
6
+ */
7
+ export type MenuVariants = VariantProps<typeof menu>;
8
+ export declare const menu: import("tailwind-variants").TVReturnType<{
9
+ selected: {
10
+ true: {
11
+ item: string;
12
+ };
13
+ };
14
+ checked: {
15
+ true: {
16
+ indicator: string;
17
+ };
18
+ };
19
+ }, {
20
+ content: string;
21
+ item: string;
22
+ icon: string;
23
+ indicator: string;
24
+ itemContent: string;
25
+ helper: string;
26
+ rightSlot: string;
27
+ groupHeading: string;
28
+ }, undefined, {
29
+ selected: {
30
+ true: {
31
+ item: string;
32
+ };
33
+ };
34
+ checked: {
35
+ true: {
36
+ indicator: string;
37
+ };
38
+ };
39
+ }, {
40
+ content: string;
41
+ item: string;
42
+ icon: string;
43
+ indicator: string;
44
+ itemContent: string;
45
+ helper: string;
46
+ rightSlot: string;
47
+ groupHeading: string;
48
+ }, import("tailwind-variants").TVReturnTypeLike<{
49
+ selected: {
50
+ true: {
51
+ item: string;
52
+ };
53
+ };
54
+ checked: {
55
+ true: {
56
+ indicator: string;
57
+ };
58
+ };
59
+ }, {
60
+ content: string;
61
+ item: string;
62
+ icon: string;
63
+ indicator: string;
64
+ itemContent: string;
65
+ helper: string;
66
+ rightSlot: string;
67
+ groupHeading: string;
68
+ }>>;
@@ -0,0 +1,36 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const menu = tv({
3
+ slots: {
4
+ content: `
5
+ bg-md-sys-color-surface-container-high shadow-elevation-3
6
+ ring-md-sys-color-outline/10 max-w-sm min-w-48 gap-1
7
+ overflow-y-auto rounded-lg px-2 py-1
8
+ `,
9
+ item: `
10
+ rounded-sm h-11 relative flex w-full cursor-pointer items-center gap-2 px-3 py-2
11
+ md-sys-typescale-body-medium whitespace-nowrap text-md-sys-color-on-surface
12
+ hover:bg-md-sys-color-on-surface/8 data-[highlighted]:bg-md-sys-color-on-surface/8
13
+ focus-visible:outline-2 focus-visible:outline-offset-2
14
+ focus-visible:outline-md-sys-color-primary
15
+ data-[disabled]:cursor-not-allowed data-[disabled]:opacity-38
16
+ `,
17
+ icon: 'text-md-sys-color-on-surface-variant size-5 text-[20px] shrink-0',
18
+ indicator: 'size-5 text-[20px] shrink-0 text-md-sys-color-on-surface-variant',
19
+ itemContent: 'flex flex-1 flex-col gap-1 text-left min-w-0',
20
+ helper: 'md-sys-typescale-body-medium text-md-sys-color-on-surface-variant',
21
+ rightSlot: 'text-md-sys-color-on-surface-variant size-5 text-[20px] shrink-0',
22
+ groupHeading: 'px-3 pt-2 pb-1 md-sys-typescale-label-medium text-md-sys-color-primary'
23
+ },
24
+ variants: {
25
+ selected: {
26
+ true: {
27
+ item: 'bg-md-sys-color-secondary-container rounded-lg text-md-sys-color-on-secondary-container'
28
+ }
29
+ },
30
+ checked: {
31
+ true: {
32
+ indicator: 'text-md-sys-color-primary'
33
+ }
34
+ }
35
+ }
36
+ });
@@ -1,3 +1,4 @@
1
+ import type { IconProps } from '../../../utils/icon/types.js';
1
2
  import type { Snippet } from 'svelte';
2
3
  /**
3
4
  * Props for the Menu component.
@@ -18,9 +19,11 @@ export type MenuProps = {
18
19
  children: Snippet;
19
20
  /**
20
21
  * Custom trigger element. When omitted, a default filled `Button` labelled
21
- * by `label` is used.
22
+ * by `label` is used. Receives the trigger's props — spread them onto the
23
+ * rendered element/component so bits-ui doesn't wrap it in its own
24
+ * `<button>` (which would nest buttons).
22
25
  */
23
- trigger?: Snippet;
26
+ trigger?: Snippet<[Record<string, unknown>]>;
24
27
  /**
25
28
  * Label for the default button trigger. Ignored when `trigger` is provided.
26
29
  * @default 'Open menu'
@@ -38,3 +41,111 @@ export type MenuProps = {
38
41
  /** Additional CSS classes applied to the floating content panel. */
39
42
  class?: string;
40
43
  };
44
+ /**
45
+ * Props for `MenuGroup`, which wraps related `MenuItem`s (or
46
+ * `MenuCheckboxItem`/`MenuRadioItem`s) under an optional heading so screen
47
+ * readers announce them as a labelled set.
48
+ */
49
+ export type MenuGroupProps = {
50
+ /** Optional label rendered above the group's items. */
51
+ heading?: string;
52
+ /** Items inside the group. */
53
+ children: Snippet;
54
+ /** Additional CSS classes applied to the group container. */
55
+ class?: string;
56
+ };
57
+ /**
58
+ * Props for `MenuRadioGroup`, which restricts its `MenuRadioItem` children
59
+ * to a single selected value at a time.
60
+ */
61
+ export type MenuRadioGroupProps = {
62
+ /**
63
+ * The value of the currently selected radio item.
64
+ * Supports two-way binding with `bind:value`.
65
+ */
66
+ value?: string;
67
+ /** Called when the selected value changes. */
68
+ onValueChange?: (value: string) => void;
69
+ /** `MenuRadioItem`s inside the group. */
70
+ children: Snippet;
71
+ /** Additional CSS classes applied to the group container. */
72
+ class?: string;
73
+ };
74
+ /**
75
+ * Props for a single option inside a `MenuRadioGroup`.
76
+ */
77
+ export type MenuRadioItemProps = {
78
+ /** The value this item represents within its `MenuRadioGroup`. */
79
+ value: string;
80
+ /**
81
+ * Whether the item is disabled.
82
+ * @default false
83
+ */
84
+ disabled?: boolean;
85
+ /** Optional supporting text shown below the label. */
86
+ helper?: string;
87
+ /** The item's label. */
88
+ children: Snippet;
89
+ /**
90
+ * Whether the menu closes when this item is selected.
91
+ * @default true
92
+ */
93
+ closeOnSelect?: boolean;
94
+ /** Additional CSS classes applied to the item row. */
95
+ class?: string;
96
+ };
97
+ /**
98
+ * Props for a toggleable option inside a `Menu`, independent of any other
99
+ * item (unlike `MenuRadioItem`, any number of `MenuCheckboxItem`s can be
100
+ * checked at once).
101
+ */
102
+ export type MenuCheckboxItemProps = {
103
+ /**
104
+ * The checked state. Supports two-way binding with `bind:checked`.
105
+ * @default false
106
+ */
107
+ checked?: boolean;
108
+ /** Called when the checked state changes. */
109
+ onCheckedChange?: (checked: boolean) => void;
110
+ /**
111
+ * Whether the item is disabled.
112
+ * @default false
113
+ */
114
+ disabled?: boolean;
115
+ /** Optional supporting text shown below the label. */
116
+ helper?: string;
117
+ /** The item's label. */
118
+ children: Snippet;
119
+ /**
120
+ * Whether the menu closes when this item is selected.
121
+ * @default true
122
+ */
123
+ closeOnSelect?: boolean;
124
+ /** Additional CSS classes applied to the item row. */
125
+ class?: string;
126
+ };
127
+ /**
128
+ * Props for `MenuSub`, a `MenuItem`-like row that opens a nested submenu
129
+ * panel on hover/click instead of firing a selection.
130
+ */
131
+ export type MenuSubProps = {
132
+ /** Props for the trigger row's leading icon. */
133
+ iconProps?: IconProps;
134
+ /**
135
+ * Whether the submenu trigger is disabled.
136
+ * @default false
137
+ */
138
+ disabled?: boolean;
139
+ /** Optional supporting text shown below the trigger's label. */
140
+ helper?: string;
141
+ /** The trigger row's label. */
142
+ children: Snippet;
143
+ /** Items rendered inside the nested submenu panel. */
144
+ submenu: Snippet;
145
+ /** Controlled open state for the submenu. */
146
+ open?: boolean;
147
+ /** Additional CSS classes applied to the trigger row. */
148
+ class?: string;
149
+ /** Additional CSS classes applied to the submenu's floating panel. */
150
+ submenuClass?: string;
151
+ };