@noxlovette/material 0.5.0 → 0.6.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 (316) 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 +60 -0
  8. package/dist/animation/Shapes.stories.svelte.d.ts +3 -0
  9. package/dist/animation/TransitionPatterns.stories.svelte +32 -20
  10. package/dist/animation/containerTransform.d.ts +11 -0
  11. package/dist/animation/containerTransform.js +11 -0
  12. package/dist/animation/enterExit.d.ts +9 -0
  13. package/dist/animation/enterExit.js +6 -3
  14. package/dist/animation/index.d.ts +1 -0
  15. package/dist/animation/index.js +1 -0
  16. package/dist/animation/shapeMorph.svelte.d.ts +52 -0
  17. package/dist/animation/shapeMorph.svelte.js +112 -0
  18. package/dist/animation/shapesAnimatableSmall.d.ts +28 -22
  19. package/dist/animation/shapesAnimatableSmall.js +32 -23
  20. package/dist/animation/sharedAxisTransition.d.ts +22 -0
  21. package/dist/animation/sharedAxisTransition.js +25 -1
  22. package/dist/animation/skeleton.d.ts +6 -1
  23. package/dist/animation/skeleton.js +6 -1
  24. package/dist/components/badge/Badge.mdx +70 -0
  25. package/dist/components/badge/Badge.stories.svelte +38 -20
  26. package/dist/components/badge/Badge.svelte +12 -5
  27. package/dist/components/badge/theme.d.ts +30 -7
  28. package/dist/components/badge/theme.js +24 -4
  29. package/dist/components/badge/types.d.ts +18 -4
  30. package/dist/components/buttons/Button.mdx +85 -0
  31. package/dist/components/buttons/Button.stories.svelte +62 -27
  32. package/dist/components/buttons/Button.svelte +29 -25
  33. package/dist/components/buttons/Button.svelte.d.ts +11 -9
  34. package/dist/components/buttons/ButtonIcon.mdx +52 -0
  35. package/dist/components/buttons/ButtonIcon.stories.svelte +72 -48
  36. package/dist/components/buttons/ButtonIcon.svelte +58 -36
  37. package/dist/components/buttons/ButtonIcon.svelte.d.ts +9 -7
  38. package/dist/components/buttons/FAB.mdx +84 -0
  39. package/dist/components/buttons/FAB.stories.svelte +103 -24
  40. package/dist/components/buttons/FAB.stories.svelte.d.ts +2 -17
  41. package/dist/components/buttons/FAB.svelte +353 -29
  42. package/dist/components/buttons/FAB.svelte.d.ts +11 -6
  43. package/dist/components/buttons/FABMenu.svelte +27 -8
  44. package/dist/components/buttons/FABMenu.svelte.d.ts +7 -3
  45. package/dist/components/buttons/FABMenuItem.svelte +20 -16
  46. package/dist/components/buttons/FABMenuItem.svelte.d.ts +3 -3
  47. package/dist/components/buttons/Toggle.stories.svelte +31 -23
  48. package/dist/components/buttons/Toggle.stories.svelte.d.ts +2 -17
  49. package/dist/components/buttons/Toggle.svelte +28 -25
  50. package/dist/components/buttons/Toggle.svelte.d.ts +5 -5
  51. package/dist/components/buttons/button-group/ButtonGroup.mdx +39 -0
  52. package/dist/components/buttons/button-group/ButtonGroup.stories.svelte +62 -43
  53. package/dist/components/buttons/button-group/ButtonGroup.stories.svelte.d.ts +2 -17
  54. package/dist/components/buttons/button-group/ButtonGroup.svelte +102 -8
  55. package/dist/components/buttons/button-group/ButtonGroup.svelte.d.ts +6 -7
  56. package/dist/components/buttons/button-group/theme.d.ts +45 -15
  57. package/dist/components/buttons/button-group/theme.js +13 -8
  58. package/dist/components/buttons/button-group/types.d.ts +13 -7
  59. package/dist/components/buttons/connected/ConnectedButtonGroup.mdx +43 -0
  60. package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte +56 -74
  61. package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte.d.ts +2 -17
  62. package/dist/components/buttons/connected/ConnectedButtonGroup.svelte +16 -4
  63. package/dist/components/buttons/connected/ConnectedButtonGroup.svelte.d.ts +4 -4
  64. package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte +35 -8
  65. package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte.d.ts +2 -3
  66. package/dist/components/buttons/connected/theme.d.ts +33 -18
  67. package/dist/components/buttons/connected/theme.js +32 -9
  68. package/dist/components/buttons/connected/types.d.ts +36 -9
  69. package/dist/components/buttons/shapeMorph.d.ts +26 -0
  70. package/dist/components/buttons/shapeMorph.js +142 -0
  71. package/dist/components/buttons/split-button/SplitButton.mdx +48 -0
  72. package/dist/components/buttons/split-button/SplitButton.stories.svelte +9 -14
  73. package/dist/components/buttons/split-button/SplitButton.svelte +65 -48
  74. package/dist/components/buttons/split-button/SplitButton.svelte.d.ts +6 -11
  75. package/dist/components/buttons/split-button/theme.d.ts +110 -17
  76. package/dist/components/buttons/split-button/theme.js +74 -16
  77. package/dist/components/buttons/split-button/types.d.ts +24 -18
  78. package/dist/components/buttons/theme.d.ts +422 -230
  79. package/dist/components/buttons/theme.js +286 -380
  80. package/dist/components/buttons/types.d.ts +130 -125
  81. package/dist/components/cards/Card.mdx +44 -0
  82. package/dist/components/cards/Card.stories.svelte +11 -11
  83. package/dist/components/cards/theme.js +5 -5
  84. package/dist/components/chips/Chip.mdx +68 -0
  85. package/dist/components/chips/Chip.stories.svelte +4 -4
  86. package/dist/components/chips/theme.js +3 -3
  87. package/dist/components/containers/action-rail/ActionRail.stories.svelte +1 -0
  88. package/dist/components/containers/action-rail/theme.js +1 -1
  89. package/dist/components/containers/bottom-sheet/BottomSheet.mdx +64 -0
  90. package/dist/components/containers/bottom-sheet/BottomSheet.stories.svelte +108 -12
  91. package/dist/components/containers/bottom-sheet/BottomSheet.svelte +179 -109
  92. package/dist/components/containers/bottom-sheet/BottomSheet.svelte.d.ts +10 -5
  93. package/dist/components/containers/bottom-sheet/index.d.ts +1 -0
  94. package/dist/components/containers/bottom-sheet/index.js +1 -0
  95. package/dist/components/containers/bottom-sheet/theme.d.ts +45 -0
  96. package/dist/components/containers/bottom-sheet/theme.js +42 -0
  97. package/dist/components/containers/bottom-sheet/types.d.ts +37 -5
  98. package/dist/components/containers/carousel/Carousel.mdx +80 -0
  99. package/dist/components/containers/carousel/Carousel.stories.svelte +131 -0
  100. package/dist/components/containers/carousel/Carousel.stories.svelte.d.ts +4 -0
  101. package/dist/components/containers/carousel/Carousel.svelte +194 -0
  102. package/dist/components/containers/carousel/Carousel.svelte.d.ts +25 -0
  103. package/dist/components/containers/carousel/index.d.ts +3 -0
  104. package/dist/components/containers/{stack → carousel}/index.js +1 -2
  105. package/dist/components/containers/carousel/keylines.d.ts +32 -0
  106. package/dist/components/containers/carousel/keylines.js +88 -0
  107. package/dist/components/containers/carousel/theme.d.ts +162 -0
  108. package/dist/components/containers/carousel/theme.js +67 -0
  109. package/dist/components/containers/carousel/types.d.ts +52 -0
  110. package/dist/components/containers/context-menu/ContextMenu.stories.svelte +1 -0
  111. package/dist/components/containers/context-menu/ContextMenu.svelte +2 -2
  112. package/dist/components/containers/context-menu/ContextMenu.svelte.d.ts +1 -1
  113. package/dist/components/containers/context-menu/theme.js +10 -10
  114. package/dist/components/containers/dialogue/Dialogue.mdx +65 -0
  115. package/dist/components/containers/dialogue/Dialogue.stories.svelte +4 -4
  116. package/dist/components/containers/dialogue/Dialogue.svelte +1 -1
  117. package/dist/components/containers/dialogue/theme.js +3 -3
  118. package/dist/components/containers/divider/Divider.stories.svelte +2 -1
  119. package/dist/components/containers/divider/Divider.svelte +2 -2
  120. package/dist/components/containers/divider/theme.d.ts +6 -6
  121. package/dist/components/containers/divider/theme.js +2 -2
  122. package/dist/components/containers/index.d.ts +1 -1
  123. package/dist/components/containers/index.js +1 -1
  124. package/dist/components/containers/link-preview/theme.js +2 -2
  125. package/dist/components/containers/list/List.svelte +18 -0
  126. package/dist/components/containers/list/List.svelte.d.ts +4 -0
  127. package/dist/components/containers/list/ListItem.mdx +100 -0
  128. package/dist/components/containers/list/ListItem.stories.svelte +177 -42
  129. package/dist/components/containers/list/ListItem.stories.svelte.d.ts +2 -17
  130. package/dist/components/containers/list/ListItem.svelte +92 -37
  131. package/dist/components/containers/list/ListItem.svelte.d.ts +1 -1
  132. package/dist/components/containers/list/context.d.ts +6 -0
  133. package/dist/components/containers/list/context.js +4 -0
  134. package/dist/components/containers/list/index.d.ts +1 -0
  135. package/dist/components/containers/list/index.js +1 -0
  136. package/dist/components/containers/list/theme.d.ts +487 -12
  137. package/dist/components/containers/list/theme.js +140 -13
  138. package/dist/components/containers/list/types.d.ts +39 -5
  139. package/dist/components/containers/menu/Menu.mdx +52 -0
  140. package/dist/components/containers/menu/Menu.stories.svelte +14 -14
  141. package/dist/components/containers/menu/Menu.svelte +1 -1
  142. package/dist/components/containers/menu/MenuGroup.svelte +1 -1
  143. package/dist/components/containers/menu/MenuGroup.svelte.d.ts +1 -1
  144. package/dist/components/containers/menu/menu-item/MenuItem.svelte +1 -1
  145. package/dist/components/containers/menu/theme.js +8 -8
  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.js +129 -45
  158. package/dist/components/containers/pane/types.d.ts +3 -2
  159. package/dist/components/containers/popover/Popover.mdx +45 -0
  160. package/dist/components/containers/popover/Popover.stories.svelte +1 -1
  161. package/dist/components/containers/popover/Popover.svelte +1 -1
  162. package/dist/components/containers/popover/theme.js +3 -3
  163. package/dist/components/containers/scroll-area/theme.js +2 -2
  164. package/dist/components/containers/side-sheet/SideSheet.mdx +71 -0
  165. package/dist/components/containers/side-sheet/SideSheet.stories.svelte +113 -17
  166. package/dist/components/containers/side-sheet/SideSheet.svelte +113 -66
  167. package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +8 -7
  168. package/dist/components/containers/side-sheet/index.d.ts +1 -0
  169. package/dist/components/containers/side-sheet/index.js +1 -0
  170. package/dist/components/containers/side-sheet/theme.d.ts +108 -0
  171. package/dist/components/containers/side-sheet/theme.js +72 -0
  172. package/dist/components/containers/side-sheet/types.d.ts +35 -7
  173. package/dist/components/date/DateField.stories.svelte +4 -3
  174. package/dist/components/date/DateField.svelte +49 -26
  175. package/dist/components/date/DateField.svelte.d.ts +2 -0
  176. package/dist/components/date/DateRangeField.stories.svelte +4 -3
  177. package/dist/components/date/DateRangeField.svelte +54 -31
  178. package/dist/components/date/DateRangeField.svelte.d.ts +2 -0
  179. package/dist/components/date/calendarMotion.d.ts +9 -0
  180. package/dist/components/date/calendarMotion.js +23 -0
  181. package/dist/components/date/theme.d.ts +7 -7
  182. package/dist/components/date/theme.js +34 -30
  183. package/dist/components/forms/checkbox/Checkbox.mdx +35 -0
  184. package/dist/components/forms/checkbox/Checkbox.stories.svelte +2 -2
  185. package/dist/components/forms/checkbox/Checkbox.svelte +1 -1
  186. package/dist/components/forms/checkbox/theme.js +3 -3
  187. package/dist/components/forms/command/Command.stories.svelte +1 -0
  188. package/dist/components/forms/command/theme.js +9 -9
  189. package/dist/components/forms/pin/theme.js +4 -4
  190. package/dist/components/forms/radio-group/RadioGroup.svelte +1 -1
  191. package/dist/components/forms/radio-group/theme.js +5 -5
  192. package/dist/components/forms/search/Search.mdx +38 -0
  193. package/dist/components/forms/search/Search.stories.svelte +19 -9
  194. package/dist/components/forms/search/Search.svelte +40 -17
  195. package/dist/components/forms/search/Search.svelte.d.ts +2 -2
  196. package/dist/components/forms/search/theme.d.ts +45 -12
  197. package/dist/components/forms/search/theme.js +13 -8
  198. package/dist/components/forms/search/types.d.ts +18 -12
  199. package/dist/components/forms/select/Select.mdx +53 -0
  200. package/dist/components/forms/select/Select.stories.svelte +4 -4
  201. package/dist/components/forms/select/Select.svelte +10 -2
  202. package/dist/components/forms/select/SelectItem.svelte +1 -1
  203. package/dist/components/forms/select/theme.js +12 -12
  204. package/dist/components/forms/slider/Slider.mdx +85 -0
  205. package/dist/components/forms/slider/Slider.stories.svelte +7 -7
  206. package/dist/components/forms/slider/Slider.svelte +46 -28
  207. package/dist/components/forms/slider/theme.d.ts +14 -0
  208. package/dist/components/forms/slider/theme.js +28 -17
  209. package/dist/components/forms/slider/types.d.ts +3 -2
  210. package/dist/components/forms/switch/Switch.mdx +38 -0
  211. package/dist/components/forms/switch/Switch.stories.svelte +3 -3
  212. package/dist/components/forms/switch/theme.js +6 -6
  213. package/dist/components/forms/textfield/Textfield.mdx +53 -0
  214. package/dist/components/forms/textfield/Textfield.stories.svelte +6 -6
  215. package/dist/components/forms/textfield/Textfield.svelte +1 -0
  216. package/dist/components/forms/textfield/theme.d.ts +3 -0
  217. package/dist/components/forms/textfield/theme.js +22 -19
  218. package/dist/components/forms/toggle-group/theme.js +2 -2
  219. package/dist/components/forms/tooltip/Tooltip.stories.svelte +1 -0
  220. package/dist/components/forms/tooltip/theme.js +3 -3
  221. package/dist/components/misc/Avatar.stories.svelte +5 -4
  222. package/dist/components/misc/ThemeSettings.svelte +9 -9
  223. package/dist/components/misc/ThemeSwitcher.svelte +3 -3
  224. package/dist/components/misc/theme.js +4 -4
  225. package/dist/components/nav/appbar/AppBar.mdx +71 -0
  226. package/dist/components/nav/appbar/AppBar.stories.svelte +93 -3
  227. package/dist/components/nav/appbar/AppBar.stories.svelte.d.ts +2 -17
  228. package/dist/components/nav/appbar/AppBar.svelte +90 -37
  229. package/dist/components/nav/appbar/AppBar.svelte.d.ts +9 -2
  230. package/dist/components/nav/appbar/theme.d.ts +85 -18
  231. package/dist/components/nav/appbar/theme.js +159 -23
  232. package/dist/components/nav/appbar/types.d.ts +46 -9
  233. package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte +1 -0
  234. package/dist/components/nav/breadcrumb/theme.js +5 -5
  235. package/dist/components/nav/navbar/Navbar.mdx +38 -0
  236. package/dist/components/nav/navbar/Navbar.svelte +1 -1
  237. package/dist/components/nav/navbar/NavbarItem.svelte +12 -9
  238. package/dist/components/nav/navbar/theme.js +6 -6
  239. package/dist/components/nav/rail/Rail.mdx +73 -0
  240. package/dist/components/nav/rail/Rail.stories.svelte +3 -7
  241. package/dist/components/nav/rail/Rail.svelte +1 -0
  242. package/dist/components/nav/rail/RailItem.svelte +12 -9
  243. package/dist/components/nav/rail/theme.js +13 -13
  244. package/dist/components/nav/rail/types.d.ts +4 -1
  245. package/dist/components/nav/tabs/TabHolder.svelte +29 -3
  246. package/dist/components/nav/tabs/TabHolder.svelte.d.ts +3 -1
  247. package/dist/components/nav/tabs/Tabs.mdx +62 -0
  248. package/dist/components/nav/tabs/Tabs.stories.svelte +1 -1
  249. package/dist/components/nav/tabs/theme.js +4 -4
  250. package/dist/components/pill/Pill.mdx +32 -0
  251. package/dist/components/pill/Pill.stories.svelte +1 -1
  252. package/dist/components/pill/theme.d.ts +1 -1
  253. package/dist/components/pill/theme.js +1 -1
  254. package/dist/components/progress/LinearProgress.svelte +1 -1
  255. package/dist/components/progress/Progress.mdx +50 -0
  256. package/dist/components/progress/Progress.stories.svelte +6 -6
  257. package/dist/components/snackbar/Snackbar.mdx +52 -0
  258. package/dist/components/snackbar/Snackbar.stories.svelte +5 -5
  259. package/dist/components/snackbar/Snackbar.svelte +1 -1
  260. package/dist/components/snackbar/theme.d.ts +3 -3
  261. package/dist/components/snackbar/theme.js +4 -4
  262. package/dist/components/table/Table.stories.svelte +1 -0
  263. package/dist/components/table/TableHeader.svelte +1 -1
  264. package/dist/components/table/theme.js +3 -3
  265. package/dist/components/time/TimeField.stories.svelte +3 -2
  266. package/dist/components/time/TimeField.svelte +14 -8
  267. package/dist/components/time/TimeField.svelte.d.ts +6 -0
  268. package/dist/components/time/TimepickerInput.svelte +9 -5
  269. package/dist/components/time/theme.js +5 -5
  270. package/dist/components/time/types.d.ts +11 -1
  271. package/dist/components/toolbar/Toolbar.stories.svelte +1 -0
  272. package/dist/components/toolbar/Toolbar.svelte +1 -1
  273. package/dist/components/toolbar/Toolbar.svelte.d.ts +1 -1
  274. package/dist/components/toolbar/theme.js +14 -14
  275. package/dist/components/typography/Typography.mdx +67 -0
  276. package/dist/components/typography/body/Body.stories.svelte +2 -1
  277. package/dist/components/typography/body/theme.d.ts +15 -12
  278. package/dist/components/typography/body/theme.js +19 -4
  279. package/dist/components/typography/body/types.d.ts +2 -1
  280. package/dist/components/typography/display/Display.stories.svelte +2 -1
  281. package/dist/components/typography/display/theme.d.ts +15 -12
  282. package/dist/components/typography/display/theme.js +19 -4
  283. package/dist/components/typography/display/types.d.ts +2 -1
  284. package/dist/components/typography/headline/Headline.stories.svelte +2 -1
  285. package/dist/components/typography/headline/theme.d.ts +15 -12
  286. package/dist/components/typography/headline/theme.js +19 -4
  287. package/dist/components/typography/headline/types.d.ts +2 -1
  288. package/dist/components/typography/kbd/Kbd.stories.svelte +2 -1
  289. package/dist/components/typography/kbd/theme.d.ts +4 -4
  290. package/dist/components/typography/kbd/theme.js +2 -2
  291. package/dist/components/typography/label/Label.stories.svelte +2 -1
  292. package/dist/components/typography/label/theme.d.ts +15 -12
  293. package/dist/components/typography/label/theme.js +19 -4
  294. package/dist/components/typography/label/types.d.ts +2 -1
  295. package/dist/components/typography/title/Title.stories.svelte +2 -1
  296. package/dist/components/typography/title/theme.d.ts +15 -12
  297. package/dist/components/typography/title/theme.js +19 -4
  298. package/dist/components/typography/title/types.d.ts +2 -1
  299. package/dist/index.css +1 -0
  300. package/dist/styles/component.css +78 -175
  301. package/dist/styles/elevation.css +9 -0
  302. package/dist/styles/spacing.css +29 -0
  303. package/dist/styles/typescale.css +635 -20
  304. package/dist/utils/Layer.svelte +1 -1
  305. package/dist/utils/icon/Icon.svelte +8 -6
  306. package/dist/utils/icon/loadingShapes.js +11 -10
  307. package/package.json +19 -15
  308. package/dist/components/containers/stack/HStack.svelte +0 -23
  309. package/dist/components/containers/stack/HStack.svelte.d.ts +0 -5
  310. package/dist/components/containers/stack/VStack.svelte +0 -23
  311. package/dist/components/containers/stack/VStack.svelte.d.ts +0 -5
  312. package/dist/components/containers/stack/index.d.ts +0 -4
  313. package/dist/components/containers/stack/theme.d.ts +0 -66
  314. package/dist/components/containers/stack/theme.js +0 -26
  315. package/dist/components/containers/stack/types.d.ts +0 -12
  316. /package/dist/components/containers/{stack → carousel}/types.js +0 -0
