@noxlovette/material 0.3.3 → 0.4.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 (289) 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/dist/utils/theme.svelte.js +1 -1
  259. package/package.json +39 -38
  260. package/bin/install-skill.js +0 -29
  261. package/dist/components/buttons/button-group/ButtonGroupItem.svelte +0 -41
  262. package/dist/components/buttons/button-group/ButtonGroupItem.svelte.d.ts +0 -8
  263. package/dist/components/buttons/connected/ConnectedButtons.svelte +0 -14
  264. package/dist/components/buttons/connected/ConnectedButtons.svelte.d.ts +0 -8
  265. package/dist/components/containers/menu-item/MenuItem.svelte +0 -74
  266. package/dist/components/containers/merger/InputMerger.svelte +0 -24
  267. package/dist/components/containers/merger/InputMerger.svelte.d.ts +0 -14
  268. package/dist/components/containers/merger/index.d.ts +0 -2
  269. package/dist/components/containers/merger/theme.d.ts +0 -1
  270. package/dist/components/containers/merger/theme.js +0 -4
  271. package/dist/components/containers/panes/SinglePane.stories.svelte +0 -67
  272. package/dist/components/containers/panes/SinglePane.svelte +0 -32
  273. package/dist/components/containers/panes/SinglePane.svelte.d.ts +0 -5
  274. package/dist/components/containers/panes/SplitPane.stories.svelte +0 -124
  275. package/dist/components/containers/panes/SplitPane.svelte +0 -144
  276. package/dist/components/containers/panes/SplitPane.svelte.d.ts +0 -8
  277. package/dist/components/containers/panes/SupportingPane.stories.svelte +0 -113
  278. package/dist/components/containers/panes/SupportingPane.svelte +0 -175
  279. package/dist/components/containers/panes/SupportingPane.svelte.d.ts +0 -9
  280. package/dist/components/containers/panes/index.d.ts +0 -5
  281. package/dist/components/containers/panes/theme.d.ts +0 -490
  282. package/dist/components/containers/panes/theme.js +0 -185
  283. package/dist/components/containers/panes/types.d.ts +0 -108
  284. package/dist/components/nav/rail/RailNavContext.svelte +0 -14
  285. package/dist/components/nav/rail/RailNavContext.svelte.d.ts +0 -8
  286. /package/dist/components/{containers/menu-item → buttons/split-button}/types.js +0 -0
  287. /package/dist/components/{containers/panes → chips}/types.js +0 -0
  288. /package/dist/components/containers/{menu-item → menu/menu-item}/index.d.ts +0 -0
  289. /package/dist/components/containers/{menu-item → menu/menu-item}/index.js +0 -0
@@ -7,9 +7,13 @@
7
7
  }
8
8
 
9
9
  .md-component-button-base {
10
- @apply state-layer md-sys-state-focus-indicator disabled:bg-md-sys-color-on-surface/10 disabled:text-md-sys-color-on-surface/38 disabled:before:bg-md-sys-color-on-surface/38 relative inline-flex items-center justify-center select-none disabled:cursor-not-allowed;
10
+ /* `relative` is applied as a literal utility token at each call site (theme.ts), not
11
+ * baked in here — that lets tailwind-merge dedupe it against a caller-supplied
12
+ * `fixed`/`absolute`/`sticky` override. Baking it into this custom class's own compiled
13
+ * CSS rule would set `position` outside of anything twMerge can see or override. */
14
+ @apply state-layer md-sys-state-focus-indicator disabled:bg-md-sys-color-on-surface/10 disabled:text-md-sys-color-on-surface/38 disabled:before:bg-md-sys-color-on-surface/38 inline-flex items-center justify-center select-none disabled:cursor-not-allowed;
11
15
  transition: box-shadow var(--md-sys-motion-duration, 200ms)
12
- var(--md-sys-motion-timing-function, cubic-bezier(0.34, 0.8, 0.34, 1));
16
+ var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
13
17
  }
14
18
 
15
19
  .md-btn-morph {
@@ -30,6 +34,124 @@
30
34
  }
31
35
  }
