@m3-baseui/react-tailwind 1.4.0 → 2.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.js → components/carousel/index.js} +4 -4
  16. package/dist/components/carousel/index.js.map +1 -0
  17. package/dist/{checkbox.d.ts → components/checkbox/index.d.ts} +22 -21
  18. package/dist/{checkbox.js → components/checkbox/index.js} +3 -3
  19. package/dist/components/checkbox/index.js.map +1 -0
  20. package/dist/{chip.js → components/chip/index.js} +3 -3
  21. package/dist/components/chip/index.js.map +1 -0
  22. package/dist/components/date-picker/index.d.ts +189 -0
  23. package/dist/{date-picker.js → components/date-picker/index.js} +4 -4
  24. package/dist/components/date-picker/index.js.map +1 -0
  25. package/dist/{dialog.js → components/dialog/index.js} +4 -4
  26. package/dist/components/dialog/index.js.map +1 -0
  27. package/dist/{divider.js → components/divider/index.js} +3 -3
  28. package/dist/components/divider/index.js.map +1 -0
  29. package/dist/{fab.d.ts → components/fab/index.d.ts} +29 -15
  30. package/dist/components/fab/index.js +79 -0
  31. package/dist/components/fab/index.js.map +1 -0
  32. package/dist/{fab-menu.d.ts → components/fab-menu/index.d.ts} +0 -21
  33. package/dist/{fab-menu.js → components/fab-menu/index.js} +49 -18
  34. package/dist/components/fab-menu/index.js.map +1 -0
  35. package/dist/{icon-button.js → components/icon-button/index.js} +3 -3
  36. package/dist/components/icon-button/index.js.map +1 -0
  37. package/dist/components/item/index.d.ts +95 -0
  38. package/dist/{item.js → components/item/index.js} +3 -3
  39. package/dist/components/item/index.js.map +1 -0
  40. package/dist/{list.js → components/list/index.js} +3 -3
  41. package/dist/components/list/index.js.map +1 -0
  42. package/dist/{loading-indicator.js → components/loading-indicator/index.js} +4 -4
  43. package/dist/components/loading-indicator/index.js.map +1 -0
  44. package/dist/{menu.d.ts → components/menu/index.d.ts} +61 -60
  45. package/dist/components/menu/index.js +179 -0
  46. package/dist/components/menu/index.js.map +1 -0
  47. package/dist/components/navigation-bar/index.d.ts +92 -0
  48. package/dist/{navigation-bar.js → components/navigation-bar/index.js} +3 -3
  49. package/dist/components/navigation-bar/index.js.map +1 -0
  50. package/dist/{navigation-drawer.js → components/navigation-drawer/index.js} +4 -4
  51. package/dist/components/navigation-drawer/index.js.map +1 -0
  52. package/dist/components/navigation-rail/index.d.ts +102 -0
  53. package/dist/{navigation-rail.js → components/navigation-rail/index.js} +4 -4
  54. package/dist/components/navigation-rail/index.js.map +1 -0
  55. package/dist/components/progress/index.d.ts +127 -0
  56. package/dist/components/progress/index.js +101 -0
  57. package/dist/components/progress/index.js.map +1 -0
  58. package/dist/{radio.d.ts → components/radio/index.d.ts} +17 -16
  59. package/dist/{radio.js → components/radio/index.js} +3 -3
  60. package/dist/components/radio/index.js.map +1 -0
  61. package/dist/{search.d.ts → components/search/index.d.ts} +62 -61
  62. package/dist/{search.js → components/search/index.js} +4 -4
  63. package/dist/components/search/index.js.map +1 -0
  64. package/dist/{segmented-button.d.ts → components/segmented-button/index.d.ts} +32 -31
  65. package/dist/{segmented-button.js → components/segmented-button/index.js} +4 -4
  66. package/dist/components/segmented-button/index.js.map +1 -0
  67. package/dist/components/select/index.d.ts +253 -0
  68. package/dist/components/select/index.js +271 -0
  69. package/dist/components/select/index.js.map +1 -0
  70. package/dist/{side-sheet.js → components/side-sheet/index.js} +4 -4
  71. package/dist/components/side-sheet/index.js.map +1 -0
  72. package/dist/{slider.d.ts → components/slider/index.d.ts} +52 -51
  73. package/dist/{slider.js → components/slider/index.js} +4 -4
  74. package/dist/components/slider/index.js.map +1 -0
  75. package/dist/{snackbar.d.ts → components/snackbar/index.d.ts} +42 -41
  76. package/dist/{snackbar.js → components/snackbar/index.js} +3 -3
  77. package/dist/components/snackbar/index.js.map +1 -0
  78. package/dist/{split-button.js → components/split-button/index.js} +4 -4
  79. package/dist/components/split-button/index.js.map +1 -0
  80. package/dist/components/switch/index.d.ts +73 -0
  81. package/dist/{switch.js → components/switch/index.js} +3 -3
  82. package/dist/components/switch/index.js.map +1 -0
  83. package/dist/{tabs.js → components/tabs/index.js} +4 -4
  84. package/dist/components/tabs/index.js.map +1 -0
  85. package/dist/{textfield.d.ts → components/textfield/index.d.ts} +7 -1
  86. package/dist/{textfield.js → components/textfield/index.js} +35 -13
  87. package/dist/components/textfield/index.js.map +1 -0
  88. package/dist/components/time-picker/index.d.ts +153 -0
  89. package/dist/{time-picker.js → components/time-picker/index.js} +28 -13
  90. package/dist/components/time-picker/index.js.map +1 -0
  91. package/dist/{toolbar.js → components/toolbar/index.js} +4 -4
  92. package/dist/components/toolbar/index.js.map +1 -0
  93. package/dist/{tooltip.d.ts → components/tooltip/index.d.ts} +47 -46
  94. package/dist/{tooltip.js → components/tooltip/index.js} +4 -4
  95. package/dist/components/tooltip/index.js.map +1 -0
  96. package/dist/{top-app-bar.js → components/top-app-bar/index.js} +4 -4
  97. package/dist/components/top-app-bar/index.js.map +1 -0
  98. package/dist/index.d.ts +40 -39
  99. package/dist/index.js +376 -119
  100. package/dist/index.js.map +1 -1
  101. package/package.json +151 -151
  102. package/styles/preset.css +75 -7
  103. package/styles/theme.css +2 -0
  104. package/styles/tokens.css +2 -0
  105. package/dist/badge.js.map +0 -1
  106. package/dist/bottom-app-bar.js.map +0 -1
  107. package/dist/bottom-sheet.js.map +0 -1
  108. package/dist/button-group.js.map +0 -1
  109. package/dist/button.js.map +0 -1
  110. package/dist/card.js.map +0 -1
  111. package/dist/carousel.js.map +0 -1
  112. package/dist/checkbox.js.map +0 -1
  113. package/dist/chip.js.map +0 -1
  114. package/dist/date-picker.d.ts +0 -188
  115. package/dist/date-picker.js.map +0 -1
  116. package/dist/dialog.js.map +0 -1
  117. package/dist/divider.js.map +0 -1
  118. package/dist/fab-menu.js.map +0 -1
  119. package/dist/fab.js +0 -47
  120. package/dist/fab.js.map +0 -1
  121. package/dist/icon-button.js.map +0 -1
  122. package/dist/item.d.ts +0 -94
  123. package/dist/item.js.map +0 -1
  124. package/dist/list.js.map +0 -1
  125. package/dist/loading-indicator.js.map +0 -1
  126. package/dist/menu.js +0 -114
  127. package/dist/menu.js.map +0 -1
  128. package/dist/navigation-bar.d.ts +0 -91
  129. package/dist/navigation-bar.js.map +0 -1
  130. package/dist/navigation-drawer.js.map +0 -1
  131. package/dist/navigation-rail.d.ts +0 -101
  132. package/dist/navigation-rail.js.map +0 -1
  133. package/dist/progress.d.ts +0 -118
  134. package/dist/progress.js +0 -62
  135. package/dist/progress.js.map +0 -1
  136. package/dist/radio.js.map +0 -1
  137. package/dist/search.js.map +0 -1
  138. package/dist/segmented-button.js.map +0 -1
  139. package/dist/select.d.ts +0 -125
  140. package/dist/select.js +0 -99
  141. package/dist/select.js.map +0 -1
  142. package/dist/side-sheet.js.map +0 -1
  143. package/dist/slider.js.map +0 -1
  144. package/dist/snackbar.js.map +0 -1
  145. package/dist/split-button.js.map +0 -1
  146. package/dist/switch.d.ts +0 -72
  147. package/dist/switch.js.map +0 -1
  148. package/dist/tabs.js.map +0 -1
  149. package/dist/textfield.js.map +0 -1
  150. package/dist/time-picker.d.ts +0 -144
  151. package/dist/time-picker.js.map +0 -1
  152. package/dist/toolbar.js.map +0 -1
  153. package/dist/tooltip.js.map +0 -1
  154. package/dist/top-app-bar.js.map +0 -1
  155. /package/dist/{badge.d.ts → components/badge/index.d.ts} +0 -0
  156. /package/dist/{button.d.ts → components/button/index.d.ts} +0 -0
  157. /package/dist/{button-group.d.ts → components/button-group/index.d.ts} +0 -0
  158. /package/dist/{card.d.ts → components/card/index.d.ts} +0 -0
  159. /package/dist/{carousel.d.ts → components/carousel/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,30 +837,16 @@ 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"
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]"
792
847
  ],
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",
848
+ itemIndicator: selectable2.itemIndicator(),
849
+ groupLabel: surface2.groupLabel(),
795
850
  // Sticky scroll affordances at the popup edges; surface-tinted with a chevron.