@@ -4,15 +4,18 @@ Material 3 Tabs container.
4
4
 
5
5
  Wraps bits-ui Tabs.Root + Tabs.List and renders a sliding active indicator.
6
6
  Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
7
+ Switching panels runs the M3 lateral transition: the new panel pushes the old one out in the
8
+ direction of the selected tab.
7
9
 
8
10
  @see https://m3.material.io/components/tabs/overview
9
11
  -->
10
12
  <script lang="ts">
13
+ import { lateral } from '../../../animation/index.js';
11
14
  import { tabHolder } from './theme.js';
12
15
  import type { TabHolderProps } from './types.js';
13
16
  import Tab from './Tab.svelte';
14
17
  import { Tabs } from 'bits-ui';
15
- import type { Snippet } from 'svelte';
18
+ import { tick, type Snippet } from 'svelte';
16
19
 
17
20
  let {
18
21
  items,
@@ -27,9 +30,28 @@ Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
27
30
  const idx = $derived(items.findIndex((i) => i.value === value));
28
31
  const count = $derived(items.length);
29
32
  const { base, bar } = $derived(tabHolder({ rounded }));
33
+
34
+ let panels = $state<HTMLElement>();
35
+
36
+ /**
37
+ * Tabs are peers, so switching panels is the M3 lateral transition: the new panel pushes the
38
+ * old one out toward the side of the newly selected tab. Navigation (href) tabs have no panels
39
+ * here — the route change is the app's to animate.
40
+ * https://m3.material.io/styles/motion/transitions/transition-patterns#lateral
41
+ */
42
+ const select = (next: string) => {
43
+ const from = idx;
44
+ const to = items.findIndex((i) => i.value === next);
45
+ const update = async () => {
46
+ value = next;
47
+ await tick();
48
+ };
49
+ if (!children || !panels || from === -1 || to === -1 || from === to) return void update();
50
+ lateral(update, { target: panels, direction: to > from ? 'forward' : 'backward' });
51
+ };
30
52
  </script>
31
53
 
32
- <Tabs.Root bind:value {onValueChange} {activationMode}>
54
+ <Tabs.Root bind:value={() => value, select} {onValueChange} {activationMode}>
33
55
  <Tabs.List class={base()}>
34
56
  {#each items as item (item)}
35
57
  <Tab {...item} {variant} />
@@ -41,5 +63,9 @@ Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
41
63
  ></div>
42
64
  </Tabs.List>
43
65
 
44
- {@render children?.()}
66
+ {#if children}
67
+ <div bind:this={panels}>
68
+ {@render children()}
69
+ </div>
70
+ {/if}
45
71
  </Tabs.Root>
@@ -1,5 +1,5 @@
1
1
  import type { TabHolderProps } from './types.js';
2
- import type { Snippet } from 'svelte';
2
+ import { type Snippet } from 'svelte';
3
3
  type $$ComponentProps = TabHolderProps & {
4
4
  children?: Snippet;
5
5
  };
@@ -8,6 +8,8 @@ type $$ComponentProps = TabHolderProps & {
8
8
  *
9
9
  * Wraps bits-ui Tabs.Root + Tabs.List and renders a sliding active indicator.
10
10
  * Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
11
+ * Switching panels runs the M3 lateral transition: the new panel pushes the old one out in the
12
+ * direction of the selected tab.
11
13
  *
12
14
  * @see https://m3.material.io/components/tabs/overview
13
15
  */
@@ -0,0 +1,62 @@
1
+ import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
+ import * as TabsStories from './Tabs.stories.svelte';
3
+
4
+ <Meta of={TabsStories} />
5
+
6
+ <Title />
7
+
8
+ <Subtitle>Tabs organise related content across views at the same level.</Subtitle>
9
+
10
+ [M3 spec](https://m3.material.io/components/tabs/specs) ·
11
+ `import { TabHolder, TabContent } from '@noxlovette/material';`
12
+
13
+ <Canvas of={TabsStories.Playground} />
14
+
15
+ <Controls of={TabsStories.Playground} />
16
+
17
+ ## Anatomy
18
+
19
+ - **`TabHolder`** renders the tab row from an `items` array, plus the sliding active indicator.
20
+ - **`Tab`** is one trigger, rendered by `TabHolder` for each item: an `<a>` when the item has
21
+ `href`, a `<button>` otherwise.
22
+ - **`TabContent`** is the panel matched to a tab by `value`, for content tabs only.
23
+
24
+ ## Content tabs
25
+
26
+ Give each item a `value` and a matching `TabContent`:
27
+
28
+ ```svelte
29
+ <TabHolder
30
+ bind:value
31
+ items={[
32
+ { value: 'flights', name: 'Flights', iconProps: { name: 'flight' } },
33
+ { value: 'trips', name: 'Trips', iconProps: { name: 'luggage' } }
34
+ ]}
35
+ />
36
+
37
+ <TabContent value="flights">Flights panel</TabContent>
38
+ <TabContent value="trips">Trips panel</TabContent>
39
+ ```
40
+
41
+ ## Navigation tabs
42
+
43
+ Give each item an `href` instead of a `value`, and leave out `TabContent`. The tabs then route
44
+ between pages.
45
+
46
+ <Canvas of={TabsStories.NavigationTabsHref} />
47
+
48
+ ## Motion
49
+
50
+ Tabs are peers, so switching panels runs the M3 lateral transition: the new panel pushes the old
51
+ one out toward the selected tab's side. The indicator slides on the fast spatial spring. Nothing
52
+ needs configuring.
53
+
54
+ Navigation tabs have no panels inside `TabHolder`, so animate the route change yourself with
55
+ `lateral()` from `@noxlovette/material`.
56
+
57
+ ## Accessibility
58
+
59
+ - **Keyboard.** Arrow keys move between tabs. With `activationMode="automatic"`, focus selects;
60
+ with `manual`, Enter or Space does.
61
+ - **Selection.** The active tab gets `aria-selected`; the indicator is decoration.
62
+ - **Disabled tabs** are skipped by the arrow keys.
@@ -32,7 +32,7 @@
32
32
 
33
33
  <Story name="Playground">
34
34
  {#snippet template(args)}
35
- <div class="flex flex-col gap-4">
35
+ <div class="gap-spacing-200 flex flex-col">
36
36
  <TabHolder {...args} {items}>
37
37
  <TabContent value="flights"><Body>Flights panel content.</Body></TabContent>
38
38
  <TabContent value="trips"><Body>Trips panel content.</Body></TabContent>
@@ -2,7 +2,7 @@ import { tv } from 'tailwind-variants';
2
2
  export const tabHolder = tv({
3
3
  slots: {
4
4
  base: 'relative flex w-full bg-md-sys-color-surface',
5
- bar: 'absolute bottom-0 h-[3px] rounded-t-full bg-md-sys-color-primary transition-transform md-sys-motion-fast-spatial'
5
+ bar: 'absolute bottom-spacing-0 h-[3px] rounded-t-full bg-md-sys-color-primary transition-transform md-sys-motion-fast-spatial'
6
6
  },
7
7
  variants: {
8
8
  rounded: {
@@ -19,15 +19,15 @@ export const tab = tv({
19
19
  'data-[state=inactive]:text-md-sys-color-on-surface-variant'
20
20
  ].join(' '),
21
21
  label: 'md-sys-typescale-title-small',
22
- icon: 'size-6 text-[24px]'
22
+ icon: 'size-spacing-300 text-[24px]'
23
23
  },
24
24
  variants: {
25
25
  variant: {
26
26
  primary: {
27
- base: 'h-16 gap-1 py-3'
27
+ base: 'h-spacing-800 gap-spacing-50 py-spacing-150'
28
28
  },
29
29
  secondary: {
30
- base: 'h-12 py-3',
30
+ base: 'h-spacing-600 py-spacing-150',
31
31
  icon: 'hidden'
32
32
  }
33
33
  },
@@ -0,0 +1,32 @@
1
+ import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
+ import * as PillStories from './Pill.stories.svelte';
3
+
4
+ <Meta of={PillStories} />
5
+
6
+ <Title />
7
+
8
+ <Subtitle>A small rounded label for short static text: a status, a count, a category.</Subtitle>
9
+
10
+ `import { Pill } from '@noxlovette/material';`
11
+
12
+ <Canvas of={PillStories.Playground} />
13
+
14
+ <Controls of={PillStories.Playground} />
15
+
16
+ ## Pill or Chip
17
+
18
+ `Pill` is not an M3 component. It renders a plain `<div>` with no click handler, remove button or
19
+ selected state. For anything the user interacts with, use `Chip`, which implements M3 chips.
20
+
21
+ ## Variants
22
+
23
+ The system variants (`primary`, `secondary-container`, and so on) use M3 color roles, so they
24
+ follow the theme. `yellow` and `green` are fixed colors for status labels like "New" or "Beta"
25
+ that should look the same in every theme.
26
+
27
+ <Canvas of={PillStories.Variants} />
28
+
29
+ ## Accessibility
30
+
31
+ - **Not a control.** A pill has no role and isn't focusable, so never make one clickable.
32
+ - **Contrast.** Each system variant pairs a container with its `on-*` role.
@@ -32,7 +32,7 @@
32
32
  <Story name="Playground">New</Story>
33
33
 
34
34
  <Story name="Variants" asChild>
35
- <div class="flex flex-wrap items-center gap-3 p-6">
35
+ <div class="gap-spacing-150 p-spacing-300 flex flex-wrap items-center">
36
36
  <Pill variant="primary">Primary</Pill>
37
37
  <Pill variant="secondary">Secondary</Pill>
38
38
  <Pill variant="tertiary">Tertiary</Pill>
@@ -14,7 +14,7 @@ export declare const pill: import("tailwind-variants").TVReturnType<{
14
14
  yellow: "bg-yellow-400 text-yellow-950 dark:bg-yellow-300 dark:text-yellow-950";
15
15
  green: "bg-green-600 text-white dark:bg-green-500 dark:text-green-950";
16
16
  };
17
- }, undefined, "relative inline-flex items-center justify-center px-4 py-1.5 md-sys-typescale-label-large select-none rounded-full whitespace-nowrap", {
17
+ }, undefined, "relative inline-flex items-center justify-center px-spacing-200 py-spacing-75 md-sys-typescale-label-large select-none rounded-full whitespace-nowrap", {
18
18
  variant: {
19
19
  primary: "md-component-button-filled-primary";
20
20
  secondary: "md-component-button-filled-secondary";
@@ -1,6 +1,6 @@
1
1
  import { tv } from 'tailwind-variants';
2
2
  export const pill = tv({
3
- base: 'relative inline-flex items-center justify-center px-4 py-1.5 md-sys-typescale-label-large select-none rounded-full whitespace-nowrap',
3
+ base: 'relative inline-flex items-center justify-center px-spacing-200 py-spacing-75 md-sys-typescale-label-large select-none rounded-full whitespace-nowrap',
4
4
  variants: {
5
5
  variant: {
6
6
  primary: 'md-component-button-filled-primary',
@@ -35,7 +35,7 @@ The track always keeps a gap either side of the bar.
35
35
  const linearProgress = tv({
36
36
  slots: {
37
37
  container: 'relative overflow-hidden',
38
- segment: 'absolute inset-y-0 rounded-full',
38
+ segment: 'absolute inset-y-spacing-0 rounded-full',
39
39
  bar: 'bg-md-sys-color-primary',
40
40
  track: 'bg-md-sys-color-secondary-container'
41
41
  }
@@ -0,0 +1,50 @@
1
+ import { Meta, Title, Subtitle, Canvas } from '@storybook/addon-docs/blocks';
2
+ import * as ProgressStories from './Progress.stories.svelte';
3
+
4
+ <Meta of={ProgressStories} />
5
+
6
+ <Title />
7
+
8
+ <Subtitle>Progress indicators show the status of an ongoing process.</Subtitle>
9
+
10
+ [M3 spec](https://m3.material.io/components/progress-indicators/specs) ·
11
+ `import { CircularProgress, LinearProgress, WavyLinearProgress } from '@noxlovette/material';`
12
+
13
+ ## Three components
14
+
15
+ There's no shared `variant` prop. Pick the component for the shape you need:
16
+
17
+ - **`CircularProgress`** and **`LinearProgress`** are M3's circular and linear indicators.
18
+ - **`WavyLinearProgress`** is this library's own sine-wave linear indicator, inspired by M3
19
+ Expressive but not a literal reproduction of the spec.
20
+
21
+ All three take the same `percent`: a number from 0 to 100 for a determinate indicator, or
22
+ omitted (or `null`) for an indeterminate one.
23
+
24
+ ```svelte
25
+ <CircularProgress percent={uploadPercent} />
26
+ <LinearProgress percent={uploadPercent} class="w-full" />
27
+
28
+ <!-- Indeterminate: omit percent -->
29
+ <CircularProgress />
30
+ ```
31
+
32
+ <Canvas of={ProgressStories.CircularDeterminate} />
33
+
34
+ <Canvas of={ProgressStories.CircularIndeterminate} />
35
+
36
+ <Canvas of={ProgressStories.LinearDeterminate} />
37
+
38
+ <Canvas of={ProgressStories.WavyDeterminate} />
39
+
40
+ ## Motion
41
+
42
+ A determinate indicator springs to each new `percent` on a critically damped spring, so progress
43
+ never visibly runs backwards. Indeterminate indicators animate continuously.
44
+
45
+ ## Accessibility
46
+
47
+ - **Role.** Each renders `role="progressbar"`, with `aria-valuenow` set from `percent` and left
48
+ out when indeterminate.
49
+ - **Label.** None of them says what is loading. Give each an `aria-label`, or put visible text
50
+ next to it.
@@ -23,42 +23,42 @@
23
23
 
24
24
  <Story name="Circular (Determinate)">
25
25
  {#snippet template(args)}
26
- <div class="flex items-center justify-center p-6">
26
+ <div class="p-spacing-300 flex items-center justify-center">
27
27
  <CircularProgress percent={args.percent} />
28
28
  </div>
29
29
  {/snippet}
30
30
  </Story>
31
31
 
32
32
  <Story name="Circular (Indeterminate)" asChild>
33
- <div class="flex items-center justify-center p-6">
33
+ <div class="p-spacing-300 flex items-center justify-center">
34
34
  <CircularProgress />
35
35
  </div>
36
36
  </Story>
37
37
 
38
38
  <Story name="Linear (Determinate)">
39
39
  {#snippet template(args)}
40
- <div class="flex items-center p-6">
40
+ <div class="p-spacing-300 flex items-center">
41
41
  <LinearProgress percent={args.percent} class="w-full max-w-sm" />
42
42
  </div>
43
43
  {/snippet}
44
44
  </Story>
45
45
 
46
46
  <Story name="Linear (Indeterminate)" asChild>
47
- <div class="flex items-center p-6">
47
+ <div class="p-spacing-300 flex items-center">
48
48
  <LinearProgress class="w-full max-w-sm" />
49
49
  </div>
50
50
  </Story>
51
51
 
52
52
  <Story name="Wavy (Determinate)">
53
53
  {#snippet template(args)}
54
- <div class="flex items-center p-6">
54
+ <div class="p-spacing-300 flex items-center">
55
55
  <WavyLinearProgress percent={args.percent} class="w-full max-w-sm" />
56
56
  </div>
57
57
  {/snippet}
58
58
  </Story>
59
59
 
60
60
  <Story name="Wavy (Indeterminate)" asChild>
61
- <div class="flex items-center p-6">
61
+ <div class="p-spacing-300 flex items-center">
62
62
  <WavyLinearProgress class="w-full max-w-sm" />
63
63
  </div>
64
64
  </Story>
@@ -0,0 +1,52 @@
1
+ import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
+ import * as SnackbarStories from './Snackbar.stories.svelte';
3
+
4
+ <Meta of={SnackbarStories} />
5
+
6
+ <Title />
7
+
8
+ <Subtitle>
9
+ Snackbars show a brief message about an app process at the bottom of the screen.
10
+ </Subtitle>
11
+
12
+ [M3 spec](https://m3.material.io/components/snackbar/specs) ·
13
+ `import { Snackbar } from '@noxlovette/material';`
14
+
15
+ <Canvas of={SnackbarStories.Playground} />
16
+
17
+ <Controls of={SnackbarStories.Playground} />
18
+
19
+ ## Showing a snackbar
20
+
21
+ There's no `toast()` function or queue. Mount one `Snackbar`, bind its `message`, and assign to
22
+ that state to show it:
23
+
24
+ ```svelte
25
+ <script lang="ts">
26
+ import { Snackbar } from '@noxlovette/material';
27
+
28
+ let snackbarMessage = $state('');
29
+ </script>
30
+
31
+ <button onclick={() => (snackbarMessage = 'Changes saved.')}>Save</button>
32
+
33
+ <Snackbar bind:message={snackbarMessage} label="Undo" callback={undoSave} />
34
+ ```
35
+
36
+ When `message` becomes non-empty (a string or a snippet), the snackbar slides in. After 4
37
+ seconds it hides and resets a string `message` to `''`, so the same text can be shown again. With
38
+ `static`, it stays until the user closes it.
39
+
40
+ `label` and `callback` add an action button.
41
+
42
+ <Canvas of={SnackbarStories.Triggered} />
43
+
44
+ <Canvas of={SnackbarStories.WithAction} />
45
+
46
+ ## Accessibility
47
+
48
+ - **Timing.** A non-static snackbar disappears on its own, so never make it the only place
49
+ critical information appears.
50
+ - **Dismiss.** `showClose` (on by default) renders a close button labelled "Dismiss snackbar".
51
+ - **One at a time.** Mount one snackbar per region and drive it through one binding; stacking
52
+ instances isn't supported.
@@ -9,10 +9,6 @@
9
9
  <script module lang="ts">
10
10
  import { defineMeta } from '@storybook/addon-svelte-csf';
11
11
  import Snackbar from './Snackbar.svelte';
12
- </script>
13
-
14
- <script lang="ts">
15
- import Button from '../buttons/Button.svelte';
16
12
 
17
13
  const { Story } = defineMeta({
18
14
  title: 'Feedback/Snackbar',
@@ -28,6 +24,10 @@
28
24
  static: false
29
25
  }
30
26
  });
27
+ </script>
28
+
29
+ <script lang="ts">
30
+ import Button from '../buttons/Button.svelte';
31
31
 
32
32
  let playgroundMessage = $state('This is a snackbar message.');
33
33
  let triggeredMessage = $state('');
@@ -50,7 +50,7 @@
50
50
  </Story>
51
51
 
52
52
  <Story name="Triggered" asChild>
53
- <div class="relative flex min-h-32 flex-col items-center justify-center gap-4">
53
+ <div class="gap-spacing-200 relative flex min-h-32 flex-col items-center justify-center">
54
54
  <Button
55
55
  variant="tonal"
56
56
  onclick={() => {
@@ -88,7 +88,7 @@ Snackbars provide brief messages about app processes at the bottom of the screen
88
88
 
89
89
  {#if showClose}
90
90
  <button
91
- class="relative rounded-full p-1"
91
+ class="p-spacing-50 relative rounded-full"
92
92
  onclick={() => {
93
93
  dismissed = true;
94
94
  if (typeof message === 'string') {
@@ -2,7 +2,7 @@ import { type VariantProps } from 'tailwind-variants';
2
2
  export type SnackBarVariants = VariantProps<typeof snackbar>;
3
3
  export declare const snackbar: import("tailwind-variants").TVReturnType<{
4
4
  fixed: {
5
- true: "fixed bottom-20 md:bottom-6 left-1/2 -translate-x-1/2";
5
+ true: "fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2";
6
6
  false: "";
7
7
  };
8
8
  }, {
@@ -13,7 +13,7 @@ export declare const snackbar: import("tailwind-variants").TVReturnType<{
13
13
  icon: string;
14
14
  }, undefined, {
15
15
  fixed: {
16
- true: "fixed bottom-20 md:bottom-6 left-1/2 -translate-x-1/2";
16
+ true: "fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2";
17
17
  false: "";
18
18
  };
19
19
  }, {
@@ -24,7 +24,7 @@ export declare const snackbar: import("tailwind-variants").TVReturnType<{
24
24
  icon: string;
25
25
  }, import("tailwind-variants").TVReturnTypeLike<{
26
26
  fixed: {
27
- true: "fixed bottom-20 md:bottom-6 left-1/2 -translate-x-1/2";
27
+ true: "fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2";
28
28
  false: "";
29
29
  };
30
30
  }, {
@@ -1,15 +1,15 @@
1
1
  import { tv } from 'tailwind-variants';
2
2
  export const snackbar = tv({
3
3
  slots: {
4
- base: 'rounded-xs relative min-h-12 md:max-h-17 flex z-[100] items-center bg-md-sys-color-inverse-surface shadow-elevation-3 pr-2 pl-4 justify-between h-max py-3',
5
- label: 'text-md-sys-color-inverse-primary md-sys-typescale-label-large px-3 cursor-pointer ',
4
+ base: 'rounded-xs relative min-h-spacing-600 md:max-h-17 flex z-[100] items-center bg-md-sys-color-inverse-surface shadow-elevation-3 pr-spacing-100 pl-spacing-200 justify-between h-max py-spacing-150',
5
+ label: 'text-md-sys-color-inverse-primary md-sys-typescale-label-large px-spacing-150 cursor-pointer ',
6
6
  actionWrapper: 'flex items-center z-40',
7
7
  supportingText: 'text-md-sys-color-inverse-on-surface md-sys-typescale-body-medium max-w-[60ch] ',
8
- icon: 'size-6 text-[24px] text-md-sys-color-inverse-on-surface mr-1 ml-3'
8
+ icon: 'size-spacing-300 text-[24px] text-md-sys-color-inverse-on-surface mr-spacing-50 ml-spacing-150'
9
9
  },
10
10
  variants: {
11
11
  fixed: {
12
- true: 'fixed bottom-20 md:bottom-6 left-1/2 -translate-x-1/2',
12
+ true: 'fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2',
13
13
  false: ''
14
14
  }
15
15
  }
@@ -11,6 +11,7 @@
11
11
 
12
12
  const { Story } = defineMeta({
13
13
  title: 'Table/Table',
14
+ tags: ['autodocs'],
14
15
  component: Table,
15
16
  argTypes: {
16
17
  rounded: { control: 'boolean' }
@@ -25,7 +25,7 @@ and `sortDirection` props. Defaults to `scope="col"`.
25
25
  </script>
26
26
 
27
27
  <th {scope} class={header({ class: clsx(className) })} {...restProps}>
28
- <span class="inline-flex items-center gap-1">
28
+ <span class="gap-spacing-50 inline-flex items-center">
29
29
  {@render children?.()}
30
30
  {#if sortable}
31
31
  <span
@@ -6,8 +6,8 @@ export const table = tv({
6
6
  body: '[&_tr:last-child]:border-b-0',
7
7
  foot: 'border-t border-md-sys-color-outline-variant',
8
8
  row: 'border-b border-md-sys-color-outline-variant transition-colors md-sys-motion-fast-effects focus-visible:outline focus-visible:-outline-offset-2 focus-visible:outline-md-sys-color-primary',
9
- cell: 'px-4 py-3 align-middle',
10
- header: 'px-4 py-4 align-middle md-sys-typescale-label-large text-md-sys-color-on-surface font-medium whitespace-nowrap'
9
+ cell: 'px-spacing-200 py-spacing-150 align-middle',
10
+ header: 'px-spacing-200 py-spacing-200 align-middle md-sys-typescale-label-large text-md-sys-color-on-surface whitespace-nowrap'
11
11
  },
12
12
  variants: {
13
13
  hoverable: {
@@ -43,7 +43,7 @@ export const table = tv({
43
43
  },
44
44
  sticky: {
45
45
  true: {
46
- head: 'sticky top-0 z-10 bg-md-sys-color-surface-container-high shadow-[0_1px_0_0_var(--md-sys-color-outline-variant)]'
46
+ head: 'sticky top-spacing-0 z-10 bg-md-sys-color-surface-container-high shadow-[0_1px_0_0_var(--md-sys-color-outline-variant)]'
47
47
  }
48
48
  }
49
49
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  const { Story } = defineMeta({
11
11
  title: 'Time/TimeField',
12
+ tags: ['autodocs'],
12
13
  component: TimeField,
13
14
  argTypes: {
14
15
  label: { control: 'text' },
@@ -28,14 +29,14 @@
28
29
 
29
30
  <Story name="Playground">
30
31
  {#snippet template(args)}
31
- <div class="max-w-xs p-8">
32
+ <div class="p-spacing-400 max-w-xs">
32
33
  <TimeField {...args} />
33
34
  </div>
34
35
  {/snippet}
35
36
  </Story>
36
37
 
37
38
  <Story name="Near Bottom Edge" asChild>
38
- <div class="flex min-h-dvh max-w-xs flex-col justify-end p-8">
39
+ <div class="p-spacing-400 flex min-h-dvh max-w-xs flex-col justify-end">
39
40
  <TimeField label="Time" value="18:45" />
40
41
  </div>
41
42
  </Story>
@@ -11,9 +11,11 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
11
11
  import Textfield from '../forms/textfield/Textfield.svelte';
12
12
  import TimepickerInput from './TimepickerInput.svelte';
13
13
  import { Popover } from 'bits-ui';
14
+ import type { Snippet } from 'svelte';
15
+ import type { TimepickerLabels } from './types.js';
14
16
 
15
17
  let {
16
- label = 'Время',
18
+ label = 'Time',
17
19
  value = $bindable(),
18
20
  required = false,
19
21
  disabled = false,
@@ -21,6 +23,8 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
21
23
  datePickerTitle = 'Pick date',
22
24
  name,
23
25
  leadingIconProps,
26
+ supportingText,
27
+ pickerLabels,
24
28
  ...restProps
25
29
  }: {
26
30
  /** The label for the text field. */
@@ -39,6 +43,10 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
39
43
  datePickerTitle?: string;
40
44
  /** Props for the leading icon. */
41
45
  leadingIconProps?: any;
46
+ /** Supporting text under the field. */
47
+ supportingText?: Snippet;
48
+ /** Headline, input and button strings for the picker overlay (English by default). */
49
+ pickerLabels?: TimepickerLabels;
42
50
  } & HTMLInputAttributes = $props();
43
51
 
44
52
  const id = $props.id();
@@ -58,21 +66,18 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
58
66
  {error}
59
67
  {leadingIconProps}
60
68
  class="pointer-events-none"
61
- trailingIconProps={{ name: 'timer' }}
69
+ trailingIconProps={{ name: 'schedule' }}
62
70
  trailingOnClick={() => !disabled && (picker = !picker)}
71
+ {supportingText}
63
72
  {...restProps as any}
64
- >
65
- {#snippet supportingText()}
66
- ЧЧ-ММ
67
- {/snippet}
68
- </Textfield>
73
+ />
69
74
 
70
75
  <Popover.Trigger {disabled}>
71
76
  {#snippet child({ props })}
72
77
  <button
73
78
  {...props}
74
79
  title="time-overlay"
75
- class="absolute inset-0 cursor-pointer disabled:cursor-not-allowed"
80
+ class="inset-spacing-0 absolute cursor-pointer disabled:cursor-not-allowed"
76
81
  type="button"
77
82
  data-cy="calendar-time-toggle"
78
83
  ></button>
@@ -100,6 +105,7 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
100
105
  {@attach presence(() => open, enterExit.scale)}
101
106
  >
102
107
  <TimepickerInput
108
+ {...pickerLabels}
103
109
  time={value}
104
110
  close={() => (picker = false)}
105
111
  setTime={(t) => (value = t)}
@@ -1,4 +1,6 @@
1
1
  import type { HTMLInputAttributes } from 'svelte/elements';
2
+ import type { Snippet } from 'svelte';
3
+ import type { TimepickerLabels } from './types.js';
2
4
  type $$ComponentProps = {
3
5
  /** The label for the text field. */
4
6
  label?: string;
@@ -16,6 +18,10 @@ type $$ComponentProps = {
16
18
  datePickerTitle?: string;
17
19
  /** Props for the leading icon. */
18
20
  leadingIconProps?: any;
21
+ /** Supporting text under the field. */
22
+ supportingText?: Snippet;
23
+ /** Headline, input and button strings for the picker overlay (English by default). */
24
+ pickerLabels?: TimepickerLabels;
19
25
  } & HTMLInputAttributes;
20
26
  /**
21
27
  * TimeField component provides a text input that opens a Timepicker overlay when interacted with.