32
36
 
37
+ /*
38
+ * Standard button group (https://m3.material.io/components/button-groups/overview).
39
+ * A plain flex row/column of otherwise-untouched Button/ButtonIcon/Toggle children.
40
+ * `data-size` drives both the fixed gap between buttons and the padding-inline
41
+ * "squeeze" below — pressing one button grows its own padding and shrinks its
42
+ * immediate neighbors', which is the M3-specified adjacent-button interaction.
43
+ * `:has()` scopes the shrink to only the pressed button's direct neighbors.
44
+ */
45
+ .md-btn-group-standard {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ flex-wrap: nowrap;
49
+ width: max-content;
50
+
51
+ &[data-orientation='vertical'] {
52
+ flex-direction: column;
53
+ align-items: stretch;
54
+ width: auto;
55
+ }
56
+
57
+ &[data-size='xs'] {
58
+ --btn-group-gap: 1.125rem;
59
+ --btn-group-base-px: 1rem;
60
+ --btn-group-squeeze: 0.375rem;
61
+ }
62
+ &[data-size='sm'] {
63
+ --btn-group-gap: 0.75rem;
64
+ --btn-group-base-px: 1rem;
65
+ --btn-group-squeeze: 0.375rem;
66
+ }
67
+ &[data-size='md'] {
68
+ --btn-group-gap: 0.5rem;
69
+ --btn-group-base-px: 1.5rem;
70
+ --btn-group-squeeze: 0.5rem;
71
+ }
72
+ &[data-size='lg'] {
73
+ --btn-group-gap: 0.5rem;
74
+ --btn-group-base-px: 3rem;
75
+ --btn-group-squeeze: 0.75rem;
76
+ }
77
+ &[data-size='xl'] {
78
+ --btn-group-gap: 0.5rem;
79
+ --btn-group-base-px: 4rem;
80
+ --btn-group-squeeze: 1rem;
81
+ }
82
+
83
+ gap: var(--btn-group-gap, 0.5rem);
84
+
85
+ > * {
86
+ padding-inline: var(--btn-group-base-px, 1rem);
87
+ transition:
88
+ padding-inline var(--md-sys-motion-duration-fast-spatial, 350ms)
89
+ var(--md-sys-motion-timing-function-fast-spatial, cubic-bezier(0.42, 1.67, 0.21, 0.9)),
90
+ border-radius 200ms var(--md-sys-motion-timing-function-emphasized-accel);
91
+ }
92
+
93
+ > *:active:not(:disabled) {
94
+ padding-inline: calc(var(--btn-group-base-px, 1rem) + var(--btn-group-squeeze, 0.5rem));
95
+ }
96
+
97
+ > *:has(+ *:active:not(:disabled)),
98
+ > *:active:not(:disabled) + * {
99
+ padding-inline: max(
100
+ 0px,
101
+ calc(var(--btn-group-base-px, 1rem) - var(--btn-group-squeeze, 0.5rem))
102
+ );
103
+ }
104
+ }
105
+
106
+ /*
107
+ * Connected button group item — replaces the deprecated segmented button.
108
+ * `--cbg-inner` (per size) is the shared radius facing a neighbor; `--cbg-outer`
109
+ * defaults to fully round and is only overridden (to equal --cbg-inner) for the
110
+ * square shape, so the position rules below become no-ops in that case.
111
+ * Selecting/pressing an item collapses all four of its own corners to
112
+ * --cbg-inner ("round to square") without touching its neighbors' shape.
113
+ */
114
+ .md-btn-connected {
115
+ border-radius: var(--cbg-inner, 9999px);
116
+ transition:
117
+ border-radius 250ms var(--md-sys-motion-timing-function-emphasized-accel),
118
+ background-color var(--md-sys-motion-duration-fast, 150ms)
119
+ var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1)),
120
+ color var(--md-sys-motion-duration-fast, 150ms)
121
+ var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
122
+
123
+ &:only-child {
124
+ border-radius: var(--cbg-outer, 9999px);
125
+ }
126
+
127
+ &[data-orientation='horizontal']:first-child:not(:only-child) {
128
+ border-top-left-radius: var(--cbg-outer, 9999px);
129
+ border-bottom-left-radius: var(--cbg-outer, 9999px);
130
+ }
131
+ &[data-orientation='horizontal']:last-child:not(:only-child) {
132
+ border-top-right-radius: var(--cbg-outer, 9999px);
133
+ border-bottom-right-radius: var(--cbg-outer, 9999px);
134
+ }
135
+ &[data-orientation='vertical']:first-child:not(:only-child) {
136
+ border-top-left-radius: var(--cbg-outer, 9999px);
137
+ border-top-right-radius: var(--cbg-outer, 9999px);
138
+ }
139
+ &[data-orientation='vertical']:last-child:not(:only-child) {
140
+ border-bottom-left-radius: var(--cbg-outer, 9999px);
141
+ border-bottom-right-radius: var(--cbg-outer, 9999px);
142
+ }
143
+
144
+ &:active:not(:disabled),
145
+ &[data-state='on'] {
146
+ border-radius: var(--cbg-inner, 4px) !important;
147
+ transition-timing-function: var(--md-sys-motion-timing-function-emphasized-decel);
148
+ }
149
+
150
+ &:active:not(:disabled) {
151
+ transition-duration: 150ms;
152
+ }
153
+ }
154
+
33
155
  .md-component-button-filled-primary {
34
156
  @apply bg-md-sys-color-primary text-md-sys-color-on-primary;
35
157
  }
