@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,7 +7,7 @@
7
7
  title: 'Navigation/App Bar',
8
8
  component: AppBar,
9
9
  parameters: {
10
- // AppBar is the mobile top bar (md:hidden) — preview it at a mobile viewport.
10
+ // AppBar is fixed across all screen sizes — preview it at a mobile viewport.
11
11
  viewport: { defaultViewport: 'mobile1' }
12
12
  },
13
13
  argTypes: {
@@ -5,6 +5,11 @@ 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
+ Publishes its measured height as `--appbar-height` on the document root, so any
9
+ `Pane`/`PaneGrid` on the page (`full`, the default) shrinks its `min-height` by
10
+ that amount with no props or wiring on either side — see Pane.svelte's doc
11
+ comment.
12
+
8
13
  @see https://m3.material.io/components/top-app-bar/overview
9
14
  -->
10
15
  <script lang="ts">
@@ -19,6 +24,7 @@ They’re used for branding, screen titles, navigation, and actions.
19
24
  trailing,
20
25
  leading,
21
26
  class: className,
27
+ rowClass,
22
28
  showBack,
23
29
  ghost = false,
24
30
  ...rest
@@ -26,12 +32,15 @@ They’re used for branding, screen titles, navigation, and actions.
26
32
 
27
33
  let scrollY = $state(0);
28
34
  let scrolled = $derived(scrollY > 10);
35
+ let barHeight = $state(64);
29
36
 
30
37
  const noTrailing = $derived(!trailing);
31
38
  const noLeading = $derived(!leading || !showBack);
32
39
 
33
40
  const {
34
41
  base,
42
+ row,
43
+ childrenRow,
35
44
  ghost: ghostCls,
36
45
  title: titleCLs,
37
46
  textContainer,
@@ -40,26 +49,48 @@ They’re used for branding, screen titles, navigation, and actions.
40
49
  trailing: trailingCls
41
50
  } = $derived(appbar({ scrolled, noLeading, noTrailing }));
42
51
  const navClass = $derived(base({ class: clsx(className) }));
52
+ const rowFull = $derived(row({ class: clsx(rowClass) }));
53
+
54
+ function trackHeight(node: HTMLElement) {
55
+ const observer = new ResizeObserver((entries) => {
56
+ const entry = entries[0];
57
+ barHeight = entry?.contentRect.height ?? barHeight;
58
+ });
59
+ observer.observe(node);
60
+ return () => observer.disconnect();
61
+ }
62
+
63
+ $effect(() => {
64
+ document.documentElement.style.setProperty('--appbar-height', `${barHeight}px`);
65
+ return () => document.documentElement.style.removeProperty('--appbar-height');
66
+ });
43
67
  </script>
44
68
 
45
69
  <svelte:window bind:scrollY />
46
70
 
47
- <nav {...rest} class={navClass}>
48
- <div class={leadingCls()}>
49
- {@render leading?.()}
50
- </div>
51
- <div class={textContainer()}>
52
- <h1 class={titleCLs()}>
53
- {title}
54
- </h1>
55
- {#if subtitle}
56
- <p class={subtitleCls()}>{subtitle}</p>
57
- {/if}
58
- </div>
59
- <div class={trailingCls()}>
60
- {@render trailing?.()}
71
+ <nav {...rest} class={navClass} {@attach trackHeight}>
72
+ <div class={rowFull}>
73
+ <div class={leadingCls()}>
74
+ {@render leading?.()}
75
+ </div>
76
+ <div class={textContainer()}>
77
+ <h1 class={titleCLs()}>
78
+ {title}
79
+ </h1>
80
+ {#if subtitle}
81
+ <p class={subtitleCls()}>{subtitle}</p>
82
+ {/if}
83
+ </div>
84
+ <div class={trailingCls()}>
85
+ {@render trailing?.()}
86
+ </div>
61
87
  </div>
88
+ {#if children}
89
+ <div class={childrenRow()}>
90
+ {@render children()}
91
+ </div>
92
+ {/if}
62
93
  </nav>
63
94
  {#if ghost}
64
- <div class={ghostCls()} aria-hidden="true"></div>
95
+ <div class={ghostCls()} style="height: {barHeight}px" aria-hidden="true"></div>
65
96
  {/if}
@@ -5,6 +5,11 @@ 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
+ * Publishes its measured height as `--appbar-height` on the document root, so any
9
+ * `Pane`/`PaneGrid` on the page (`full`, the default) shrinks its `min-height` by
10
+ * that amount with no props or wiring on either side — see Pane.svelte's doc
11
+ * comment.
12
+ *
8
13
  * @see https://m3.material.io/components/top-app-bar/overview
9
14
  */
10
15
  declare const AppBar: import("svelte").Component<AppBarProps, {}, "">;
@@ -10,23 +10,25 @@ export declare const appbar: import("tailwind-variants").TVReturnType<{
10
10
  };
11
11
  };
12
12
  searchContainer: {
13
- true: string;
14
- false: string;
13
+ true: "";
14
+ false: "";
15
15
  };
16
16
  noTrailing: {
17
17
  true: {
18
18
  textContainer: string;
19
19
  };
20
- false: string;
20
+ false: "";
21
21
  };
22
22
  noLeading: {
23
23
  true: {
24
24
  textContainer: string;
25
25
  };
26
- false: string;
26
+ false: "";
27
27
  };
28
28
  }, {
29
29
  base: string;
30
+ row: string;
31
+ childrenRow: string;
30
32
  ghost: string;
31
33
  textContainer: string;
32
34
  title: string;
@@ -43,30 +45,32 @@ export declare const appbar: import("tailwind-variants").TVReturnType<{
43
45
  };
44
46
  };
45
47
  searchContainer: {
46
- true: string;
47
- false: string;
48
+ true: "";
49
+ false: "";
48
50
  };
49
51
  noTrailing: {
50
52
  true: {
51
53
  textContainer: string;
52
54
  };
53
- false: string;
55
+ false: "";
54
56
  };
55
57
  noLeading: {
56
58
  true: {
57
59
  textContainer: string;
58
60
  };
59
- false: string;
61
+ false: "";
60
62
  };
61
63
  }, {
62
64
  base: string;
65
+ row: string;
66
+ childrenRow: string;
63
67
  ghost: string;
64
68
  textContainer: string;
65
69
  title: string;
66
70
  subtitle: string;
67
71
  leading: string;
68
72
  trailing: string;
69
- }, import("tailwind-variants").TVReturnType<{
73
+ }, import("tailwind-variants").TVReturnTypeLike<{
70
74
  scrolled: {
71
75
  true: {
72
76
  base: string;
@@ -76,27 +80,29 @@ export declare const appbar: import("tailwind-variants").TVReturnType<{
76
80
  };
77
81
  };
78
82
  searchContainer: {
79
- true: string;
80
- false: string;
83
+ true: "";
84
+ false: "";
81
85
  };
82
86
  noTrailing: {
83
87
  true: {
84
88
  textContainer: string;
85
89
  };
86
- false: string;
90
+ false: "";
87
91
  };
88
92
  noLeading: {
89
93
  true: {
90
94
  textContainer: string;
91
95
  };
92
- false: string;
96
+ false: "";
93
97
  };
94
98
  }, {
95
99
  base: string;
100
+ row: string;
101
+ childrenRow: string;
96
102
  ghost: string;
97
103
  textContainer: string;
98
104
  title: string;
99
105
  subtitle: string;
100
106
  leading: string;
101
107
  trailing: string;
102
- }, undefined, unknown, unknown, undefined>>;
108
+ }>>;
@@ -1,18 +1,22 @@
1
1
  import { tv } from 'tailwind-variants';
2
2
  export const appbar = tv({
3
3
  slots: {
4
- base: 'h-16 py-1 fixed top-0 left-0 w-full md:hidden flex z-40 items-center justify-between',
5
- ghost: 'h-16 w-full shrink-0 md:hidden pointer-events-none',
4
+ base: 'fixed top-0 left-0 w-full flex flex-col z-30',
5
+ row: 'h-16 py-1 flex w-full items-center justify-between',
6
+ childrenRow: 'w-full px-2 pb-2',
7
+ ghost: 'w-full shrink-0 pointer-events-none',
6
8
  textContainer: 'flex flex-col items-start gap-0.5 grow',
7
9
  title: 'text-md-sys-color-on-surface md-sys-typescale-title-large line-clamp-1 capitalize ',
8
10
  subtitle: 'text-md-sys-color-on-surface-variant md-sys-typescale-label-medium',
9
11
  leading: 'text-md-sys-color-on-surface ml-0.5',
10
- trailing: 'text-md-sys-color-on-surface-variant mr-4'
12
+ trailing: 'text-md-sys-color-on-surface-variant mr-4 md:mr-6 lg:mr-8'
11
13
  },
12
14
  variants: {
13
15
  scrolled: {
14
- true: { base: 'shadow-elevation-2 bg-md-sys-color-surface-container' },
15
- false: { base: 'shadow-elevation-0 bg-md-sys-color-surface' }
16
+ true: { base: 'shadow-elevation-1 bg-md-sys-color-surface-container' },
17
+ false: {
18
+ base: 'shadow-elevation-0 bg-md-sys-color-surface md:bg-md-sys-color-surface-container'
19
+ }
16
20
  },
17
21
  searchContainer: {
18
22
  true: '',
@@ -20,13 +24,13 @@ export const appbar = tv({
20
24
  },
21
25
  noTrailing: {
22
26
  true: {
23
- textContainer: 'pr-2'
27
+ textContainer: 'pr-4 md:pr-6 lg:pr-8'
24
28
  },
25
29
  false: ''
26
30
  },
27
31
  noLeading: {
28
32
  true: {
29
- textContainer: 'pl-6'
33
+ textContainer: 'pl-4 md:pl-6 lg:pl-8'
30
34
  },
31
35
  false: ''
32
36
  }
@@ -5,7 +5,7 @@ import type { AppbarVariants } from './theme.js';
5
5
  * Props for the AppBar component.
6
6
  */
7
7
  export type AppBarProps = AppbarVariants & HTMLAttributes<HTMLElementTagNameMap['nav']> & {
8
- /** The content to be rendered inside the app bar. */
8
+ /** Extra content rendered in a full-width row below the title, e.g. a Breadcrumb trail. */
9
9
  children?: Snippet;
10
10
  /** The main title of the app bar. */
11
11
  title: string;
@@ -19,4 +19,6 @@ export type AppBarProps = AppbarVariants & HTMLAttributes<HTMLElementTagNameMap[
19
19
  showBack?: boolean;
20
20
  /** Renders an invisible same-height spacer after the fixed bar so page content isn't obscured. */
21
21
  ghost?: boolean;
22
+ /** Additional classes passed onto the row element */
23
+ rowClass?: string;
22
24
  };
@@ -0,0 +1,50 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import Breadcrumb from './Breadcrumb.svelte';
4
+ import AppBar from '../appbar/AppBar.svelte';
5
+
6
+ const { Story } = defineMeta({
7
+ title: 'Navigation/Breadcrumb',
8
+ component: Breadcrumb,
9
+ argTypes: {
10
+ color: { control: 'select', options: ['primary', 'secondary', 'tertiary', 'surface'] }
11
+ },
12
+ args: {
13
+ color: 'primary',
14
+ items: [
15
+ { label: 'Docs', href: '/docs' },
16
+ { label: 'Navigation', href: '/docs' },
17
+ { label: 'App Bar' }
18
+ ]
19
+ }
20
+ });
21
+ </script>
22
+
23
+ <Story name="Playground">
24
+ {#snippet template(args)}
25
+ <Breadcrumb {...args} />
26
+ {/snippet}
27
+ </Story>
28
+
29
+ <Story name="Deep Trail" asChild>
30
+ <Breadcrumb
31
+ items={[
32
+ { label: 'Home', href: '#' },
33
+ { label: 'Library', href: '#' },
34
+ { label: 'Data', href: '#' },
35
+ { label: 'Sample Files' }
36
+ ]}
37
+ />
38
+ </Story>
39
+
40
+ <Story name="In App Bar" asChild>
41
+ <AppBar title="Sample Files" ghost={false}>
42
+ <Breadcrumb
43
+ items={[
44
+ { label: 'Home', href: '#' },
45
+ { label: 'Library', href: '#' },
46
+ { label: 'Sample Files' }
47
+ ]}
48
+ />
49
+ </AppBar>
50
+ </Story>
@@ -0,0 +1,19 @@
1
+ import Breadcrumb from './Breadcrumb.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 Breadcrumb: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Breadcrumb = InstanceType<typeof Breadcrumb>;
19
+ export default Breadcrumb;
@@ -0,0 +1,46 @@
1
+ <!--
2
+ @component
3
+ Breadcrumb trail: `label-large` text links separated by chevron icons, wayfinding for
4
+ where the current screen sits in a hierarchy. Designed to sit inside `AppBar`, via its
5
+ `children` snippet, below the title row.
6
+
7
+ M3 doesn't define a breadcrumb pattern, so this follows the repo's own typescale/color-role
8
+ conventions instead of a spec page. The last item is always rendered as static text with
9
+ `aria-current="page"`, regardless of whether it has an `href`.
10
+ -->
11
+ <script lang="ts">
12
+ import { Icon, Layer } from '../../../utils/index.js';
13
+ import clsx from 'clsx';
14
+ import { breadcrumb } from './theme.js';
15
+ import type { BreadcrumbProps } from './types.js';
16
+
17
+ let { items, color = 'primary', class: className, ...rest }: BreadcrumbProps = $props();
18
+
19
+ const { base, list, item, link, text, current, separator } = $derived(breadcrumb({ color }));
20
+ const navCls = $derived(base({ class: clsx(className) }));
21
+ </script>
22
+
23
+ <nav aria-label="Breadcrumb" {...rest} class={navCls}>
24
+ <ol class={list()}>
25
+ {#each items as crumb, i (crumb.label + i)}
26
+ {@const isLast = i === items.length - 1}
27
+ <li class={item()}>
28
+ {#if isLast}
29
+ <span class={current()} aria-current="page">{crumb.label}</span>
30
+ {:else if crumb.href}
31
+ <a href={crumb.href} class={link()}>
32
+ <Layer />
33
+ {crumb.label}
34
+ </a>
35
+ {:else}
36
+ <span class={text()}>{crumb.label}</span>
37
+ {/if}
38
+ {#if !isLast}
39
+ <span class={separator()} aria-hidden="true">
40
+ <Icon name="chevron_right" size="sm" />
41
+ </span>
42
+ {/if}
43
+ </li>
44
+ {/each}
45
+ </ol>
46
+ </nav>
@@ -0,0 +1,13 @@
1
+ import type { BreadcrumbProps } from './types.js';
2
+ /**
3
+ * Breadcrumb trail: `label-large` text links separated by chevron icons, wayfinding for
4
+ * where the current screen sits in a hierarchy. Designed to sit inside `AppBar`, via its
5
+ * `children` snippet, below the title row.
6
+ *
7
+ * M3 doesn't define a breadcrumb pattern, so this follows the repo's own typescale/color-role
8
+ * conventions instead of a spec page. The last item is always rendered as static text with
9
+ * `aria-current="page"`, regardless of whether it has an `href`.
10
+ */
11
+ declare const Breadcrumb: import("svelte").Component<BreadcrumbProps, {}, "">;
12
+ type Breadcrumb = ReturnType<typeof Breadcrumb>;
13
+ export default Breadcrumb;
@@ -0,0 +1,3 @@
1
+ export * from './theme.js';
2
+ export * from './types.js';
3
+ export { default as Breadcrumb } from './Breadcrumb.svelte';
@@ -0,0 +1,6 @@
1
+ // THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
2
+ // re-export TS/JS modules from this folder
3
+ export * from './theme.js';
4
+ export * from './types.js';
5
+ // default exports for components in this folder
6
+ export { default as Breadcrumb } from './Breadcrumb.svelte';
@@ -0,0 +1,84 @@
1
+ import { type VariantProps } from 'tailwind-variants';
2
+ export type BreadcrumbVariants = VariantProps<typeof breadcrumb>;
3
+ export declare const breadcrumb: import("tailwind-variants").TVReturnType<{
4
+ color: {
5
+ primary: {
6
+ current: string;
7
+ link: string;
8
+ };
9
+ secondary: {
10
+ current: string;
11
+ link: string;
12
+ };
13
+ tertiary: {
14
+ current: string;
15
+ link: string;
16
+ };
17
+ surface: {
18
+ current: string;
19
+ link: string;
20
+ };
21
+ };
22
+ }, {
23
+ base: string;
24
+ list: string;
25
+ item: string;
26
+ link: string;
27
+ text: string;
28
+ current: string;
29
+ separator: string;
30
+ }, undefined, {
31
+ color: {
32
+ primary: {
33
+ current: string;
34
+ link: string;
35
+ };
36
+ secondary: {
37
+ current: string;
38
+ link: string;
39
+ };
40
+ tertiary: {
41
+ current: string;
42
+ link: string;
43
+ };
44
+ surface: {
45
+ current: string;
46
+ link: string;
47
+ };
48
+ };
49
+ }, {
50
+ base: string;
51
+ list: string;
52
+ item: string;
53
+ link: string;
54
+ text: string;
55
+ current: string;
56
+ separator: string;
57
+ }, import("tailwind-variants").TVReturnTypeLike<{
58
+ color: {
59
+ primary: {
60
+ current: string;
61
+ link: string;
62
+ };
63
+ secondary: {
64
+ current: string;
65
+ link: string;
66
+ };
67
+ tertiary: {
68
+ current: string;
69
+ link: string;
70
+ };
71
+ surface: {
72
+ current: string;
73
+ link: string;
74
+ };
75
+ };
76
+ }, {
77
+ base: string;
78
+ list: string;
79
+ item: string;
80
+ link: string;
81
+ text: string;
82
+ current: string;
83
+ separator: string;
84
+ }>>;
@@ -0,0 +1,35 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const breadcrumb = tv({
3
+ slots: {
4
+ base: 'flex',
5
+ list: 'flex flex-wrap items-center gap-1',
6
+ item: 'flex items-center gap-1',
7
+ link: 'md-sys-typescale-label-large text-md-sys-color-on-surface-variant md-sys-state-focus-indicator relative inline-flex min-h-12 items-center rounded-full px-3 transition-colors',
8
+ text: 'md-sys-typescale-label-large text-md-sys-color-on-surface-variant px-1 py-0.5',
9
+ current: 'md-sys-typescale-label-large font-bold px-1 py-0.5',
10
+ separator: 'text-md-sys-color-on-surface-variant inline-flex shrink-0'
11
+ },
12
+ variants: {
13
+ color: {
14
+ primary: {
15
+ current: 'text-md-sys-color-primary',
16
+ link: 'hover:text-md-sys-color-primary'
17
+ },
18
+ secondary: {
19
+ current: 'text-md-sys-color-secondary',
20
+ link: 'hover:text-md-sys-color-secondary'
21
+ },
22
+ tertiary: {
23
+ current: 'text-md-sys-color-tertiary',
24
+ link: 'hover:text-md-sys-color-tertiary'
25
+ },
26
+ surface: {
27
+ current: 'text-md-sys-color-on-surface',
28
+ link: 'hover:text-md-sys-color-on-surface'
29
+ }
30
+ }
31
+ },
32
+ defaultVariants: {
33
+ color: 'primary'
34
+ }
35
+ });
@@ -0,0 +1,14 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import type { BreadcrumbVariants } from './theme.js';
3
+ export type BreadcrumbItem = {
4
+ /** Text shown for this crumb. */
5
+ label: string;
6
+ /** Destination URL. Omit for a non-navigable crumb (e.g. the current page — the last item is always rendered as static text regardless of href). */
7
+ href?: string;
8
+ };
9
+ export type BreadcrumbProps = HTMLAttributes<HTMLElementTagNameMap['nav']> & {
10
+ /** Ordered from root to current page. */
11
+ items: BreadcrumbItem[];
12
+ /** Text color of the current (last) crumb, and the hover color of the links before it. Defaults to 'primary'. */
13
+ color?: BreadcrumbVariants['color'];
14
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  export * from './appbar/index.js';
2
+ export * from './breadcrumb/index.js';
2
3
  export * from './navbar/index.js';
3
4
  export * from './rail/index.js';
4
5
  export * from './tabs/index.js';
@@ -1,6 +1,7 @@
1
1
  // THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
2
2
  // folder re-exports (export everything from these folders)
3
3
  export * from './appbar/index.js';
4
+ export * from './breadcrumb/index.js';
4
5
  export * from './navbar/index.js';
5
6
  export * from './rail/index.js';
6
7
  export * from './tabs/index.js';
@@ -1,19 +1,19 @@
1
1
  export declare const navbar: import("tailwind-variants").TVReturnType<{
2
2
  [key: string]: {
3
- [key: string]: import("tailwind-merge").ClassNameValue | {
4
- base?: import("tailwind-merge").ClassNameValue;
5
- items?: import("tailwind-merge").ClassNameValue;
6
- ghost?: import("tailwind-merge").ClassNameValue;
7
- fab?: import("tailwind-merge").ClassNameValue;
3
+ [key: string]: import("tailwind-variants").ClassValue | {
4
+ base?: import("tailwind-variants").ClassValue;
5
+ items?: import("tailwind-variants").ClassValue;
6
+ ghost?: import("tailwind-variants").ClassValue;
7
+ fab?: import("tailwind-variants").ClassValue;
8
8
  };
9
9
  };
10
10
  } | {
11
11
  [x: string]: {
12
- [x: string]: import("tailwind-merge").ClassNameValue | {
13
- base?: import("tailwind-merge").ClassNameValue;
14
- items?: import("tailwind-merge").ClassNameValue;
15
- ghost?: import("tailwind-merge").ClassNameValue;
16
- fab?: import("tailwind-merge").ClassNameValue;
12
+ [x: string]: import("tailwind-variants").ClassValue | {
13
+ base?: import("tailwind-variants").ClassValue;
14
+ items?: import("tailwind-variants").ClassValue;
15
+ ghost?: import("tailwind-variants").ClassValue;
16
+ fab?: import("tailwind-variants").ClassValue;
17
17
  };
18
18
  };
19
19
  } | {}, {
@@ -23,11 +23,11 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
23
23
  ghost: string;
24
24
  }, undefined, {
25
25
  [key: string]: {
26
- [key: string]: import("tailwind-merge").ClassNameValue | {
27
- base?: import("tailwind-merge").ClassNameValue;
28
- items?: import("tailwind-merge").ClassNameValue;
29
- ghost?: import("tailwind-merge").ClassNameValue;
30
- fab?: import("tailwind-merge").ClassNameValue;
26
+ [key: string]: import("tailwind-variants").ClassValue | {
27
+ base?: import("tailwind-variants").ClassValue;
28
+ items?: import("tailwind-variants").ClassValue;
29
+ ghost?: import("tailwind-variants").ClassValue;
30
+ fab?: import("tailwind-variants").ClassValue;
31
31
  };
32
32
  };
33
33
  } | {}, {
@@ -35,12 +35,12 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
35
35
  items: string;
36
36
  fab: string;
37
37
  ghost: string;
38
- }, import("tailwind-variants").TVReturnType<unknown, {
38
+ }, import("tailwind-variants").TVReturnTypeLike<unknown, {
39
39
  base: string;
40
40
  items: string;
41
41
  fab: string;
42
42
  ghost: string;
43
- }, undefined, unknown, unknown, undefined>>;
43
+ }>>;
44
44
  export declare const navitem: import("tailwind-variants").TVReturnType<{
45
45
  active: {
46
46
  true: {
@@ -79,7 +79,7 @@ export declare const navitem: import("tailwind-variants").TVReturnType<{
79
79
  iconContainer: string;
80
80
  icon: string;
81
81
  label: string;
82
- }, import("tailwind-variants").TVReturnType<{
82
+ }, import("tailwind-variants").TVReturnTypeLike<{
83
83
  active: {
84
84
  true: {
85
85
  content: string;
@@ -98,4 +98,4 @@ export declare const navitem: import("tailwind-variants").TVReturnType<{
98
98
  iconContainer: string;
99
99
  icon: string;
100
100
  label: string;
101
- }, undefined, unknown, unknown, undefined>>;
101
+ }>>;