@noxlovette/material 0.5.1 → 0.6.1

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 (329) hide show
  1. package/bin/material-claude-skill.js +31 -0
  2. package/claude-skill/material-design/SKILL.md +68 -0
  3. package/claude-skill/material-design/references/accessibility-checklist.md +29 -0
  4. package/claude-skill/material-design/references/component-patterns.md +55 -0
  5. package/claude-skill/material-design/references/motion-guide.md +163 -0
  6. package/claude-skill/material-design/references/tokens-and-styles.md +68 -0
  7. package/dist/animation/Shapes.stories.svelte +10 -6
  8. package/dist/animation/TransitionPatterns.stories.svelte +30 -20
  9. package/dist/animation/containerTransform.d.ts +4 -2
  10. package/dist/animation/containerTransform.js +4 -2
  11. package/dist/animation/enterExit.js +5 -2
  12. package/dist/animation/skeleton.d.ts +1 -1
  13. package/dist/animation/skeleton.js +1 -1
  14. package/dist/components/badge/Badge.mdx +70 -0
  15. package/dist/components/badge/Badge.stories.svelte +38 -20
  16. package/dist/components/badge/Badge.svelte +12 -5
  17. package/dist/components/badge/theme.d.ts +30 -7
  18. package/dist/components/badge/theme.js +25 -5
  19. package/dist/components/badge/types.d.ts +18 -4
  20. package/dist/components/buttons/Button.mdx +85 -0
  21. package/dist/components/buttons/Button.stories.svelte +62 -27
  22. package/dist/components/buttons/Button.svelte +29 -25
  23. package/dist/components/buttons/Button.svelte.d.ts +11 -9
  24. package/dist/components/buttons/ButtonIcon.mdx +52 -0
  25. package/dist/components/buttons/ButtonIcon.stories.svelte +72 -48
  26. package/dist/components/buttons/ButtonIcon.svelte +58 -36
  27. package/dist/components/buttons/ButtonIcon.svelte.d.ts +9 -7
  28. package/dist/components/buttons/FAB.mdx +84 -0
  29. package/dist/components/buttons/FAB.stories.svelte +103 -24
  30. package/dist/components/buttons/FAB.stories.svelte.d.ts +2 -17
  31. package/dist/components/buttons/FAB.svelte +353 -29
  32. package/dist/components/buttons/FAB.svelte.d.ts +11 -6
  33. package/dist/components/buttons/FABMenu.svelte +27 -8
  34. package/dist/components/buttons/FABMenu.svelte.d.ts +7 -3
  35. package/dist/components/buttons/FABMenuItem.svelte +20 -16
  36. package/dist/components/buttons/FABMenuItem.svelte.d.ts +3 -3
  37. package/dist/components/buttons/Toggle.stories.svelte +31 -23
  38. package/dist/components/buttons/Toggle.stories.svelte.d.ts +2 -17
  39. package/dist/components/buttons/Toggle.svelte +28 -25
  40. package/dist/components/buttons/Toggle.svelte.d.ts +5 -5
  41. package/dist/components/buttons/button-group/ButtonGroup.mdx +39 -0
  42. package/dist/components/buttons/button-group/ButtonGroup.stories.svelte +62 -43
  43. package/dist/components/buttons/button-group/ButtonGroup.stories.svelte.d.ts +2 -17
  44. package/dist/components/buttons/button-group/ButtonGroup.svelte +102 -8
  45. package/dist/components/buttons/button-group/ButtonGroup.svelte.d.ts +6 -7
  46. package/dist/components/buttons/button-group/theme.d.ts +46 -16
  47. package/dist/components/buttons/button-group/theme.js +14 -9
  48. package/dist/components/buttons/button-group/types.d.ts +13 -7
  49. package/dist/components/buttons/connected/ConnectedButtonGroup.mdx +43 -0
  50. package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte +56 -74
  51. package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte.d.ts +2 -17
  52. package/dist/components/buttons/connected/ConnectedButtonGroup.svelte +16 -4
  53. package/dist/components/buttons/connected/ConnectedButtonGroup.svelte.d.ts +4 -4
  54. package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte +35 -8
  55. package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte.d.ts +2 -3
  56. package/dist/components/buttons/connected/theme.d.ts +34 -19
  57. package/dist/components/buttons/connected/theme.js +33 -10
  58. package/dist/components/buttons/connected/types.d.ts +36 -9
  59. package/dist/components/buttons/shapeMorph.d.ts +26 -0
  60. package/dist/components/buttons/shapeMorph.js +142 -0
  61. package/dist/components/buttons/split-button/SplitButton.mdx +48 -0
  62. package/dist/components/buttons/split-button/SplitButton.stories.svelte +9 -14
  63. package/dist/components/buttons/split-button/SplitButton.svelte +66 -49
  64. package/dist/components/buttons/split-button/SplitButton.svelte.d.ts +6 -11
  65. package/dist/components/buttons/split-button/theme.d.ts +111 -18
  66. package/dist/components/buttons/split-button/theme.js +75 -17
  67. package/dist/components/buttons/split-button/types.d.ts +24 -18
  68. package/dist/components/buttons/theme.d.ts +423 -231
  69. package/dist/components/buttons/theme.js +287 -381
  70. package/dist/components/buttons/types.d.ts +130 -125
  71. package/dist/components/cards/Card.mdx +44 -0
  72. package/dist/components/cards/Card.stories.svelte +11 -11
  73. package/dist/components/cards/theme.js +6 -6
  74. package/dist/components/chips/Chip.mdx +68 -0
  75. package/dist/components/chips/Chip.stories.svelte +4 -4
  76. package/dist/components/chips/theme.d.ts +1 -1
  77. package/dist/components/chips/theme.js +4 -4
  78. package/dist/components/containers/action-rail/ActionRail.stories.svelte +1 -0
  79. package/dist/components/containers/action-rail/theme.d.ts +1 -1
  80. package/dist/components/containers/action-rail/theme.js +2 -2
  81. package/dist/components/containers/app/theme.d.ts +1 -1
  82. package/dist/components/containers/app/theme.js +1 -1
  83. package/dist/components/containers/bottom-sheet/BottomSheet.mdx +64 -0
  84. package/dist/components/containers/bottom-sheet/BottomSheet.stories.svelte +108 -12
  85. package/dist/components/containers/bottom-sheet/BottomSheet.svelte +179 -109
  86. package/dist/components/containers/bottom-sheet/BottomSheet.svelte.d.ts +10 -5
  87. package/dist/components/containers/bottom-sheet/index.d.ts +1 -0
  88. package/dist/components/containers/bottom-sheet/index.js +1 -0
  89. package/dist/components/containers/bottom-sheet/theme.d.ts +45 -0
  90. package/dist/components/containers/bottom-sheet/theme.js +42 -0
  91. package/dist/components/containers/bottom-sheet/types.d.ts +37 -5
  92. package/dist/components/containers/carousel/Carousel.mdx +80 -0
  93. package/dist/components/containers/carousel/Carousel.stories.svelte +131 -0
  94. package/dist/components/containers/carousel/Carousel.stories.svelte.d.ts +4 -0
  95. package/dist/components/containers/carousel/Carousel.svelte +194 -0
  96. package/dist/components/containers/carousel/Carousel.svelte.d.ts +25 -0
  97. package/dist/components/containers/carousel/index.d.ts +3 -0
  98. package/dist/components/containers/{stack → carousel}/index.js +1 -2
  99. package/dist/components/containers/carousel/keylines.d.ts +32 -0
  100. package/dist/components/containers/carousel/keylines.js +88 -0
  101. package/dist/components/containers/carousel/theme.d.ts +162 -0
  102. package/dist/components/containers/carousel/theme.js +67 -0
  103. package/dist/components/containers/carousel/types.d.ts +52 -0
  104. package/dist/components/containers/context-menu/ContextMenu.stories.svelte +1 -0
  105. package/dist/components/containers/context-menu/ContextMenu.svelte +2 -2
  106. package/dist/components/containers/context-menu/ContextMenu.svelte.d.ts +1 -1
  107. package/dist/components/containers/context-menu/theme.d.ts +1 -1
  108. package/dist/components/containers/context-menu/theme.js +11 -11
  109. package/dist/components/containers/dialogue/Dialogue.mdx +65 -0
  110. package/dist/components/containers/dialogue/Dialogue.stories.svelte +4 -4
  111. package/dist/components/containers/dialogue/Dialogue.svelte +2 -2
  112. package/dist/components/containers/dialogue/theme.d.ts +1 -1
  113. package/dist/components/containers/dialogue/theme.js +4 -4
  114. package/dist/components/containers/dialogue/types.d.ts +1 -1
  115. package/dist/components/containers/divider/Divider.stories.svelte +2 -1
  116. package/dist/components/containers/divider/Divider.svelte +2 -2
  117. package/dist/components/containers/divider/theme.d.ts +7 -7
  118. package/dist/components/containers/divider/theme.js +3 -3
  119. package/dist/components/containers/index.d.ts +1 -1
  120. package/dist/components/containers/index.js +1 -1
  121. package/dist/components/containers/link-preview/theme.d.ts +1 -1
  122. package/dist/components/containers/link-preview/theme.js +3 -3
  123. package/dist/components/containers/list/List.svelte +18 -0
  124. package/dist/components/containers/list/List.svelte.d.ts +4 -0
  125. package/dist/components/containers/list/ListItem.mdx +100 -0
  126. package/dist/components/containers/list/ListItem.stories.svelte +177 -42
  127. package/dist/components/containers/list/ListItem.stories.svelte.d.ts +2 -17
  128. package/dist/components/containers/list/ListItem.svelte +92 -37
  129. package/dist/components/containers/list/ListItem.svelte.d.ts +1 -1
  130. package/dist/components/containers/list/context.d.ts +6 -0
  131. package/dist/components/containers/list/context.js +4 -0
  132. package/dist/components/containers/list/index.d.ts +1 -0
  133. package/dist/components/containers/list/index.js +1 -0
  134. package/dist/components/containers/list/theme.d.ts +487 -12
  135. package/dist/components/containers/list/theme.js +141 -14
  136. package/dist/components/containers/list/types.d.ts +39 -5
  137. package/dist/components/containers/menu/Menu.mdx +52 -0
  138. package/dist/components/containers/menu/Menu.stories.svelte +14 -14
  139. package/dist/components/containers/menu/Menu.svelte +2 -2
  140. package/dist/components/containers/menu/MenuGroup.svelte +1 -1
  141. package/dist/components/containers/menu/MenuGroup.svelte.d.ts +1 -1
  142. package/dist/components/containers/menu/MenuSub.svelte +1 -1
  143. package/dist/components/containers/menu/menu-item/MenuItem.svelte +1 -1
  144. package/dist/components/containers/menu/theme.d.ts +1 -1
  145. package/dist/components/containers/menu/theme.js +9 -9
  146. package/dist/components/containers/pane/DraggablePane.stories.svelte +4 -3
  147. package/dist/components/containers/pane/DraggablePane.svelte +2 -2
  148. package/dist/components/containers/pane/Pane.stories.svelte +11 -10
  149. package/dist/components/containers/pane/Pane.svelte +24 -2
  150. package/dist/components/containers/pane/PaneGrid.stories.svelte +19 -18
  151. package/dist/components/containers/pane/PaneGrid.svelte +3 -2
  152. package/dist/components/containers/pane/PaneGrid.svelte.d.ts +2 -1
  153. package/dist/components/containers/pane/PaneHandle.svelte +48 -2
  154. package/dist/components/containers/pane/PaneHandle.svelte.d.ts +4 -0
  155. package/dist/components/containers/pane/resizeStore.svelte.d.ts +10 -1
  156. package/dist/components/containers/pane/resizeStore.svelte.js +13 -2
  157. package/dist/components/containers/pane/theme.d.ts +1 -1
  158. package/dist/components/containers/pane/theme.js +131 -47
  159. package/dist/components/containers/pane/types.d.ts +3 -2
  160. package/dist/components/containers/popover/Popover.mdx +45 -0
  161. package/dist/components/containers/popover/Popover.stories.svelte +1 -1
  162. package/dist/components/containers/popover/Popover.svelte +1 -1
  163. package/dist/components/containers/popover/theme.d.ts +1 -1
  164. package/dist/components/containers/popover/theme.js +4 -4
  165. package/dist/components/containers/scroll-area/theme.js +3 -3
  166. package/dist/components/containers/side-sheet/SideSheet.mdx +71 -0
  167. package/dist/components/containers/side-sheet/SideSheet.stories.svelte +113 -17
  168. package/dist/components/containers/side-sheet/SideSheet.svelte +113 -66
  169. package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +8 -7
  170. package/dist/components/containers/side-sheet/index.d.ts +1 -0
  171. package/dist/components/containers/side-sheet/index.js +1 -0
  172. package/dist/components/containers/side-sheet/theme.d.ts +108 -0
  173. package/dist/components/containers/side-sheet/theme.js +72 -0
  174. package/dist/components/containers/side-sheet/types.d.ts +35 -7
  175. package/dist/components/date/DateField.stories.svelte +4 -3
  176. package/dist/components/date/DateField.svelte +11 -2
  177. package/dist/components/date/DateRangeField.stories.svelte +4 -3
  178. package/dist/components/date/DateRangeField.svelte +12 -3
  179. package/dist/components/date/theme.d.ts +8 -8
  180. package/dist/components/date/theme.js +32 -32
  181. package/dist/components/forms/checkbox/Checkbox.mdx +35 -0
  182. package/dist/components/forms/checkbox/Checkbox.stories.svelte +2 -2
  183. package/dist/components/forms/checkbox/Checkbox.svelte +1 -1
  184. package/dist/components/forms/checkbox/theme.d.ts +1 -1
  185. package/dist/components/forms/checkbox/theme.js +4 -4
  186. package/dist/components/forms/command/Command.stories.svelte +1 -0
  187. package/dist/components/forms/command/theme.d.ts +1 -1
  188. package/dist/components/forms/command/theme.js +10 -10
  189. package/dist/components/forms/pin/theme.d.ts +1 -1
  190. package/dist/components/forms/pin/theme.js +5 -5
  191. package/dist/components/forms/radio-group/RadioGroup.svelte +1 -1
  192. package/dist/components/forms/radio-group/theme.d.ts +1 -1
  193. package/dist/components/forms/radio-group/theme.js +6 -6
  194. package/dist/components/forms/search/Search.mdx +38 -0
  195. package/dist/components/forms/search/Search.stories.svelte +19 -9
  196. package/dist/components/forms/search/Search.svelte +40 -17
  197. package/dist/components/forms/search/Search.svelte.d.ts +2 -2
  198. package/dist/components/forms/search/theme.d.ts +46 -13
  199. package/dist/components/forms/search/theme.js +14 -9
  200. package/dist/components/forms/search/types.d.ts +18 -12
  201. package/dist/components/forms/select/Select.mdx +53 -0
  202. package/dist/components/forms/select/Select.stories.svelte +4 -4
  203. package/dist/components/forms/select/Select.svelte +12 -4
  204. package/dist/components/forms/select/SelectItem.svelte +1 -1
  205. package/dist/components/forms/select/theme.d.ts +1 -1
  206. package/dist/components/forms/select/theme.js +14 -14
  207. package/dist/components/forms/slider/Slider.mdx +85 -0
  208. package/dist/components/forms/slider/Slider.stories.svelte +7 -7
  209. package/dist/components/forms/slider/Slider.svelte +46 -28
  210. package/dist/components/forms/slider/theme.d.ts +15 -1
  211. package/dist/components/forms/slider/theme.js +29 -18
  212. package/dist/components/forms/slider/types.d.ts +3 -2
  213. package/dist/components/forms/switch/Switch.mdx +38 -0
  214. package/dist/components/forms/switch/Switch.stories.svelte +3 -3
  215. package/dist/components/forms/switch/theme.d.ts +1 -1
  216. package/dist/components/forms/switch/theme.js +7 -7
  217. package/dist/components/forms/textfield/Textfield.mdx +53 -0
  218. package/dist/components/forms/textfield/Textfield.stories.svelte +6 -6
  219. package/dist/components/forms/textfield/Textfield.svelte +1 -0
  220. package/dist/components/forms/textfield/theme.d.ts +1 -1
  221. package/dist/components/forms/textfield/theme.js +20 -20
  222. package/dist/components/forms/toggle-group/theme.d.ts +1 -1
  223. package/dist/components/forms/toggle-group/theme.js +3 -3
  224. package/dist/components/forms/tooltip/Tooltip.stories.svelte +1 -0
  225. package/dist/components/forms/tooltip/theme.d.ts +1 -1
  226. package/dist/components/forms/tooltip/theme.js +4 -4
  227. package/dist/components/misc/Avatar.stories.svelte +5 -4
  228. package/dist/components/misc/ThemeSettings.svelte +9 -9
  229. package/dist/components/misc/ThemeSwitcher.svelte +3 -3
  230. package/dist/components/misc/theme.js +5 -5
  231. package/dist/components/nav/appbar/AppBar.mdx +71 -0
  232. package/dist/components/nav/appbar/AppBar.stories.svelte +93 -3
  233. package/dist/components/nav/appbar/AppBar.stories.svelte.d.ts +2 -17
  234. package/dist/components/nav/appbar/AppBar.svelte +90 -37
  235. package/dist/components/nav/appbar/AppBar.svelte.d.ts +9 -2
  236. package/dist/components/nav/appbar/theme.d.ts +86 -19
  237. package/dist/components/nav/appbar/theme.js +160 -24
  238. package/dist/components/nav/appbar/types.d.ts +46 -9
  239. package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte +1 -0
  240. package/dist/components/nav/breadcrumb/theme.d.ts +1 -1
  241. package/dist/components/nav/breadcrumb/theme.js +6 -6
  242. package/dist/components/nav/navbar/Navbar.mdx +38 -0
  243. package/dist/components/nav/navbar/Navbar.svelte +1 -1
  244. package/dist/components/nav/navbar/NavbarItem.svelte +12 -9
  245. package/dist/components/nav/navbar/theme.d.ts +3 -3
  246. package/dist/components/nav/navbar/theme.js +7 -7
  247. package/dist/components/nav/rail/Rail.mdx +73 -0
  248. package/dist/components/nav/rail/Rail.stories.svelte +3 -7
  249. package/dist/components/nav/rail/Rail.svelte +5 -2
  250. package/dist/components/nav/rail/RailItem.svelte +12 -9
  251. package/dist/components/nav/rail/theme.d.ts +1 -1
  252. package/dist/components/nav/rail/theme.js +14 -14
  253. package/dist/components/nav/rail/types.d.ts +8 -1
  254. package/dist/components/nav/tabs/Tabs.mdx +62 -0
  255. package/dist/components/nav/tabs/Tabs.stories.svelte +1 -1
  256. package/dist/components/nav/tabs/theme.d.ts +1 -1
  257. package/dist/components/nav/tabs/theme.js +5 -5
  258. package/dist/components/pill/Pill.mdx +32 -0
  259. package/dist/components/pill/Pill.stories.svelte +1 -1
  260. package/dist/components/pill/theme.d.ts +2 -2
  261. package/dist/components/pill/theme.js +2 -2
  262. package/dist/components/progress/LinearProgress.svelte +2 -2
  263. package/dist/components/progress/Progress.mdx +50 -0
  264. package/dist/components/progress/Progress.stories.svelte +6 -6
  265. package/dist/components/snackbar/Snackbar.mdx +52 -0
  266. package/dist/components/snackbar/Snackbar.stories.svelte +5 -5
  267. package/dist/components/snackbar/Snackbar.svelte +1 -1
  268. package/dist/components/snackbar/theme.d.ts +4 -4
  269. package/dist/components/snackbar/theme.js +5 -5
  270. package/dist/components/table/Table.stories.svelte +1 -0
  271. package/dist/components/table/TableHeader.svelte +1 -1
  272. package/dist/components/table/theme.d.ts +1 -1
  273. package/dist/components/table/theme.js +4 -4
  274. package/dist/components/time/TimeField.stories.svelte +3 -2
  275. package/dist/components/time/TimeField.svelte +2 -2
  276. package/dist/components/time/TimepickerInput.svelte +1 -1
  277. package/dist/components/time/theme.d.ts +1 -1
  278. package/dist/components/time/theme.js +6 -6
  279. package/dist/components/toolbar/Toolbar.stories.svelte +1 -0
  280. package/dist/components/toolbar/Toolbar.svelte +1 -1
  281. package/dist/components/toolbar/Toolbar.svelte.d.ts +1 -1
  282. package/dist/components/toolbar/theme.d.ts +1 -1
  283. package/dist/components/toolbar/theme.js +15 -15
  284. package/dist/components/typography/Typography.mdx +67 -0
  285. package/dist/components/typography/body/Body.stories.svelte +2 -1
  286. package/dist/components/typography/body/theme.d.ts +16 -13
  287. package/dist/components/typography/body/theme.js +20 -5
  288. package/dist/components/typography/body/types.d.ts +2 -1
  289. package/dist/components/typography/display/Display.stories.svelte +2 -1
  290. package/dist/components/typography/display/theme.d.ts +16 -13
  291. package/dist/components/typography/display/theme.js +20 -5
  292. package/dist/components/typography/display/types.d.ts +2 -1
  293. package/dist/components/typography/headline/Headline.stories.svelte +2 -1
  294. package/dist/components/typography/headline/theme.d.ts +16 -13
  295. package/dist/components/typography/headline/theme.js +20 -5
  296. package/dist/components/typography/headline/types.d.ts +2 -1
  297. package/dist/components/typography/kbd/Kbd.stories.svelte +2 -1
  298. package/dist/components/typography/kbd/theme.d.ts +5 -5
  299. package/dist/components/typography/kbd/theme.js +3 -3
  300. package/dist/components/typography/label/Label.stories.svelte +2 -1
  301. package/dist/components/typography/label/theme.d.ts +15 -12
  302. package/dist/components/typography/label/theme.js +20 -5
  303. package/dist/components/typography/label/types.d.ts +2 -1
  304. package/dist/components/typography/title/Title.stories.svelte +2 -1
  305. package/dist/components/typography/title/theme.d.ts +16 -13
  306. package/dist/components/typography/title/theme.js +20 -5
  307. package/dist/components/typography/title/types.d.ts +2 -1
  308. package/dist/index.css +2 -0
  309. package/dist/styles/component.css +78 -175
  310. package/dist/styles/elevation.css +9 -0
  311. package/dist/styles/layers.css +33 -0
  312. package/dist/styles/spacing.css +29 -0
  313. package/dist/styles/typescale.css +635 -20
  314. package/dist/utils/Layer.svelte +1 -1
  315. package/dist/utils/icon/Icon.svelte +8 -6
  316. package/dist/utils/icon/theme.d.ts +1 -1
  317. package/dist/utils/icon/theme.js +1 -1
  318. package/dist/utils/tv.d.ts +6 -0
  319. package/dist/utils/tv.js +12 -0
  320. package/package.json +19 -15
  321. package/dist/components/containers/stack/HStack.svelte +0 -23
  322. package/dist/components/containers/stack/HStack.svelte.d.ts +0 -5
  323. package/dist/components/containers/stack/VStack.svelte +0 -23
  324. package/dist/components/containers/stack/VStack.svelte.d.ts +0 -5
  325. package/dist/components/containers/stack/index.d.ts +0 -4
  326. package/dist/components/containers/stack/theme.d.ts +0 -66
  327. package/dist/components/containers/stack/theme.js +0 -26
  328. package/dist/components/containers/stack/types.d.ts +0 -12
  329. /package/dist/components/containers/{stack → carousel}/types.js +0 -0