@@ -124,7 +246,7 @@
124
246
  .text-link {
125
247
  @apply text-md-sys-color-primary hover:text-md-sys-color-secondary underline;
126
248
  transition: color var(--md-sys-motion-duration, 200ms)
127
- var(--md-sys-motion-timing-function, cubic-bezier(0.34, 0.8, 0.34, 1));
249
+ var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
128
250
  }
129
251
 
130
252
  .text-link.md-sys-typescale-label-small {
@@ -149,6 +271,6 @@
149
271
  @apply before:pointer-events-none before:absolute before:inset-0 before:content-[''];
150
272
  &::before {
151
273
  transition: background-color var(--md-sys-motion-duration-fast, 150ms)
152
- var(--md-sys-motion-timing-function, cubic-bezier(0.34, 0.8, 0.34, 1));
274
+ var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
153
275
  }
154
276
  }
@@ -15,16 +15,19 @@
15
15
  --md-sys-motion-easing-slow-spatial: var(--md-sys-motion-timing-function-slow-spatial)
16
16
  var(--md-sys-motion-duration-slow-spatial);
17
17
 
18
- --md-sys-motion-timing-function-fast: cubic-bezier(0.31, 0.94, 0.34, 1);
18
+ /* Standard easing — md.sys.motion.easing.standard, cubic-bezier(0.2, 0, 0, 1) per
19
+ m3.material.io/styles/motion/easing-and-duration/tokens-specs. Same curve across all
20
+ three durations; only the duration changes per tier. */
21
+ --md-sys-motion-timing-function-fast: cubic-bezier(0.2, 0, 0, 1);
19
22
  --md-sys-motion-duration-fast: 150ms;
20
23
  --md-sys-motion-easing-fast: var(--md-sys-motion-timing-function-fast)
21
24
  var(--md-sys-motion-duration-fast);
22
25
 
23
- --md-sys-motion-timing-function: cubic-bezier(0.34, 0.8, 0.34, 1);
26
+ --md-sys-motion-timing-function: cubic-bezier(0.2, 0, 0, 1);
24
27
  --md-sys-motion-duration: 200ms;
25
28
  --md-sys-motion-easing: var(--md-sys-motion-timing-function) var(--md-sys-motion-duration);
26
29
 
27
- --md-sys-motion-timing-function-slow: cubic-bezier(0.34, 0.88, 0.34, 1);
30
+ --md-sys-motion-timing-function-slow: cubic-bezier(0.2, 0, 0, 1);
28
31
  --md-sys-motion-duration-slow: 300ms;
29
32
  --md-sys-motion-easing-slow: var(--md-sys-motion-timing-function-slow)
