@m3-baseui/react-tailwind 1.4.0 → 3.0.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 (171) hide show
  1. package/dist/{badge.js → components/badge/index.js} +4 -4
  2. package/dist/components/badge/index.js.map +1 -0
  3. package/dist/{bottom-app-bar.d.ts → components/bottom-app-bar/index.d.ts} +22 -21
  4. package/dist/{bottom-app-bar.js → components/bottom-app-bar/index.js} +4 -4
  5. package/dist/components/bottom-app-bar/index.js.map +1 -0
  6. package/dist/{bottom-sheet.d.ts → components/bottom-sheet/index.d.ts} +37 -36
  7. package/dist/{bottom-sheet.js → components/bottom-sheet/index.js} +4 -4
  8. package/dist/components/bottom-sheet/index.js.map +1 -0
  9. package/dist/{button.js → components/button/index.js} +3 -3
  10. package/dist/components/button/index.js.map +1 -0
  11. package/dist/{button-group.js → components/button-group/index.js} +4 -4
  12. package/dist/components/button-group/index.js.map +1 -0
  13. package/dist/{card.js → components/card/index.js} +4 -4
  14. package/dist/components/card/index.js.map +1 -0
  15. package/dist/{carousel.d.ts → components/carousel/index.d.ts} +21 -0
  16. package/dist/{carousel.js → components/carousel/index.js} +11 -5
  17. package/dist/components/carousel/index.js.map +1 -0
  18. package/dist/{checkbox.d.ts → components/checkbox/index.d.ts} +22 -21
  19. package/dist/{checkbox.js → components/checkbox/index.js} +3 -3
  20. package/dist/components/checkbox/index.js.map +1 -0
  21. package/dist/{chip.js → components/chip/index.js} +3 -3
  22. package/dist/components/chip/index.js.map +1 -0
  23. package/dist/components/date-picker/index.d.ts +189 -0
  24. package/dist/{date-picker.js → components/date-picker/index.js} +4 -4
  25. package/dist/components/date-picker/index.js.map +1 -0
  26. package/dist/{dialog.js → components/dialog/index.js} +4 -4
  27. package/dist/components/dialog/index.js.map +1 -0
  28. package/dist/{divider.js → components/divider/index.js} +3 -3
  29. package/dist/components/divider/index.js.map +1 -0
  30. package/dist/{fab.d.ts → components/fab/index.d.ts} +29 -15
  31. package/dist/components/fab/index.js +79 -0
  32. package/dist/components/fab/index.js.map +1 -0
  33. package/dist/{fab-menu.d.ts → components/fab-menu/index.d.ts} +0 -21
  34. package/dist/{fab-menu.js → components/fab-menu/index.js} +49 -18
  35. package/dist/components/fab-menu/index.js.map +1 -0
  36. package/dist/{icon-button.js → components/icon-button/index.js} +3 -3
  37. package/dist/components/icon-button/index.js.map +1 -0
  38. package/dist/components/item/index.d.ts +95 -0
  39. package/dist/{item.js → components/item/index.js} +3 -3
  40. package/dist/components/item/index.js.map +1 -0
  41. package/dist/{list.js → components/list/index.js} +3 -3
  42. package/dist/components/list/index.js.map +1 -0
  43. package/dist/{loading-indicator.js → components/loading-indicator/index.js} +4 -4
  44. package/dist/components/loading-indicator/index.js.map +1 -0
  45. package/dist/{menu.d.ts → components/menu/index.d.ts} +61 -60
  46. package/dist/components/menu/index.js +179 -0
  47. package/dist/components/menu/index.js.map +1 -0
  48. package/dist/components/navigation-bar/index.d.ts +92 -0
  49. package/dist/{navigation-bar.js → components/navigation-bar/index.js} +3 -3
  50. package/dist/components/navigation-bar/index.js.map +1 -0
  51. package/dist/{navigation-drawer.js → components/navigation-drawer/index.js} +4 -4
  52. package/dist/components/navigation-drawer/index.js.map +1 -0
  53. package/dist/components/navigation-rail/index.d.ts +102 -0
  54. package/dist/{navigation-rail.js → components/navigation-rail/index.js} +4 -4
  55. package/dist/components/navigation-rail/index.js.map +1 -0
  56. package/dist/components/progress/index.d.ts +127 -0
  57. package/dist/components/progress/index.js +101 -0
  58. package/dist/components/progress/index.js.map +1 -0
  59. package/dist/{radio.d.ts → components/radio/index.d.ts} +17 -16
  60. package/dist/{radio.js → components/radio/index.js} +3 -3
  61. package/dist/components/radio/index.js.map +1 -0
  62. package/dist/{search.d.ts → components/search/index.d.ts} +62 -61
  63. package/dist/{search.js → components/search/index.js} +4 -4
  64. package/dist/components/search/index.js.map +1 -0
  65. package/dist/{segmented-button.d.ts → components/segmented-button/index.d.ts} +32 -31
  66. package/dist/{segmented-button.js → components/segmented-button/index.js} +4 -4
  67. package/dist/components/segmented-button/index.js.map +1 -0
  68. package/dist/components/select/index.d.ts +235 -0
  69. package/dist/components/select/index.js +260 -0
  70. package/dist/components/select/index.js.map +1 -0
  71. package/dist/{side-sheet.js → components/side-sheet/index.js} +4 -4
  72. package/dist/components/side-sheet/index.js.map +1 -0
  73. package/dist/{slider.d.ts → components/slider/index.d.ts} +52 -51
  74. package/dist/{slider.js → components/slider/index.js} +4 -4
  75. package/dist/components/slider/index.js.map +1 -0
  76. package/dist/{snackbar.d.ts → components/snackbar/index.d.ts} +42 -41
  77. package/dist/{snackbar.js → components/snackbar/index.js} +3 -3
  78. package/dist/components/snackbar/index.js.map +1 -0
  79. package/dist/{split-button.js → components/split-button/index.js} +4 -4
  80. package/dist/components/split-button/index.js.map +1 -0
  81. package/dist/components/switch/index.d.ts +73 -0
  82. package/dist/{switch.js → components/switch/index.js} +3 -3
  83. package/dist/components/switch/index.js.map +1 -0
  84. package/dist/{tabs.js → components/tabs/index.js} +4 -4
  85. package/dist/components/tabs/index.js.map +1 -0
  86. package/dist/{textfield.d.ts → components/textfield/index.d.ts} +7 -1
  87. package/dist/{textfield.js → components/textfield/index.js} +35 -13
  88. package/dist/components/textfield/index.js.map +1 -0
  89. package/dist/components/time-picker/index.d.ts +153 -0
  90. package/dist/{time-picker.js → components/time-picker/index.js} +28 -13
  91. package/dist/components/time-picker/index.js.map +1 -0
  92. package/dist/{toolbar.js → components/toolbar/index.js} +4 -4
  93. package/dist/components/toolbar/index.js.map +1 -0
  94. package/dist/{tooltip.d.ts → components/tooltip/index.d.ts} +47 -46
  95. package/dist/{tooltip.js → components/tooltip/index.js} +4 -4
  96. package/dist/components/tooltip/index.js.map +1 -0
  97. package/dist/{top-app-bar.js → components/top-app-bar/index.js} +4 -4
  98. package/dist/components/top-app-bar/index.js.map +1 -0
  99. package/dist/index.d.ts +40 -39
  100. package/dist/index.js +382 -130
  101. package/dist/index.js.map +1 -1
  102. package/package.json +151 -151
  103. package/styles/preset.css +75 -7
  104. package/styles/theme.css +2 -0
  105. package/styles/tokens.css +2 -0
  106. package/dist/badge.js.map +0 -1
  107. package/dist/bottom-app-bar.js.map +0 -1
  108. package/dist/bottom-sheet.js.map +0 -1
  109. package/dist/button-group.js.map +0 -1
  110. package/dist/button.js.map +0 -1
  111. package/dist/card.js.map +0 -1
  112. package/dist/carousel.js.map +0 -1
  113. package/dist/checkbox.js.map +0 -1
  114. package/dist/chip.js.map +0 -1
  115. package/dist/date-picker.d.ts +0 -188
  116. package/dist/date-picker.js.map +0 -1
  117. package/dist/dialog.js.map +0 -1
  118. package/dist/divider.js.map +0 -1
  119. package/dist/fab-menu.js.map +0 -1
  120. package/dist/fab.js +0 -47
  121. package/dist/fab.js.map +0 -1
  122. package/dist/icon-button.js.map +0 -1
  123. package/dist/item.d.ts +0 -94
  124. package/dist/item.js.map +0 -1
  125. package/dist/list.js.map +0 -1
  126. package/dist/loading-indicator.js.map +0 -1
  127. package/dist/menu.js +0 -114
  128. package/dist/menu.js.map +0 -1
  129. package/dist/navigation-bar.d.ts +0 -91
  130. package/dist/navigation-bar.js.map +0 -1
  131. package/dist/navigation-drawer.js.map +0 -1
  132. package/dist/navigation-rail.d.ts +0 -101
  133. package/dist/navigation-rail.js.map +0 -1
  134. package/dist/progress.d.ts +0 -118
  135. package/dist/progress.js +0 -62
  136. package/dist/progress.js.map +0 -1
  137. package/dist/radio.js.map +0 -1
  138. package/dist/search.js.map +0 -1
  139. package/dist/segmented-button.js.map +0 -1
  140. package/dist/select.d.ts +0 -125
  141. package/dist/select.js +0 -99
  142. package/dist/select.js.map +0 -1
  143. package/dist/side-sheet.js.map +0 -1
  144. package/dist/slider.js.map +0 -1
  145. package/dist/snackbar.js.map +0 -1
  146. package/dist/split-button.js.map +0 -1
  147. package/dist/switch.d.ts +0 -72
  148. package/dist/switch.js.map +0 -1
  149. package/dist/tabs.js.map +0 -1
  150. package/dist/textfield.js.map +0 -1
  151. package/dist/time-picker.d.ts +0 -144
  152. package/dist/time-picker.js.map +0 -1
  153. package/dist/toolbar.js.map +0 -1
  154. package/dist/tooltip.js.map +0 -1
  155. package/dist/top-app-bar.js.map +0 -1
  156. /package/dist/{badge.d.ts → components/badge/index.d.ts} +0 -0
  157. /package/dist/{button.d.ts → components/button/index.d.ts} +0 -0
  158. /package/dist/{button-group.d.ts → components/button-group/index.d.ts} +0 -0
  159. /package/dist/{card.d.ts → components/card/index.d.ts} +0 -0
  160. /package/dist/{chip.d.ts → components/chip/index.d.ts} +0 -0
  161. /package/dist/{dialog.d.ts → components/dialog/index.d.ts} +0 -0
  162. /package/dist/{divider.d.ts → components/divider/index.d.ts} +0 -0
  163. /package/dist/{icon-button.d.ts → components/icon-button/index.d.ts} +0 -0
  164. /package/dist/{list.d.ts → components/list/index.d.ts} +0 -0
  165. /package/dist/{loading-indicator.d.ts → components/loading-indicator/index.d.ts} +0 -0
  166. /package/dist/{navigation-drawer.d.ts → components/navigation-drawer/index.d.ts} +0 -0
  167. /package/dist/{side-sheet.d.ts → components/side-sheet/index.d.ts} +0 -0
  168. /package/dist/{split-button.d.ts → components/split-button/index.d.ts} +0 -0
  169. /package/dist/{tabs.d.ts → components/tabs/index.d.ts} +0 -0
  170. /package/dist/{toolbar.d.ts → components/toolbar/index.d.ts} +0 -0
  171. /package/dist/{top-app-bar.d.ts → components/top-app-bar/index.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { createButton, createIconButton, createSwitch, createCheckbox, createRad
3
3
  export { ITEM_LEADING_VARIANTS, LIST_LEADING_VARIANTS, Ripple, ThemeProvider, applyScheme, generateScheme, schemeToCssText, useSnackbar, useTheme } from '@m3-baseui/core';
4
4
  import { tv } from 'tailwind-variants';
5
5
 
6
- // src/button.ts
6
+ // src/components/button/button.ts
7
7
  var button = tv({
8
8
  base: [
9
9
  "relative inline-flex items-center justify-center gap-2",
@@ -465,7 +465,7 @@ var tv7 = (options, config) => tv(options, {
465
465
  }
466
466
  });
467
467
 
468
- // src/tooltip.ts
468
+ // src/components/tooltip/tooltip.ts
469
469
  var transition = [
470
470
  "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
471
471
  "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
@@ -573,16 +573,102 @@ var Dialog = createDialog({
573
573
  actions: d.actions(),
574
574
  close: d.close()
575
575
  });
576
+
577
+ // src/components/menu/menu-selectable-item.ts
578
+ var menuSelectableItemStateLayer = [
579
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
580
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
581
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
582
+ "active:before:opacity-[var(--md-sys-state-pressed)]"
583
+ ];
584
+ var menuSelectableItemSelectedFill = [
585
+ "data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container",
586
+ "data-[checked]:bg-secondary-container data-[checked]:text-on-secondary-container"
587
+ ];
588
+ var menuSelectableItemPositionShape = [
589
+ "data-[selected]:data-[position=only]:rounded-extra-small",
590
+ "data-[selected]:data-[position=first]:rounded-t-extra-small",
591
+ "data-[selected]:data-[position=middle]:rounded-none",
592
+ "data-[selected]:data-[position=last]:rounded-b-extra-small",
593
+ "data-[checked]:data-[position=only]:rounded-extra-small",
594
+ "data-[checked]:data-[position=first]:rounded-t-extra-small",
595
+ "data-[checked]:data-[position=middle]:rounded-none",
596
+ "data-[checked]:data-[position=last]:rounded-b-extra-small"
597
+ ];
598
+ var menuSelectableItemPositionShapeFallback = [
599
+ "data-[selected]:not([data-position]):rounded-extra-small",
600
+ "data-[checked]:not([data-position]):rounded-extra-small"
601
+ ];
602
+ var menuSelectableItemDisabled = [
603
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
604
+ "data-[disabled]:data-[selected]:bg-transparent data-[disabled]:data-[selected]:text-on-surface/[0.38]",
605
+ "data-[disabled]:data-[checked]:bg-transparent data-[disabled]:data-[checked]:text-on-surface/[0.38]"
606
+ ];
607
+ var menuSelectableItemBase = [
608
+ "group relative cursor-pointer select-none outline-none text-label-large text-on-surface",
609
+ "h-12 px-3 overflow-hidden",
610
+ ...menuSelectableItemStateLayer,
611
+ ...menuSelectableItemSelectedFill,
612
+ ...menuSelectableItemPositionShape,
613
+ ...menuSelectableItemPositionShapeFallback,
614
+ ...menuSelectableItemDisabled
615
+ ];
616
+ var menuSelectableItemTv = tv7({
617
+ slots: {
618
+ /** Select row: check + label + optional trailing meta. */
619
+ selectItem: ["grid grid-cols-[24px_1fr_auto] items-center gap-3", ...menuSelectableItemBase],
620
+ /** Menu checkbox / radio row: check + label. */
621
+ menuSelectableItem: ["grid grid-cols-[24px_1fr] items-center gap-3", ...menuSelectableItemBase],
622
+ itemIndicator: [
623
+ "inline-flex items-center justify-center text-on-surface",
624
+ "invisible group-data-[selected]:visible group-data-[checked]:visible",
625
+ "group-data-[selected]:text-on-secondary-container group-data-[checked]:text-on-secondary-container",
626
+ "group-data-[disabled]:text-on-surface/[0.38]"
627
+ ]
628
+ }
629
+ });
630
+ var menuSelectableItem = menuSelectableItemTv();
631
+
632
+ // src/components/menu/menu-surface.ts
633
+ var menuSurfaceBase = [
634
+ "py-2",
635
+ "bg-surface-container text-on-surface rounded-extra-small shadow-level2",
636
+ "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
637
+ "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
638
+ "data-[ending-style]:opacity-0",
639
+ "focus:outline-none"
640
+ ];
641
+ var menuSurfaceTv = tv7({
642
+ slots: {
643
+ popup: ["max-w-[280px]", ...menuSurfaceBase],
644
+ groupLabel: "px-3 py-2 text-label-small text-on-surface-variant"
645
+ },
646
+ variants: {
647
+ width: {
648
+ /** Standalone Menu: 112–280dp. */
649
+ standard: { popup: "min-w-[112px]" },
650
+ /** Exposed Dropdown / Select: at least anchor width, capped at 280dp. */
651
+ anchor: { popup: "min-w-[max(112px,var(--anchor-width))]" }
652
+ },
653
+ scroll: {
654
+ none: {},
655
+ /** Select popup: clamp height and scroll the list. */
656
+ auto: { popup: "max-h-[var(--available-height)] overflow-auto" }
657
+ }
658
+ },
659
+ defaultVariants: {
660
+ width: "standard",
661
+ scroll: "none"
662
+ }
663
+ });
664
+ menuSurfaceTv();
665
+
666
+ // src/components/menu/menu.ts
667
+ var surface = menuSurfaceTv({ width: "standard", scroll: "none" });
668
+ var selectable = menuSelectableItem;
576
669
  var menuTv = tv7({
577
670
  slots: {
578
- popup: [
579
- "min-w-[112px] max-w-[280px] py-2",
580
- "bg-surface-container text-on-surface rounded-extra-small shadow-level2",
581
- "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
582
- "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
583
- "data-[ending-style]:opacity-0",
584
- "focus:outline-none"
585
- ],
671
+ popup: surface.popup(),
586
672
  item: [
587
673
  "relative flex items-center gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none",
588
674
  "text-label-large text-on-surface",
@@ -599,7 +685,7 @@ var menuTv = tv7({
599
685
  "[&_[data-slot=menu-trailing]]:ml-auto [&_[data-slot=menu-trailing]]:pl-4 [&_[data-slot=menu-trailing]]:text-label-large [&_[data-slot=menu-trailing]]:text-on-surface-variant"
600
686
  ],
601
687
  separator: ["my-2 h-px border-0 bg-outline-variant"],
602
- groupLabel: ["px-3 py-2 text-label-small text-on-surface-variant"],
688
+ groupLabel: surface.groupLabel(),
603
689
  // Submenu trigger: item look + trailing chevron, highlighted while open.
604
690
  submenuTrigger: [
605
691
  "relative flex items-center justify-between gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none",
@@ -614,28 +700,9 @@ var menuTv = tv7({
614
700
  "data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38]",
615
701
  "[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6"
616
702
  ],
617
- // Selectable items: 24dp leading indicator column + label.
618
- checkboxItem: [
619
- "group relative grid grid-cols-[24px_1fr] items-center gap-3 h-12 px-3 overflow-hidden",
620
- "cursor-pointer select-none outline-none text-label-large text-on-surface",
621
- "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
622
- "hover:before:opacity-[var(--md-sys-state-hover)]",
623
- "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
624
- "active:before:opacity-[var(--md-sys-state-pressed)]",
625
- // M3 disabled (per-token): label on-surface/0.38, no state layer.
626
- "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none"
627
- ],
628
- radioItem: [
629
- "group relative grid grid-cols-[24px_1fr] items-center gap-3 h-12 px-3 overflow-hidden",
630
- "cursor-pointer select-none outline-none text-label-large text-on-surface",
631
- "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
632
- "hover:before:opacity-[var(--md-sys-state-hover)]",
633
- "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
634
- "active:before:opacity-[var(--md-sys-state-pressed)]",
635
- // M3 disabled (per-token): label on-surface/0.38, no state layer.
636
- "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none"
637
- ],
638
- itemIndicator: "inline-flex items-center justify-center text-on-surface invisible group-data-[checked]:visible group-data-[disabled]:text-on-surface/[0.38]"
703
+ checkboxItem: selectable.menuSelectableItem(),
704
+ radioItem: selectable.menuSelectableItem(),
705
+ itemIndicator: selectable.itemIndicator()
639
706
  }
640
707
  });
641
708
  var m = menuTv();
@@ -754,6 +821,8 @@ var Slider = createSlider({
754
821
  tick: s2.tick(),
755
822
  valueLabel: s2.valueLabel()
756
823
  });
824
+ var surface2 = menuSurfaceTv({ width: "anchor", scroll: "auto" });
825
+ var selectable2 = menuSelectableItem;
757
826
  var selectTv = tv7({
758
827
  slots: {
759
828
  trigger: [
@@ -768,62 +837,133 @@ var selectTv = tv7({
768
837
  ],
769
838
  value: "flex-1 truncate",
770
839
  icon: "flex text-on-surface-variant transition-transform duration-150 group-data-[popup-open]:rotate-180 group-data-[disabled]:text-on-surface/[0.38]",
771
- popup: [
772
- "min-w-[var(--anchor-width)] max-h-[var(--available-height)] py-2 overflow-auto",
773
- "bg-surface-container text-on-surface rounded-extra-small shadow-level2",
774
- "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
775
- "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
776
- "data-[ending-style]:opacity-0",
777
- "focus:outline-none"
778
- ],
840
+ popup: surface2.popup(),
779
841
  item: [
780
- "group relative grid grid-cols-[24px_1fr_auto] items-center gap-2 h-12 px-3 overflow-hidden",
781
- "cursor-pointer select-none outline-none text-body-large text-on-surface",
782
- "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
783
- "hover:before:opacity-[var(--md-sys-state-hover)]",
784
- "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
785
- "active:before:opacity-[var(--md-sys-state-pressed)]",
786
- // M3 disabled (per-token, not a blanket fade): label + trailing supporting
787
- // text on-surface/0.38, no state layer.
788
- "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
789
- "data-[disabled]:[&_[data-slot=select-trailing]]:text-on-surface/[0.38]",
842
+ selectable2.selectItem(),
790
843
  // M3 trailing supporting text (e.g. meta) sits in the last column.
791
- "[&_[data-slot=select-trailing]]:pl-4 [&_[data-slot=select-trailing]]:text-label-large [&_[data-slot=select-trailing]]:text-on-surface-variant"
792
- ],
793
- itemIndicator: "inline-flex items-center justify-center text-primary invisible group-data-[selected]:visible group-data-[disabled]:text-on-surface/[0.38]",
794
- groupLabel: "px-3 py-2 text-label-small text-on-surface-variant",
795
- // Sticky scroll affordances at the popup edges; surface-tinted with a chevron.
796
- scrollUpArrow: [
797
- "sticky top-0 z-[1] flex items-center justify-center h-6 cursor-default",
798
- "bg-surface-container text-on-surface-variant [&>svg]:size-5"
799
- ],
800
- scrollDownArrow: [
801
- "sticky bottom-0 z-[1] flex items-center justify-center h-6 cursor-default",
802
- "bg-surface-container text-on-surface-variant [&>svg]:size-5"
803
- ]
844
+ "[&_[data-slot=select-trailing]]:pl-4 [&_[data-slot=select-trailing]]:text-label-large [&_[data-slot=select-trailing]]:text-on-surface-variant",
845
+ "data-[selected]:[&_[data-slot=select-trailing]]:text-on-secondary-container",
846
+ "data-[disabled]:[&_[data-slot=select-trailing]]:text-on-surface/[0.38]"
847
+ ],
848
+ itemIndicator: selectable2.itemIndicator(),
849
+ groupLabel: surface2.groupLabel()
804
850
  }
805
851
  });
806
- var s3 = selectTv();
807
- var Select = createSelect({
808
- trigger: s3.trigger(),
809
- value: s3.value(),
810
- icon: s3.icon(),
811
- popup: s3.popup(),
812
- item: s3.item(),
813
- itemIndicator: s3.itemIndicator(),
814
- groupLabel: s3.groupLabel(),
815
- scrollUpArrow: s3.scrollUpArrow(),
816
- scrollDownArrow: s3.scrollDownArrow()
852
+ var selectFieldTv = tv7({
853
+ slots: {
854
+ // The `group` hook lives here (not in engine-neutral core): supporting text
855
+ // keys its error color off Field.Root's `group-data-[invalid]`.
856
+ root: "group flex flex-col gap-1 min-w-[210px]",
857
+ field: [
858
+ "group/field relative flex items-stretch gap-3 h-14 px-4 box-border w-full",
859
+ "text-on-surface text-body-large cursor-pointer text-left outline-none",
860
+ "transition-[border-color,padding] duration-150 ease-standard",
861
+ "data-[disabled]:opacity-[0.38] data-[disabled]:pointer-events-none"
862
+ ],
863
+ inputWrap: "relative z-0 flex-1 flex items-center min-w-0 overflow-visible",
864
+ value: "flex-1 truncate text-body-large text-on-surface",
865
+ label: [
866
+ "absolute left-0 pointer-events-none origin-left",
867
+ "top-1/2 -translate-y-1/2 text-body-large text-on-surface-variant",
868
+ "transition-all duration-150 ease-standard",
869
+ "group-data-[focused]/field:text-primary group-data-[invalid]/field:text-error"
870
+ ],
871
+ icon: [
872
+ // Disabled dimming comes from the field's own opacity (0.38); no per-icon
873
+ // color override here, else it would compound to ~0.14.
874
+ "flex items-center text-on-surface-variant transition-transform duration-150 [&>svg]:size-6",
875
+ "group-data-[popup-open]/field:rotate-180"
876
+ ],
877
+ leadingIcon: "inline-flex items-center justify-center shrink-0 text-on-surface-variant [&>svg]:size-6",
878
+ supporting: [
879
+ "flex justify-between gap-4 px-4 text-body-small text-on-surface-variant",
880
+ "group-data-[invalid]:text-error"
881
+ ],
882
+ supportingText: "min-w-0"
883
+ },
884
+ variants: {
885
+ variant: {
886
+ filled: {
887
+ field: [
888
+ "overflow-hidden rounded-t-extra-small bg-surface-container-highest",
889
+ // M3 filled hover: state layer (on-surface × state-hover).
890
+ "before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none",
891
+ "before:transition-opacity before:duration-100",
892
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
893
+ "data-[disabled]:before:opacity-0",
894
+ // M3 filled resting active-indicator: 1dp on-surface-variant.
895
+ "border-b border-on-surface-variant hover:border-on-surface",
896
+ // M3 filled focus-active-indicator-height is 3dp.
897
+ "data-[focused]:border-b-[3px] data-[focused]:border-primary",
898
+ "data-[popup-open]:border-b-[3px] data-[popup-open]:border-primary",
899
+ "data-[invalid]:border-error"
900
+ ],
901
+ value: "pt-3",
902
+ label: [
903
+ "group-data-[focused]/field:top-1.5 group-data-[focused]/field:translate-y-0 group-data-[focused]/field:text-body-small",
904
+ "group-data-[filled]/field:top-1.5 group-data-[filled]/field:translate-y-0 group-data-[filled]/field:text-body-small",
905
+ "group-data-[popup-open]/field:top-1.5 group-data-[popup-open]/field:translate-y-0 group-data-[popup-open]/field:text-body-small",
906
+ "group-data-[has-placeholder]/field:top-1.5 group-data-[has-placeholder]/field:translate-y-0 group-data-[has-placeholder]/field:text-body-small"
907
+ ]
908
+ },
909
+ outlined: {
910
+ field: [
911
+ "overflow-visible rounded-extra-small border border-outline hover:border-on-surface",
912
+ // M3 outlined focus-outline-width is 3dp; padding drops 2px so content
913
+ // stays steady as the 1dp border grows (matches the TextField anchor).
914
+ "data-[focused]:border-[3px] data-[focused]:border-primary data-[focused]:px-[14px]",
915
+ "data-[popup-open]:border-[3px] data-[popup-open]:border-primary data-[popup-open]:px-[14px]",
916
+ "data-[invalid]:border-error"
917
+ ],
918
+ label: [
919
+ "group-data-[focused]/field:top-0 group-data-[focused]/field:-translate-y-1/2 group-data-[focused]/field:z-[1] group-data-[focused]/field:text-body-small group-data-[focused]/field:bg-surface group-data-[focused]/field:px-1 group-data-[focused]/field:leading-none",
920
+ "group-data-[filled]/field:top-0 group-data-[filled]/field:-translate-y-1/2 group-data-[filled]/field:z-[1] group-data-[filled]/field:text-body-small group-data-[filled]/field:bg-surface group-data-[filled]/field:px-1 group-data-[filled]/field:leading-none",
921
+ "group-data-[popup-open]/field:top-0 group-data-[popup-open]/field:-translate-y-1/2 group-data-[popup-open]/field:z-[1] group-data-[popup-open]/field:text-body-small group-data-[popup-open]/field:bg-surface group-data-[popup-open]/field:px-1 group-data-[popup-open]/field:leading-none",
922
+ "group-data-[has-placeholder]/field:top-0 group-data-[has-placeholder]/field:-translate-y-1/2 group-data-[has-placeholder]/field:z-[1] group-data-[has-placeholder]/field:text-body-small group-data-[has-placeholder]/field:bg-surface group-data-[has-placeholder]/field:px-1 group-data-[has-placeholder]/field:leading-none"
923
+ ]
924
+ }
925
+ }
926
+ },
927
+ defaultVariants: {
928
+ variant: "outlined"
929
+ }
817
930
  });
931
+ var s3 = selectTv();
932
+ var Select = createSelect(
933
+ {
934
+ trigger: s3.trigger(),
935
+ value: s3.value(),
936
+ icon: s3.icon(),
937
+ popup: s3.popup(),
938
+ item: s3.item(),
939
+ itemIndicator: s3.itemIndicator(),
940
+ groupLabel: s3.groupLabel()
941
+ },
942
+ ({ variant }) => {
943
+ const f = selectFieldTv({ variant });
944
+ return {
945
+ root: f.root(),
946
+ field: f.field(),
947
+ inputWrap: f.inputWrap(),
948
+ value: f.value(),
949
+ label: f.label(),
950
+ icon: f.icon(),
951
+ leadingIcon: f.leadingIcon(),
952
+ supporting: f.supporting(),
953
+ supportingText: f.supportingText()
954
+ };
955
+ }
956
+ );
957
+ var iconVisual = "inline-flex items-center justify-center shrink-0 text-on-surface-variant [&>svg]:size-6";
818
958
  var textFieldTv = tv({
819
959
  slots: {
820
960
  root: "flex flex-col gap-1 min-w-[210px]",
821
961
  field: [
822
- "relative flex items-stretch gap-3 h-14 px-4 box-border",
962
+ "relative flex items-stretch gap-3 h-14 px-4 box-border text-on-surface",
823
963
  "transition-[border-color,padding] duration-150 ease-standard",
824
964
  "group-data-[disabled]:opacity-[0.38] group-data-[disabled]:pointer-events-none"
825
965
  ],
826
- inputWrap: "relative flex-1 flex items-center min-w-0",
966
+ inputWrap: "relative z-0 flex-1 flex items-center min-w-0 overflow-visible",
827
967
  input: [
828
968
  "peer w-full bg-transparent outline-none border-0 p-0 text-body-large text-on-surface",
829
969
  "placeholder:text-on-surface-variant"
@@ -834,8 +974,18 @@ var textFieldTv = tv({
834
974
  "transition-all duration-150 ease-standard",
835
975
  "group-data-[focused]:text-primary group-data-[invalid]:text-error"
836
976
  ],
837
- leadingIcon: "flex items-center shrink-0 text-on-surface-variant",
838
- trailingIcon: "flex items-center shrink-0 text-on-surface-variant",
977
+ leadingIcon: iconVisual,
978
+ trailingIcon: iconVisual,
979
+ leadingIconButton: [
980
+ iconVisual,
981
+ "relative size-12 p-0 border-0 bg-transparent cursor-pointer",
982
+ "group-data-[disabled]:pointer-events-none"
983
+ ],
984
+ trailingIconButton: [
985
+ iconVisual,
986
+ "relative size-12 p-0 border-0 bg-transparent cursor-pointer",
987
+ "group-data-[disabled]:pointer-events-none"
988
+ ],
839
989
  supporting: [
840
990
  "flex justify-between gap-4 px-4 text-body-small text-on-surface-variant",
841
991
  "group-data-[invalid]:text-error"
@@ -847,9 +997,15 @@ var textFieldTv = tv({
847
997
  variant: {
848
998
  filled: {
849
999
  field: [
850
- "rounded-t-extra-small bg-surface-container-highest",
851
- "border-b-2 border-outline",
852
- // M3 filled focus-active-indicator-height is 3dp (resting/error stay 2dp).
1000
+ "overflow-hidden rounded-t-extra-small bg-surface-container-highest",
1001
+ // M3 filled hover: state layer (on-surface × state-hover) + indicator color.
1002
+ "before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none",
1003
+ "before:transition-opacity before:duration-100",
1004
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
1005
+ "group-data-[disabled]:before:opacity-0",
1006
+ // M3 filled resting active-indicator: 1dp on-surface-variant.
1007
+ "border-b border-on-surface-variant hover:border-on-surface",
1008
+ // M3 filled focus-active-indicator-height is 3dp.
853
1009
  "group-data-[focused]:border-b-[3px] group-data-[focused]:border-primary group-data-[invalid]:border-error"
854
1010
  ],
855
1011
  input: "pt-3",
@@ -860,15 +1016,18 @@ var textFieldTv = tv({
860
1016
  },
861
1017
  outlined: {
862
1018
  field: [
863
- "rounded-extra-small border border-outline",
1019
+ // Outlined hover = outline color only (no container state layer per M3).
1020
+ "overflow-visible rounded-extra-small border border-outline hover:border-on-surface",
864
1021
  // M3 outlined focus-outline-width is 3dp (matches Select's trigger);
865
1022
  // padding drops 2px so content stays steady as the 1dp border grows.
866
1023
  "group-data-[focused]:border-[3px] group-data-[focused]:border-primary group-data-[focused]:px-[14px]",
867
1024
  "group-data-[invalid]:border-error"
868
1025
  ],
869
1026
  label: [
870
- "group-data-[focused]:top-0 group-data-[focused]:-translate-y-1/2 group-data-[focused]:text-body-small group-data-[focused]:bg-surface group-data-[focused]:px-1",
871
- "group-data-[filled]:top-0 group-data-[filled]:-translate-y-1/2 group-data-[filled]:text-body-small group-data-[filled]:bg-surface group-data-[filled]:px-1"
1027
+ "group-data-[focused]:top-0 group-data-[focused]:-translate-y-1/2 group-data-[focused]:z-[1]",
1028
+ "group-data-[focused]:text-body-small group-data-[focused]:bg-surface group-data-[focused]:px-1 group-data-[focused]:leading-none",
1029
+ "group-data-[filled]:top-0 group-data-[filled]:-translate-y-1/2 group-data-[filled]:z-[1]",
1030
+ "group-data-[filled]:text-body-small group-data-[filled]:bg-surface group-data-[filled]:px-1 group-data-[filled]:leading-none"
872
1031
  ]
873
1032
  }
874
1033
  }
@@ -887,6 +1046,8 @@ var TextField = createTextField(({ variant }) => {
887
1046
  label: c3.label(),
888
1047
  leadingIcon: c3.leadingIcon(),
889
1048
  trailingIcon: c3.trailingIcon(),
1049
+ leadingIconButton: c3.leadingIconButton(),
1050
+ trailingIconButton: c3.trailingIconButton(),
890
1051
  supporting: c3.supporting(),
891
1052
  supportingText: c3.supportingText(),
892
1053
  counter: c3.counter()
@@ -966,36 +1127,68 @@ var fabTv = tv({
966
1127
  "data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38"
967
1128
  ],
968
1129
  variants: {
969
- size: {
970
- small: "size-10 rounded-medium [&_svg]:size-6",
971
- regular: "size-14 rounded-large [&_svg]:size-6",
972
- large: "size-24 rounded-extra-large [&_svg]:size-9",
973
- extended: "h-14 min-w-20 px-4 gap-3 rounded-large text-label-large [&_svg]:size-6"
974
- },
1130
+ // Geometry is set by compoundVariants (size × variant); these keys exist so
1131
+ // the resolver can accept them.
1132
+ size: { small: "", medium: "", large: "" },
1133
+ variant: { standard: "", extended: "" },
975
1134
  color: {
976
- surface: "bg-surface-container-high text-primary",
977
1135
  primary: "bg-primary-container text-on-primary-container",
978
1136
  secondary: "bg-secondary-container text-on-secondary-container",
979
1137
  tertiary: "bg-tertiary-container text-on-tertiary-container"
980
1138
  }
981
1139
  },
1140
+ compoundVariants: [
1141
+ // ---- Standard (icon-only square): container / corner / icon ----
1142
+ { size: "small", variant: "standard", class: "size-14 rounded-large [&_svg]:size-6" },
1143
+ // 56 / 16 / 24
1144
+ {
1145
+ size: "medium",
1146
+ variant: "standard",
1147
+ class: "size-20 rounded-large-increased [&_svg]:size-7"
1148
+ // 80 / 20 / 28
1149
+ },
1150
+ { size: "large", variant: "standard", class: "size-24 rounded-extra-large [&_svg]:size-8" },
1151
+ // 96 / 28 / 32
1152
+ // ---- Extended (icon + label pill): height / corner / icon / padding / gap / label ----
1153
+ // `min-w-*` keeps the pill affordance for short / text-only labels (wider
1154
+ // than tall), matching the pre-Expressive extended FAB which guarded this.
1155
+ {
1156
+ size: "small",
1157
+ variant: "extended",
1158
+ class: "h-14 min-w-20 px-4 gap-2 rounded-large text-title-medium [&_svg]:size-6"
1159
+ // 56 / 16 / 24 / 16 / 8
1160
+ },
1161
+ {
1162
+ size: "medium",
1163
+ variant: "extended",
1164
+ class: "h-20 min-w-28 px-[26px] gap-4 rounded-large-increased text-title-large [&_svg]:size-7"
1165
+ // 80 / 20 / 28 / 26 / 16
1166
+ },
1167
+ {
1168
+ size: "large",
1169
+ variant: "extended",
1170
+ class: "h-24 min-w-32 px-7 gap-5 rounded-extra-large text-headline-small [&_svg]:size-8"
1171
+ // 96 / 28 / 32 / 28 / 20
1172
+ }
1173
+ ],
982
1174
  defaultVariants: {
983
- size: "regular",
984
- color: "surface"
1175
+ size: "small",
1176
+ variant: "standard",
1177
+ color: "primary"
985
1178
  }
986
1179
  });
987
- var Fab = createFab(({ size, color }) => fabTv({ size, color }));
1180
+ var Fab = createFab(({ size, color, variant }) => fabTv({ size, color, variant }));
988
1181
  var fabMenuTv = tv7({
989
1182
  slots: {
990
1183
  popup: [
991
- "flex flex-col items-end gap-2 bg-transparent outline-none",
1184
+ "flex flex-col items-end gap-1 bg-transparent outline-none",
992
1185
  "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
993
1186
  "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
994
1187
  "data-[ending-style]:opacity-0"
995
1188
  ],
996
1189
  item: [
997
- "relative inline-flex items-center gap-3 h-14 px-4 overflow-hidden box-border",
998
- "cursor-pointer select-none outline-none rounded-full text-label-large",
1190
+ "relative inline-flex items-center gap-2 h-14 px-6 overflow-hidden box-border",
1191
+ "cursor-pointer select-none outline-none rounded-full text-title-medium",
999
1192
  "shadow-level3 hover:shadow-level4 transition-shadow duration-150 ease-standard",
1000
1193
  "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
1001
1194
  "hover:before:opacity-[var(--md-sys-state-hover)]",
@@ -1011,7 +1204,6 @@ var fabMenuTv = tv7({
1011
1204
  },
1012
1205
  variants: {
1013
1206
  color: {
1014
- surface: { item: "bg-surface-container-high text-primary" },
1015
1207
  primary: { item: "bg-primary-container text-on-primary-container" },
1016
1208
  secondary: { item: "bg-secondary-container text-on-secondary-container" },
1017
1209
  tertiary: { item: "bg-tertiary-container text-on-tertiary-container" }
@@ -1053,13 +1245,16 @@ var dividerTv = tv({
1053
1245
  var Divider = createDivider(({ inset, orientation }) => dividerTv({ inset, orientation }));
1054
1246
  var linearTv = tv({
1055
1247
  slots: {
1056
- // The track-stop dot (4dp, primary) sits at the inline-end via `after:`. It's
1057
- // a determinate-only M3 concept, so it's hidden while indeterminate. Logical
1058
- // `end-0` mirrors with the indicator under `dir="rtl"`.
1248
+ // The track-stop dot (primary, full track height) sits at the inline-end via
1249
+ // `after:`. It's a determinate-only M3 concept, so it's hidden while
1250
+ // indeterminate. Logical `end-0` mirrors with the indicator under `dir="rtl"`.
1251
+ // Height comes from the factory (inline) so `thickness` is honored.
1059
1252
  root: [
1060
- "group relative block w-full h-1 overflow-hidden rounded-full",
1253
+ "group relative block w-full overflow-hidden rounded-full",
1254
+ // The dot is `--m3-thickness` tall (stroke height) and centered, so it stays
1255
+ // correct when the wavy track grows taller than the stroke.
1061
1256
  "after:content-[''] after:absolute after:end-0 after:top-1/2 after:-translate-y-1/2",
1062
- "after:size-1 after:rounded-full after:bg-primary",
1257
+ "after:h-[var(--m3-thickness,100%)] after:aspect-square after:rounded-full after:bg-primary",
1063
1258
  // Self variant (not `group-data-*`): the dot is on the root element itself,
1064
1259
  // which carries `data-indeterminate` — it isn't a descendant of `.group`.
1065
1260
  "data-[indeterminate]:after:hidden"
@@ -1068,40 +1263,76 @@ var linearTv = tv({
1068
1263
  // 4dp gap separates it from the active indicator (`--m3-progress` + 4px). The
1069
1264
  // gap uses logical inline insets so it tracks the indicator (which Base UI
1070
1265
  // anchors at inline-start) under `dir="rtl"`. Indeterminate has no fraction,
1071
- // so the inactive track spans the full width.
1266
+ // so the inactive track spans the full width. The flat track stays
1267
+ // `--m3-thickness` tall and centered even when the wavy root is taller.
1072
1268
  track: [
1073
1269
  "absolute inset-0",
1074
- "before:content-[''] before:absolute before:inset-y-0 before:end-0",
1075
- "before:[inset-inline-start:calc(var(--m3-progress,0%)+4px)]",
1270
+ "before:content-[''] before:absolute before:top-1/2 before:-translate-y-1/2 before:end-0",
1271
+ "before:h-[var(--m3-thickness,100%)]",
1272
+ "before:[inset-inline-start:calc(var(--m3-progress,0%)_+_4px)]",
1076
1273
  "before:bg-surface-container-highest before:rounded-full",
1077
1274
  "group-data-[indeterminate]:before:start-0"
1078
1275
  ],
1276
+ // Primary bar. Determinate: width from Base UI. Indeterminate: full width,
1277
+ // scaled + slid by the disjoint `primary` keyframe (origin at the start edge).
1278
+ // Wavy determinate: a scrolling sine tile masks the solid bar into a wave.
1079
1279
  indicator: [
1080
- "absolute inset-y-0 left-0 bg-primary rounded-full",
1280
+ "absolute inset-y-0 left-0 origin-left bg-primary rounded-full",
1081
1281
  "transition-[width] duration-200 ease-standard",
1082
- "group-data-[indeterminate]:w-2/5 group-data-[indeterminate]:transition-none",
1083
- "group-data-[indeterminate]:animate-m3-linear-indeterminate"
1282
+ "group-data-[indeterminate]:w-full group-data-[indeterminate]:transition-none",
1283
+ "group-data-[indeterminate]:animate-m3-linear-primary",
1284
+ "group-data-[wavy]:rounded-none",
1285
+ "group-data-[wavy]:[-webkit-mask-image:var(--m3-wave)] group-data-[wavy]:[mask-image:var(--m3-wave)]",
1286
+ "group-data-[wavy]:[-webkit-mask-repeat:repeat-x] group-data-[wavy]:[mask-repeat:repeat-x]",
1287
+ "group-data-[wavy]:[-webkit-mask-size:40px_100%] group-data-[wavy]:[mask-size:40px_100%]",
1288
+ "group-data-[wavy]:animate-m3-wave-flow",
1289
+ // Reduced motion: freeze the loops and show a static ~40% bar / static wave.
1290
+ "motion-reduce:group-data-[indeterminate]:w-2/5",
1291
+ "motion-reduce:group-data-[indeterminate]:animate-none motion-reduce:group-data-[wavy]:animate-none"
1292
+ ],
1293
+ // Second disjoint bar: only present visually while indeterminate.
1294
+ indicatorSecondary: [
1295
+ "absolute inset-y-0 left-0 w-full origin-left bg-primary rounded-full hidden",
1296
+ "group-data-[indeterminate]:block group-data-[indeterminate]:animate-m3-linear-secondary",
1297
+ // Reduced motion: a single static bar reads better than two frozen ones.
1298
+ "motion-reduce:group-data-[indeterminate]:hidden"
1084
1299
  ]
1085
1300
  }
1086
1301
  });
1087
1302
  var circularTv = tv({
1088
1303
  slots: {
1304
+ // Size comes from the factory (inline width/height) so `size` is honored.
1305
+ // Indeterminate rotates the whole ring; the arc grows/shrinks via the
1306
+ // indicator's own `dash` animation (M3 "advance").
1089
1307
  root: [
1090
- "inline-flex items-center justify-center size-12",
1308
+ "group inline-flex items-center justify-center",
1091
1309
  "[&_svg]:block [&_svg]:size-full",
1092
- "data-[indeterminate]:animate-spin"
1310
+ "data-[indeterminate]:animate-m3-circular-rotate",
1311
+ "motion-reduce:data-[indeterminate]:animate-none"
1312
+ ],
1313
+ // Both ends are rounded (M3); the inactive track sits behind with a 4dp gap.
1314
+ track: [
1315
+ "stroke-surface-container-highest [stroke-linecap:round]",
1316
+ "transition-[stroke-dasharray,stroke-dashoffset] duration-300 ease-standard"
1093
1317
  ],
1094
- track: "stroke-surface-container-highest [stroke-width:4px]",
1095
1318
  indicator: [
1096
- "stroke-primary [stroke-width:4px] [stroke-linecap:round]",
1097
- "transition-[stroke-dashoffset] duration-300 ease-standard"
1319
+ "stroke-primary [stroke-linecap:round]",
1320
+ "transition-[stroke-dasharray,stroke-dashoffset] duration-300 ease-standard",
1321
+ "group-data-[indeterminate]:animate-m3-circular-dash group-data-[indeterminate]:transition-none",
1322
+ // Reduced motion: freeze the arc at its static 25% length (no rotation).
1323
+ "motion-reduce:group-data-[indeterminate]:animate-none"
1098
1324
  ]
1099
1325
  }
1100
1326
  });
1101
1327
  var l = linearTv();
1102
1328
  var c2 = circularTv();
1103
1329
  var Progress = createProgress({
1104
- linear: { root: l.root(), track: l.track(), indicator: l.indicator() },
1330
+ linear: {
1331
+ root: l.root(),
1332
+ track: l.track(),
1333
+ indicator: l.indicator(),
1334
+ indicatorSecondary: l.indicatorSecondary()
1335
+ },
1105
1336
  circular: { root: c2.root(), track: c2.track(), indicator: c2.indicator() }
1106
1337
  });
1107
1338
  var loadingIndicatorTv = tv7({
@@ -1384,7 +1615,7 @@ var buttonGroup = tv7({
1384
1615
  }
1385
1616
  });
1386
1617
  var ButtonGroup = createButtonGroup(({ variant }) => buttonGroup({ variant }));
1387
- var surface = [
1618
+ var surface3 = [
1388
1619
  "relative inline-flex items-center justify-center h-10 overflow-hidden cursor-pointer select-none border-0 outline-none",
1389
1620
  "text-label-large",
1390
1621
  "transition-[background-color,color,border-color] duration-200 ease-standard",
@@ -1426,9 +1657,9 @@ var splitButtonTv = tv7({
1426
1657
  slots: {
1427
1658
  group: "inline-flex items-center gap-0.5",
1428
1659
  // leading: outer (start) corner full, seam (end) corner reduced.
1429
- leading: [...surface, "gap-2 px-6 rounded-s-full rounded-e-small"],
1660
+ leading: [...surface3, "gap-2 px-6 rounded-s-full rounded-e-small"],
1430
1661
  // trailing: seam (start) corner reduced, outer (end) corner full.
1431
- trailing: [...surface, "group gap-1 px-3 rounded-s-small rounded-e-full"],
1662
+ trailing: [...surface3, "group gap-1 px-3 rounded-s-small rounded-e-full"],
1432
1663
  chevron: [
1433
1664
  "inline-flex items-center justify-center shrink-0 [&>svg]:size-[18px]",
1434
1665
  "transition-transform duration-200 ease-standard group-data-[popup-open]:rotate-180"
@@ -1873,32 +2104,46 @@ var DatePicker = createDatePicker({
1873
2104
  modalHeadline: dp.modalHeadline(),
1874
2105
  modalActions: dp.modalActions()
1875
2106
  });
2107
+ var stateLayerBase = [
2108
+ "overflow-hidden",
2109
+ 'before:content-[""] before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',
2110
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
2111
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
2112
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
2113
+ "focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-2"
2114
+ ];
1876
2115
  var timePickerTv = tv7({
1877
2116
  slots: {
1878
- root: ["inline-flex flex-col items-center gap-2 p-2 text-on-surface"],
1879
- header: ["flex items-center gap-2"],
2117
+ root: ["inline-flex flex-col items-center p-2 text-on-surface"],
2118
+ header: ["flex items-center gap-3 min-h-[98px]"],
2119
+ display: ["inline-flex items-center"],
1880
2120
  field: [
1881
- "inline-grid place-items-center w-24 h-20 rounded-small overflow-hidden box-border",
2121
+ "relative",
2122
+ ...stateLayerBase,
2123
+ "inline-grid place-items-center w-24 h-20 rounded-small box-border",
1882
2124
  "bg-surface-container-highest text-on-surface text-display-large cursor-pointer outline-none",
1883
2125
  "border border-transparent transition-colors duration-100",
1884
2126
  "data-[selected]:bg-primary-container data-[selected]:text-on-primary-container"
1885
2127
  ],
1886
- colon: ["text-display-large text-on-surface px-1 leading-none"],
2128
+ colon: ["text-display-large text-on-surface px-1 leading-none self-center"],
1887
2129
  periods: [
1888
- "inline-flex flex-col rounded-small overflow-hidden border border-outline self-stretch",
1889
- "m-0 p-0 min-w-0"
2130
+ "inline-flex flex-col shrink-0 rounded-small overflow-hidden border border-outline",
2131
+ "h-[98px] w-[52px] m-0 p-0 min-w-0 box-border"
1890
2132
  ],
1891
2133
  period: [
1892
- "flex-1 inline-flex items-center justify-center px-3 min-h-[38px] w-14",
2134
+ "relative",
2135
+ ...stateLayerBase,
2136
+ "flex-1 inline-flex items-center justify-center min-h-12 h-12 w-full",
1893
2137
  "border-0 bg-transparent",
1894
2138
  "text-title-medium text-on-surface-variant cursor-pointer outline-none",
1895
2139
  "data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container",
1896
2140
  "[&+&]:border-t [&+&]:border-outline"
1897
2141
  ],
1898
2142
  dial: [
1899
- "relative size-[256px] my-2 p-0 min-w-0 border-0 rounded-full bg-surface-container-highest"
2143
+ "relative size-[256px] mt-[28px] p-0 min-w-0 border-0 rounded-full bg-surface-container-highest"
1900
2144
  ],
1901
2145
  dialNumber: [
2146
+ ...stateLayerBase,
1902
2147
  "absolute -translate-x-1/2 -translate-y-1/2 inline-grid place-items-center size-12 rounded-full",
1903
2148
  "border-0 bg-transparent",
1904
2149
  "text-body-large text-on-surface cursor-pointer outline-none select-none",
@@ -1910,7 +2155,7 @@ var timePickerTv = tv7({
1910
2155
  dialCenter: [
1911
2156
  "absolute left-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary pointer-events-none"
1912
2157
  ],
1913
- inputs: ["flex items-start gap-2"],
2158
+ inputs: ["flex items-start gap-3"],
1914
2159
  inputBox: [
1915
2160
  "w-24 h-20 rounded-small box-border text-center",
1916
2161
  "bg-surface-container-highest text-on-surface text-display-large outline-none",
@@ -1924,6 +2169,7 @@ var tp = timePickerTv();
1924
2169
  var TimePicker = createTimePicker(() => ({
1925
2170
  root: tp.root(),
1926
2171
  header: tp.header(),
2172
+ display: tp.display(),
1927
2173
  field: tp.field(),
1928
2174
  colon: tp.colon(),
1929
2175
  periods: tp.periods(),
@@ -1957,13 +2203,19 @@ var carouselTv = tv7({
1957
2203
  slots: {
1958
2204
  root: [
1959
2205
  "flex gap-2 overflow-x-auto snap-x snap-mandatory scroll-smooth",
1960
- "[scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
2206
+ "[scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
2207
+ // Keyboard focus ring (M3: 3px secondary, 2px offset); keyboard-only.
2208
+ "outline-none focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary",
2209
+ // Reduced motion: jump instead of smooth-scrolling between snap cells.
2210
+ "motion-reduce:scroll-auto"
1961
2211
  ],
1962
2212
  item: "snap-start shrink-0 overflow-hidden rounded-large"
1963
2213
  },
1964
2214
  variants: {
1965
2215
  variant: {
1966
2216
  "multi-browse": { item: "w-40 h-56" },
2217
+ // Uniform, wider cells that scroll past the container edge.
2218
+ uncontained: { item: "w-56 h-56" },
1967
2219
  hero: { item: "w-72 h-56 snap-center" },
1968
2220
  "full-screen": {
1969
2221
  // gap-0: full-screen slides fill the viewport with no inter-slide gap.
@@ -1979,6 +2231,6 @@ var Carousel = createCarousel((variant) => {
1979
2231
  return { root: s14.root(), item: s14.item() };
1980
2232
  });
1981
2233
 
1982
- export { Badge, BottomAppBar, BottomSheet, Button, ButtonGroup, Card, Carousel, Checkbox, Chip, DatePicker, Dialog, Divider, Fab, FabMenu, IconButton, Item, List, LoadingIndicator, Menu, NavigationBar, NavigationDrawer, NavigationRail, Progress, Radio, RadioGroup, RichTooltip, Search, SegmentedButton, Select, SideSheet, Slider, Snackbar, SplitButton, Switch, Tabs, TextField, TimePicker, Toolbar, Tooltip, TopAppBar, badgeTv, bottomAppBarTv, bottomSheetTv, button, buttonGroup, cardTv, carouselTv, checkboxTv, chipTv, circularTv, datePickerTv, dialogTv, dividerTv, fabMenuTv, fabTv, iconButton, itemTv, linearTv, listTv, loadingIndicatorTv, menuTv, navigationBarTv, navigationDrawerTv, navigationRailTv, radioTv, richTooltipTv, searchTv, segmentedButtonTv, selectTv, sideSheetTv, sliderTv, snackbarTv, splitButtonTv, switchTv, tabsTv, textFieldTv, timePickerTv, toolbarTv, tooltipTv, topAppBarTv };
2234
+ export { Badge, BottomAppBar, BottomSheet, Button, ButtonGroup, Card, Carousel, Checkbox, Chip, DatePicker, Dialog, Divider, Fab, FabMenu, IconButton, Item, List, LoadingIndicator, Menu, NavigationBar, NavigationDrawer, NavigationRail, Progress, Radio, RadioGroup, RichTooltip, Search, SegmentedButton, Select, SideSheet, Slider, Snackbar, SplitButton, Switch, Tabs, TextField, TimePicker, Toolbar, Tooltip, TopAppBar, badgeTv, bottomAppBarTv, bottomSheetTv, button, buttonGroup, cardTv, carouselTv, checkboxTv, chipTv, circularTv, datePickerTv, dialogTv, dividerTv, fabMenuTv, fabTv, iconButton, itemTv, linearTv, listTv, loadingIndicatorTv, menuTv, navigationBarTv, navigationDrawerTv, navigationRailTv, radioTv, richTooltipTv, searchTv, segmentedButtonTv, selectFieldTv, selectTv, sideSheetTv, sliderTv, snackbarTv, splitButtonTv, switchTv, tabsTv, textFieldTv, timePickerTv, toolbarTv, tooltipTv, topAppBarTv };
1983
2235
  //# sourceMappingURL=index.js.map
1984
2236
  //# sourceMappingURL=index.js.map