@@ -1,33 +1,60 @@
1
1
  import type { IconProps } from '../../../utils/index.js';
2
2
  import type { Snippet } from 'svelte';
3
+ import type { ButtonSize } from '../theme.js';
3
4
  import type { ConnectedButtonGroupVariants } from './theme.js';
5
+ export type ConnectedButtonGroupVariant = 'elevated' | 'filled' | 'tonal' | 'outlined';
4
6
  export type ConnectedButtonGroupCtx = {
5
- size: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
7
+ size: ButtonSize;
6
8
  shape: 'round' | 'square';
9
+ variant: ConnectedButtonGroupVariant;
10
+ type: 'single' | 'multiple';
11
+ value: any;
7
12
  };
8
13
  export type ConnectedButtonGroupProps = ConnectedButtonGroupVariants & {
9
- /** Whether only one item can be active at a time, or multiple. */
14
+ /** One selected item at a time, or several. */
10
15
  type: 'single' | 'multiple';
11
- /** Currently selected value(s). @bindable */
16
+ /** The selected value (`single`) or values (`multiple`). Bindable. */
12
17
  value?: any;
18
+ /** Called when the selection changes. */
13
19
  onValueChange?: (value: any) => void;
20
+ /** Disables every item. */
14
21
  disabled?: boolean;
22
+ /** Whether arrow keys wrap from the last item to the first. @default true */
15
23
  loop?: boolean;
24
+ /** @default 'horizontal' */
16
25
  orientation?: 'horizontal' | 'vertical';
17
- /** Outer corner shape of the group. A selected/pressed item collapses to its inner corner size regardless. */
26
+ /**
27
+ * Toggle button colour style of the items: unselected and selected colours as for `Toggle`.
28
+ * @default 'filled'
29
+ */
30
+ variant?: ConnectedButtonGroupVariant;
31
+ /**
32
+ * Outer corners: fully round, or square (the inner corner size). Inner corners are the same
33
+ * for both.
34
+ * @default 'round'
35
+ */
18
36
  shape?: ConnectedButtonGroupCtx['shape'];
19
- /** Drives the group's height and inner corner size. Match the size of the buttons this replaces. */
20
- size?: ConnectedButtonGroupCtx['size'];
37
+ /**
38
+ * Height, padding and type of the items, as for `Button`: 32, 40, 56, 96 or 136dp.
39
+ * @default 'sm'
40
+ */
41
+ size?: ButtonSize;
42
+ /** `ConnectedButtonGroupItem`s. */
21
43
  children?: Snippet;
44
+ /** Accessible name of the group. */
45
+ 'aria-label'?: string;
22
46
  class?: string;
23
47
  };