796
851
  scrollUpArrow: [
797
852
  "sticky top-0 z-[1] flex items-center justify-center h-6 cursor-default",
@@ -803,27 +858,123 @@ var selectTv = tv7({
803
858
  ]
804
859
  }
805
860
  });
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()
861
+ var selectFieldTv = tv7({
862
+ slots: {
863
+ // The `group` hook lives here (not in engine-neutral core): supporting text
864
+ // keys its error color off Field.Root's `group-data-[invalid]`.
865
+ root: "group flex flex-col gap-1 min-w-[210px]",
866
+ field: [
867
+ "group/field relative flex items-stretch gap-3 h-14 px-4 box-border w-full",
868
+ "text-on-surface text-body-large cursor-pointer text-left outline-none",
869
+ "transition-[border-color,padding] duration-150 ease-standard",
870
+ "data-[disabled]:opacity-[0.38] data-[disabled]:pointer-events-none"
871
+ ],
872
+ inputWrap: "relative z-0 flex-1 flex items-center min-w-0 overflow-visible",
873
+ value: "flex-1 truncate text-body-large text-on-surface",
874
+ label: [
875
+ "absolute left-0 pointer-events-none origin-left",
876
+ "top-1/2 -translate-y-1/2 text-body-large text-on-surface-variant",
877
+ "transition-all duration-150 ease-standard",
878
+ "group-data-[focused]/field:text-primary group-data-[invalid]/field:text-error"
879
+ ],
880
+ icon: [
881
+ // Disabled dimming comes from the field's own opacity (0.38); no per-icon
882
+ // color override here, else it would compound to ~0.14.
883
+ "flex items-center text-on-surface-variant transition-transform duration-150 [&>svg]:size-6",
884
+ "group-data-[popup-open]/field:rotate-180"
885
+ ],
886
+ leadingIcon: "inline-flex items-center justify-center shrink-0 text-on-surface-variant [&>svg]:size-6",
887
+ supporting: [
888
+ "flex justify-between gap-4 px-4 text-body-small text-on-surface-variant",
889
+ "group-data-[invalid]:text-error"
890
+ ],
891
+ supportingText: "min-w-0"
892
+ },
893
+ variants: {
894
+ variant: {
895
+ filled: {
896
+ field: [
897
+ "overflow-hidden rounded-t-extra-small bg-surface-container-highest",
898
+ // M3 filled hover: state layer (on-surface × state-hover).
899
+ "before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none",
900
+ "before:transition-opacity before:duration-100",
901
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
902
+ "data-[disabled]:before:opacity-0",
903
+ // M3 filled resting active-indicator: 1dp on-surface-variant.
904
+ "border-b border-on-surface-variant hover:border-on-surface",
905
+ // M3 filled focus-active-indicator-height is 3dp.
906
+ "data-[focused]:border-b-[3px] data-[focused]:border-primary",
907
+ "data-[popup-open]:border-b-[3px] data-[popup-open]:border-primary",
908
+ "data-[invalid]:border-error"
909
+ ],
910
+ value: "pt-3",
911
+ label: [
912
+ "group-data-[focused]/field:top-1.5 group-data-[focused]/field:translate-y-0 group-data-[focused]/field:text-body-small",
913
+ "group-data-[filled]/field:top-1.5 group-data-[filled]/field:translate-y-0 group-data-[filled]/field:text-body-small",
914
+ "group-data-[popup-open]/field:top-1.5 group-data-[popup-open]/field:translate-y-0 group-data-[popup-open]/field:text-body-small",
915
+ "group-data-[has-placeholder]/field:top-1.5 group-data-[has-placeholder]/field:translate-y-0 group-data-[has-placeholder]/field:text-body-small"
916
+ ]
917
+ },
918
+ outlined: {
919
+ field: [
920
+ "overflow-visible rounded-extra-small border border-outline hover:border-on-surface",
921
+ // M3 outlined focus-outline-width is 3dp; padding drops 2px so content
922
+ // stays steady as the 1dp border grows (matches the TextField anchor).
923
+ "data-[focused]:border-[3px] data-[focused]:border-primary data-[focused]:px-[14px]",
924
+ "data-[popup-open]:border-[3px] data-[popup-open]:border-primary data-[popup-open]:px-[14px]",
925
+ "data-[invalid]:border-error"
926
+ ],
927
+ label: [
928
+ "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",
929
+ "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",
930
+ "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",
931
+ "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"
932
+ ]
933
+ }
934
+ }
935
+ },
936
+ defaultVariants: {
937
+ variant: "outlined"
938
+ }
817
939
  });
