@m3-baseui/react-tailwind 1.0.3 → 1.1.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 (43) hide show
  1. package/dist/bottom-app-bar.d.ts +62 -0
  2. package/dist/bottom-app-bar.js +51 -0
  3. package/dist/bottom-app-bar.js.map +1 -0
  4. package/dist/bottom-sheet.d.ts +101 -0
  5. package/dist/bottom-sheet.js +70 -0
  6. package/dist/bottom-sheet.js.map +1 -0
  7. package/dist/card.js +2 -0
  8. package/dist/card.js.map +1 -1
  9. package/dist/checkbox.d.ts +5 -5
  10. package/dist/divider.js +2 -1
  11. package/dist/divider.js.map +1 -1
  12. package/dist/fab-menu.d.ts +132 -0
  13. package/dist/fab-menu.js +116 -0
  14. package/dist/fab-menu.js.map +1 -0
  15. package/dist/index.d.ts +7 -1
  16. package/dist/index.js +259 -16
  17. package/dist/index.js.map +1 -1
  18. package/dist/item.d.ts +5 -5
  19. package/dist/menu.d.ts +5 -5
  20. package/dist/navigation-bar.d.ts +5 -5
  21. package/dist/navigation-bar.js +20 -4
  22. package/dist/navigation-bar.js.map +1 -1
  23. package/dist/navigation-rail.d.ts +101 -0
  24. package/dist/navigation-rail.js +92 -0
  25. package/dist/navigation-rail.js.map +1 -0
  26. package/dist/progress.d.ts +12 -12
  27. package/dist/progress.js.map +1 -1
  28. package/dist/segmented-button.d.ts +5 -5
  29. package/dist/select.d.ts +5 -5
  30. package/dist/side-sheet.d.ts +112 -0
  31. package/dist/side-sheet.js +90 -0
  32. package/dist/side-sheet.js.map +1 -0
  33. package/dist/slider.d.ts +5 -5
  34. package/dist/snackbar.d.ts +5 -5
  35. package/dist/snackbar.js +1 -1
  36. package/dist/snackbar.js.map +1 -1
  37. package/dist/textfield.js +5 -2
  38. package/dist/textfield.js.map +1 -1
  39. package/dist/top-app-bar.d.ts +147 -0
  40. package/dist/top-app-bar.js +68 -0
  41. package/dist/top-app-bar.js.map +1 -0
  42. package/package.json +31 -1
  43. package/styles/preset.css +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tv.ts","../src/fab.ts","../src/fab-menu.ts"],"names":["baseTv","tv"],"mappings":"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","file":"fab-menu.js","sourcesContent":["/**\n * tv.ts — a tailwind-variants factory pre-configured for the M3 typescale.\n *\n * The Tailwind v4 preset exposes the 15 typescale roles as `text-<role>`\n * font-size utilities (e.g. `text-body-small`, `text-label-large`). Stock\n * tailwind-merge does not know these custom names, so it groups them with the\n * `text-<color>` utilities and drops one when a slot sets both a color *and* a\n * typescale (the common M3 case). That silently strips either the color or the\n * type, breaking token compliance.\n *\n * Teaching tailwind-merge that the typescale names belong to the `font-size`\n * group keeps color and type independent, so both survive the merge.\n */\nimport { type TV, tv as baseTv } from 'tailwind-variants';\n\nconst TYPESCALE = [\n 'display-large',\n 'display-medium',\n 'display-small',\n 'headline-large',\n 'headline-medium',\n 'headline-small',\n 'title-large',\n 'title-medium',\n 'title-small',\n 'body-large',\n 'body-medium',\n 'body-small',\n 'label-large',\n 'label-medium',\n 'label-small',\n] as const;\n\nexport const tv: TV = (options, config) =>\n baseTv(options, {\n ...config,\n twMergeConfig: {\n extend: {\n classGroups: {\n 'font-size': [{ text: [...TYPESCALE] }],\n },\n },\n },\n });\n","/**\n * fab.ts — tailwind-variants for the M3 FAB.\n *\n * Four sizes + four container colors, elevation level3 (level4 on hover) and a\n * currentColor state-layer `::before`. The pointer ripple is added by the\n * factory. Same DOM as the VE build.\n */\nimport { createFab } from '@m3-baseui/core';\nimport { tv } from 'tailwind-variants';\n\nexport const fabTv = tv({\n base: [\n 'relative inline-flex items-center justify-center box-border overflow-hidden',\n 'border-0 cursor-pointer select-none outline-none',\n 'shadow-level3 hover:shadow-level4',\n 'transition-shadow duration-150 ease-standard',\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'focus-visible:before:opacity-[var(--md-sys-state-focus)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n 'data-[pressed]:before:opacity-[var(--md-sys-state-pressed)]',\n // M3 discourages disabled FABs (material-web removed the state). When native\n // disabled is used, apply the same container/label tokens as filled buttons.\n 'disabled:pointer-events-none disabled:shadow-none disabled:before:opacity-0',\n 'disabled:bg-on-surface/12 disabled:text-on-surface/38',\n 'data-[disabled]:pointer-events-none data-[disabled]:shadow-none data-[disabled]:before:opacity-0',\n 'data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38',\n ],\n variants: {\n size: {\n small: 'size-10 rounded-medium [&_svg]:size-6',\n regular: 'size-14 rounded-large [&_svg]:size-6',\n large: 'size-24 rounded-extra-large [&_svg]:size-9',\n extended: 'h-14 min-w-20 px-4 gap-3 rounded-large text-label-large [&_svg]:size-6',\n },\n color: {\n surface: 'bg-surface-container-high text-primary',\n primary: 'bg-primary-container text-on-primary-container',\n secondary: 'bg-secondary-container text-on-secondary-container',\n tertiary: 'bg-tertiary-container text-on-tertiary-container',\n },\n },\n defaultVariants: {\n size: 'regular',\n color: 'surface',\n },\n});\n\nexport const Fab = createFab(({ size, color }) => fabTv({ size, color }));\nexport type { FabProps, FabSize, FabColor } from '@m3-baseui/core';\n","/**\n * fab-menu.ts — tailwind-variants for the M3 FAB menu.\n *\n * The popup stacks the actions in a right-aligned column with the M3 menu\n * enter/exit motion; each item is a 56dp full-corner pill (elevation level3,\n * level4 on hover) with a currentColor state-layer `::before`, a 24dp leading\n * icon slot and a label-large label. The trigger reuses the FAB resolver. Same\n * DOM + ripple as the VE build.\n */\nimport { createFabMenu } from '@m3-baseui/core';\nimport { tv } from './tv';\nimport { fabTv } from './fab';\n\nexport const fabMenuTv = tv({\n slots: {\n popup: [\n 'flex flex-col items-end gap-2 bg-transparent outline-none',\n 'origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard',\n 'data-[starting-style]:opacity-0 data-[starting-style]:scale-95',\n 'data-[ending-style]:opacity-0',\n ],\n item: [\n 'relative inline-flex items-center gap-3 h-14 px-4 overflow-hidden box-border',\n 'cursor-pointer select-none outline-none rounded-full text-label-large',\n 'shadow-level3 hover:shadow-level4 transition-shadow duration-150 ease-standard',\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n // M3 leading icon (24dp).\n '[&_[data-slot=fab-menu-leading]]:inline-flex [&_[data-slot=fab-menu-leading]>svg]:size-6',\n // M3 discourages disabled FABs; when used, match the filled-button tokens\n // (per-token, not a blanket opacity) and suppress the state layer.\n 'data-[disabled]:pointer-events-none data-[disabled]:shadow-none data-[disabled]:before:opacity-0',\n 'data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38',\n ],\n },\n variants: {\n color: {\n surface: { item: 'bg-surface-container-high text-primary' },\n primary: { item: 'bg-primary-container text-on-primary-container' },\n secondary: { item: 'bg-secondary-container text-on-secondary-container' },\n tertiary: { item: 'bg-tertiary-container text-on-tertiary-container' },\n },\n },\n defaultVariants: {\n color: 'primary',\n },\n});\n\nexport const FabMenu = createFabMenu(({ size, color }) => fabTv({ size, color }), {\n popup: fabMenuTv().popup(),\n item: (color) => fabMenuTv({ color }).item(),\n});\n\nexport type { FabMenuTriggerProps, FabMenuItemProps } from '@m3-baseui/core';\n"]}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export { Select, selectTv } from './select.js';
13
13
  export { TextField, textFieldTv } from './textfield.js';
14
14
  export { NavigationBar, navigationBarTv } from './navigation-bar.js';
15
15
  export { Fab, fabTv } from './fab.js';
16
+ export { FabMenu, fabMenuTv } from './fab-menu.js';
16
17
  export { Divider, dividerTv } from './divider.js';
17
18
  export { Progress, circularTv, linearTv } from './progress.js';
18
19
  export { List, listTv } from './list.js';
@@ -22,7 +23,12 @@ export { Badge, badgeTv } from './badge.js';
22
23
  export { Card, cardTv } from './card.js';
23
24
  export { SegmentedButton, segmentedButtonTv } from './segmented-button.js';
24
25
  export { NavigationDrawer, navigationDrawerTv } from './navigation-drawer.js';
25
- export { BadgeProps, BadgeSize, ButtonProps, ButtonVariant, CardProps, CardVariant, ChipProps, ChipVariant, CircularProgressProps, ContrastLevel, DividerInset, DividerOrientation, DividerProps, FabColor, FabProps, FabSize, IconButtonProps, IconButtonVariant, ItemProps, LinearProgressProps, ListItemLines, ListItemProps, NavigationDrawerVariant, Ripple, SchemeVariant, TabsVariant, TextFieldProps, TextFieldVariant, ThemeMode, ThemeProvider, ThemeProviderProps, applyScheme, generateScheme, schemeToCssText, useSnackbar, useTheme } from '@m3-baseui/core';
26
+ export { TopAppBar, topAppBarTv } from './top-app-bar.js';
27
+ export { BottomAppBar, bottomAppBarTv } from './bottom-app-bar.js';
28
+ export { NavigationRail, navigationRailTv } from './navigation-rail.js';
29
+ export { BottomSheet, bottomSheetTv } from './bottom-sheet.js';
30
+ export { SideSheet, sideSheetTv } from './side-sheet.js';
31
+ export { BadgeProps, BadgeSize, BottomAppBarProps, BottomSheetVariant, ButtonProps, ButtonVariant, CardProps, CardVariant, ChipProps, ChipVariant, CircularProgressProps, ContrastLevel, DividerInset, DividerOrientation, DividerProps, FabColor, FabMenuItemProps, FabMenuTriggerProps, FabProps, FabSize, IconButtonProps, IconButtonVariant, ItemProps, LinearProgressProps, ListItemLines, ListItemProps, NavigationDrawerVariant, Ripple, SchemeVariant, SideSheetSide, SideSheetVariant, TabsVariant, TextFieldProps, TextFieldVariant, ThemeMode, ThemeProvider, ThemeProviderProps, TopAppBarProps, TopAppBarVariant, applyScheme, generateScheme, schemeToCssText, useSnackbar, useTheme } from '@m3-baseui/core';
26
32
  import '@base-ui/react';
27
33
  import 'react';
28
34
  import 'tailwind-variants';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { createButton, createIconButton, createSwitch, createCheckbox, createRadio, createRadioGroup, createChip, createTooltip, createDialog, createMenu, createTabs, createSlider, createSelect, createTextField, createNavigationBar, createFab, createDivider, createProgress, createList, createSnackbar, createItem, createBadge, createCard, createSegmentedButton, createNavigationDrawer } from '@m3-baseui/core';
2
+ import { createButton, createIconButton, createSwitch, createCheckbox, createRadio, createRadioGroup, createChip, createTooltip, createDialog, createMenu, createTabs, createSlider, createSelect, createTextField, createNavigationBar, createFab, createFabMenu, createDivider, createProgress, createList, createSnackbar, createItem, createBadge, createCard, createSegmentedButton, createNavigationDrawer, createTopAppBar, createBottomAppBar, createNavigationRail, createBottomSheet, createSideSheet } from '@m3-baseui/core';
3
3
  export { Ripple, ThemeProvider, applyScheme, generateScheme, schemeToCssText, useSnackbar, useTheme } from '@m3-baseui/core';
4
4
  import { tv } from 'tailwind-variants';
5
5
 
@@ -593,13 +593,13 @@ var tabsTv = tv7({
593
593
  }
594
594
  });
595
595
  var Tabs = createTabs((variant) => {
596
- const s9 = tabsTv({ variant });
596
+ const s13 = tabsTv({ variant });
597
597
  return {
598
- root: s9.root(),
599
- list: s9.list(),
600
- tab: s9.tab(),
601
- indicator: s9.indicator(),
602
- panel: s9.panel()
598
+ root: s13.root(),
599
+ list: s13.list(),
600
+ tab: s13.tab(),
601
+ indicator: s13.indicator(),
602
+ panel: s13.panel()
603
603
  };
604
604
  });
605
605
  var sliderTv = tv7({
@@ -730,7 +730,8 @@ var textFieldTv = tv({
730
730
  field: [
731
731
  "rounded-t-extra-small bg-surface-container-highest",
732
732
  "border-b-2 border-outline",
733
- "group-data-[focused]:border-primary group-data-[invalid]:border-error"
733
+ // M3 filled focus-active-indicator-height is 3dp (resting/error stay 2dp).
734
+ "group-data-[focused]:border-b-[3px] group-data-[focused]:border-primary group-data-[invalid]:border-error"
734
735
  ],
735
736
  input: "pt-3",
736
737
  label: [
@@ -741,7 +742,9 @@ var textFieldTv = tv({
741
742
  outlined: {
742
743
  field: [
743
744
  "rounded-extra-small border border-outline",
744
- "group-data-[focused]:border-2 group-data-[focused]:border-primary group-data-[focused]:px-[15px]",
745
+ // M3 outlined focus-outline-width is 3dp (matches Select's trigger);
746
+ // padding drops 2px so content stays steady as the 1dp border grows.
747
+ "group-data-[focused]:border-[3px] group-data-[focused]:border-primary group-data-[focused]:px-[14px]",
745
748
  "group-data-[invalid]:border-error"
746
749
  ],
747
750
  label: [
@@ -776,7 +779,8 @@ var navigationBarTv = tv({
776
779
  item: [
777
780
  "group relative flex flex-1 flex-col items-center justify-center gap-1 px-1 pt-3 pb-4",
778
781
  "bg-transparent border-0 cursor-pointer select-none outline-none",
779
- "data-[disabled]:opacity-[0.38] data-[disabled]:pointer-events-none"
782
+ // M3 disabled is per-token (icon + label dimmed below), not a blanket fade.
783
+ "data-[disabled]:pointer-events-none"
780
784
  ],
781
785
  iconWrap: "relative flex items-center justify-center w-16 h-8",
782
786
  indicator: [
@@ -786,17 +790,32 @@ var navigationBarTv = tv({
786
790
  "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
787
791
  "group-hover:before:opacity-[var(--md-sys-state-hover)]",
788
792
  "group-focus-visible:before:opacity-[var(--md-sys-state-focus)]",
789
- "group-active:before:opacity-[var(--md-sys-state-pressed)]"
793
+ "group-active:before:opacity-[var(--md-sys-state-pressed)]",
794
+ // No state layer on a disabled destination.
795
+ "group-data-[disabled]:before:opacity-0"
790
796
  ],
791
797
  icon: [
792
798
  "relative flex items-center justify-center text-on-surface-variant",
793
799
  "transition-colors duration-150 ease-standard",
794
- "group-data-[pressed]:text-on-secondary-container"
800
+ // Raw <svg> icons render at 24dp (Material Symbols set their own size).
801
+ "[&_svg]:size-6",
802
+ "group-data-[pressed]:text-on-secondary-container",
803
+ // M3 disabled: icon dims to on-surface/0.38. The item is the only `.group`,
804
+ // so the disabled+active override must test both attributes on that single
805
+ // element (`.group[data-disabled][data-pressed] &`) to outrank the equal-
806
+ // specificity data-[pressed] color — a stacked `group-data-*:group-data-*`
807
+ // would expect two nested groups and never match.
808
+ "group-data-[disabled]:text-on-surface/[0.38]",
809
+ "group-[&[data-disabled][data-pressed]]:text-on-surface/[0.38]"
795
810
  ],
796
811
  label: [
797
812
  "text-label-medium text-on-surface-variant",
798
813
  "transition-colors duration-150 ease-standard",
799
- "group-data-[pressed]:text-on-surface group-data-[pressed]:font-bold"
814
+ "group-data-[pressed]:text-on-surface group-data-[pressed]:font-bold",
815
+ // M3 disabled: label dims to on-surface/0.38. Same-element override (see the
816
+ // icon slot) keeps a disabled+active label dimmed.
817
+ "group-data-[disabled]:text-on-surface/[0.38]",
818
+ "group-[&[data-disabled][data-pressed]]:text-on-surface/[0.38]"
800
819
  ]
801
820
  }
802
821
  });
@@ -847,6 +866,46 @@ var fabTv = tv({
847
866
  }
848
867
  });
849
868
  var Fab = createFab(({ size, color }) => fabTv({ size, color }));
869
+ var fabMenuTv = tv7({
870
+ slots: {
871
+ popup: [
872
+ "flex flex-col items-end gap-2 bg-transparent outline-none",
873
+ "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
874
+ "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
875
+ "data-[ending-style]:opacity-0"
876
+ ],
877
+ item: [
878
+ "relative inline-flex items-center gap-3 h-14 px-4 overflow-hidden box-border",
879
+ "cursor-pointer select-none outline-none rounded-full text-label-large",
880
+ "shadow-level3 hover:shadow-level4 transition-shadow duration-150 ease-standard",
881
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
882
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
883
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
884
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
885
+ // M3 leading icon (24dp).
886
+ "[&_[data-slot=fab-menu-leading]]:inline-flex [&_[data-slot=fab-menu-leading]>svg]:size-6",
887
+ // M3 discourages disabled FABs; when used, match the filled-button tokens
888
+ // (per-token, not a blanket opacity) and suppress the state layer.
889
+ "data-[disabled]:pointer-events-none data-[disabled]:shadow-none data-[disabled]:before:opacity-0",
890
+ "data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38"
891
+ ]
892
+ },
893
+ variants: {
894
+ color: {
895
+ surface: { item: "bg-surface-container-high text-primary" },
896
+ primary: { item: "bg-primary-container text-on-primary-container" },
897
+ secondary: { item: "bg-secondary-container text-on-secondary-container" },
898
+ tertiary: { item: "bg-tertiary-container text-on-tertiary-container" }
899
+ }
900
+ },
901
+ defaultVariants: {
902
+ color: "primary"
903
+ }
904
+ });
905
+ var FabMenu = createFabMenu(({ size, color }) => fabTv({ size, color }), {
906
+ popup: fabMenuTv().popup(),
907
+ item: (color) => fabMenuTv({ color }).item()
908
+ });
850
909
  var dividerTv = tv({
851
910
  base: "shrink-0 self-stretch border-0 bg-outline-variant",
852
911
  variants: {
@@ -863,7 +922,8 @@ var dividerTv = tv({
863
922
  compoundVariants: [
864
923
  { orientation: "horizontal", inset: "inset", class: "ms-4" },
865
924
  { orientation: "horizontal", inset: "middle", class: "mx-4" },
866
- { orientation: "vertical", inset: "inset", class: "mt-4" },
925
+ // Logical block-start margin mirrors the VE recipe's `marginBlockStart`.
926
+ { orientation: "vertical", inset: "inset", class: "[margin-block-start:1rem]" },
867
927
  { orientation: "vertical", inset: "middle", class: "my-4" }
868
928
  ],
869
929
  defaultVariants: {
@@ -976,7 +1036,7 @@ var snackbarTv = tv({
976
1036
  ],
977
1037
  content: "flex flex-col flex-1 min-w-0 gap-0.5",
978
1038
  title: "text-body-medium",
979
- description: "text-body-small opacity-90",
1039
+ description: "text-body-medium",
980
1040
  action: [
981
1041
  "relative inline-flex items-center justify-center shrink-0 h-9 px-3 overflow-hidden",
982
1042
  "rounded-extra-small bg-transparent border-0 cursor-pointer outline-none",
@@ -1054,6 +1114,8 @@ var cardTv = tv7({
1054
1114
  interactive: {
1055
1115
  true: [
1056
1116
  "group overflow-hidden cursor-pointer select-none text-left w-full outline-none",
1117
+ // Animate the elevation lift/settle to match the VE box-shadow transition.
1118
+ "transition-shadow duration-150 ease-standard",
1057
1119
  "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
1058
1120
  "hover:before:opacity-[var(--md-sys-state-hover)]",
1059
1121
  "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
@@ -1160,7 +1222,188 @@ var NavigationDrawer = createNavigationDrawer({
1160
1222
  label: s8.label(),
1161
1223
  trailing: s8.trailing()
1162
1224
  });
1225
+ var topAppBarTv = tv7({
1226
+ slots: {
1227
+ root: "flex flex-col w-full box-border h-16 bg-surface text-on-surface",
1228
+ row: "flex items-center gap-1 h-16 px-1",
1229
+ leading: "flex items-center shrink-0 text-on-surface [&_svg]:size-6",
1230
+ headline: "min-w-0 truncate text-on-surface",
1231
+ trailing: "flex items-center gap-1 shrink-0 text-on-surface-variant [&_svg]:size-6"
1232
+ },
1233
+ variants: {
1234
+ variant: {
1235
+ small: { headline: "flex-1 px-3 text-title-large" },
1236
+ center: { headline: "flex-1 px-3 text-center text-title-large" },
1237
+ medium: { root: "h-28", headline: "px-4 pb-6 text-headline-small" },
1238
+ large: { root: "h-38", headline: "px-4 pb-7 text-headline-medium" }
1239
+ }
1240
+ },
1241
+ defaultVariants: {
1242
+ variant: "small"
1243
+ }
1244
+ });
1245
+ var TopAppBar = createTopAppBar((args) => {
1246
+ const s13 = topAppBarTv({ variant: args.variant });
1247
+ return {
1248
+ root: s13.root(),
1249
+ row: s13.row(),
1250
+ leading: s13.leading(),
1251
+ headline: s13.headline(),
1252
+ trailing: s13.trailing()
1253
+ };
1254
+ });
1255
+ var bottomAppBarTv = tv7({
1256
+ slots: {
1257
+ root: "flex items-center justify-between w-full box-border h-20 px-1 bg-surface-container text-on-surface-variant",
1258
+ actions: "flex items-center gap-1 pl-2 [&_svg]:size-6",
1259
+ fab: "flex items-center pr-3"
1260
+ }
1261
+ });
1262
+ var s9 = bottomAppBarTv();
1263
+ var BottomAppBar = createBottomAppBar({
1264
+ root: s9.root(),
1265
+ actions: s9.actions(),
1266
+ fab: s9.fab()
1267
+ });
1268
+ var navigationRailTv = tv7({
1269
+ slots: {
1270
+ root: "flex flex-col items-center gap-3 h-full w-20 py-5 bg-surface",
1271
+ header: "flex flex-col items-center gap-3 mb-1",
1272
+ item: [
1273
+ "group relative flex flex-col items-center justify-center gap-1 px-1 py-1",
1274
+ "bg-transparent border-0 cursor-pointer select-none outline-none",
1275
+ // M3 disabled is per-token (icon + label dimmed below), not a blanket fade.
1276
+ "data-[disabled]:pointer-events-none"
1277
+ ],
1278
+ iconWrap: "relative flex items-center justify-center w-14 h-8",
1279
+ indicator: [
1280
+ "absolute inset-0 rounded-full bg-transparent overflow-hidden",
1281
+ "transition-colors duration-150 ease-standard",
1282
+ "group-data-[pressed]:bg-secondary-container",
1283
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
1284
+ "group-hover:before:opacity-[var(--md-sys-state-hover)]",
1285
+ "group-focus-visible:before:opacity-[var(--md-sys-state-focus)]",
1286
+ "group-active:before:opacity-[var(--md-sys-state-pressed)]",
1287
+ // No state layer on a disabled destination.
1288
+ "group-data-[disabled]:before:opacity-0"
1289
+ ],
1290
+ icon: [
1291
+ "relative flex items-center justify-center text-on-surface-variant",
1292
+ "transition-colors duration-150 ease-standard",
1293
+ // Raw <svg> icons render at 24dp (Material Symbols set their own size).
1294
+ "[&_svg]:size-6",
1295
+ "group-data-[pressed]:text-on-secondary-container",
1296
+ // M3 disabled: icon dims to on-surface/0.38. The item is the only `.group`,
1297
+ // so the disabled+active override tests both attributes on that single
1298
+ // element (see NavigationBar for the rationale).
1299
+ "group-data-[disabled]:text-on-surface/[0.38]",
1300
+ "group-[&[data-disabled][data-pressed]]:text-on-surface/[0.38]"
1301
+ ],
1302
+ label: [
1303
+ "text-label-medium text-on-surface-variant",
1304
+ "transition-colors duration-150 ease-standard",
1305
+ "group-data-[pressed]:text-on-surface group-data-[pressed]:font-bold",
1306
+ // M3 disabled: label dims to on-surface/0.38 (same-element override).
1307
+ "group-data-[disabled]:text-on-surface/[0.38]",
1308
+ "group-[&[data-disabled][data-pressed]]:text-on-surface/[0.38]"
1309
+ ]
1310
+ }
1311
+ });
1312
+ var s10 = navigationRailTv();
1313
+ var NavigationRail = createNavigationRail({
1314
+ root: s10.root(),
1315
+ header: s10.header(),
1316
+ item: s10.item(),
1317
+ iconWrap: s10.iconWrap(),
1318
+ indicator: s10.indicator(),
1319
+ icon: s10.icon(),
1320
+ label: s10.label()
1321
+ });
1322
+ var bottomSheetTv = tv7({
1323
+ slots: {
1324
+ backdrop: [
1325
+ "fixed inset-0 z-40 bg-scrim/32",
1326
+ "transition-opacity duration-300 ease-emphasized",
1327
+ "data-[swiping]:transition-none",
1328
+ "data-[starting-style]:opacity-0 data-[ending-style]:opacity-0"
1329
+ ],
1330
+ viewport: "fixed inset-0 z-50 flex items-end justify-center",
1331
+ popup: [
1332
+ "box-border w-full max-w-[640px] max-h-[calc(100dvh-56px)]",
1333
+ "overflow-y-auto overscroll-contain touch-auto outline-none",
1334
+ "pb-6 bg-surface-container-low text-on-surface rounded-t-extra-large shadow-level1",
1335
+ "[transform:translateY(calc(var(--drawer-snap-point-offset)+var(--drawer-swipe-movement-y)))]",
1336
+ "transition-transform duration-300 ease-emphasized",
1337
+ "data-[swiping]:select-none",
1338
+ "data-[starting-style]:[transform:translateY(100%)] data-[ending-style]:[transform:translateY(100%)]"
1339
+ ],
1340
+ handle: "mx-auto mt-4 mb-2 h-1 w-8 shrink-0 rounded-full bg-on-surface-variant/40",
1341
+ title: ["m-0 px-6 pt-2 text-title-large text-on-surface"],
1342
+ description: ["m-0 px-6 pt-1 text-body-medium text-on-surface-variant"]
1343
+ }
1344
+ });
1345
+ var s11 = bottomSheetTv();
1346
+ var BottomSheet = createBottomSheet({
1347
+ backdrop: s11.backdrop(),
1348
+ viewport: s11.viewport(),
1349
+ popup: s11.popup(),
1350
+ handle: s11.handle(),
1351
+ title: s11.title(),
1352
+ description: s11.description()
1353
+ });
1354
+ var sideSheetTv = tv7({
1355
+ slots: {
1356
+ backdrop: [
1357
+ "fixed inset-0 z-40 bg-scrim/32",
1358
+ "transition-opacity duration-300 ease-emphasized",
1359
+ "data-[swiping]:transition-none",
1360
+ "data-[starting-style]:opacity-0 data-[ending-style]:opacity-0"
1361
+ ],
1362
+ viewport: "fixed inset-0 z-50 flex items-stretch",
1363
+ popup: [
1364
+ "box-border h-full w-[320px] max-w-[calc(100vw-56px)]",
1365
+ "flex flex-col overflow-y-auto overscroll-contain touch-auto outline-none",
1366
+ "bg-surface-container-low text-on-surface",
1367
+ "data-[swipe-direction=right]:ml-auto data-[swipe-direction=left]:mr-auto",
1368
+ "[transform:translateX(var(--drawer-swipe-movement-x))]",
1369
+ "transition-transform duration-300 ease-emphasized",
1370
+ "data-[swiping]:select-none",
1371
+ "data-[swipe-direction=right]:data-[starting-style]:[transform:translateX(100%)]",
1372
+ "data-[swipe-direction=right]:data-[ending-style]:[transform:translateX(100%)]",
1373
+ "data-[swipe-direction=left]:data-[starting-style]:[transform:translateX(-100%)]",
1374
+ "data-[swipe-direction=left]:data-[ending-style]:[transform:translateX(-100%)]"
1375
+ ],
1376
+ header: "flex items-center gap-2 min-h-14 px-4 py-2",
1377
+ title: ["flex-1 m-0 text-title-large text-on-surface"],
1378
+ description: ["m-0 px-6 pb-4 text-body-medium text-on-surface-variant"],
1379
+ close: "inline-flex shrink-0"
1380
+ },
1381
+ variants: {
1382
+ variant: {
1383
+ modal: {
1384
+ popup: [
1385
+ "shadow-level1",
1386
+ "data-[swipe-direction=right]:rounded-s-large data-[swipe-direction=left]:rounded-e-large"
1387
+ ]
1388
+ },
1389
+ standard: { popup: "shadow-none" }
1390
+ }
1391
+ },
1392
+ defaultVariants: {
1393
+ variant: "modal"
1394
+ }
1395
+ });
1396
+ var s12 = sideSheetTv();
1397
+ var SideSheet = createSideSheet({
1398
+ backdrop: s12.backdrop(),
1399
+ viewport: s12.viewport(),
1400
+ popup: ({ variant }) => sideSheetTv({ variant }).popup(),
1401
+ header: s12.header(),
1402
+ title: s12.title(),
1403
+ description: s12.description(),
1404
+ close: s12.close()
1405
+ });
1163
1406
 
1164
- export { Badge, Button, Card, Checkbox, Chip, Dialog, Divider, Fab, IconButton, Item, List, Menu, NavigationBar, NavigationDrawer, Progress, Radio, RadioGroup, SegmentedButton, Select, Slider, Snackbar, Switch, Tabs, TextField, Tooltip, badgeTv, button, cardTv, checkboxTv, chipTv, circularTv, dialogTv, dividerTv, fabTv, iconButton, itemTv, linearTv, listTv, menuTv, navigationBarTv, navigationDrawerTv, radioTv, segmentedButtonTv, selectTv, sliderTv, snackbarTv, switchTv, tabsTv, textFieldTv, tooltipTv };
1407
+ export { Badge, BottomAppBar, BottomSheet, Button, Card, Checkbox, Chip, Dialog, Divider, Fab, FabMenu, IconButton, Item, List, Menu, NavigationBar, NavigationDrawer, NavigationRail, Progress, Radio, RadioGroup, SegmentedButton, Select, SideSheet, Slider, Snackbar, Switch, Tabs, TextField, Tooltip, TopAppBar, badgeTv, bottomAppBarTv, bottomSheetTv, button, cardTv, checkboxTv, chipTv, circularTv, dialogTv, dividerTv, fabMenuTv, fabTv, iconButton, itemTv, linearTv, listTv, menuTv, navigationBarTv, navigationDrawerTv, navigationRailTv, radioTv, segmentedButtonTv, selectTv, sideSheetTv, sliderTv, snackbarTv, switchTv, tabsTv, textFieldTv, tooltipTv, topAppBarTv };
1165
1408
  //# sourceMappingURL=index.js.map
1166
1409
  //# sourceMappingURL=index.js.map