24
48
  export type ConnectedButtonGroupItemProps = {
25
- /** The value this item represents. */
49
+ /** The value this item selects. */
26
50
  value: string;
27
- /** Text label displayed inside the item. */
51
+ /** The label. */
28
52
  label?: string;
29
- /** Optional icon. Stays visible when selected — selection is shown via shape and color, not an icon swap. */
53
+ /** A leading icon. It fills while the item is selected. */
30
54
  iconProps?: IconProps;
55
+ /** Accessible name, for an item with only an icon. */
56
+ 'aria-label'?: string;
57
+ /** Disables the item. */
31
58
  disabled?: boolean;
32
59
  class?: string;
33
60
  };
@@ -0,0 +1,26 @@
1
+ export type ButtonState = {
2
+ pressed: boolean;
3
+ /** A mouse or pen over the button (never touch, where hover sticks after a tap). */
4
+ hovered: boolean;
5
+ focusVisible: boolean;
6
+ };
7
+ /** Corner radii in px, in logical order: start-start, start-end, end-end, end-start. */
8
+ export type Corners = [number, number, number, number];
9
+ type CornerResolver = (el: HTMLElement, state: ButtonState, px: (prop: string) => number) => Corners;
10
+ /** Springs `el`'s four corners to whatever `corners` resolves for its current state. */
11
+ export declare function shapeMorph(el: HTMLElement, corners: CornerResolver): () => void;
12
+ /** Button, Toggle, ButtonIcon: --btn-shape at rest, --btn-pressed while pressed. */
13
+ export declare const buttonCorners: CornerResolver;
14
+ /**
15
+ * Split button halves. Outer corners stay round; inner corners are --split-inner at rest,
16
+ * --split-active while hovered, focused or pressed, and fully round on the trailing button while
17
+ * its menu is open.
18
+ */
19
+ export declare const splitCorners: (side: "leading" | "trailing") => CornerResolver;
20
+ /**
21
+ * Connected button group items. Inner corners (facing a neighbour) are --cbg-inner, then
22
+ * --cbg-pressed while pressed and fully round while selected; outer corners (the group's ends)
23
+ * are --cbg-outer.
24
+ */
25
+ export declare const connectedCorners: CornerResolver;
26
+ export {};
@@ -0,0 +1,142 @@
1
+ import { springTokens, springTransition } from '../../animation/spring.js';
2
+ import { animate, motionValue } from 'motion';
3
+ const CORNER_PROPS = [
4
+ 'borderStartStartRadius',
5
+ 'borderStartEndRadius',
6
+ 'borderEndEndRadius',
7
+ 'borderEndStartRadius'
8
+ ];
9
+ /** A length custom property in px. Handles the px, rem and em values the button classes use. */
10
+ const lengthVar = (el, style, prop) => {
11
+ const value = style.getPropertyValue(prop).trim();
12
+ const n = parseFloat(value);
13
+ if (Number.isNaN(n))
14
+ return 0;
15
+ if (value.endsWith('rem'))
16
+ return n * parseFloat(getComputedStyle(document.documentElement).fontSize);
17
+ if (value.endsWith('em'))
18
+ return n * parseFloat(style.fontSize);
19
+ if (value.endsWith('%'))
20
+ return (n / 100) * Math.min(el.offsetWidth, el.offsetHeight);
21
+ return n;
22
+ };
23
+ const isDisabled = (el) => el.matches(':disabled, [aria-disabled="true"], [data-disabled]');
24
+ /** Springs `el`'s four corners to whatever `corners` resolves for its current state. */
25
+ export function shapeMorph(el, corners) {
26
+ const reduced = matchMedia('(prefers-reduced-motion: reduce)');
27
+ const spring = springTransition(springTokens.fastSpatial);
28
+ const state = { pressed: false, hovered: false, focusVisible: false };
29
+ const resolve = () => {
30
+ const style = getComputedStyle(el);
31
+ return corners(el, state, (prop) => lengthVar(el, style, prop));
32
+ };
33
+ const initial = resolve();
34
+ const values = initial.map((r) => motionValue(r));
35
+ const controls = [];
36
+ const unsubscribe = values.map((v, i) => v.on('change', (r) => (el.style[CORNER_PROPS[i]] = `${r}px`)));
37
+ values.forEach((v, i) => (el.style[CORNER_PROPS[i]] = `${v.get()}px`));
38
+ // Each spring restarts only when its target changes; a retarget mid-flight inherits velocity.
39
+ const targets = [...initial];
40
+ const retarget = () => {
41
+ resolve().forEach((to, i) => {
42
+ if (to === targets[i])
43
+ return;
44
+ targets[i] = to;
45
+ controls[i]?.stop();
46
+ if (reduced.matches)
47
+ values[i].jump(to);
48
+ else
49
+ controls[i] = animate(values[i], to, spring);
50
+ });
51
+ };
52
+ const set = (key, on) => {
53
+ if (state[key] === on)
54
+ return;
55
+ state[key] = on;
56
+ retarget();
57
+ };
58
+ const onPointerDown = (e) => {
59
+ if (e.button === 0 && !isDisabled(el))
60
+ set('pressed', true);
61
+ };
62
+ const onKeyDown = (e) => {
63
+ if (!e.repeat && (e.key === ' ' || e.key === 'Enter') && !isDisabled(el))
64
+ set('pressed', true);
65
+ };
66
+ const release = () => set('pressed', false);
67
+ const onEnter = (e) => {
68
+ if (e.pointerType !== 'touch')
69
+ set('hovered', true);
70
+ };
71
+ const onLeave = () => set('hovered', false);
72
+ const onFocus = () => set('focusVisible', el.matches(':focus-visible'));
73
+ const onBlur = () => {
74
+ state.pressed = false;
75
+ set('focusVisible', false);
76
+ };
77
+ // Selection, open state, size and shape arrive as attribute changes. Not `style`: the springs
78
+ // write the corners there every frame.
79
+ const observer = new MutationObserver(retarget);
80
+ observer.observe(el, {
81
+ attributes: true,
82
+ attributeFilter: ['class', 'data-state', 'aria-pressed', 'aria-expanded']
83
+ });
84
+ el.addEventListener('pointerdown', onPointerDown);
85
+ el.addEventListener('pointerenter', onEnter);
86
+ el.addEventListener('pointerleave', onLeave);
87
+ el.addEventListener('keydown', onKeyDown);
88
+ el.addEventListener('keyup', release);
89
+ el.addEventListener('focus', onFocus);
90
+ el.addEventListener('blur', onBlur);
91
+ window.addEventListener('pointerup', release);
92
+ window.addEventListener('pointercancel', release);
93
+ return () => {
94
+ observer.disconnect();
95
+ controls.forEach((c) => c?.stop());
96
+ unsubscribe.forEach((u) => u());
97
+ el.removeEventListener('pointerdown', onPointerDown);
98
+ el.removeEventListener('pointerenter', onEnter);
99
+ el.removeEventListener('pointerleave', onLeave);
100
+ el.removeEventListener('keydown', onKeyDown);
101
+ el.removeEventListener('keyup', release);
102
+ el.removeEventListener('focus', onFocus);
103
+ el.removeEventListener('blur', onBlur);
104
+ window.removeEventListener('pointerup', release);
105
+ window.removeEventListener('pointercancel', release);
106
+ };
107
+ }
108
+ const all = (r) => [r, r, r, r];
109
+ /** Button, Toggle, ButtonIcon: --btn-shape at rest, --btn-pressed while pressed. */
110
+ export const buttonCorners = (_el, { pressed }, px) => all(pressed ? px('--btn-pressed') || px('--btn-shape') : px('--btn-shape'));
111
+ /**
112
+ * Split button halves. Outer corners stay round; inner corners are --split-inner at rest,
113
+ * --split-active while hovered, focused or pressed, and fully round on the trailing button while
114
+ * its menu is open.
115
+ */
116
+ export const splitCorners = (side) => (el, { pressed, hovered, focusVisible }, px) => {
117
+ const outer = px('--btn-round');
118
+ const open = side === 'trailing' && el.dataset.state === 'open';
119
+ const active = (pressed || hovered || focusVisible) && !isDisabled(el);
120
+ const inner = open ? outer : active ? px('--split-active') : px('--split-inner');
121
+ return side === 'leading' ? [outer, inner, inner, outer] : [inner, outer, outer, inner];
122
+ };
123
+ /**
124
+ * Connected button group items. Inner corners (facing a neighbour) are --cbg-inner, then
125
+ * --cbg-pressed while pressed and fully round while selected; outer corners (the group's ends)
126
+ * are --cbg-outer.
127
+ */
128
+ export const connectedCorners = (el, { pressed }, px) => {
129
+ const selected = el.dataset.state === 'on';
130
+ const inner = pressed && !isDisabled(el)
131
+ ? px('--cbg-pressed')
132
+ : selected
133
+ ? px('--btn-round')
134
+ : px('--cbg-inner');
135
+ const outer = px('--cbg-outer');
136
+ const first = el.parentElement?.firstElementChild === el;
137
+ const last = el.parentElement?.lastElementChild === el;
138
+ const s = first ? outer : inner;
139
+ const e = last ? outer : inner;
140
+ // Horizontal: the start corners face the previous item. Vertical: the top corners do.
141
+ return el.dataset.orientation === 'vertical' ? [s, s, e, e] : [s, e, e, s];
142
+ };
@@ -0,0 +1,48 @@
1
+ import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
+ import * as SplitStories from './SplitButton.stories.svelte';
3
+
4
+ <Meta of={SplitStories} />
5
+
6
+ <Title />
7
+
8
+ <Subtitle>Split buttons open a menu of options related to their main action.</Subtitle>
9
+
10
+ [M3 spec](https://m3.material.io/components/split-button/specs) ·
11
+ `import { SplitButton } from '@noxlovette/material';`
12
+
13
+ <Canvas of={SplitStories.Playground} />
14
+
15
+ <Controls of={SplitStories.Playground} />
16
+
17
+ ## Anatomy
18
+
19
+ - **Leading button:** the main action, with a label, an icon, or both. An icon-only leading
20
+ button needs an `aria-label`.
21
+ - **Trailing button:** always a menu icon. It opens the menu (`menuLabel` names it) and flips the
22
+ icon while open.
23
+
24
+ The two share one colour style (elevated, filled, tonal or outlined; there is no text split
25
+ button), and opening the menu doesn't change their colours.
26
+
27
+ <Canvas of={SplitStories.WithLeadingIcon} />
28
+
29
+ ## Shape and size
30
+
31
+ The buttons sit 2dp apart. Their outer corners are fully round; the inner corners are small at
32
+ rest and round out while hovered, focused or pressed. While the menu is open, the trailing
33
+ button becomes fully round and centres its icon, which sits slightly toward the leading button
34
+ otherwise.
35
+
36
+ | `size` | Height | Inner corner | Hovered/pressed | Trailing width | Menu icon |
37
+ | ------ | ------ | ------------ | --------------- | -------------- | --------- |
38
+ | `xs` | 32dp | 4dp | 8dp | 48dp | 22dp |
39
+ | `sm` | 40dp | 4dp | 12dp | 48dp | 22dp |
40
+ | `md` | 56dp | 4dp | 12dp | 56dp | 26dp |
41
+ | `lg` | 96dp | 8dp | 20dp | 96dp | 38dp |
42
+ | `xl` | 136dp | 12dp | 20dp | 136dp | 50dp |
43
+
44
+ <Canvas of={SplitStories.Sizes} />
45
+
46
+ ## Migrating
47
+
48
+ `color` and the `text` variant are gone, and the default size is now `sm`.
@@ -9,11 +9,7 @@
9
9
  argTypes: {
10
10
  variant: {
11
11
  control: 'select',
12
- options: ['elevated', 'filled', 'tonal', 'outlined', 'text']
13
- },
14
- color: {
15
- control: 'select',
16
- options: ['default', 'primary', 'secondary', 'tertiary', 'error']
12
+ options: ['elevated', 'filled', 'tonal', 'outlined']
17
13
  },
18
14
  size: {
19
15
  control: 'select',
@@ -22,15 +18,14 @@
22
18
  },
23
19
  args: {
24
20
  variant: 'filled',
25
- color: 'default',
26
- size: 'md'
21
+ size: 'sm'
27
22
  }
28
23
  });
