@noxlovette/material 0.3.3 → 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 (288) 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/{containers/merger → chips}/index.js +2 -1
  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/theme.d.ts +14 -14
  83. package/dist/components/containers/list/theme.js +1 -1
  84. package/dist/components/containers/menu/Menu.stories.svelte +105 -3
  85. package/dist/components/containers/menu/Menu.stories.svelte.d.ts +2 -17
  86. package/dist/components/containers/menu/Menu.svelte +9 -7
  87. package/dist/components/containers/menu/MenuCheckboxItem.svelte +55 -0
  88. package/dist/components/containers/menu/MenuCheckboxItem.svelte.d.ts +25 -0
  89. package/dist/components/containers/menu/MenuGroup.svelte +43 -0
  90. package/dist/components/containers/menu/MenuGroup.svelte.d.ts +28 -0
  91. package/dist/components/containers/menu/MenuRadioGroup.svelte +39 -0
  92. package/dist/components/containers/menu/MenuRadioGroup.svelte.d.ts +27 -0
  93. package/dist/components/containers/menu/MenuRadioItem.svelte +49 -0
  94. package/dist/components/containers/menu/MenuRadioItem.svelte.d.ts +17 -0
  95. package/dist/components/containers/menu/MenuSub.svelte +91 -0
  96. package/dist/components/containers/menu/MenuSub.svelte.d.ts +29 -0
  97. package/dist/components/containers/menu/index.d.ts +7 -0
  98. package/dist/components/containers/menu/index.js +8 -0
  99. package/dist/components/containers/menu/menu-item/MenuItem.svelte +71 -0
  100. package/dist/components/containers/{menu-item → menu/menu-item}/MenuItem.svelte.d.ts +2 -1
  101. package/dist/components/containers/{menu-item → menu/menu-item}/types.d.ts +5 -1
  102. package/dist/components/containers/menu/menu-item/types.js +1 -0
  103. package/dist/components/containers/menu/theme.d.ts +68 -0
  104. package/dist/components/containers/menu/theme.js +36 -0
  105. package/dist/components/containers/menu/types.d.ts +113 -2
  106. package/dist/components/containers/pane/DraggablePane.stories.svelte +199 -0
  107. package/dist/components/containers/pane/DraggablePane.stories.svelte.d.ts +4 -0
  108. package/dist/components/containers/pane/DraggablePane.svelte +533 -0
  109. package/dist/components/containers/pane/DraggablePane.svelte.d.ts +29 -0
  110. package/dist/components/containers/pane/Pane.stories.svelte +104 -0
  111. package/dist/components/containers/pane/Pane.stories.svelte.d.ts +19 -0
  112. package/dist/components/containers/pane/Pane.svelte +78 -0
  113. package/dist/components/containers/pane/Pane.svelte.d.ts +18 -0
  114. package/dist/components/containers/pane/PaneGrid.stories.svelte +134 -0
  115. package/dist/components/containers/pane/PaneGrid.stories.svelte.d.ts +19 -0
  116. package/dist/components/containers/pane/PaneGrid.svelte +43 -0
  117. package/dist/components/containers/pane/PaneGrid.svelte.d.ts +13 -0
  118. package/dist/components/containers/pane/PaneHandle.svelte +90 -0
  119. package/dist/components/containers/pane/PaneHandle.svelte.d.ts +12 -0
  120. package/dist/components/containers/pane/dragStore.svelte.d.ts +16 -0
  121. package/dist/components/containers/pane/dragStore.svelte.js +38 -0
  122. package/dist/components/containers/pane/index.d.ts +8 -0
  123. package/dist/components/containers/pane/index.js +11 -0
  124. package/dist/components/containers/pane/resizeStore.svelte.d.ts +10 -0
  125. package/dist/components/containers/pane/resizeStore.svelte.js +30 -0
  126. package/dist/components/containers/pane/theme.d.ts +571 -0
  127. package/dist/components/containers/pane/theme.js +211 -0
  128. package/dist/components/containers/pane/types.d.ts +249 -0
  129. package/dist/components/containers/pane/types.js +1 -0
  130. package/dist/components/containers/popover/Popover.stories.svelte +4 -4
  131. package/dist/components/containers/popover/Popover.svelte +3 -1
  132. package/dist/components/containers/popover/theme.d.ts +20 -20
  133. package/dist/components/containers/popover/types.d.ts +6 -2
  134. package/dist/components/containers/scroll-area/theme.d.ts +2 -2
  135. package/dist/components/containers/side-sheet/SideSheet.stories.svelte +16 -24
  136. package/dist/components/containers/side-sheet/SideSheet.svelte +73 -7
  137. package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +5 -0
  138. package/dist/components/containers/stack/theme.d.ts +44 -44
  139. package/dist/components/date/DateField.stories.svelte +57 -0
  140. package/dist/components/{containers/panes/SplitPane.stories.svelte.d.ts → date/DateField.stories.svelte.d.ts} +4 -4
  141. package/dist/components/date/DateField.svelte +11 -2
  142. package/dist/components/date/DateRangeField.stories.svelte +53 -0
  143. package/dist/components/{containers/panes/SupportingPane.stories.svelte.d.ts → date/DateRangeField.stories.svelte.d.ts} +4 -4
  144. package/dist/components/date/DateRangeField.svelte +2 -1
  145. package/dist/components/date/theme.d.ts +73 -4
  146. package/dist/components/date/theme.js +95 -26
  147. package/dist/components/date/types.d.ts +5 -0
  148. package/dist/components/forms/checkbox/Checkbox.svelte +7 -9
  149. package/dist/components/forms/checkbox/theme.d.ts +8 -8
  150. package/dist/components/forms/checkbox/theme.js +31 -9
  151. package/dist/components/forms/command/theme.d.ts +35 -35
  152. package/dist/components/forms/pin/theme.d.ts +2 -2
  153. package/dist/components/forms/radio-group/theme.d.ts +2 -2
  154. package/dist/components/forms/search/theme.d.ts +8 -8
  155. package/dist/components/forms/select/Select.svelte +3 -2
  156. package/dist/components/forms/select/theme.d.ts +26 -2
  157. package/dist/components/forms/select/theme.js +56 -22
  158. package/dist/components/forms/slider/theme.d.ts +20 -20
  159. package/dist/components/forms/switch/theme.d.ts +2 -2
  160. package/dist/components/forms/textfield/Textfield.stories.svelte +22 -0
  161. package/dist/components/forms/textfield/Textfield.svelte +10 -1
  162. package/dist/components/forms/textfield/theme.d.ts +44 -2
  163. package/dist/components/forms/textfield/theme.js +56 -16
  164. package/dist/components/forms/toggle-group/ToggleGroup.svelte +2 -2
  165. package/dist/components/forms/toggle-group/ToggleGroup.svelte.d.ts +2 -2
  166. package/dist/components/forms/toggle-group/ToggleGroupItem.svelte +1 -1
  167. package/dist/components/forms/toggle-group/ToggleGroupItem.svelte.d.ts +1 -1
  168. package/dist/components/forms/toggle-group/theme.d.ts +16 -16
  169. package/dist/components/forms/toggle-group/types.d.ts +2 -2
  170. package/dist/components/forms/tooltip/Tooltip.svelte +1 -1
  171. package/dist/components/forms/tooltip/theme.d.ts +2 -2
  172. package/dist/components/index.d.ts +1 -0
  173. package/dist/components/index.js +1 -0
  174. package/dist/components/misc/Avatar.stories.svelte +8 -0
  175. package/dist/components/misc/Avatar.svelte +35 -10
  176. package/dist/components/misc/DicebearAvatarBuilder.d.ts +59 -0
  177. package/dist/components/misc/DicebearAvatarBuilder.js +115 -0
  178. package/dist/components/misc/ThemeSettings.svelte +1 -1
  179. package/dist/components/misc/ThemeSwitcher.svelte +2 -2
  180. package/dist/components/misc/dicebearStyles.d.ts +21 -0
  181. package/dist/components/misc/dicebearStyles.js +169 -0
  182. package/dist/components/misc/index.d.ts +3 -0
  183. package/dist/components/misc/index.js +3 -0
  184. package/dist/components/misc/materialAvatarPalette.d.ts +6 -0
  185. package/dist/components/misc/materialAvatarPalette.js +44 -0
  186. package/dist/components/misc/theme.d.ts +20 -2
  187. package/dist/components/misc/theme.js +7 -1
  188. package/dist/components/misc/types.d.ts +20 -2
  189. package/dist/components/nav/appbar/AppBar.stories.svelte +1 -1
  190. package/dist/components/nav/appbar/AppBar.svelte +46 -15
  191. package/dist/components/nav/appbar/AppBar.svelte.d.ts +5 -0
  192. package/dist/components/nav/appbar/theme.d.ts +20 -14
  193. package/dist/components/nav/appbar/theme.js +11 -7
  194. package/dist/components/nav/appbar/types.d.ts +3 -1
  195. package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte +50 -0
  196. package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte.d.ts +19 -0
  197. package/dist/components/nav/breadcrumb/Breadcrumb.svelte +46 -0
  198. package/dist/components/nav/breadcrumb/Breadcrumb.svelte.d.ts +13 -0
  199. package/dist/components/nav/breadcrumb/index.d.ts +3 -0
  200. package/dist/components/nav/breadcrumb/index.js +6 -0
  201. package/dist/components/nav/breadcrumb/theme.d.ts +84 -0
  202. package/dist/components/nav/breadcrumb/theme.js +35 -0
  203. package/dist/components/nav/breadcrumb/types.d.ts +14 -0
  204. package/dist/components/nav/breadcrumb/types.js +1 -0
  205. package/dist/components/nav/index.d.ts +1 -0
  206. package/dist/components/nav/index.js +1 -0
  207. package/dist/components/nav/navbar/theme.d.ts +19 -19
  208. package/dist/components/nav/rail/Rail.stories.svelte +1 -5
  209. package/dist/components/nav/rail/Rail.svelte +3 -25
  210. package/dist/components/nav/rail/theme.d.ts +4 -4
  211. package/dist/components/nav/rail/types.d.ts +0 -5
  212. package/dist/components/nav/tabs/TabHolder.svelte +2 -1
  213. package/dist/components/nav/tabs/theme.d.ts +21 -21
  214. package/dist/components/nav/tabs/theme.js +6 -0
  215. package/dist/components/nav/tabs/types.d.ts +2 -2
  216. package/dist/components/pill/theme.d.ts +35 -35
  217. package/dist/components/snackbar/theme.d.ts +8 -8
  218. package/dist/components/table/Table.stories.svelte +267 -0
  219. package/dist/components/table/Table.stories.svelte.d.ts +19 -0
  220. package/dist/components/table/Table.svelte +1 -1
  221. package/dist/components/table/TableBody.svelte +16 -3
  222. package/dist/components/table/TableBody.svelte.d.ts +5 -1
  223. package/dist/components/table/TableRow.svelte +1 -1
  224. package/dist/components/table/theme.d.ts +2 -2
  225. package/dist/components/table/theme.js +2 -2
  226. package/dist/components/table/types.d.ts +7 -0
  227. package/dist/components/time/theme.d.ts +29 -29
  228. package/dist/components/toolbar/Toolbar.stories.svelte +71 -0
  229. package/dist/components/toolbar/Toolbar.stories.svelte.d.ts +19 -0
  230. package/dist/components/toolbar/Toolbar.svelte +19 -3
  231. package/dist/components/toolbar/Toolbar.svelte.d.ts +8 -2
  232. package/dist/components/toolbar/ToolbarButton.svelte +28 -4
  233. package/dist/components/toolbar/ToolbarDivider.svelte +4 -3
  234. package/dist/components/toolbar/ToolbarGroup.svelte +7 -2
  235. package/dist/components/toolbar/ToolbarGroupItem.svelte +29 -4
  236. package/dist/components/toolbar/ToolbarSection.svelte +35 -0
  237. package/dist/components/toolbar/ToolbarSection.svelte.d.ts +9 -0
  238. package/dist/components/toolbar/ToolbarSpacer.svelte +18 -0
  239. package/dist/components/toolbar/ToolbarSpacer.svelte.d.ts +9 -0
  240. package/dist/components/toolbar/index.d.ts +2 -0
  241. package/dist/components/toolbar/index.js +2 -0
  242. package/dist/components/toolbar/theme.d.ts +36 -21
  243. package/dist/components/toolbar/theme.js +27 -11
  244. package/dist/components/toolbar/types.d.ts +37 -4
  245. package/dist/components/typography/body/theme.d.ts +14 -14
  246. package/dist/components/typography/display/theme.d.ts +14 -14
  247. package/dist/components/typography/headline/theme.d.ts +14 -14
  248. package/dist/components/typography/kbd/Kbd.stories.svelte +1 -1
  249. package/dist/components/typography/kbd/theme.d.ts +8 -8
  250. package/dist/components/typography/label/theme.d.ts +14 -14
  251. package/dist/components/typography/title/theme.d.ts +14 -14
  252. package/dist/styles/component.css +126 -4
  253. package/dist/styles/motion.css +6 -3
  254. package/dist/utils/Layer.svelte +7 -3
  255. package/dist/utils/Theme.svelte +20 -20
  256. package/dist/utils/ThemeScript.svelte +1 -1
  257. package/dist/utils/icon/theme.d.ts +14 -14
  258. package/package.json +38 -37
  259. package/bin/install-skill.js +0 -29
  260. package/dist/components/buttons/button-group/ButtonGroupItem.svelte +0 -41
  261. package/dist/components/buttons/button-group/ButtonGroupItem.svelte.d.ts +0 -8
  262. package/dist/components/buttons/connected/ConnectedButtons.svelte +0 -14
  263. package/dist/components/buttons/connected/ConnectedButtons.svelte.d.ts +0 -8
  264. package/dist/components/containers/menu-item/MenuItem.svelte +0 -74
  265. package/dist/components/containers/merger/InputMerger.svelte +0 -24
  266. package/dist/components/containers/merger/InputMerger.svelte.d.ts +0 -14
  267. package/dist/components/containers/merger/index.d.ts +0 -2
  268. package/dist/components/containers/merger/theme.d.ts +0 -1
  269. package/dist/components/containers/merger/theme.js +0 -4
  270. package/dist/components/containers/panes/SinglePane.stories.svelte +0 -67
  271. package/dist/components/containers/panes/SinglePane.svelte +0 -32
  272. package/dist/components/containers/panes/SinglePane.svelte.d.ts +0 -5
  273. package/dist/components/containers/panes/SplitPane.stories.svelte +0 -124
  274. package/dist/components/containers/panes/SplitPane.svelte +0 -144
  275. package/dist/components/containers/panes/SplitPane.svelte.d.ts +0 -8
  276. package/dist/components/containers/panes/SupportingPane.stories.svelte +0 -113
  277. package/dist/components/containers/panes/SupportingPane.svelte +0 -175
  278. package/dist/components/containers/panes/SupportingPane.svelte.d.ts +0 -9
  279. package/dist/components/containers/panes/index.d.ts +0 -5
  280. package/dist/components/containers/panes/theme.d.ts +0 -490
  281. package/dist/components/containers/panes/theme.js +0 -185
  282. package/dist/components/containers/panes/types.d.ts +0 -108
  283. package/dist/components/nav/rail/RailNavContext.svelte +0 -14
  284. package/dist/components/nav/rail/RailNavContext.svelte.d.ts +0 -8
  285. /package/dist/components/{containers/menu-item → buttons/split-button}/types.js +0 -0
  286. /package/dist/components/{containers/panes → chips}/types.js +0 -0
  287. /package/dist/components/containers/{menu-item → menu/menu-item}/index.d.ts +0 -0
  288. /package/dist/components/containers/{menu-item → menu/menu-item}/index.js +0 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Google's Material Design System in Svelte
