@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
@@ -9,16 +9,16 @@ export const avatar = tv({
9
9
  variants: {
10
10
  size: {
11
11
  xxs: {
12
- root: 'size-5'
12
+ root: 'size-spacing-250'
13
13
  },
14
14
  xs: {
15
- root: 'size-8'
15
+ root: 'size-spacing-400'
16
16
  },
17
17
  sm: {
18
- root: 'size-12'
18
+ root: 'size-spacing-600'
19
19
  },
20
20
  md: {
21
- root: 'size-18'
21
+ root: 'size-spacing-900'
22
22
  },
23
23
  lg: {
24
24
  root: 'size-24'
@@ -0,0 +1,71 @@
1
+ import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
+ import * as AppBarStories from './AppBar.stories.svelte';
3
+ import * as BreadcrumbStories from '../breadcrumb/Breadcrumb.stories.svelte';
4
+
5
+ <Meta of={AppBarStories} />
6
+
7
+ <Title />
8
+
9
+ <Subtitle>Top app bars show the screen's title, navigation, and actions.</Subtitle>
10
+
11
+ [M3 spec](https://m3.material.io/components/app-bars/specs) ·
12
+ `import { AppBar } from '@noxlovette/material';`
13
+
14
+ <Canvas of={AppBarStories.Playground} />
15
+
16
+ <Controls of={AppBarStories.Playground} />
17
+
18
+ ## Two kinds of bar
19
+
20
+ The props form a union, so the bar is one of two kinds:
21
+
22
+ - **Titled bar.** Pass `title`. `size` is `small` (64dp, one line), or the Expressive `medium` or
23
+ `large` flexible bars, whose headline wraps and grows. `size` is responsive: pass
24
+ `{ small: 'small', large: 'large' }` to grow the bar on wider windows. The switch happens in CSS,
25
+ so server rendering needs no JS.
26
+ - **Search bar.** Pass `search` (the hint text) instead. The bar is always 64dp. `title` then
27
+ becomes a screen-reader-only heading.
28
+
29
+ <Canvas of={AppBarStories.MediumFlexible} />
30
+
31
+ <Canvas of={AppBarStories.Search} />
32
+
33
+ ## Placement
34
+
35
+ The bar is fixed at the top at every window size. Pass `ghost` to render a same-height spacer
36
+ after it, so page content doesn't start underneath. The bar also publishes its height as
37
+ `--appbar-height` on the root element. `Pane`/`PaneGrid` read it to shrink their `min-height`, so
38
+ nothing needs wiring. Next to a `Rail`, pass the bar's height to the rail's `railTop`.
39
+
40
+ ```svelte
41
+ <AppBar title="Inbox" ghost>
42
+ {#snippet trailing()}
43
+ <ButtonIcon variant="standard" iconProps={{ name: 'search' }} />
44
+ <ButtonIcon variant="standard" iconProps={{ name: 'more_vert' }} />
45
+ {/snippet}
46
+ </AppBar>
47
+ ```
48
+
49
+ ## Scroll color
50
+
51
+ The bar switches to its on-scroll color once the page scrolls more than 10px. If content scrolls
52
+ inside a container instead (a `Pane`, say), pass that element as `scrollContainer`.
53
+
54
+ <Canvas of={AppBarStories.ScrollContainer} />
55
+
56
+ ## Breadcrumbs
57
+
58
+ `children` renders in a full-width row below the title, which is where a `Breadcrumb` goes. M3
59
+ has no breadcrumb pattern, so `Breadcrumb` uses `label-large` crumbs separated by chevrons. The
60
+ current page uses the emphasized `label-large` and is always static text with
61
+ `aria-current="page"`. `color` sets the current crumb's color and the links' hover color.
62
+
63
+ <Canvas of={BreadcrumbStories.InAppBar} />
64
+
65
+ ## Accessibility
66
+
67
+ - **Landmark.** The bar renders a `<nav>`, which assistive tech announces as a landmark.
68
+ - **Heading.** The title is the page's `<h1>`. On a search bar it stays an `<h1>`, hidden
69
+ visually. Don't render a second `<h1>` on the page.
70
+ - **Back button.** `showBack` renders a labelled back button that calls `onback`, or
71
+ `history.back()` by default.
@@ -13,23 +13,31 @@
13
13
  argTypes: {
14
14
  title: { control: 'text' },
15
15
  subtitle: { control: 'text' },
16
+ size: { control: 'inline-radio', options: ['small', 'medium', 'large'] },
17
+ align: { control: 'inline-radio', options: ['start', 'center'] },
16
18
  showBack: { control: 'boolean' },
17
19
  ghost: { control: 'boolean' }
18
20
  },
19
21
  args: {
20
22
  title: 'Inbox',
23
+ size: 'small',
24
+ align: 'start',
21
25
  showBack: false,
22
26
  ghost: true
23
27
  }
24
28
  });
25
29
  </script>
26
30
 
31
+ <script lang="ts">
32
+ let scroller = $state<HTMLElement | null>(null);
33
+ </script>
34
+
27
35
  <Story name="Playground">
28
36
  {#snippet template(args)}
29
37
  <AppBar {...args}>
30
38
  {#snippet trailing()}
31
- <ButtonIcon variant="text" iconProps={{ name: 'search' }} />
32
- <ButtonIcon variant="text" iconProps={{ name: 'more_vert' }} />
39
+ <ButtonIcon variant="standard" iconProps={{ name: 'search' }} />
40
+ <ButtonIcon variant="standard" iconProps={{ name: 'more_vert' }} />
33
41
  {/snippet}
34
42
  </AppBar>
35
43
  {/snippet}
@@ -38,12 +46,94 @@
38
46
  <Story
39
47
  name="With Back and Subtitle"
40
48
  args={{ title: 'Draft', subtitle: '3 recipients', showBack: true }}
49
+ >
50
+ {#snippet template(args)}
51
+ <AppBar {...args} />
52
+ {/snippet}
53
+ </Story>
54
+
55
+ <Story name="Medium flexible" args={{ title: 'Travel plans', size: 'medium', showBack: true }}>
56
+ {#snippet template(args)}
57
+ <AppBar {...args}>
58
+ {#snippet trailing()}
59
+ <ButtonIcon variant="standard" iconProps={{ name: 'search' }} />
60
+ <ButtonIcon variant="standard" iconProps={{ name: 'more_vert' }} />
61
+ {/snippet}
62
+ </AppBar>
63
+ {/snippet}
64
+ </Story>
65
+
66
+ <Story
67
+ name="Large flexible"
68
+ args={{ title: 'Travel plans', subtitle: '3 upcoming trips', size: 'large', showBack: true }}
41
69
  >
70
+ {#snippet template(args)}
71
+ <AppBar {...args}>
72
+ {#snippet trailing()}
73
+ <ButtonIcon variant="standard" iconProps={{ name: 'more_vert' }} />
74
+ {/snippet}
75
+ </AppBar>
76
+ {/snippet}
77
+ </Story>
78
+
79
+ <Story name="Centered" args={{ title: 'Product', align: 'center' }}>
42
80
  {#snippet template(args)}
43
81
  <AppBar {...args}>
44
82
  {#snippet leading()}
45
- <ButtonIcon variant="text" iconProps={{ name: 'arrow_back' }} />
83
+ <ButtonIcon variant="standard" iconProps={{ name: 'menu' }} aria-label="Menu" />
84
+ {/snippet}
85
+ {#snippet trailing()}
86
+ <ButtonIcon
87
+ variant="standard"
88
+ iconProps={{ name: 'account_circle' }}
89
+ aria-label="Account"
90
+ />
46
91
  {/snippet}
47
92
  </AppBar>
48
93
  {/snippet}
49
94
  </Story>
95
+
96
+ <Story
97
+ name="Responsive size"
98
+ args={{
99
+ title: 'Travel plans',
100
+ subtitle: 'Resize the viewport',
101
+ size: { small: 'small', medium: 'medium', large: 'large' }
102
+ }}
103
+ parameters={{ viewport: { defaultViewport: 'responsive' } }}
104
+ >
105
+ {#snippet template(args)}
106
+ <AppBar {...args} showBack>
107
+ {#snippet trailing()}
108
+ <ButtonIcon variant="standard" iconProps={{ name: 'more_vert' }} aria-label="More" />
109
+ {/snippet}
110
+ </AppBar>
111
+ {/snippet}
112
+ </Story>
113
+
114
+ <Story name="Search" asChild>
115
+ <AppBar search="Search products" title="Products">
116
+ {#snippet leading()}
117
+ <ButtonIcon variant="standard" iconProps={{ name: 'menu' }} aria-label="Menu" />
118
+ {/snippet}
119
+ {#snippet searchTrailing()}
120
+ <ButtonIcon variant="standard" iconProps={{ name: 'mic' }} aria-label="Voice search" />
121
+ {/snippet}
122
+ {#snippet trailing()}
123
+ <ButtonIcon variant="standard" iconProps={{ name: 'account_circle' }} aria-label="Account" />
124
+ {/snippet}
125
+ </AppBar>
126
+ </Story>
127
+
128
+ <Story name="Scroll container" asChild>
129
+ <div bind:this={scroller} class="h-[480px] overflow-y-auto">
130
+ <AppBar title="Scroll this box" scrollContainer={scroller} ghost />
131
+ {#each { length: 40 } as _, i (i)}
132
+ <p
133
+ class="md-sys-typescale-body-large text-md-sys-color-on-surface px-spacing-200 py-spacing-100"
134
+ >
135
+ Row {i + 1}
136
+ </p>
137
+ {/each}
138
+ </div>
139
+ </Story>
@@ -1,19 +1,4 @@
1
1
  import AppBar from './AppBar.svelte';
2
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- declare const AppBar: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
- [evt: string]: CustomEvent<any>;
17
- }, {}, {}, string>;
18
- type AppBar = InstanceType<typeof AppBar>;
2
+ declare const AppBar: import("svelte").Component<Record<string, never>, {}, "">;
3
+ type AppBar = ReturnType<typeof AppBar>;
19
4
  export default AppBar;
@@ -5,17 +5,25 @@ Material 3 App Bar.
5
5
  Top app bars provide content and actions related to the current screen.
6
6
  They’re used for branding, screen titles, navigation, and actions.
7
7
 
8
+ Sizes: `small` (64dp, one line) and the Expressive `medium`/`large` flexible bars, whose
9
+ headline block wraps and grows. `size` also takes one value per breakpoint
10
+ (`{ small: 'small', large: 'large' }`), switched in CSS so server rendering needs no JS.
11
+ `align="center"` centres the title. Setting `search` makes it a search app bar.
12
+
13
+ The bar takes its on-scroll color once `scrollContainer` (default: the page) scrolls.
14
+
8
15
  Publishes its measured height as `--appbar-height` on the document root, so any
9
16
  `Pane`/`PaneGrid` on the page (`full`, the default) shrinks its `min-height` by
10
17
  that amount with no props or wiring on either side — see Pane.svelte's doc
11
18
  comment.
12
19
 
13
- @see https://m3.material.io/components/top-app-bar/overview
20
+ @see https://m3.material.io/components/app-bars/specs
14
21
  -->
15
22
  <script lang="ts">
16
- import { appbar } from './theme.js';
23
+ import { appbar, appbarSize } from './theme.js';
17
24
  import type { AppBarProps } from './types.js';
18
25
  import clsx from 'clsx';
26
+ import ButtonIcon from '../../buttons/ButtonIcon.svelte';
19
27
 
20
28
  let {
21
29
  children,
@@ -27,31 +35,46 @@ comment.
27
35
  leading,
28
36
  class: className,
29
37
  rowClass,
30
- showBack,
38
+ showBack = false,
39
+ onback = () => history.back(),
40
+ size = 'small',
41
+ align = 'start',
42
+ search,
43
+ query = $bindable(''),
44
+ searchProps,
45
+ searchTrailing,
46
+ scrollContainer,
31
47
  ghost = false,
32
48
  ...rest
33
49
  }: AppBarProps = $props();
34
50
 
35
- let scrollY = $state(0);
36
- let scrolled = $derived(scrollY > 10);
51
+ let scrolled = $state(false);
37
52
  let barHeight = $state(64);
38
53
 
39
- const noTrailing = $derived(!trailing);
40
- const noLeading = $derived(!leading || !showBack);
54
+ $effect(() => {
55
+ const target = scrollContainer ?? window;
56
+ const read = () =>
57
+ (scrolled = (scrollContainer ? scrollContainer.scrollTop : window.scrollY) > 10);
58
+ read();
59
+ target.addEventListener('scroll', read, { passive: true });
60
+ return () => target.removeEventListener('scroll', read);
61
+ });
62
+
63
+ const isSearch = $derived(search !== undefined);
64
+ const noLeading = $derived(!leading && !showBack);
41
65
 
42
- const {
43
- base,
44
- row,
45
- childrenRow,
46
- ghost: ghostCls,
47
- title: titleCLs,
48
- textContainer,
49
- subtitle: subtitleCls,
50
- leading: leadingCls,
51
- trailing: trailingCls
52
- } = $derived(appbar({ scrolled, noLeading, noTrailing }));
53
- const navClass = $derived(base({ class: clsx(className) }));
54
- const rowFull = $derived(row({ class: clsx(rowClass) }));
66
+ const s = $derived(
67
+ appbar({
68
+ align: isSearch ? 'start' : align,
69
+ scrolled,
70
+ searchContainer: isSearch,
71
+ hasSearchTrailing: !!searchTrailing,
72
+ noLeading,
73
+ noTrailing: !trailing
74
+ })
75
+ );
76
+ // Search app bars are always the small, 64dp bar.
77
+ const sized = $derived(appbarSize(isSearch ? 'small' : size, !!subtitle));
55
78
 
56
79
  function trackHeight(node: HTMLElement) {
57
80
  const observer = new ResizeObserver((entries) => {
@@ -68,33 +91,63 @@ comment.
68
91
  });
69
92
  </script>
70
93
 
71
- <svelte:window bind:scrollY />
72
-
73
- <nav {...rest} class={navClass} {@attach trackHeight}>
74
- <div class={rowFull}>
75
- <div class={leadingCls()}>
76
- {@render leading?.()}
94
+ <nav {...rest} class={s.base({ class: clsx(className) })} {@attach trackHeight}>
95
+ <div class={s.row({ class: clsx(sized.row, rowClass) })}>
96
+ <div class={s.leading()}>
97
+ {#if leading}
98
+ {@render leading()}
99
+ {:else if showBack}
100
+ <ButtonIcon
101
+ variant="standard"
102
+ iconProps={{ name: 'arrow_back' }}
103
+ aria-label="Back"
104
+ onclick={onback}
105
+ />
106
+ {/if}
77
107
  </div>
78
- <div class={textContainer()}>
79
- <h1 class={titleCLs({ class: clsx(titleProps?.class) })} {...titleProps}>
80
- {title}
81
- </h1>
82
- {#if subtitle}
83
- <p class={subtitleCls({ class: clsx(subtitleProps?.class) })} {...subtitleProps}>
84
- {subtitle}
85
- </p>
108
+ <div class={s.textContainer({ class: sized.textContainer })}>
109
+ {#if isSearch}
110
+ {#if title}
111
+ <h1 {...titleProps} class={clsx('sr-only', titleProps?.class)}>{title}</h1>
112
+ {/if}
113
+ <label class={s.search()}>
114
+ <input
115
+ type="search"
116
+ {...searchProps}
117
+ placeholder={search}
118
+ aria-label={searchProps?.['aria-label'] ?? search}
119
+ bind:value={query}
120
+ class={s.searchInput({ class: clsx(searchProps?.class) })}
121
+ />
122
+ {#if searchTrailing}
123
+ <span class={s.searchTrailing()}>{@render searchTrailing()}</span>
124
+ {/if}
125
+ </label>
126
+ {:else}
127
+ <h1 {...titleProps} class={s.title({ class: clsx(sized.title, titleProps?.class) })}>
128
+ {title}
129
+ </h1>
130
+ {#if subtitle}
131
+ <p
132
+ {...subtitleProps}
133
+ class={s.subtitle({ class: clsx(sized.subtitle, subtitleProps?.class) })}
134
+ >
135
+ {subtitle}
136
+ </p>
137
+ {/if}
86
138
  {/if}
87
139
  </div>
88
- <div class={trailingCls()}>
140
+ <div class={s.trailing()}>
89
141
  {@render trailing?.()}
90
142
  </div>
91
143
  </div>
92
144
  {#if children}
93
- <div class={childrenRow()}>
145
+ <div class={s.childrenRow()}>
94
146
  {@render children()}
95
147
  </div>
96
148
  {/if}
97
149
  </nav>
150
+
98
151
  {#if ghost}
99
- <div class={ghostCls()} style="height: {barHeight}px" aria-hidden="true"></div>
152
+ <div class={s.ghost()} style="height: {barHeight}px" aria-hidden="true"></div>
100
153
  {/if}
@@ -5,13 +5,20 @@ import type { AppBarProps } from './types.js';
5
5
  * Top app bars provide content and actions related to the current screen.
6
6
  * They’re used for branding, screen titles, navigation, and actions.
7
7
  *
8
+ * Sizes: `small` (64dp, one line) and the Expressive `medium`/`large` flexible bars, whose
9
+ * headline block wraps and grows. `size` also takes one value per breakpoint
10
+ * (`{ small: 'small', large: 'large' }`), switched in CSS so server rendering needs no JS.
11
+ * `align="center"` centres the title. Setting `search` makes it a search app bar.
12
+ *
13
+ * The bar takes its on-scroll color once `scrollContainer` (default: the page) scrolls.
14
+ *
8
15
  * Publishes its measured height as `--appbar-height` on the document root, so any
9
16
  * `Pane`/`PaneGrid` on the page (`full`, the default) shrinks its `min-height` by
10
17
  * that amount with no props or wiring on either side — see Pane.svelte's doc
11
18
  * comment.
12
19
  *
13
- * @see https://m3.material.io/components/top-app-bar/overview
20
+ * @see https://m3.material.io/components/app-bars/specs
14
21
  */
15
- declare const AppBar: import("svelte").Component<AppBarProps, {}, "">;
22
+ declare const AppBar: import("svelte").Component<AppBarProps, {}, "query">;
16
23
  type AppBar = ReturnType<typeof AppBar>;
17
24
  export default AppBar;
@@ -1,30 +1,54 @@
1
1
  import { type VariantProps } from 'tailwind-variants';
2
+ import type { Breakpoint } from '../../containers/pane/theme.js';
2
3
  export type AppbarVariants = VariantProps<typeof appbar>;
4
+ export type AppBarSize = 'small' | 'medium' | 'large';
5
+ /**
6
+ * Resolves `size` (one value, or one per breakpoint like `PaneGrid`'s props) into per-slot
7
+ * classes. Sizes cascade upward from the smallest breakpoint given, like Tailwind prefixes.
8
+ */
9
+ export declare function appbarSize(size: AppBarSize | Partial<Record<Breakpoint, AppBarSize>>, hasSubtitle: boolean): Record<'row' | 'textContainer' | 'title' | 'subtitle', string>;
3
10
  export declare const appbar: import("tailwind-variants").TVReturnType<{
11
+ align: {
12
+ start: {
13
+ row: string;
14
+ textContainer: string;
15
+ };
16
+ center: {
17
+ row: string;
18
+ textContainer: string;
19
+ };
20
+ };
4
21
  scrolled: {
5
22
  true: {
6
23
  base: string;
24
+ search: string;
7
25
  };
8
26
  false: {
9
27
  base: string;
28
+ search: string;
10
29
  };
11
30
  };
12
31
  searchContainer: {
13
- true: "";
14
- false: "";
15
- };
16
- noTrailing: {
17
32
  true: {
33
+ row: string;
18
34
  textContainer: string;
19
35
  };
20
36
  false: "";
21
37
  };
22
- noLeading: {
38
+ hasSearchTrailing: {
23
39
  true: {
24
- textContainer: string;
40
+ search: string;
25
41
  };
26
42
  false: "";
27
43
  };
44
+ noTrailing: {
45
+ true: "";
46
+ false: "";
47
+ };
48
+ noLeading: {
49
+ true: "";
50
+ false: "";
51
+ };
28
52
  }, {
29
53
  base: string;
30
54
  row: string;
@@ -35,31 +59,51 @@ export declare const appbar: import("tailwind-variants").TVReturnType<{
35
59
  subtitle: string;
36
60
  leading: string;
37
61
  trailing: string;
62
+ search: string;
63
+ searchInput: string;
64
+ searchTrailing: string;
38
65
  }, undefined, {
66
+ align: {
67
+ start: {
68
+ row: string;
69
+ textContainer: string;
70
+ };
71
+ center: {
72
+ row: string;
73
+ textContainer: string;
74
+ };
75
+ };
39
76
  scrolled: {
40
77
  true: {
41
78
  base: string;
79
+ search: string;
42
80
  };
43
81
  false: {
44
82
  base: string;
83
+ search: string;
45
84
  };
46
85
  };
47
86
  searchContainer: {
48
- true: "";
49
- false: "";
50
- };
51
- noTrailing: {
52
87
  true: {
88
+ row: string;
53
89
  textContainer: string;
54
90
  };
55
91
  false: "";
56
92
  };
57
- noLeading: {
93
+ hasSearchTrailing: {
58
94
  true: {
59
- textContainer: string;
95
+ search: string;
60
96
  };
61
97
  false: "";
62
98
  };
99
+ noTrailing: {
100
+ true: "";
101
+ false: "";
102
+ };
103
+ noLeading: {
104
+ true: "";
105
+ false: "";
106
+ };
63
107
  }, {
64
108
  base: string;
65
109
  row: string;
@@ -70,31 +114,51 @@ export declare const appbar: import("tailwind-variants").TVReturnType<{
70
114
  subtitle: string;
71
115
  leading: string;
72
116
  trailing: string;
117
+ search: string;
118
+ searchInput: string;
119
+ searchTrailing: string;
73
120
  }, import("tailwind-variants").TVReturnTypeLike<{
121
+ align: {
122
+ start: {
123
+ row: string;
124
+ textContainer: string;
125
+ };
126
+ center: {
127
+ row: string;
128
+ textContainer: string;
129
+ };
130
+ };
74
131
  scrolled: {
75
132
  true: {
76
133
  base: string;
134
+ search: string;
77
135
  };
78
136
  false: {
79
137
  base: string;
138
+ search: string;
80
139
  };
81
140
  };
82
141
  searchContainer: {
83
- true: "";
84
- false: "";
85
- };
86
- noTrailing: {
87
142
  true: {
143
+ row: string;
88
144
  textContainer: string;
89
145
  };
90
146
  false: "";
91
147
  };
92
- noLeading: {
148
+ hasSearchTrailing: {
93
149
  true: {
94
- textContainer: string;
150
+ search: string;
95
151
  };
96
152
  false: "";
97
153
  };
154
+ noTrailing: {
155
+ true: "";
156
+ false: "";
157
+ };
158
+ noLeading: {
159
+ true: "";
160
+ false: "";
161
+ };
98
162
  }, {
99
163
  base: string;
100
164
  row: string;
@@ -105,4 +169,7 @@ export declare const appbar: import("tailwind-variants").TVReturnType<{
105
169
  subtitle: string;
106
170
  leading: string;
107
171
  trailing: string;
172
+ search: string;
173
+ searchInput: string;
174
+ searchTrailing: string;
108
175
  }>>;