30
33
  var(--md-sys-motion-duration-slow);
@@ -54,7 +54,9 @@
54
54
  expand.setAttribute('dur', `${speed}ms`);
55
55
  expand.setAttribute('fill', 'freeze');
56
56
  expand.setAttribute('calcMode', 'spline');
57
- expand.setAttribute('keySplines', '0.4 0, 0.2 1');
57
+ // md.sys.motion.easing.standard: cubic-bezier(0.2, 0, 0, 1) — keep in sync with
58
+ // --md-sys-motion-timing-function in motion.css (SMIL keySplines can't reference CSS vars).
59
+ expand.setAttribute('keySplines', '0.2 0, 0 1');
58
60
  circle.appendChild(expand);
59
61
 
60
62
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
@@ -105,7 +107,9 @@
105
107
  fade.setAttribute('dur', '800ms');
106
108
  fade.setAttribute('fill', 'freeze');
107
109
  fade.setAttribute('calcMode', 'spline');
108
- fade.setAttribute('keySplines', '0.4 0, 0.2 1');
110
+ // md.sys.motion.easing.standard: cubic-bezier(0.2, 0, 0, 1) — keep in sync with
111
+ // --md-sys-motion-timing-function in motion.css (SMIL keySplines can't reference CSS vars).
112
+ fade.setAttribute('keySplines', '0.2 0, 0 1');
109
113
  circle.appendChild(fade);
110
114
  fade.beginElement();
111
115
  setTimeout(() => svg.remove(), 800);
@@ -196,7 +200,7 @@
196
200
  background-color: currentColor;
197
201
  opacity: 0;
198
202
  transition: opacity var(--md-sys-motion-duration-fast, 150ms)
199
- var(--md-sys-motion-timing-function, cubic-bezier(0.34, 0.8, 0.34, 1));
203
+ var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
200
204
 