29
24
  </script>
30
25
 
31
26
  <Story name="Playground">
32
27
  {#snippet template(args)}
33
- <SplitButton variant={args.variant} color={args.color} size={args.size}>
28
+ <SplitButton variant={args.variant} size={args.size}>
34
29
  {#snippet children()}
35
30
  Reply
36
31
  {/snippet}
@@ -42,8 +37,8 @@
42
37
  {/snippet}
43
38
  </Story>
44
39
 
45
- <Story name="WithLeadingIcon" asChild>
46
- <div class="p-6">
40
+ <Story name="With leading icon" asChild>
41
+ <div class="p-spacing-300">
47
42
  <SplitButton iconProps={{ name: 'send' }}>
48
43
  {#snippet children()}
49
44
  Send
@@ -57,8 +52,8 @@
57
52
  </Story>
58
53
 
59
54
  <Story name="Variants" asChild>
60
- <div class="flex flex-wrap items-center gap-6 p-6">
61
- {#each ['elevated', 'filled', 'tonal', 'outlined', 'text'] as const as variant (variant)}
55
+ <div class="gap-spacing-300 p-spacing-300 flex flex-wrap items-center">
56
+ {#each ['elevated', 'filled', 'tonal', 'outlined'] as const as variant (variant)}
62
57
  <SplitButton {variant}>
63
58
  {#snippet children()}
64
59
  Reply
@@ -73,7 +68,7 @@
73
68
  </Story>
74
69
 
75
70
  <Story name="Sizes" asChild>
76
- <div class="flex flex-wrap items-center gap-6 p-6">
71
+ <div class="gap-spacing-300 p-spacing-300 flex flex-col items-start">
77
72
  {#each ['xs', 'sm', 'md', 'lg', 'xl'] as const as size (size)}
78
73
  <SplitButton {size}>
79
74
  {#snippet children()}
@@ -89,7 +84,7 @@
89
84
  </Story>
90
85
 
91
86
  <Story name="Disabled" asChild>
92
- <div class="p-6">
87
+ <div class="p-spacing-300">
93
88
  <SplitButton disabled>
94
89
  {#snippet children()}
95
90
  Reply
@@ -1,27 +1,25 @@
1
1
  <!--
2
2
  @component
3
- A leading action button fused to a trailing chevron trigger that opens a menu
4
- of related actions — e.g. "Reply" with a dropdown for "Reply all" / "Forward".
3
+ A split button: a leading button for the main action and a trailing button that opens a menu of
4
+ related ones, such as Send with Schedule send. The two share one colour style and sit 2dp apart;
5
+ their inner corners tighten at rest and round out while hovered, pressed or open.
5
6
 
6
- The two segments render as one connected shape: pill on the outer edges,
7
- squared on the corners where they touch (see `SPLIT_BUTTON_INNER_RADIUS`).
8
- Compose the dropdown from `MenuItem` (and `Divider`, headings, etc.), the
9
- same way you would with `Menu`.
7
+ Compose the menu from `MenuItem`s (and `Divider`, headings), as with `Menu`. For one trigger that
8
+ only opens a menu, use `Menu`; for selectable options, `ConnectedButtonGroup`.
10
9
 
11
- Contrast with `Menu` (a single trigger that only ever opens a menu — no
12
- separate primary action) and `ConnectedButtonGroup` (multiple equal,
13
- selectable items, no menu).
14
-
15
- @see https://m3.material.io/components/buttons/guidelines#834f5f31-e363-4d0f-bc4d-abac128f5f0e
10
+ @see https://m3.material.io/components/split-button/specs
16
11
  -->
17
12
  <script lang="ts">
18
13
  import { enterExit, presence } from '../../../animation/index.js';
19
- import { DropdownMenu } from 'bits-ui';
14
+ import { Icon, Layer } from '../../../utils/index.js';
15
+ import { Button, DropdownMenu } from 'bits-ui';
20
16
  import clsx from 'clsx';
21
- import Button from '../Button.svelte';
22
- import ButtonIcon from '../ButtonIcon.svelte';
23
- import { buttonIcon } from '../theme.js';
24
- import { SPLIT_BUTTON_INNER_RADIUS, splitButton } from './theme.js';
17
+ import { buttonColor, buttonElevation } from '../theme.js';
18
+ import { menu } from '../../containers/menu/theme.js';
19
+ import { SPLIT_CHEVRON_OFFSET, splitButton } from './theme.js';
20
+ import { animate } from 'motion';
21
+ import { springTokens, springTransition } from '../../../animation/spring.js';
22
+ import { shapeMorph, splitCorners } from '../shapeMorph.js';
25
23
  import type { SplitButtonProps } from './types.js';
26
24
 
27
25
  let {
@@ -30,61 +28,80 @@ selectable items, no menu).
30
28
  onclick,
31
29
  iconProps,
32
30
  variant = 'filled',
33
- color = 'default',
34
- size = 'md',
31
+ size = 'sm',
35
32
  disabled = false,
36
33
  open = $bindable(false),
37
34
  align = 'end',
38
35
  menuLabel = 'More options',
36
+ 'aria-label': ariaLabel,
39
37
  class: className
40
38
  }: SplitButtonProps = $props();
41
39
 
42
- const cls = $derived(splitButton({ open }));
43
- // Reuse ButtonIcon's own icon-size classes so the chevron matches exactly
44
- // what ButtonIcon would render — `iconProps.class` fully replaces its
45
- // internal size classes (see ButtonIcon.svelte), so we recompute them here.
46
- const chevronCls = $derived(
47
- clsx(buttonIcon({ variant, color, size, width: 'narrow' }).icon(), cls.icon())
48
- );
40
+ const cls = $derived(splitButton({ size }));
49
41
 
50
- const innerRadius = $derived(SPLIT_BUTTON_INNER_RADIUS[size ?? 'md']);
51
- const leadingStyle = $derived(
52
- `border-start-end-radius:${innerRadius};border-end-end-radius:${innerRadius}`
53
- );
54
- const trailingStyle = $derived(
55
- `border-start-start-radius:${innerRadius};border-end-start-radius:${innerRadius}`
42
+ let leadingEl = $state<HTMLElement | null>(null);
43
+ let trailingEl = $state<HTMLElement | null>(null);
44
+ $effect(() => (leadingEl ? shapeMorph(leadingEl, splitCorners('leading')) : undefined));
45
+ $effect(() => (trailingEl ? shapeMorph(trailingEl, splitCorners('trailing')) : undefined));
46
+
47
+ // Open: the menu icon springs to centre (cancelling its resting offset) and flips.
48
+ let chevronEl = $state<HTMLElement | null>(null);
49
+ $effect(() => {
50
+ const el = chevronEl;
51
+ if (!el) return;
52
+ const target = { x: open ? SPLIT_CHEVRON_OFFSET[size] : 0, rotate: open ? 180 : 0 };
53
+ const controls = matchMedia('(prefers-reduced-motion: reduce)').matches
54
+ ? animate(el, target, { duration: 0 })
55
+ : animate(el, target, springTransition(springTokens.fastSpatial));
56
+ return () => controls.stop();
57
+ });
58
+ const colorCls = $derived(
59
+ clsx(buttonColor({ variant, state: 'default' }), buttonElevation[variant])
56
60
  );
57
61
  </script>
58
62
 
59
63
  <div class={cls.root({ class: clsx(className) })}>
60
- <Button {variant} {color} {size} {disabled} {iconProps} {onclick} style={leadingStyle}>
61
- {@render children()}
62
- </Button>
63
-
64
+ <Button.Root
65
+ bind:ref={leadingEl}
66
+ type="button"
67
+ {disabled}
68
+ {onclick}
69
+ aria-label={ariaLabel}
70
+ class={cls.leading({ class: colorCls })}
71
+ data-cy="m3-split-button"
72
+ >
73
+ {#if iconProps}
74
+ <Icon {...iconProps} class={cls.leadingIcon({ class: clsx(iconProps.class) })} />
75
+ {/if}
76
+ {@render children?.()}
77
+ <Layer />
78
+ </Button.Root>
64
79
  <DropdownMenu.Root bind:open>
65
80
  <DropdownMenu.Trigger {disabled}>
66
81
  {#snippet child({ props })}
67
- <ButtonIcon
68
- {variant}
69
- {color}
70
- {size}
71
- {disabled}
72
- width="narrow"
73
- style={trailingStyle}
74
- tooltipContent={menuLabel}
75
- iconProps={{ name: 'arrow_drop_down', class: chevronCls }}
82
+ <Button.Root
83
+ bind:ref={trailingEl}
84
+ type="button"
76
85
  {...props}
77
- />
86
+ aria-label={menuLabel}
87
+ class={cls.trailing({ class: colorCls })}
88
+ data-cy="m3-split-button-menu"
89
+ >
90
+ <span bind:this={chevronEl} class="inline-flex">
91
+ <Icon name="keyboard_arrow_down" class={cls.chevron()} />
92
+ </span>
93
+ <Layer />
94
+ </Button.Root>
78
95
  {/snippet}
79
96
  </DropdownMenu.Trigger>
80
-
81
97
  <DropdownMenu.Portal>
82
- <DropdownMenu.Content {align} sideOffset={4} class="z-100">
98
+ <DropdownMenu.Content {align} sideOffset={4} class="z-layer-popup">
83
99
  {#snippet child({ wrapperProps, props, open: isOpen })}
84
- <div {...wrapperProps} class={wrapperProps.class as any}>
100
+ <div {...wrapperProps}>
101
+ <!-- Menu's own panel, so MenuItem rows look the same here. -->
85
102
  <div
86
103
  {...props}
87
- class="bg-md-sys-color-surface-container-high shadow-elevation-3 ring-md-sys-color-outline/10 max-w-sm min-w-48 gap-1 overflow-y-auto rounded-lg px-2 py-1"
104
+ class={menu().content()}
88
105
  {@attach presence(() => isOpen, enterExit.scale)}
89
106
  >
90
107
  {@render menuChildren()}
@@ -1,18 +1,13 @@
1
1
  import type { SplitButtonProps } from './types.js';
2
2
  /**
3
- * A leading action button fused to a trailing chevron trigger that opens a menu
4
- * of related actions — e.g. "Reply" with a dropdown for "Reply all" / "Forward".
3
+ * A split button: a leading button for the main action and a trailing button that opens a menu of
4
+ * related ones, such as Send with Schedule send. The two share one colour style and sit 2dp apart;
5
+ * their inner corners tighten at rest and round out while hovered, pressed or open.
5
6
  *
6
- * The two segments render as one connected shape: pill on the outer edges,
7
- * squared on the corners where they touch (see `SPLIT_BUTTON_INNER_RADIUS`).
8
- * Compose the dropdown from `MenuItem` (and `Divider`, headings, etc.), the
9
- * same way you would with `Menu`.
7
+ * Compose the menu from `MenuItem`s (and `Divider`, headings), as with `Menu`. For one trigger that
8
+ * only opens a menu, use `Menu`; for selectable options, `ConnectedButtonGroup`.
10
9
  *
11
- * Contrast with `Menu` (a single trigger that only ever opens a menu — no
12
- * separate primary action) and `ConnectedButtonGroup` (multiple equal,
13
- * selectable items, no menu).
14
- *
15
- * @see https://m3.material.io/components/buttons/guidelines#834f5f31-e363-4d0f-bc4d-abac128f5f0e
10
+ * @see https://m3.material.io/components/split-button/specs
16
11
  */
17
12
  declare const SplitButton: import("svelte").Component<SplitButtonProps, {}, "open">;
18
13
  type SplitButton = ReturnType<typeof SplitButton>;