940
+ var s3 = selectTv();
941
+ var Select = createSelect(
942
+ {
943
+ trigger: s3.trigger(),
944
+ value: s3.value(),
945
+ icon: s3.icon(),
946
+ popup: s3.popup(),
947
+ item: s3.item(),
948
+ itemIndicator: s3.itemIndicator(),
949
+ groupLabel: s3.groupLabel(),
950
+ scrollUpArrow: s3.scrollUpArrow(),
951
+ scrollDownArrow: s3.scrollDownArrow()
952
+ },
953
+ ({ variant }) => {
954
+ const f = selectFieldTv({ variant });
955
+ return {
956
+ root: f.root(),
957
+ field: f.field(),
958
+ inputWrap: f.inputWrap(),
959
+ value: f.value(),
960
+ label: f.label(),
961
+ icon: f.icon(),
962
+ leadingIcon: f.leadingIcon(),
963
+ supporting: f.supporting(),
964
+ supportingText: f.supportingText()
965
+ };
966
+ }
967
+ );
968
+ var iconVisual = "inline-flex items-center justify-center shrink-0 text-on-surface-variant [&>svg]:size-6";
818
969
  var textFieldTv = tv({
819
970
  slots: {
820
971
  root: "flex flex-col gap-1 min-w-[210px]",
821
972
  field: [
822
- "relative flex items-stretch gap-3 h-14 px-4 box-border",
973
+ "relative flex items-stretch gap-3 h-14 px-4 box-border text-on-surface",
823
974
  "transition-[border-color,padding] duration-150 ease-standard",
824
975
  "group-data-[disabled]:opacity-[0.38] group-data-[disabled]:pointer-events-none"
825
976
  ],
826
- inputWrap: "relative flex-1 flex items-center min-w-0",
977
+ inputWrap: "relative z-0 flex-1 flex items-center min-w-0 overflow-visible",
827
978
  input: [
828
979
  "peer w-full bg-transparent outline-none border-0 p-0 text-body-large text-on-surface",
829
980
  "placeholder:text-on-surface-variant"
@@ -834,8 +985,18 @@ var textFieldTv = tv({
834
985
  "transition-all duration-150 ease-standard",
835
986
  "group-data-[focused]:text-primary group-data-[invalid]:text-error"
836
987
  ],
837
- leadingIcon: "flex items-center shrink-0 text-on-surface-variant",
838
- trailingIcon: "flex items-center shrink-0 text-on-surface-variant",
988
+ leadingIcon: iconVisual,
989
+ trailingIcon: iconVisual,
990
+ leadingIconButton: [
991
+ iconVisual,
992
+ "relative size-12 p-0 border-0 bg-transparent cursor-pointer",
993
+ "group-data-[disabled]:pointer-events-none"
994
+ ],
995
+ trailingIconButton: [
996
+ iconVisual,
997
+ "relative size-12 p-0 border-0 bg-transparent cursor-pointer",
998
+ "group-data-[disabled]:pointer-events-none"
999
+ ],
839
1000
  supporting: [
840
1001
  "flex justify-between gap-4 px-4 text-body-small text-on-surface-variant",
841
1002
  "group-data-[invalid]:text-error"
@@ -847,9 +1008,15 @@ var textFieldTv = tv({
847
1008
  variant: {
848
1009
  filled: {
849
1010
  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).
1011
+ "overflow-hidden rounded-t-extra-small bg-surface-container-highest",
1012
+ // M3 filled hover: state layer (on-surface × state-hover) + indicator color.
1013
+ "before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none",
1014
+ "before:transition-opacity before:duration-100",
1015
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
1016
+ "group-data-[disabled]:before:opacity-0",
1017
+ // M3 filled resting active-indicator: 1dp on-surface-variant.
1018
+ "border-b border-on-surface-variant hover:border-on-surface",
1019
+ // M3 filled focus-active-indicator-height is 3dp.
853
1020
  "group-data-[focused]:border-b-[3px] group-data-[focused]:border-primary group-data-[invalid]:border-error"
854
1021
  ],
855
1022
  input: "pt-3",
@@ -860,15 +1027,18 @@ var textFieldTv = tv({
860
1027
  },
861
1028
  outlined: {
862
1029
  field: [
863
- "rounded-extra-small border border-outline",
1030
+ // Outlined hover = outline color only (no container state layer per M3).
1031
+ "overflow-visible rounded-extra-small border border-outline hover:border-on-surface",
864
1032
  // M3 outlined focus-outline-width is 3dp (matches Select's trigger);
865
1033
  // padding drops 2px so content stays steady as the 1dp border grows.
866
1034
  "group-data-[focused]:border-[3px] group-data-[focused]:border-primary group-data-[focused]:px-[14px]",
867
1035
  "group-data-[invalid]:border-error"
868
1036
  ],
869
1037
  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"
1038
+ "group-data-[focused]:top-0 group-data-[focused]:-translate-y-1/2 group-data-[focused]:z-[1]",
1039
+ "group-data-[focused]:text-body-small group-data-[focused]:bg-surface group-data-[focused]:px-1 group-data-[focused]:leading-none",
1040
+ "group-data-[filled]:top-0 group-data-[filled]:-translate-y-1/2 group-data-[filled]:z-[1]",
1041
+ "group-data-[filled]:text-body-small group-data-[filled]:bg-surface group-data-[filled]:px-1 group-data-[filled]:leading-none"
872
1042
  ]
873
1043
  }
874
1044
  }
@@ -887,6 +1057,8 @@ var TextField = createTextField(({ variant }) => {
887
1057
  label: c3.label(),
888
1058
  leadingIcon: c3.leadingIcon(),
889
1059
  trailingIcon: c3.trailingIcon(),
1060
+ leadingIconButton: c3.leadingIconButton(),
1061
+ trailingIconButton: c3.trailingIconButton(),
890
1062
  supporting: c3.supporting(),
891
1063
  supportingText: c3.supportingText(),
892
1064
  counter: c3.counter()
@@ -966,36 +1138,68 @@ var fabTv = tv({
966
1138
  "data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38"
967
1139
  ],
968
1140
  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
- },
1141
+ // Geometry is set by compoundVariants (size × variant); these keys exist so
1142
+ // the resolver can accept them.
1143
+ size: { small: "", medium: "", large: "" },
1144
+ variant: { standard: "", extended: "" },
975
1145
  color: {
976
- surface: "bg-surface-container-high text-primary",
977
1146
  primary: "bg-primary-container text-on-primary-container",
978
1147
  secondary: "bg-secondary-container text-on-secondary-container",
979
1148
  tertiary: "bg-tertiary-container text-on-tertiary-container"
980
1149
  }
981
1150
  },
1151
+ compoundVariants: [
1152
+ // ---- Standard (icon-only square): container / corner / icon ----
1153
+ { size: "small", variant: "standard", class: "size-14 rounded-large [&_svg]:size-6" },
1154
+ // 56 / 16 / 24
1155
+ {
1156
+ size: "medium",
1157
+ variant: "standard",
1158
+ class: "size-20 rounded-large-increased [&_svg]:size-7"
1159
+ // 80 / 20 / 28
1160
+ },
1161
+ { size: "large", variant: "standard", class: "size-24 rounded-extra-large [&_svg]:size-8" },
1162
+ // 96 / 28 / 32
1163
+ // ---- Extended (icon + label pill): height / corner / icon / padding / gap / label ----
1164
+ // `min-w-*` keeps the pill affordance for short / text-only labels (wider
1165
+ // than tall), matching the pre-Expressive extended FAB which guarded this.
1166
+ {
1167
+ size: "small",
1168
+ variant: "extended",
1169
+ class: "h-14 min-w-20 px-4 gap-2 rounded-large text-title-medium [&_svg]:size-6"
1170
+ // 56 / 16 / 24 / 16 / 8
1171
+ },
1172
+ {
1173
+ size: "medium",
1174
+ variant: "extended",
1175
+ class: "h-20 min-w-28 px-[26px] gap-4 rounded-large-increased text-title-large [&_svg]:size-7"
1176
+ // 80 / 20 / 28 / 26 / 16
1177
+ },
1178
+ {
1179
+ size: "large",
1180
+ variant: "extended",
1181
+ class: "h-24 min-w-32 px-7 gap-5 rounded-extra-large text-headline-small [&_svg]:size-8"
1182
+ // 96 / 28 / 32 / 28 / 20
1183
+ }
1184
+ ],
982
1185
  defaultVariants: {
983
- size: "regular",
984
- color: "surface"
1186
+ size: "small",
1187
+ variant: "standard",
1188
+ color: "primary"
985
1189
  }
986
1190
  });
987
- var Fab = createFab(({ size, color }) => fabTv({ size, color }));
1191
+ var Fab = createFab(({ size, color, variant }) => fabTv({ size, color, variant }));
988
1192
  var fabMenuTv = tv7({
989
1193
  slots: {
990
1194
  popup: [
991
- "flex flex-col items-end gap-2 bg-transparent outline-none",
1195
+ "flex flex-col items-end gap-1 bg-transparent outline-none",
992
1196
  "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
993
1197
  "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
994
1198
  "data-[ending-style]:opacity-0"
995
1199
  ],
996
1200
  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",
1201
+ "relative inline-flex items-center gap-2 h-14 px-6 overflow-hidden box-border",
1202
+ "cursor-pointer select-none outline-none rounded-full text-title-medium",
999
1203
  "shadow-level3 hover:shadow-level4 transition-shadow duration-150 ease-standard",
1000
1204
  "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
1001
1205
  "hover:before:opacity-[var(--md-sys-state-hover)]",
@@ -1011,7 +1215,6 @@ var fabMenuTv = tv7({
1011
1215
  },
1012
1216
  variants: {
1013
1217
  color: {
1014
- surface: { item: "bg-surface-container-high text-primary" },
1015
1218
  primary: { item: "bg-primary-container text-on-primary-container" },
1016
1219
  secondary: { item: "bg-secondary-container text-on-secondary-container" },
1017
1220
  tertiary: { item: "bg-tertiary-container text-on-tertiary-container" }
@@ -1053,13 +1256,16 @@ var dividerTv = tv({
1053
1256
  var Divider = createDivider(({ inset, orientation }) => dividerTv({ inset, orientation }));
1054
1257
  var linearTv = tv({
1055
1258
  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"`.
1259
+ // The track-stop dot (primary, full track height) sits at the inline-end via
1260
+ // `after:`. It's a determinate-only M3 concept, so it's hidden while
1261
+ // indeterminate. Logical `end-0` mirrors with the indicator under `dir="rtl"`.
1262
+ // Height comes from the factory (inline) so `thickness` is honored.
1059
1263
  root: [
1060
- "group relative block w-full h-1 overflow-hidden rounded-full",
1264
+ "group relative block w-full overflow-hidden rounded-full",
1265
+ // The dot is `--m3-thickness` tall (stroke height) and centered, so it stays
1266
+ // correct when the wavy track grows taller than the stroke.
1061
1267
  "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",
1268
+ "after:h-[var(--m3-thickness,100%)] after:aspect-square after:rounded-full after:bg-primary",
1063
1269
  // Self variant (not `group-data-*`): the dot is on the root element itself,
1064
1270
  // which carries `data-indeterminate` — it isn't a descendant of `.group`.
1065
1271
  "data-[indeterminate]:after:hidden"
@@ -1068,40 +1274,76 @@ var linearTv = tv({
1068
1274
  // 4dp gap separates it from the active indicator (`--m3-progress` + 4px). The
1069
1275
  // gap uses logical inline insets so it tracks the indicator (which Base UI
1070
1276
  // anchors at inline-start) under `dir="rtl"`. Indeterminate has no fraction,
1071
- // so the inactive track spans the full width.
1277
+ // so the inactive track spans the full width. The flat track stays
1278
+ // `--m3-thickness` tall and centered even when the wavy root is taller.
1072
1279
  track: [
1073
1280
  "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)]",
1281
+ "before:content-[''] before:absolute before:top-1/2 before:-translate-y-1/2 before:end-0",
1282
+ "before:h-[var(--m3-thickness,100%)]",
1283
+ "before:[inset-inline-start:calc(var(--m3-progress,0%)_+_4px)]",
1076
1284
  "before:bg-surface-container-highest before:rounded-full",
1077
1285
  "group-data-[indeterminate]:before:start-0"
1078
1286
  ],
1287
+ // Primary bar. Determinate: width from Base UI. Indeterminate: full width,
1288
+ // scaled + slid by the disjoint `primary` keyframe (origin at the start edge).
1289
+ // Wavy determinate: a scrolling sine tile masks the solid bar into a wave.
1079
1290
  indicator: [
1080
- "absolute inset-y-0 left-0 bg-primary rounded-full",
1291
+ "absolute inset-y-0 left-0 origin-left bg-primary rounded-full",
1081
1292
  "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"
1293
+ "group-data-[indeterminate]:w-full group-data-[indeterminate]:transition-none",
1294
+ "group-data-[indeterminate]:animate-m3-linear-primary",
1295
+ "group-data-[wavy]:rounded-none",
1296
+ "group-data-[wavy]:[-webkit-mask-image:var(--m3-wave)] group-data-[wavy]:[mask-image:var(--m3-wave)]",
1297
+ "group-data-[wavy]:[-webkit-mask-repeat:repeat-x] group-data-[wavy]:[mask-repeat:repeat-x]",
1298
+ "group-data-[wavy]:[-webkit-mask-size:40px_100%] group-data-[wavy]:[mask-size:40px_100%]",
1299
+ "group-data-[wavy]:animate-m3-wave-flow",
1300
+ // Reduced motion: freeze the loops and show a static ~40% bar / static wave.
1301
+ "motion-reduce:group-data-[indeterminate]:w-2/5",
1302
+ "motion-reduce:group-data-[indeterminate]:animate-none motion-reduce:group-data-[wavy]:animate-none"
1303
+ ],
1304
+ // Second disjoint bar: only present visually while indeterminate.
1305
+ indicatorSecondary: [
1306
+ "absolute inset-y-0 left-0 w-full origin-left bg-primary rounded-full hidden",
1307
+ "group-data-[indeterminate]:block group-data-[indeterminate]:animate-m3-linear-secondary",
1308
+ // Reduced motion: a single static bar reads better than two frozen ones.
1309
+ "motion-reduce:group-data-[indeterminate]:hidden"
1084
1310
  ]
1085
1311
  }
1086
1312
  });
1087
1313
  var circularTv = tv({
1088
1314
  slots: {
1315
+ // Size comes from the factory (inline width/height) so `size` is honored.
1316
+ // Indeterminate rotates the whole ring; the arc grows/shrinks via the
1317
+ // indicator's own `dash` animation (M3 "advance").
1089
1318
  root: [
1090
- "inline-flex items-center justify-center size-12",
1319
+ "group inline-flex items-center justify-center",
1091
1320
  "[&_svg]:block [&_svg]:size-full",
1092
- "data-[indeterminate]:animate-spin"
1321
+ "data-[indeterminate]:animate-m3-circular-rotate",
1322
+ "motion-reduce:data-[indeterminate]:animate-none"
1323
+ ],
1324
+ // Both ends are rounded (M3); the inactive track sits behind with a 4dp gap.
1325
+ track: [
1326
+ "stroke-surface-container-highest [stroke-linecap:round]",
1327
+ "transition-[stroke-dasharray,stroke-dashoffset] duration-300 ease-standard"
1093
1328
  ],
1094
- track: "stroke-surface-container-highest [stroke-width:4px]",
1095
1329
  indicator: [
1096
- "stroke-primary [stroke-width:4px] [stroke-linecap:round]",
1097
- "transition-[stroke-dashoffset] duration-300 ease-standard"
1330
+ "stroke-primary [stroke-linecap:round]",
1331
+ "transition-[stroke-dasharray,stroke-dashoffset] duration-300 ease-standard",
1332
+ "group-data-[indeterminate]:animate-m3-circular-dash group-data-[indeterminate]:transition-none",
1333
+ // Reduced motion: freeze the arc at its static 25% length (no rotation).
1334
+ "motion-reduce:group-data-[indeterminate]:animate-none"
1098
1335
  ]
1099
1336
  }
1100
1337
  });
1101
1338
  var l = linearTv();
1102
1339
  var c2 = circularTv();
1103
1340
  var Progress = createProgress({
1104
- linear: { root: l.root(), track: l.track(), indicator: l.indicator() },
1341
+ linear: {
1342
+ root: l.root(),
1343
+ track: l.track(),
1344
+ indicator: l.indicator(),
1345
+ indicatorSecondary: l.indicatorSecondary()
1346
+ },
1105
1347
  circular: { root: c2.root(), track: c2.track(), indicator: c2.indicator() }
1106
1348
  });
1107
1349
  var loadingIndicatorTv = tv7({
@@ -1384,7 +1626,7 @@ var buttonGroup = tv7({
1384
1626
  }
1385
1627
  });
1386
1628
  var ButtonGroup = createButtonGroup(({ variant }) => buttonGroup({ variant }));
1387
- var surface = [
1629
+ var surface3 = [
1388
1630
  "relative inline-flex items-center justify-center h-10 overflow-hidden cursor-pointer select-none border-0 outline-none",
1389
1631
  "text-label-large",
1390
1632
  "transition-[background-color,color,border-color] duration-200 ease-standard",
@@ -1426,9 +1668,9 @@ var splitButtonTv = tv7({
1426
1668
  slots: {
1427
1669
  group: "inline-flex items-center gap-0.5",
1428
1670
  // leading: outer (start) corner full, seam (end) corner reduced.
1429
- leading: [...surface, "gap-2 px-6 rounded-s-full rounded-e-small"],
1671
+ leading: [...surface3, "gap-2 px-6 rounded-s-full rounded-e-small"],
1430
1672
  // trailing: seam (start) corner reduced, outer (end) corner full.
1431
- trailing: [...surface, "group gap-1 px-3 rounded-s-small rounded-e-full"],
1673
+ trailing: [...surface3, "group gap-1 px-3 rounded-s-small rounded-e-full"],
1432
1674
  chevron: [
1433
1675
  "inline-flex items-center justify-center shrink-0 [&>svg]:size-[18px]",
1434
1676
  "transition-transform duration-200 ease-standard group-data-[popup-open]:rotate-180"
@@ -1873,32 +2115,46 @@ var DatePicker = createDatePicker({
1873
2115
  modalHeadline: dp.modalHeadline(),
1874
2116
  modalActions: dp.modalActions()
1875
2117
  });
2118
+ var stateLayerBase = [
2119
+ "overflow-hidden",
2120
+ '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',
2121
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
2122
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
2123
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
2124
+ "focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-2"
2125
+ ];
1876
2126
  var timePickerTv = tv7({
1877
2127
  slots: {
1878
- root: ["inline-flex flex-col items-center gap-2 p-2 text-on-surface"],
1879
- header: ["flex items-center gap-2"],
2128
+ root: ["inline-flex flex-col items-center p-2 text-on-surface"],
2129
+ header: ["flex items-center gap-3 min-h-[98px]"],
2130
+ display: ["inline-flex items-center"],
1880
2131
  field: [
1881
- "inline-grid place-items-center w-24 h-20 rounded-small overflow-hidden box-border",
2132
+ "relative",
2133
+ ...stateLayerBase,
2134
+ "inline-grid place-items-center w-24 h-20 rounded-small box-border",
1882
2135
  "bg-surface-container-highest text-on-surface text-display-large cursor-pointer outline-none",
1883
2136
  "border border-transparent transition-colors duration-100",
1884
2137
  "data-[selected]:bg-primary-container data-[selected]:text-on-primary-container"
1885
2138
  ],
1886
- colon: ["text-display-large text-on-surface px-1 leading-none"],
2139
+ colon: ["text-display-large text-on-surface px-1 leading-none self-center"],
1887
2140
  periods: [
1888
- "inline-flex flex-col rounded-small overflow-hidden border border-outline self-stretch",
1889
- "m-0 p-0 min-w-0"
2141
+ "inline-flex flex-col shrink-0 rounded-small overflow-hidden border border-outline",
2142
+ "h-[98px] w-[52px] m-0 p-0 min-w-0 box-border"
1890
2143
  ],
1891
2144
  period: [
1892
- "flex-1 inline-flex items-center justify-center px-3 min-h-[38px] w-14",
2145
+ "relative",
2146
+ ...stateLayerBase,
2147
+ "flex-1 inline-flex items-center justify-center min-h-12 h-12 w-full",
1893
2148
  "border-0 bg-transparent",
1894
2149
  "text-title-medium text-on-surface-variant cursor-pointer outline-none",
1895
2150
  "data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container",
1896
2151
  "[&+&]:border-t [&+&]:border-outline"
1897
2152
  ],
1898
2153
  dial: [
1899
- "relative size-[256px] my-2 p-0 min-w-0 border-0 rounded-full bg-surface-container-highest"
2154
+ "relative size-[256px] mt-[28px] p-0 min-w-0 border-0 rounded-full bg-surface-container-highest"
1900
2155
  ],
1901
2156
  dialNumber: [
2157
+ ...stateLayerBase,
1902
2158
  "absolute -translate-x-1/2 -translate-y-1/2 inline-grid place-items-center size-12 rounded-full",
1903
2159
  "border-0 bg-transparent",
1904
2160
  "text-body-large text-on-surface cursor-pointer outline-none select-none",
@@ -1910,7 +2166,7 @@ var timePickerTv = tv7({
1910
2166
  dialCenter: [
1911
2167
  "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
2168
  ],
1913
- inputs: ["flex items-start gap-2"],
2169
+ inputs: ["flex items-start gap-3"],
1914
2170
  inputBox: [
1915
2171
  "w-24 h-20 rounded-small box-border text-center",
1916
2172
  "bg-surface-container-highest text-on-surface text-display-large outline-none",
@@ -1924,6 +2180,7 @@ var tp = timePickerTv();
1924
2180
  var TimePicker = createTimePicker(() => ({
1925
2181
  root: tp.root(),
1926
2182
  header: tp.header(),
2183
+ display: tp.display(),
1927
2184
  field: tp.field(),
1928
2185
  colon: tp.colon(),
1929
2186
  periods: tp.periods(),
@@ -1979,6 +2236,6 @@ var Carousel = createCarousel((variant) => {
1979
2236
  return { root: s14.root(), item: s14.item() };
1980
2237
  });
1981
2238
 
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 };
2239
+ 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
2240
  //# sourceMappingURL=index.js.map
1984
2241
  //# sourceMappingURL=index.js.map