@@ -3,3 +3,4 @@ export * from './floating.js';
3
3
  export * from './keyboard.js';
4
4
  export * from './portal.js';
5
5
  export * from './positionFloating.js';
6
+ export * from './rovingFocusGroup.js';
@@ -3,3 +3,4 @@ export * from './floating.js';
3
3
  export * from './keyboard.js';
4
4
  export * from './portal.js';
5
5
  export * from './positionFloating.js';
6
+ export * from './rovingFocusGroup.js';
@@ -0,0 +1,20 @@
1
+ export type RovingFocusGroupParams = {
2
+ /** CSS selector (relative to the node) matching the focusable candidates. */
3
+ candidateSelector: string;
4
+ /** Loop from the last candidate back to the first (and vice versa). */
5
+ loop?: boolean;
6
+ /** Disable the group without unmounting it (leaves existing tabindex/focus alone). */
7
+ enabled?: boolean;
8
+ };
9
+ /**
10
+ * Roving-tabindex keyboard navigation for a group of sibling elements (e.g. table rows,
11
+ * list items): only one candidate is ever a Tab stop, and ArrowDown/ArrowUp (plus the
12
+ * j/k vim aliases) move focus — and the roving tab stop — between candidates. Tab and
13
+ * Shift+Tab keep working natively since they only ever see the single active tabindex=0
14
+ * candidate. Modeled on bits-ui's RovingFocusGroup (packages/bits-ui/src/lib/internal/
15
+ * roving-focus-group.ts), adapted to a plain Svelte action instead of a headless class.
16
+ */
17
+ export declare function rovingFocusGroup(node: HTMLElement, params: RovingFocusGroupParams): {
18
+ update(newParams: RovingFocusGroupParams): void;
19
+ destroy(): void;
20
+ };
@@ -0,0 +1,82 @@
1
+ const NEXT_KEYS = new Set(['ArrowDown', 'j']);
2
+ const PREV_KEYS = new Set(['ArrowUp', 'k']);
3
+ /**
4
+ * Roving-tabindex keyboard navigation for a group of sibling elements (e.g. table rows,
5
+ * list items): only one candidate is ever a Tab stop, and ArrowDown/ArrowUp (plus the
6
+ * j/k vim aliases) move focus — and the roving tab stop — between candidates. Tab and
7
+ * Shift+Tab keep working natively since they only ever see the single active tabindex=0
8
+ * candidate. Modeled on bits-ui's RovingFocusGroup (packages/bits-ui/src/lib/internal/
9
+ * roving-focus-group.ts), adapted to a plain Svelte action instead of a headless class.
10
+ */
11
+ export function rovingFocusGroup(node, params) {
12
+ let p = params;
13
+ function candidates() {
14
+ return Array.from(node.querySelectorAll(p.candidateSelector));
15
+ }
16
+ function setup() {
17
+ if (!p.enabled)
18
+ return;
19
+ const items = candidates();
20
+ if (!items.length)
21
+ return;
22
+ const active = items.includes(document.activeElement)
23
+ ? document.activeElement
24
+ : items[0];
25
+ for (const item of items) {
26
+ item.tabIndex = item === active ? 0 : -1;
27
+ }
28
+ }
29
+ function handleFocusIn(event) {
30
+ if (!p.enabled)
31
+ return;
32
+ const items = candidates();
33
+ const target = event.target;
34
+ if (!items.includes(target))
35
+ return;
36
+ for (const item of items) {
37
+ item.tabIndex = item === target ? 0 : -1;
38
+ }
39
+ }
40
+ function handleKeydown(event) {
41
+ if (!p.enabled)
42
+ return;
43
+ const target = event.target;
44
+ const items = candidates();
45
+ const index = items.indexOf(target);
46
+ if (index === -1)
47
+ return;
48
+ let nextIndex;
49
+ if (NEXT_KEYS.has(event.key))
50
+ nextIndex = index + 1;
51
+ else if (PREV_KEYS.has(event.key))
52
+ nextIndex = index - 1;
53
+ else if (event.key === 'Home')
54
+ nextIndex = 0;
55
+ else if (event.key === 'End')
56
+ nextIndex = items.length - 1;
57
+ if (nextIndex === undefined)
58
+ return;
59
+ if (nextIndex < 0)
60
+ nextIndex = p.loop ? items.length - 1 : 0;
61
+ else if (nextIndex >= items.length)
62
+ nextIndex = p.loop ? 0 : items.length - 1;
63
+ const nextItem = items[nextIndex];
64
+ if (!nextItem || nextItem === target)
65
+ return;
66
+ event.preventDefault();
67
+ nextItem.focus();
68
+ }
69
+ setup();
70
+ node.addEventListener('keydown', handleKeydown);
71
+ node.addEventListener('focusin', handleFocusIn);
72
+ return {
73
+ update(newParams) {
74
+ p = newParams;
75
+ setup();
76
+ },
77
+ destroy() {
78
+ node.removeEventListener('keydown', handleKeydown);
79
+ node.removeEventListener('focusin', handleFocusIn);
80
+ }
81
+ };
82
+ }
@@ -1,16 +1,16 @@
1
1
  export declare const badge: import("tailwind-variants").TVReturnType<{
2
2
  size: {
3
- sm: string;
4
- lg: string;
3
+ sm: "size-1.5 top-0 right-3";
4
+ lg: "h-3 min-w-3 p-1 -top-1 right-1";
5
5
  };
6
6
  }, undefined, "bg-md-sys-color-error text-md-sys-color-on-error absolute rounded-full md-sys-typescale-label-small inline-flex items-center justify-center", {
7
7
  size: {
8
- sm: string;
9
- lg: string;
8
+ sm: "size-1.5 top-0 right-3";
9
+ lg: "h-3 min-w-3 p-1 -top-1 right-1";
10
10
  };
11
- }, undefined, import("tailwind-variants").TVReturnType<{
11
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
12
12
  size: {
13
- sm: string;
14
- lg: string;
13
+ sm: "size-1.5 top-0 right-3";
14
+ lg: "h-3 min-w-3 p-1 -top-1 right-1";
15
15
  };
16
- }, undefined, "bg-md-sys-color-error text-md-sys-color-on-error absolute rounded-full md-sys-typescale-label-small inline-flex items-center justify-center", unknown, unknown, undefined>>;
16
+ }, undefined>>;
@@ -0,0 +1,83 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import Button from '../Button.svelte';
4
+ import ButtonIcon from '../ButtonIcon.svelte';
5
+ import ButtonGroup from './ButtonGroup.svelte';
6
+
7
+ const { Story } = defineMeta({
8
+ title: 'Buttons/Button Group',
9
+ component: ButtonGroup,
10
+ argTypes: {
11
+ orientation: {
12
+ control: 'select',
13
+ options: ['horizontal', 'vertical']
14
+ },
15
+ size: {
16
+ control: 'select',
17
+ options: ['xs', 'sm', 'md', 'lg', 'xl']
18
+ }
19
+ },
20
+ args: {
21
+ orientation: 'horizontal',
22
+ size: 'sm'
23
+ }
24
+ });
25
+ </script>
26
+
27
+ <Story name="Playground">
28
+ {#snippet template(args)}
29
+ <ButtonGroup orientation={args.orientation} size={args.size}>
30
+ <Button variant="tonal">Left</Button>
31
+ <Button variant="tonal">Center</Button>
32
+ <Button variant="tonal">Right</Button>
33
+ </ButtonGroup>
34
+ {/snippet}
35
+ </Story>
36
+
37
+ <Story name="Mixed Variants and Colors" asChild>
38
+ <div class="p-6">
39
+ <ButtonGroup size="sm">
40
+ <Button variant="outlined">Cancel</Button>
41
+ <Button variant="tonal" color="secondary">Save draft</Button>
42
+ <Button variant="filled" color="primary">Publish</Button>
43
+ </ButtonGroup>
44
+ </div>
45
+ </Story>
46
+
47
+ <Story name="Icon Toolbar" asChild>
48
+ <div class="flex flex-wrap gap-8 p-6">
49
+ <ButtonGroup size="sm">
50
+ <ButtonIcon variant="tonal" variation="toggle" iconProps={{ name: 'mic' }} />
51
+ <ButtonIcon variant="tonal" variation="toggle" iconProps={{ name: 'videocam' }} />
52
+ <ButtonIcon variant="tonal" iconProps={{ name: 'more_vert' }} />
53
+ <ButtonIcon variant="filled" color="error" iconProps={{ name: 'call_end' }} />
54
+ </ButtonGroup>
55
+ </div>
56
+ </Story>
57
+
58
+ <Story name="Sizes" asChild>
59
+ <div class="flex flex-wrap items-center gap-8 p-6">
60
+ <ButtonGroup size="xs">
61
+ <Button size="xs" variant="tonal">XS</Button>
62
+ <Button size="xs" variant="tonal">XS</Button>
63
+ </ButtonGroup>
64
+ <ButtonGroup size="md">
65
+ <Button size="md" variant="tonal">M</Button>
66
+ <Button size="md" variant="tonal">M</Button>
67
+ </ButtonGroup>
68
+ <ButtonGroup size="xl">
69
+ <Button size="xl" variant="tonal">XL</Button>
70
+ <Button size="xl" variant="tonal">XL</Button>
71
+ </ButtonGroup>
72
+ </div>
73
+ </Story>
74
+
75
+ <Story name="Vertical" asChild>
76
+ <div class="p-6">
77
+ <ButtonGroup orientation="vertical" size="sm">
78
+ <Button variant="tonal">Top</Button>
79
+ <Button variant="tonal">Middle</Button>
80
+ <Button variant="tonal">Bottom</Button>
81
+ </ButtonGroup>
82
+ </div>
83
+ </Story>
@@ -0,0 +1,19 @@
1
+ import ButtonGroup from './ButtonGroup.svelte';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const ButtonGroup: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type ButtonGroup = InstanceType<typeof ButtonGroup>;
19
+ export default ButtonGroup;
@@ -1,49 +1,30 @@
1
1
  <!--
2
2
  @component
3
- A group of connected buttons for filtering or mode selection.
3
+ A standard button group — an invisible container that adds spacing between
4
+ buttons and lets them mix variants, colors, and widths freely. Pressing a
5
+ button also nudges the width of its immediate neighbors, per the M3 spec.
4
6
 
5
- Replaces the deprecated ToggleGroup / segmented-buttons pattern.
7
+ Buttons keep their own identity here; this is a plain layout wrapper around
8
+ `Button` / `ButtonIcon` / `Toggle` children, not a selection primitive. For a
9
+ single/multi-select segmented control, use `ConnectedButtonGroup` instead.
6
10
 
7
11
  @see https://m3.material.io/components/button-groups/overview
8
12
  -->
9
13
  <script lang="ts">
10
- import { ToggleGroup } from 'bits-ui';
11
14
  import clsx from 'clsx';
12
- import { setContext } from 'svelte';
13
15
  import { buttonGroup } from './theme.js';
14
16
  import type { ButtonGroupProps } from './types.js';
15
17
 
16
18
  let {
17
- type,
18
- value = $bindable(undefined),
19
- onValueChange,
20
- disabled = false,
21
- loop = true,
22
19
  orientation = 'horizontal',
23
- shape = 'round',
24
20
  size = 'sm',
25
21
  children,
26
22
  class: className
27
23
  }: ButtonGroupProps = $props();
28
24
 
29
- const cls = $derived(buttonGroup({ orientation, shape, size }));
30
-
31
- const buttonGroupCtx = {
32
- get orientation() {
33
- return orientation;
34
- }
35
- };
36
- setContext('buttonGroup', buttonGroupCtx);
25
+ const cls = $derived(buttonGroup({ orientation, size }));
37
26
  </script>
38
27
 
39
- <ToggleGroup.Root
40
- {type}
41
- bind:value
42
- {onValueChange}
43
- {disabled}
44
- {loop}
45
- {orientation}
46
- class={cls.root({ class: clsx(className) })}
47
- >
48
- {@render children?.()}
49
- </ToggleGroup.Root>
28
+ <div class={cls.root({ class: clsx(className) })} data-size={size} data-orientation={orientation}>
29
+ {@render children()}
30
+ </div>
@@ -1,11 +1,15 @@
1
1
  import type { ButtonGroupProps } from './types.js';
2
2
  /**
3
- * A group of connected buttons for filtering or mode selection.
3
+ * A standard button group — an invisible container that adds spacing between
4
+ * buttons and lets them mix variants, colors, and widths freely. Pressing a
5
+ * button also nudges the width of its immediate neighbors, per the M3 spec.
4
6
  *
5
- * Replaces the deprecated ToggleGroup / segmented-buttons pattern.
7
+ * Buttons keep their own identity here; this is a plain layout wrapper around
8
+ * `Button` / `ButtonIcon` / `Toggle` children, not a selection primitive. For a
9
+ * single/multi-select segmented control, use `ConnectedButtonGroup` instead.
6
10
  *
7
11
  * @see https://m3.material.io/components/button-groups/overview
8
12
  */
9
- declare const ButtonGroup: import("svelte").Component<ButtonGroupProps, {}, "value">;
13
+ declare const ButtonGroup: import("svelte").Component<ButtonGroupProps, {}, "">;
10
14
  type ButtonGroup = ReturnType<typeof ButtonGroup>;
11
15
  export default ButtonGroup;
@@ -1,4 +1,3 @@
1
1
  export * from './theme.js';
2
2
  export * from './types.js';
3
3
  export { default as ButtonGroup } from './ButtonGroup.svelte';
4
- export { default as ButtonGroupItem } from './ButtonGroupItem.svelte';
@@ -1,4 +1,6 @@
1
+ // THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
2
+ // re-export TS/JS modules from this folder
1
3
  export * from './theme.js';
2
4
  export * from './types.js';
5
+ // default exports for components in this folder
3
6
  export { default as ButtonGroup } from './ButtonGroup.svelte';
4
- export { default as ButtonGroupItem } from './ButtonGroupItem.svelte';
@@ -1,6 +1,5 @@
1
1
  import { type VariantProps } from 'tailwind-variants';
2
2
  export type ButtonGroupVariants = VariantProps<typeof buttonGroup>;
3
- export type ButtonGroupItemVariants = VariantProps<typeof buttonGroupItem>;
4
3
  export declare const buttonGroup: import("tailwind-variants").TVReturnType<{
5
4
  orientation: {
6
5
  horizontal: {
@@ -10,27 +9,12 @@ export declare const buttonGroup: import("tailwind-variants").TVReturnType<{
10
9
  root: string;
11
10
  };
12
11
  };
13
- shape: {
14
- round: {
15
- root: string;
16
- };
17
- square: {
18
- root: string;
19
- };
20
- };
21
12
  size: {
22
- xs: {
23
- root: string;
24
- };
25
- sm: {
26
- root: string;
27
- };
28
- md: {
29
- root: string;
30
- };
31
- lg: {
32
- root: string;
33
- };
13
+ xs: {};
14
+ sm: {};
15
+ md: {};
16
+ lg: {};
17
+ xl: {};
34
18
  };
35
19
  }, {
36
20
  root: string;
@@ -43,31 +27,16 @@ export declare const buttonGroup: import("tailwind-variants").TVReturnType<{
43
27
  root: string;
44
28
  };
45
29
  };
46
- shape: {
47
- round: {
48
- root: string;
49
- };
50
- square: {
51
- root: string;
52
- };
53
- };
54
30
  size: {
55
- xs: {
56
- root: string;
57
- };
58
- sm: {
59
- root: string;
60
- };
61
- md: {
62
- root: string;
63
- };
64
- lg: {
65
- root: string;
66
- };
31
+ xs: {};
32
+ sm: {};
33
+ md: {};
34
+ lg: {};
35
+ xl: {};
67
36
  };
68
37
  }, {
69
38
  root: string;
70
- }, import("tailwind-variants").TVReturnType<{
39
+ }, import("tailwind-variants").TVReturnTypeLike<{
71
40
  orientation: {
72
41
  horizontal: {
73
42
  root: string;
@@ -76,68 +45,13 @@ export declare const buttonGroup: import("tailwind-variants").TVReturnType<{
76
45
  root: string;
77
46
  };
78
47
  };
79
- shape: {
80
- round: {
81
- root: string;
82
- };
83
- square: {
84
- root: string;
85
- };
86
- };
87
48
  size: {
88
- xs: {
89
- root: string;
90
- };
91
- sm: {
92
- root: string;
93
- };
94
- md: {
95
- root: string;
96
- };
97
- lg: {
98
- root: string;
99
- };
49
+ xs: {};
50
+ sm: {};
51
+ md: {};
52
+ lg: {};
53
+ xl: {};
100
54
  };
101
55
  }, {
102
56
  root: string;
103
- }, undefined, unknown, unknown, undefined>>;
104
- export declare const buttonGroupItem: import("tailwind-variants").TVReturnType<{
105
- orientation: {
106
- horizontal: {
107
- base: string;
108
- };
109
- vertical: {
110
- base: string;
111
- };
112
- };
113
- }, {
114
- base: string;
115
- checkIcon: string;
116
- icon: string;
117
- }, undefined, {
118
- orientation: {
119
- horizontal: {
120
- base: string;
121
- };
122
- vertical: {
123
- base: string;
124
- };
125
- };
126
- }, {
127
- base: string;
128
- checkIcon: string;
129
- icon: string;
130
- }, import("tailwind-variants").TVReturnType<{
131
- orientation: {
132
- horizontal: {
133
- base: string;
134
- };
135
- vertical: {
136
- base: string;
137
- };
138
- };
139
- }, {
140
- base: string;
141
- checkIcon: string;
142
- icon: string;
143
- }, undefined, unknown, unknown, undefined>>;
57
+ }>>;
@@ -1,51 +1,23 @@
1
1
  import { tv } from 'tailwind-variants';
2
2
  export const buttonGroup = tv({
3
3
  slots: {
4
- root: 'inline-flex overflow-hidden border border-md-sys-color-outline'
4
+ root: 'md-btn-group-standard'
5
5
  },
6
6
  variants: {
7
7
  orientation: {
8
8
  horizontal: { root: 'flex-row' },
9
- vertical: { root: 'flex-col h-auto w-auto' }
10
- },
11
- shape: {
12
- round: { root: 'rounded-full' },
13
- square: { root: 'rounded-lg' }
9
+ vertical: { root: 'flex-col' }
14
10
  },
15
11
  size: {
16
- xs: { root: 'h-8' },
17
- sm: { root: 'h-10' },
18
- md: { root: 'h-14' },
19
- lg: { root: 'h-24' }
12
+ xs: {},
13
+ sm: {},
14
+ md: {},
15
+ lg: {},
16
+ xl: {}
20
17
  }
21
18
  },
22
- compoundVariants: [
23
- {
24
- orientation: 'vertical',
25
- class: { root: 'h-auto w-auto rounded-2xl' }
26
- }
27
- ],
28
19
  defaultVariants: {
29
20
  orientation: 'horizontal',
30
- shape: 'round',
31
21
  size: 'sm'
32
22
  }
33
23
  });
34
- export const buttonGroupItem = tv({
35
- slots: {
36
- base: 'layer-container state-layer relative inline-flex min-w-12 flex-1 items-center justify-center gap-2 px-4 md-sys-typescale-label-large text-md-sys-color-on-surface outline-none transition-colors disabled:cursor-not-allowed disabled:opacity-38 data-[state=on]:bg-md-sys-color-secondary-container data-[state=on]:text-md-sys-color-on-secondary-container',
37
- checkIcon: 'size-[18px] text-[18px]',
38
- icon: 'size-[18px] text-[18px]'
39
- },
40
- variants: {
41
- orientation: {
42
- horizontal: {
43
- base: '[&:not(:last-child)]:border-r [&:not(:last-child)]:border-md-sys-color-outline'
44
- },
45
- vertical: {
46
- base: '[&:not(:last-child)]:border-b [&:not(:last-child)]:border-md-sys-color-outline'
47
- }
48
- }
49
- },
50
- defaultVariants: { orientation: 'horizontal' }
51
- });
@@ -1,25 +1,14 @@
1
- import type { IconProps } from '../../../utils/index.js';
2
1
  import type { Snippet } from 'svelte';
3
- import type { ButtonGroupItemVariants, ButtonGroupVariants } from './theme.js';
2
+ import type { ButtonGroupVariants } from './theme.js';
4
3
  export type ButtonGroupProps = ButtonGroupVariants & {
5
- /** Whether only one item can be active at a time, or multiple. */
6
- type: 'single' | 'multiple';
7
- /** Currently selected value(s). @bindable */
8
- value?: any;
9
- onValueChange?: (value: any) => void;
10
- disabled?: boolean;
11
- loop?: boolean;
4
+ /** Layout direction of the buttons. */
12
5
  orientation?: 'horizontal' | 'vertical';
13
- children?: Snippet;
14
- class?: string;
15
- };
16
- export type ButtonGroupItemProps = ButtonGroupItemVariants & {
17
- /** The value this item represents. */
18
- value: string;
19
- /** Text label displayed inside the button. */
20
- label?: string;
21
- /** Optional leading icon. Replaced by a check mark when selected. */
22
- iconProps?: IconProps;
23
- disabled?: boolean;
6
+ /**
7
+ * Drives the gap between buttons and the press-squeeze amount applied to a
8
+ * pressed button's immediate neighbors. Match the size of the buttons inside.
9
+ */
10
+ size?: ButtonGroupVariants['size'];
11
+ /** The buttons in the group — `Button`, `ButtonIcon`, or `Toggle` components, mixed freely. */
12
+ children: Snippet;
24
13
  class?: string;
25
14
  };