201
205
  &:not(
202
206
  :global(input:disabled + label) > .tint,
@@ -1,5 +1,16 @@
1
1
  <script lang="ts">
2
- import { generateThemeCSS, isDarkScheme, themeState, STORAGE_KEY } from './theme.svelte.js';
2
+ import { MediaQuery } from 'svelte/reactivity';
3
+ import { generateThemeCSS, themeState, STORAGE_KEY } from './theme.svelte.js';
4
+
5
+ /**
6
+ * Whether to generate and inject the M3 dynamic-color CSS custom properties
7
+ * derived from `themeState.sourceColor`. When `false`, this component still
8
+ * restores/persists `themeState.scheme` and keeps the `dark` class on
9
+ * `<html>` in sync with it (including system-preference changes) — it just
10
+ * skips generating dynamic-color CSS, for consumers supplying their own
11
+ * static `@noxlovette/material/theme/*` CSS.
12
+ */
13
+ let { generateCSS = true }: { generateCSS?: boolean } = $props();
3
14
 
4
15
  // Restore from localStorage on mount
5
16
  $effect(() => {
@@ -17,25 +28,12 @@
17
28
  });
18
29
 
19
30
  // Track dark mode, including system preference changes
20
- let finalIsDark = $state(isDarkScheme(themeState.scheme));
21
-
22
- $effect(() => {
23
- if (themeState.scheme !== 'system') {
24
- finalIsDark = themeState.scheme === 'dark';
25
- return;
26
- }
27
-
28
- const media = window.matchMedia('(prefers-color-scheme: dark)');
29
- const handler = (e: MediaQueryListEvent) => {
30
- finalIsDark = e.matches;
31
- };
32
-
33
- finalIsDark = media.matches;
34
- media.addEventListener('change', handler);
35
- return () => media.removeEventListener('change', handler);
36
- });
31
+ const systemDark = new MediaQuery('(prefers-color-scheme: dark)');
32
+ const finalIsDark = $derived(
33
+ themeState.scheme === 'system' ? systemDark.current : themeState.scheme === 'dark'
34
+ );
37
35
 
38
- const themeStyles = $derived(generateThemeCSS(themeState, finalIsDark));
36
+ const themeStyles = $derived(generateCSS ? generateThemeCSS(themeState, finalIsDark) : '');
39
37
 
40
38
  // Persist to localStorage on any change
41
39
  $effect(() => {
@@ -61,5 +59,7 @@
61
59
  </script>
62
60
 
63
61
  <svelte:head>
64
- {@html `<` + `style id="ogonek-m3-dynamic-theme">` + themeStyles + `</` + `style>`}
62
+ {#if generateCSS}
63
+ {@html `<` + `style id="ogonek-m3-dynamic-theme">` + themeStyles + `</` + `style>`}
64
+ {/if}
65
65
  </svelte:head>
@@ -13,5 +13,5 @@ Add this to your root +layout.svelte (or any layout that wraps the whole app):
13
13
  </script>
14
14
 
15
15
  <svelte:head>
16
- {@html `<script>${THEME_INIT_SCRIPT}</script>`}
16
+ {@html '<' + 'script>' + THEME_INIT_SCRIPT + '</' + 'script>'}
17
17
  </svelte:head>
@@ -2,29 +2,29 @@ import { type VariantProps } from 'tailwind-variants';
2
2
  export type LoadingIndicatorVariants = VariantProps<typeof loadingIndicator>;
3
3
  export declare const loadingIndicator: import("tailwind-variants").TVReturnType<{
4
4
  center: {
5
- true: string;
6
- false: string;
5
+ true: "mx-auto";
6
+ false: "";
7
7
  };
8
8
  container: {
9
- true: string;
10
- false: string;
9
+ true: "text-md-sys-color-on-primary-container bg-md-sys-color-primary-container";
10
+ false: "text-md-sys-color-primary";
11
11
  };
12
12
  }, undefined, "rounded-full", {
13
13
  center: {
14
- true: string;
15
- false: string;
14
+ true: "mx-auto";
15
+ false: "";
16
16
  };
17
17
  container: {
18
- true: string;
19
- false: string;
18
+ true: "text-md-sys-color-on-primary-container bg-md-sys-color-primary-container";
19
+ false: "text-md-sys-color-primary";
20
20
  };
21
- }, undefined, import("tailwind-variants").TVReturnType<{
21
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
22
22
  center: {
23
- true: string;
24
- false: string;
23
+ true: "mx-auto";
24
+ false: "";
25
25
  };
26
26
  container: {
27
- true: string;
28
- false: string;
27
+ true: "text-md-sys-color-on-primary-container bg-md-sys-color-primary-container";
28
+ false: "text-md-sys-color-primary";
29
29
  };
30
- }, undefined, "rounded-full", unknown, unknown, undefined>>;
30
+ }, undefined>>;
@@ -1,4 +1,4 @@
1
- import { argbFromHex, Hct, hexFromArgb, MaterialDynamicColors, QuantizerCelebi, SchemeContent, SchemeFidelity, SchemeFruitSalad, SchemeRainbow, SchemeTonalSpot, SchemeVibrant, Score } from '@ktibow/material-color-utilities-nightly';
1
+ import { argbFromHex, Hct, hexFromArgb, MaterialDynamicColors, QuantizerCelebi, SchemeContent, SchemeFidelity, SchemeFruitSalad, SchemeRainbow, SchemeTonalSpot, SchemeVibrant, Score } from '@material/material-color-utilities';
2
2
  export const DEFAULT_CONFIG = {
3
3
  sourceColor: '#6750A4',
4
4
  scheme: 'system',
package/package.json CHANGED
@@ -1,23 +1,22 @@
1
1
  {
2
2
  "name": "@noxlovette/material",
3
- "version": "0.3.3",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
7
- "url": "git+https://github.com/noxlovette/material.git"
7
+ "url": "git+https://codeberg.org/noxlovette/material.git"
8
8
  },
9
9
  "scripts": {
10
- "build": "svelte-package && bun scripts/copy-skill.ts",
10
+ "build": "svelte-package",
11
+ "watch": "svelte-package --watch",
11
12
  "prepublishOnly": "bun run build",
12
13
  "check": "svelte-kit sync && svelte-check",
13
14
  "test": "vitest run",
14
15
  "format": "prettier --write .",
15
16
  "dev": "vite dev",
16
17
  "storybook": "storybook dev -p 6006",
17
- "build-storybook": "storybook build"
18
- },
19
- "bin": {
20
- "material-claude-skill": "./bin/install-skill.js"
18
+ "build-storybook": "storybook build",
19
+ "index": "bun run scripts/generate-components-index.ts"
21
20
  },
22
21
  "files": [
23
22
  "dist",
@@ -48,51 +47,53 @@
48
47
  "devDependencies": {
49
48
  "@eslint/compat": "^2.1.0",
50
49
  "@eslint/js": "^10.0.1",
51
- "@storybook/addon-a11y": "10.5.2",
52
- "@storybook/addon-docs": "10.5.2",
50
+ "@storybook/addon-a11y": "10.5.10",
51
+ "@storybook/addon-docs": "10.5.10",
53
52
  "@storybook/addon-svelte-csf": "5.1.2",
54
- "@storybook/svelte-vite": "10.5.2",
53
+ "@storybook/svelte-vite": "10.5.10",
55
54
  "@sveltejs/adapter-static": "^3.0.10",
56
- "@sveltejs/kit": "^2.69.3",
55
+ "@sveltejs/kit": "^2.70.3",
57
56
  "@sveltejs/package": "^2.5.8",
58
- "@sveltejs/vite-plugin-svelte": "6.2.4",
59
- "@tailwindcss/cli": "^4.3.2",
57
+ "@sveltejs/vite-plugin-svelte": "7.3.0",
58
+ "@tailwindcss/cli": "^4.3.3",
60
59
  "@tailwindcss/typography": "^0.5.20",
61
- "@tailwindcss/vite": "^4.3.2",
62
- "@types/node": "^25.9.5",
63
- "eslint": "^10.7.0",
60
+ "@tailwindcss/vite": "^4.3.3",
61
+ "@types/node": "^26.4.0",
62
+ "eslint": "^10.9.1",
64
63
  "eslint-config-prettier": "^10.1.8",
65
- "eslint-plugin-svelte": "^3.20.0",
66
- "globals": "^17.7.0",
67
- "lefthook": "^2.1.10",
68
- "prettier": "^3.9.5",
64
+ "eslint-plugin-svelte": "^3.23.0",
65
+ "globals": "^17.11.0",
66
+ "lefthook": "^2.1.12",
67
+ "prettier": "^3.9.6",
69
68
  "prettier-plugin-organize-imports": "^4.3.0",
70
69
  "prettier-plugin-svelte": "^4.1.1",
71
- "prettier-plugin-tailwindcss": "^0.8.0",
72
- "publint": "^0.3.21",
73
- "shiki": "^4.3.1",
74
- "storybook": "10.5.2",
75
- "svelte": "^5.56.5",
76
- "svelte-check": "^4.7.2",
70
+ "prettier-plugin-tailwindcss": "^0.8.1",
71
+ "publint": "^0.3.24",
72
+ "shiki": "^4.4.3",
73
+ "storybook": "10.5.10",
74
+ "svelte": "^5.57.0",
75
+ "svelte-check": "^4.7.6",
77
76
  "sveltekit-superforms": "^2.30.2",
78
77
  "tailwind-scrollbar": "^4.0.2",
79
- "tailwindcss": "^4.3.2",
80
- "typescript": "^6.0.3",
81
- "typescript-eslint": "^8.64.0",
82
- "vite": "7.3.6",
83
- "vite-plugin-devtools-json": "^1.0.0",
84
- "vitest": "^4.1.10",
85
- "zod": "^4.4.3"
78
+ "tailwindcss": "^4.3.3",
79
+ "typescript": "6",
80
+ "typescript-eslint": "^8.69.0",
81
+ "vite": "8.2.2",
82
+ "vite-plugin-devtools-json": "^1.1.0",
83
+ "vitest": "^4.1.11",
84
+ "zod": "^4.5.4"
86
85
  },
87
86
  "dependencies": {
87
+ "@dicebear/core": "^10.7.0",
88
+ "@dicebear/styles": "^10.6.0",
88
89
  "@floating-ui/dom": "^1.8.0",
89
- "@internationalized/date": "^3.12.2",
90
- "@ktibow/material-color-utilities-nightly": "^0.4.1772748028000",
91
- "bits-ui": "^2.18.1",
90
+ "@internationalized/date": "^3.12.3",
91
+ "@material/material-color-utilities": "^0.4.0",
92
+ "bits-ui": "^2.19.0",
92
93
  "clsx": "^2.1.1",
93
94
  "mode-watcher": "^1.1.0",
94
- "nanoid": "^5.1.16",
95
+ "nanoid": "^6.0.1",
95
96
  "tailwind-merge": "^3.6.0",
96
- "tailwind-variants": "^3.2.2"
97
+ "tailwind-variants": "^3.3.1"
97
98
  }
98
99
  }
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env node
2
- import { cpSync, existsSync, mkdirSync } from 'node:fs';
3
- import { dirname, join } from 'node:path';
4
- import { fileURLToPath } from 'node:url';
5
-
6
- const __dirname = dirname(fileURLToPath(import.meta.url));
7
- const source = join(__dirname, '..', 'claude-skill', 'material-design');
8
- const destDir = join(process.cwd(), '.claude', 'skills');
9
- const dest = join(destDir, 'material-design');
10
- const force = process.argv.includes('--force');
11
-
12
- if (!existsSync(source)) {
13
- console.error(
14
- 'Could not find the bundled material-design skill. Reinstall @noxlovette/material and try again.'
15
- );
16
- process.exit(1);
17
- }
18
-
19
- if (existsSync(dest) && !force) {
20
- console.error(
21
- `.claude/skills/material-design already exists. Re-run with --force to overwrite it.`
22
- );
23
- process.exit(1);
24
- }
25
-
26
- mkdirSync(destDir, { recursive: true });
27
- cpSync(source, dest, { recursive: true, force: true });
28
-
29
- console.log(`Installed the material-design Claude Code skill to .claude/skills/material-design`);
@@ -1,41 +0,0 @@
1
- <!--
2
- @component
3
- A single button within a ButtonGroup.
4
- Displays a leading check icon when selected, per M3 spec.
5
- -->
6
- <script lang="ts">
7
- import { ToggleGroup } from 'bits-ui';
8
- import clsx from 'clsx';
9
- import { getContext } from 'svelte';
10
- import { Icon, Layer } from '../../../utils/index.js';
11
- import { buttonGroupItem } from './theme.js';
12
- import type { ButtonGroupItemProps } from './types.js';
13
-
14
- let {
15
- value,
16
- label,
17
- iconProps,
18
- disabled = false,
19
- class: className
20
- }: ButtonGroupItemProps = $props();
21
-
22
- const buttonGroupCtx = getContext<{ orientation: 'horizontal' | 'vertical' } | undefined>(
23
- 'buttonGroup'
24
- );
25
- const orientation = $derived(buttonGroupCtx?.orientation ?? 'horizontal');
26
- const { base, checkIcon, icon } = $derived(buttonGroupItem({ orientation }));
27
- </script>
28
-
29
- <ToggleGroup.Item {value} {disabled} class={base({ class: clsx(className) })}>
30
- {#snippet children({ pressed })}
31
- {#if pressed}
32
- <Icon name="check" class={checkIcon()} />
33
- {:else if iconProps}
34
- <Icon {...iconProps} class={icon()} />
35
- {/if}
36
- {#if label}
37
- <span>{label}</span>
38
- {/if}
39
- <Layer />
40
- {/snippet}
41
- </ToggleGroup.Item>
@@ -1,8 +0,0 @@
1
- import type { ButtonGroupItemProps } from './types.js';
2
- /**
3
- * A single button within a ButtonGroup.
4
- * Displays a leading check icon when selected, per M3 spec.
5
- */
6
- declare const ButtonGroupItem: import("svelte").Component<ButtonGroupItemProps, {}, "">;
7
- type ButtonGroupItem = ReturnType<typeof ButtonGroupItem>;
8
- export default ButtonGroupItem;
@@ -1,14 +0,0 @@
1
- <!--
2
- @component
3
- A container for grouping buttons with shared borders and rounding.
4
- Typically used for segmented controls or closely related actions.
5
- -->
6
- <script lang="ts">
7
- import type { ConnectedButtonsProps } from './types.js';
8
-
9
- let { children, ...rest }: ConnectedButtonsProps = $props();
10
- </script>
11
-
12
- <div class="grid auto-cols-fr grid-flow-col gap-0.5 overflow-hidden rounded-full" {...rest}>
13
- {@render children()}
14
- </div>
@@ -1,8 +0,0 @@
1
- import type { ConnectedButtonsProps } from './types.js';
2
- /**
3
- * A container for grouping buttons with shared borders and rounding.
4
- * Typically used for segmented controls or closely related actions.
5
- */
6
- declare const ConnectedButtons: import("svelte").Component<ConnectedButtonsProps, {}, "">;
7
- type ConnectedButtons = ReturnType<typeof ConnectedButtons>;
8
- export default ConnectedButtons;
@@ -1,74 +0,0 @@
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 Icon from '../../../utils/icon/Icon.svelte';
20
- import Layer from '../../../utils/Layer.svelte';
21
- import { DropdownMenu } from 'bits-ui';
22
- import { tv } from 'tailwind-variants';
23
-
24
- let {
25
- iconProps,
26
- disabled = false,
27
- onclick,
28
- onSelect,
29
- selected,
30
- helper,
31
- children,
32
- ...restProps
33
- }: MenuItemProps & Record<string, any> = $props();
34
-
35
- // bits-ui fires onSelect at the Item level; avoid wiring onclick to the
36
- // native button as well or it would fire twice on every click.
37
- const handleSelect = $derived(onSelect ?? (onclick ? () => onclick() : undefined));
38
-
39
- const itemClass = $derived(
40
- tv({
41
- base: 'relative flex w-full cursor-pointer items-start gap-3 border-none bg-transparent px-4 py-3 text-left md-sys-typescale-body-large whitespace-nowrap text-md-sys-color-on-surface hover:bg-md-sys-color-on-surface/8 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-md-sys-color-primary disabled:cursor-not-allowed disabled:opacity-38',
42
- variants: {
43
- selected: {
44
- true: 'bg-md-sys-color-secondary-container text-md-sys-color-on-secondary-container'
45
- }
46
- }
47
- })({ selected })
48
- );
49
- </script>
50
-
51
- <DropdownMenu.Item {disabled} onSelect={handleSelect}>
52
- <button {...restProps} type="button" class={itemClass} {disabled}>
53
- {#if iconProps}
54
- <Icon class="text-md-sys-color-on-surface-variant size-6 text-[24px]" {...iconProps} />
55
- {/if}
56
-
57
- <div class="flex flex-1 flex-col gap-1">
58
- <span class="md-sys-typescale-body-large text-md-sys-color-on-surface">
59
- {@render children()}
60
- </span>
61
- {#if helper}
62
- <span class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant">
63
- {helper}
64
- </span>
65
- {/if}
66
- </div>
67
-
68
- {#if selected}
69
- <Icon aria-hidden="true" name="check" />
70
- {/if}
71
-
72
- <Layer />
73
- </button>
74
- </DropdownMenu.Item>
@@ -1,24 +0,0 @@
1
- <!--
2
- @component
3
- InputMerger is a container that groups multiple input components together visually.
4
- -->
5
- <script lang="ts">
6
- import { inputMerger } from './theme.js';
7
-
8
- interface Props {
9
- /**
10
- * The input components to be merged.
11
- */
12
- children: import('svelte').Snippet;
13
- /**
14
- * Additional CSS classes for the container.
15
- */
16
- class?: string;
17
- }
18
-
19
- let { children, class: className = '' }: Props = $props();
20
- </script>
21
-
22
- <div class={inputMerger({ class: className })}>
23
- {@render children()}
24
- </div>