@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
@@ -2,16 +2,17 @@
2
2
  import { createTextField } from '@m3-baseui/core';
3
3
  import { tv } from 'tailwind-variants';
4
4
 
5
- // src/textfield.ts
5
+ // src/components/textfield/textfield.ts
6
+ var iconVisual = "inline-flex items-center justify-center shrink-0 text-on-surface-variant [&>svg]:size-6";
6
7
  var textFieldTv = tv({
7
8
  slots: {
8
9
  root: "flex flex-col gap-1 min-w-[210px]",
9
10
  field: [
10
- "relative flex items-stretch gap-3 h-14 px-4 box-border",
11
+ "relative flex items-stretch gap-3 h-14 px-4 box-border text-on-surface",
11
12
  "transition-[border-color,padding] duration-150 ease-standard",
12
13
  "group-data-[disabled]:opacity-[0.38] group-data-[disabled]:pointer-events-none"
13
14
  ],
14
- inputWrap: "relative flex-1 flex items-center min-w-0",
15
+ inputWrap: "relative z-0 flex-1 flex items-center min-w-0 overflow-visible",
15
16
  input: [
16
17
  "peer w-full bg-transparent outline-none border-0 p-0 text-body-large text-on-surface",
17
18
  "placeholder:text-on-surface-variant"
@@ -22,8 +23,18 @@ var textFieldTv = tv({
22
23
  "transition-all duration-150 ease-standard",
23
24
  "group-data-[focused]:text-primary group-data-[invalid]:text-error"
24
25
  ],
25
- leadingIcon: "flex items-center shrink-0 text-on-surface-variant",
26
- trailingIcon: "flex items-center shrink-0 text-on-surface-variant",
26
+ leadingIcon: iconVisual,
27
+ trailingIcon: iconVisual,
28
+ leadingIconButton: [
29
+ iconVisual,
30
+ "relative size-12 p-0 border-0 bg-transparent cursor-pointer",
31
+ "group-data-[disabled]:pointer-events-none"
32
+ ],
33
+ trailingIconButton: [
34
+ iconVisual,
35
+ "relative size-12 p-0 border-0 bg-transparent cursor-pointer",
36
+ "group-data-[disabled]:pointer-events-none"
37
+ ],
27
38
  supporting: [
28
39
  "flex justify-between gap-4 px-4 text-body-small text-on-surface-variant",
29
40
  "group-data-[invalid]:text-error"
@@ -35,9 +46,15 @@ var textFieldTv = tv({
35
46
  variant: {
36
47
  filled: {
37
48
  field: [
38
- "rounded-t-extra-small bg-surface-container-highest",
39
- "border-b-2 border-outline",
40
- // M3 filled focus-active-indicator-height is 3dp (resting/error stay 2dp).
49
+ "overflow-hidden rounded-t-extra-small bg-surface-container-highest",
50
+ // M3 filled hover: state layer (on-surface × state-hover) + indicator color.
51
+ "before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none",
52
+ "before:transition-opacity before:duration-100",
53
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
54
+ "group-data-[disabled]:before:opacity-0",
55
+ // M3 filled resting active-indicator: 1dp on-surface-variant.
56
+ "border-b border-on-surface-variant hover:border-on-surface",
57
+ // M3 filled focus-active-indicator-height is 3dp.
41
58
  "group-data-[focused]:border-b-[3px] group-data-[focused]:border-primary group-data-[invalid]:border-error"
42
59
  ],
43
60
  input: "pt-3",
@@ -48,15 +65,18 @@ var textFieldTv = tv({
48
65
  },
49
66
  outlined: {
50
67
  field: [
51
- "rounded-extra-small border border-outline",
68
+ // Outlined hover = outline color only (no container state layer per M3).
69
+ "overflow-visible rounded-extra-small border border-outline hover:border-on-surface",
52
70
  // M3 outlined focus-outline-width is 3dp (matches Select's trigger);
53
71
  // padding drops 2px so content stays steady as the 1dp border grows.
54
72
  "group-data-[focused]:border-[3px] group-data-[focused]:border-primary group-data-[focused]:px-[14px]",
55
73
  "group-data-[invalid]:border-error"
56
74
  ],
57
75
  label: [
58
- "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",
59
- "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"
76
+ "group-data-[focused]:top-0 group-data-[focused]:-translate-y-1/2 group-data-[focused]:z-[1]",
77
+ "group-data-[focused]:text-body-small group-data-[focused]:bg-surface group-data-[focused]:px-1 group-data-[focused]:leading-none",
78
+ "group-data-[filled]:top-0 group-data-[filled]:-translate-y-1/2 group-data-[filled]:z-[1]",
79
+ "group-data-[filled]:text-body-small group-data-[filled]:bg-surface group-data-[filled]:px-1 group-data-[filled]:leading-none"
60
80
  ]
61
81
  }
62
82
  }
@@ -75,6 +95,8 @@ var TextField = createTextField(({ variant }) => {
75
95
  label: c.label(),
76
96
  leadingIcon: c.leadingIcon(),
77
97
  trailingIcon: c.trailingIcon(),
98
+ leadingIconButton: c.leadingIconButton(),
99
+ trailingIconButton: c.trailingIconButton(),
78
100
  supporting: c.supporting(),
79
101
  supportingText: c.supportingText(),
80
102
  counter: c.counter()
@@ -82,5 +104,5 @@ var TextField = createTextField(({ variant }) => {
82
104
  });
83
105
 
84
106
  export { TextField, textFieldTv };
85
- //# sourceMappingURL=textfield.js.map
86
- //# sourceMappingURL=textfield.js.map
107
+ //# sourceMappingURL=index.js.map
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/textfield/textfield.ts"],"names":[],"mappings":";;;;;AAYA,IAAM,UAAA,GACJ,yFAAA;AAEK,IAAM,cAAc,EAAA,CAAG;AAAA,EAC5B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,mCAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,wEAAA;AAAA,MACA,8DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAW,gEAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACL,sFAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,iDAAA;AAAA,MACA,kEAAA;AAAA,MACA,2CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,WAAA,EAAa,UAAA;AAAA,IACb,YAAA,EAAc,UAAA;AAAA,IACd,iBAAA,EAAmB;AAAA,MACjB,UAAA;AAAA,MACA,6DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,UAAA;AAAA,MACA,6DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,yEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,cAAA,EAAgB,SAAA;AAAA,IAChB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO;AAAA,UACL,oEAAA;AAAA;AAAA,UAEA,uHAAA;AAAA,UACA,+CAAA;AAAA,UACA,kDAAA;AAAA,UACA,wCAAA;AAAA;AAAA,UAEA,4DAAA;AAAA;AAAA,UAEA;AAAA,SACF;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,sGAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,KAAA,EAAO;AAAA;AAAA,UAEL,oFAAA;AAAA;AAAA;AAAA,UAGA,sGAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,6FAAA;AAAA,UACA,kIAAA;AAAA,UACA,0FAAA;AAAA,UACA;AAAA;AACF;AACF;AACF,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC;AAEM,IAAM,SAAA,GAAY,eAAA,CAAgB,CAAC,EAAE,SAAQ,KAAM;AACxD,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,EAAE,OAAA,EAAS,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,IACb,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,IACf,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,IACvB,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,IACf,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,IACf,WAAA,EAAa,EAAE,WAAA,EAAY;AAAA,IAC3B,YAAA,EAAc,EAAE,YAAA,EAAa;AAAA,IAC7B,iBAAA,EAAmB,EAAE,iBAAA,EAAkB;AAAA,IACvC,kBAAA,EAAoB,EAAE,kBAAA,EAAmB;AAAA,IACzC,UAAA,EAAY,EAAE,UAAA,EAAW;AAAA,IACzB,cAAA,EAAgB,EAAE,cAAA,EAAe;AAAA,IACjC,OAAA,EAAS,EAAE,OAAA;AAAQ,GACrB;AACF,CAAC","file":"index.js","sourcesContent":["/**\n * textfield.ts — tailwind-variants slots for the M3 TextField.\n *\n * 56dp tall. The floating label and focus/filled border key off Field's\n * `data-focused` / `data-filled` / `data-invalid` via the `group` on Root.\n * Filled = surface-container-highest with a bottom indicator; outlined = a\n * border that thickens to 3dp primary on focus (M3 focus-outline-width). Same\n * DOM as the VE build.\n */\nimport { createTextField } from '@m3-baseui/core';\nimport { tv } from 'tailwind-variants';\n\nconst iconVisual =\n 'inline-flex items-center justify-center shrink-0 text-on-surface-variant [&>svg]:size-6';\n\nexport const textFieldTv = tv({\n slots: {\n root: 'flex flex-col gap-1 min-w-[210px]',\n field: [\n 'relative flex items-stretch gap-3 h-14 px-4 box-border text-on-surface',\n 'transition-[border-color,padding] duration-150 ease-standard',\n 'group-data-[disabled]:opacity-[0.38] group-data-[disabled]:pointer-events-none',\n ],\n inputWrap: 'relative z-0 flex-1 flex items-center min-w-0 overflow-visible',\n input: [\n 'peer w-full bg-transparent outline-none border-0 p-0 text-body-large text-on-surface',\n 'placeholder:text-on-surface-variant',\n ],\n label: [\n 'absolute left-0 pointer-events-none origin-left',\n 'top-1/2 -translate-y-1/2 text-body-large text-on-surface-variant',\n 'transition-all duration-150 ease-standard',\n 'group-data-[focused]:text-primary group-data-[invalid]:text-error',\n ],\n leadingIcon: iconVisual,\n trailingIcon: iconVisual,\n leadingIconButton: [\n iconVisual,\n 'relative size-12 p-0 border-0 bg-transparent cursor-pointer',\n 'group-data-[disabled]:pointer-events-none',\n ],\n trailingIconButton: [\n iconVisual,\n 'relative size-12 p-0 border-0 bg-transparent cursor-pointer',\n 'group-data-[disabled]:pointer-events-none',\n ],\n supporting: [\n 'flex justify-between gap-4 px-4 text-body-small text-on-surface-variant',\n 'group-data-[invalid]:text-error',\n ],\n supportingText: 'min-w-0',\n counter: 'shrink-0 tabular-nums',\n },\n variants: {\n variant: {\n filled: {\n field: [\n 'overflow-hidden rounded-t-extra-small bg-surface-container-highest',\n // M3 filled hover: state layer (on-surface × state-hover) + indicator color.\n 'before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none',\n 'before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'group-data-[disabled]:before:opacity-0',\n // M3 filled resting active-indicator: 1dp on-surface-variant.\n 'border-b border-on-surface-variant hover:border-on-surface',\n // M3 filled focus-active-indicator-height is 3dp.\n 'group-data-[focused]:border-b-[3px] group-data-[focused]:border-primary group-data-[invalid]:border-error',\n ],\n input: 'pt-3',\n label: [\n 'group-data-[focused]:top-1.5 group-data-[focused]:translate-y-0 group-data-[focused]:text-body-small',\n 'group-data-[filled]:top-1.5 group-data-[filled]:translate-y-0 group-data-[filled]:text-body-small',\n ],\n },\n outlined: {\n field: [\n // Outlined hover = outline color only (no container state layer per M3).\n 'overflow-visible rounded-extra-small border border-outline hover:border-on-surface',\n // M3 outlined focus-outline-width is 3dp (matches Select's trigger);\n // padding drops 2px so content stays steady as the 1dp border grows.\n 'group-data-[focused]:border-[3px] group-data-[focused]:border-primary group-data-[focused]:px-[14px]',\n 'group-data-[invalid]:border-error',\n ],\n label: [\n 'group-data-[focused]:top-0 group-data-[focused]:-translate-y-1/2 group-data-[focused]:z-[1]',\n 'group-data-[focused]:text-body-small group-data-[focused]:bg-surface group-data-[focused]:px-1 group-data-[focused]:leading-none',\n 'group-data-[filled]:top-0 group-data-[filled]:-translate-y-1/2 group-data-[filled]:z-[1]',\n 'group-data-[filled]:text-body-small group-data-[filled]:bg-surface group-data-[filled]:px-1 group-data-[filled]:leading-none',\n ],\n },\n },\n },\n defaultVariants: {\n variant: 'filled',\n },\n});\n\nexport const TextField = createTextField(({ variant }) => {\n const c = textFieldTv({ variant });\n return {\n root: c.root(),\n field: c.field(),\n inputWrap: c.inputWrap(),\n input: c.input(),\n label: c.label(),\n leadingIcon: c.leadingIcon(),\n trailingIcon: c.trailingIcon(),\n leadingIconButton: c.leadingIconButton(),\n trailingIconButton: c.trailingIconButton(),\n supporting: c.supporting(),\n supportingText: c.supportingText(),\n counter: c.counter(),\n };\n});\n\nexport type { TextFieldIconAction, TextFieldProps, TextFieldVariant } from '@m3-baseui/core';\n"]}
@@ -0,0 +1,153 @@
1
+ import * as _m3_baseui_core from '@m3-baseui/core';
2
+ export { TimePickerVariant, TimeValue } from '@m3-baseui/core';
3
+ import * as tailwind_variants from 'tailwind-variants';
4
+ import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
5
+ import * as tailwind_merge from 'tailwind-merge';
6
+
7
+ declare const timePickerTv: tailwind_variants.TVReturnType<{
8
+ [key: string]: {
9
+ [key: string]: tailwind_merge.ClassNameValue | {
10
+ header?: tailwind_merge.ClassNameValue;
11
+ display?: tailwind_merge.ClassNameValue;
12
+ dial?: tailwind_merge.ClassNameValue;
13
+ root?: tailwind_merge.ClassNameValue;
14
+ field?: tailwind_merge.ClassNameValue;
15
+ colon?: tailwind_merge.ClassNameValue;
16
+ periods?: tailwind_merge.ClassNameValue;
17
+ period?: tailwind_merge.ClassNameValue;
18
+ dialNumber?: tailwind_merge.ClassNameValue;
19
+ dialHand?: tailwind_merge.ClassNameValue;
20
+ dialCenter?: tailwind_merge.ClassNameValue;
21
+ inputs?: tailwind_merge.ClassNameValue;
22
+ inputBox?: tailwind_merge.ClassNameValue;
23
+ inputCaption?: tailwind_merge.ClassNameValue;
24
+ };
25
+ };
26
+ } | {
27
+ [x: string]: {
28
+ [x: string]: tailwind_merge.ClassNameValue | {
29
+ header?: tailwind_merge.ClassNameValue;
30
+ display?: tailwind_merge.ClassNameValue;
31
+ dial?: tailwind_merge.ClassNameValue;
32
+ root?: tailwind_merge.ClassNameValue;
33
+ field?: tailwind_merge.ClassNameValue;
34
+ colon?: tailwind_merge.ClassNameValue;
35
+ periods?: tailwind_merge.ClassNameValue;
36
+ period?: tailwind_merge.ClassNameValue;
37
+ dialNumber?: tailwind_merge.ClassNameValue;
38
+ dialHand?: tailwind_merge.ClassNameValue;
39
+ dialCenter?: tailwind_merge.ClassNameValue;
40
+ inputs?: tailwind_merge.ClassNameValue;
41
+ inputBox?: tailwind_merge.ClassNameValue;
42
+ inputCaption?: tailwind_merge.ClassNameValue;
43
+ };
44
+ };
45
+ } | {}, {
46
+ root: string[];
47
+ header: string[];
48
+ display: string[];
49
+ field: string[];
50
+ colon: string[];
51
+ periods: string[];
52
+ period: string[];
53
+ dial: string[];
54
+ dialNumber: string[];
55
+ dialHand: string[];
56
+ dialCenter: string[];
57
+ inputs: string[];
58
+ inputBox: string[];
59
+ inputCaption: string[];
60
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
61
+ [key: string]: {
62
+ [key: string]: tailwind_merge.ClassNameValue | {
63
+ header?: tailwind_merge.ClassNameValue;
64
+ display?: tailwind_merge.ClassNameValue;
65
+ dial?: tailwind_merge.ClassNameValue;
66
+ root?: tailwind_merge.ClassNameValue;
67
+ field?: tailwind_merge.ClassNameValue;
68
+ colon?: tailwind_merge.ClassNameValue;
69
+ periods?: tailwind_merge.ClassNameValue;
70
+ period?: tailwind_merge.ClassNameValue;
71
+ dialNumber?: tailwind_merge.ClassNameValue;
72
+ dialHand?: tailwind_merge.ClassNameValue;
73
+ dialCenter?: tailwind_merge.ClassNameValue;
74
+ inputs?: tailwind_merge.ClassNameValue;
75
+ inputBox?: tailwind_merge.ClassNameValue;
76
+ inputCaption?: tailwind_merge.ClassNameValue;
77
+ };
78
+ };
79
+ } | {}>, {
80
+ [key: string]: {
81
+ [key: string]: tailwind_merge.ClassNameValue | {
82
+ header?: tailwind_merge.ClassNameValue;
83
+ display?: tailwind_merge.ClassNameValue;
84
+ dial?: tailwind_merge.ClassNameValue;
85
+ root?: tailwind_merge.ClassNameValue;
86
+ field?: tailwind_merge.ClassNameValue;
87
+ colon?: tailwind_merge.ClassNameValue;
88
+ periods?: tailwind_merge.ClassNameValue;
89
+ period?: tailwind_merge.ClassNameValue;
90
+ dialNumber?: tailwind_merge.ClassNameValue;
91
+ dialHand?: tailwind_merge.ClassNameValue;
92
+ dialCenter?: tailwind_merge.ClassNameValue;
93
+ inputs?: tailwind_merge.ClassNameValue;
94
+ inputBox?: tailwind_merge.ClassNameValue;
95
+ inputCaption?: tailwind_merge.ClassNameValue;
96
+ };
97
+ };
98
+ } | {}, {
99
+ root: string[];
100
+ header: string[];
101
+ display: string[];
102
+ field: string[];
103
+ colon: string[];
104
+ periods: string[];
105
+ period: string[];
106
+ dial: string[];
107
+ dialNumber: string[];
108
+ dialHand: string[];
109
+ dialCenter: string[];
110
+ inputs: string[];
111
+ inputBox: string[];
112
+ inputCaption: string[];
113
+ }, tailwind_variants.TVReturnType<unknown, {
114
+ root: string[];
115
+ header: string[];
116
+ display: string[];
117
+ field: string[];
118
+ colon: string[];
119
+ periods: string[];
120
+ period: string[];
121
+ dial: string[];
122
+ dialNumber: string[];
123
+ dialHand: string[];
124
+ dialCenter: string[];
125
+ inputs: string[];
126
+ inputBox: string[];
127
+ inputCaption: string[];
128
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
129
+ [key: string]: {
130
+ [key: string]: tailwind_merge.ClassNameValue | {
131
+ header?: tailwind_merge.ClassNameValue;
132
+ display?: tailwind_merge.ClassNameValue;
133
+ dial?: tailwind_merge.ClassNameValue;
134
+ root?: tailwind_merge.ClassNameValue;
135
+ field?: tailwind_merge.ClassNameValue;
136
+ colon?: tailwind_merge.ClassNameValue;
137
+ periods?: tailwind_merge.ClassNameValue;
138
+ period?: tailwind_merge.ClassNameValue;
139
+ dialNumber?: tailwind_merge.ClassNameValue;
140
+ dialHand?: tailwind_merge.ClassNameValue;
141
+ dialCenter?: tailwind_merge.ClassNameValue;
142
+ inputs?: tailwind_merge.ClassNameValue;
143
+ inputBox?: tailwind_merge.ClassNameValue;
144
+ inputCaption?: tailwind_merge.ClassNameValue;
145
+ };
146
+ };
147
+ } | {}>, unknown, unknown, undefined>>;
148
+ declare const TimePicker: {
149
+ ({ variant, format, value, defaultValue, onValueChange, className, }: _m3_baseui_core.TimePickerOwnProps): React.JSX.Element;
150
+ displayName: string;
151
+ };
152
+
153
+ export { TimePicker, timePickerTv };
@@ -2,7 +2,7 @@
2
2
  import { createTimePicker } from '@m3-baseui/core';
3
3
  import { tv as tv$1 } from 'tailwind-variants';
4
4
 
5
- // src/time-picker.ts
5
+ // src/components/time-picker/time-picker.ts
6
6
  var TYPESCALE = [
7
7
  "display-large",
8
8
  "display-medium",
@@ -31,33 +31,47 @@ var tv = (options, config) => tv$1(options, {
31
31
  }
32
32
  });
33
33
 
34
- // src/time-picker.ts
34
+ // src/components/time-picker/time-picker.ts
35
+ var stateLayerBase = [
36
+ "overflow-hidden",
37
+ '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',
38
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
39
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
40
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
41
+ "focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-2"
42
+ ];
35
43
  var timePickerTv = tv({
36
44
  slots: {
37
- root: ["inline-flex flex-col items-center gap-2 p-2 text-on-surface"],
38
- header: ["flex items-center gap-2"],
45
+ root: ["inline-flex flex-col items-center p-2 text-on-surface"],
46
+ header: ["flex items-center gap-3 min-h-[98px]"],
47
+ display: ["inline-flex items-center"],
39
48
  field: [
40
- "inline-grid place-items-center w-24 h-20 rounded-small overflow-hidden box-border",
49
+ "relative",
50
+ ...stateLayerBase,
51
+ "inline-grid place-items-center w-24 h-20 rounded-small box-border",
41
52
  "bg-surface-container-highest text-on-surface text-display-large cursor-pointer outline-none",
42
53
  "border border-transparent transition-colors duration-100",
43
54
  "data-[selected]:bg-primary-container data-[selected]:text-on-primary-container"
44
55
  ],
45
- colon: ["text-display-large text-on-surface px-1 leading-none"],
56
+ colon: ["text-display-large text-on-surface px-1 leading-none self-center"],
46
57
  periods: [
47
- "inline-flex flex-col rounded-small overflow-hidden border border-outline self-stretch",
48
- "m-0 p-0 min-w-0"
58
+ "inline-flex flex-col shrink-0 rounded-small overflow-hidden border border-outline",
59
+ "h-[98px] w-[52px] m-0 p-0 min-w-0 box-border"
49
60
  ],
50
61
  period: [
51
- "flex-1 inline-flex items-center justify-center px-3 min-h-[38px] w-14",
62
+ "relative",
63
+ ...stateLayerBase,
64
+ "flex-1 inline-flex items-center justify-center min-h-12 h-12 w-full",
52
65
  "border-0 bg-transparent",
53
66
  "text-title-medium text-on-surface-variant cursor-pointer outline-none",
54
67
  "data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container",
55
68
  "[&+&]:border-t [&+&]:border-outline"
56
69
  ],
57
70
  dial: [
58
- "relative size-[256px] my-2 p-0 min-w-0 border-0 rounded-full bg-surface-container-highest"
71
+ "relative size-[256px] mt-[28px] p-0 min-w-0 border-0 rounded-full bg-surface-container-highest"
59
72
  ],
60
73
  dialNumber: [
74
+ ...stateLayerBase,
61
75
  "absolute -translate-x-1/2 -translate-y-1/2 inline-grid place-items-center size-12 rounded-full",
62
76
  "border-0 bg-transparent",
63
77
  "text-body-large text-on-surface cursor-pointer outline-none select-none",
@@ -69,7 +83,7 @@ var timePickerTv = tv({
69
83
  dialCenter: [
70
84
  "absolute left-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary pointer-events-none"
71
85
  ],
72
- inputs: ["flex items-start gap-2"],
86
+ inputs: ["flex items-start gap-3"],
73
87
  inputBox: [
74
88
  "w-24 h-20 rounded-small box-border text-center",
75
89
  "bg-surface-container-highest text-on-surface text-display-large outline-none",
@@ -83,6 +97,7 @@ var tp = timePickerTv();
83
97
  var TimePicker = createTimePicker(() => ({
84
98
  root: tp.root(),
85
99
  header: tp.header(),
100
+ display: tp.display(),
86
101
  field: tp.field(),
87
102
  colon: tp.colon(),
88
103
  periods: tp.periods(),
@@ -97,5 +112,5 @@ var TimePicker = createTimePicker(() => ({
97
112
  }));
98
113
 
99
114
  export { TimePicker, timePickerTv };
100
- //# sourceMappingURL=time-picker.js.map
101
- //# sourceMappingURL=time-picker.js.map
115
+ //# sourceMappingURL=index.js.map
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tv.ts","../../../src/components/time-picker/time-picker.ts"],"names":["baseTv"],"mappings":";;;;;AAeA,IAAM,SAAA,GAAY;AAAA,EAChB,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,EAAA,GAAS,CAAC,OAAA,EAAS,MAAA,KAC9BA,KAAO,OAAA,EAAS;AAAA,EACd,GAAG,MAAA;AAAA,EACH,aAAA,EAAe;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa;AAAA,QACX,WAAA,EAAa,CAAC,EAAE,IAAA,EAAM,CAAC,GAAG,SAAS,GAAG;AAAA;AACxC;AACF;AAEJ,CAAC,CAAA;;;AC/BH,IAAM,cAAA,GAAiB;AAAA,EACrB,iBAAA;AAAA,EACA,yLAAA;AAAA,EACA,kDAAA;AAAA,EACA,0DAAA;AAAA,EACA,qDAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,eAAe,EAAA,CAAG;AAAA,EAC7B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,CAAC,uDAAuD,CAAA;AAAA,IAC9D,MAAA,EAAQ,CAAC,sCAAsC,CAAA;AAAA,IAC/C,OAAA,EAAS,CAAC,0BAA0B,CAAA;AAAA,IACpC,KAAA,EAAO;AAAA,MACL,UAAA;AAAA,MACA,GAAG,cAAA;AAAA,MACH,mEAAA;AAAA,MACA,6FAAA;AAAA,MACA,0DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO,CAAC,kEAAkE,CAAA;AAAA,IAC1E,OAAA,EAAS;AAAA,MACP,mFAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA;AAAA,MACA,GAAG,cAAA;AAAA,MACH,qEAAA;AAAA,MACA,yBAAA;AAAA,MACA,uEAAA;AAAA,MACA,oFAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,GAAG,cAAA;AAAA,MACH,gGAAA;AAAA,MACA,yBAAA;AAAA,MACA,yEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV;AAAA,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,wBAAwB,CAAA;AAAA,IACjC,QAAA,EAAU;AAAA,MACR,gDAAA;AAAA,MACA,8EAAA;AAAA,MACA,2DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,YAAA,EAAc,CAAC,oDAAoD;AAAA;AAEvE,CAAC;AAED,IAAM,KAAK,YAAA,EAAa;AACjB,IAAM,UAAA,GAAa,iBAAiB,OAAO;AAAA,EAChD,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,EACd,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAClB,OAAA,EAAS,GAAG,OAAA,EAAQ;AAAA,EACpB,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,EAChB,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,EAChB,OAAA,EAAS,GAAG,OAAA,EAAQ;AAAA,EACpB,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAClB,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,EACd,UAAA,EAAY,GAAG,UAAA,EAAW;AAAA,EAC1B,QAAA,EAAU,GAAG,QAAA,EAAS;AAAA,EACtB,UAAA,EAAY,GAAG,UAAA,EAAW;AAAA,EAC1B,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAClB,QAAA,EAAU,GAAG,QAAA,EAAS;AAAA,EACtB,YAAA,EAAc,GAAG,YAAA;AACnB,CAAA,CAAE","file":"index.js","sourcesContent":["/**\n * tv.ts — a tailwind-variants factory pre-configured for the M3 typescale.\n *\n * The Tailwind v4 preset exposes the 15 typescale roles as `text-<role>`\n * font-size utilities (e.g. `text-body-small`, `text-label-large`). Stock\n * tailwind-merge does not know these custom names, so it groups them with the\n * `text-<color>` utilities and drops one when a slot sets both a color *and* a\n * typescale (the common M3 case). That silently strips either the color or the\n * type, breaking token compliance.\n *\n * Teaching tailwind-merge that the typescale names belong to the `font-size`\n * group keeps color and type independent, so both survive the merge.\n */\nimport { type TV, tv as baseTv } from 'tailwind-variants';\n\nconst TYPESCALE = [\n 'display-large',\n 'display-medium',\n 'display-small',\n 'headline-large',\n 'headline-medium',\n 'headline-small',\n 'title-large',\n 'title-medium',\n 'title-small',\n 'body-large',\n 'body-medium',\n 'body-small',\n 'label-large',\n 'label-medium',\n 'label-small',\n] as const;\n\nexport const tv: TV = (options, config) =>\n baseTv(options, {\n ...config,\n twMergeConfig: {\n extend: {\n classGroups: {\n 'font-size': [{ text: [...TYPESCALE] }],\n },\n },\n },\n });\n","/**\n * time-picker.ts — Tailwind classes for the M3 Time picker (dial + input).\n *\n * Dimensions follow Material Android timepicker dimens (96×80 display, 52×98\n * period toggle, 48dp period targets, 12dp display↔toggle gap, 256dp dial,\n * 28dp dial top margin). State layers on interactive slots match other M3 controls.\n */\nimport { createTimePicker } from '@m3-baseui/core';\nimport { tv } from '../../tv';\n\nexport type { TimePickerVariant, TimeValue } from '@m3-baseui/core';\n\nconst stateLayerBase = [\n 'overflow-hidden',\n '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',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'focus-visible:before:opacity-[var(--md-sys-state-focus)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-2',\n] as const;\n\nexport const timePickerTv = tv({\n slots: {\n root: ['inline-flex flex-col items-center p-2 text-on-surface'],\n header: ['flex items-center gap-3 min-h-[98px]'],\n display: ['inline-flex items-center'],\n field: [\n 'relative',\n ...stateLayerBase,\n 'inline-grid place-items-center w-24 h-20 rounded-small box-border',\n 'bg-surface-container-highest text-on-surface text-display-large cursor-pointer outline-none',\n 'border border-transparent transition-colors duration-100',\n 'data-[selected]:bg-primary-container data-[selected]:text-on-primary-container',\n ],\n colon: ['text-display-large text-on-surface px-1 leading-none self-center'],\n periods: [\n 'inline-flex flex-col shrink-0 rounded-small overflow-hidden border border-outline',\n 'h-[98px] w-[52px] m-0 p-0 min-w-0 box-border',\n ],\n period: [\n 'relative',\n ...stateLayerBase,\n 'flex-1 inline-flex items-center justify-center min-h-12 h-12 w-full',\n 'border-0 bg-transparent',\n 'text-title-medium text-on-surface-variant cursor-pointer outline-none',\n 'data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container',\n '[&+&]:border-t [&+&]:border-outline',\n ],\n dial: [\n 'relative size-[256px] mt-[28px] p-0 min-w-0 border-0 rounded-full bg-surface-container-highest',\n ],\n dialNumber: [\n ...stateLayerBase,\n 'absolute -translate-x-1/2 -translate-y-1/2 inline-grid place-items-center size-12 rounded-full',\n 'border-0 bg-transparent',\n 'text-body-large text-on-surface cursor-pointer outline-none select-none',\n 'data-[selected]:bg-primary data-[selected]:text-on-primary',\n ],\n dialHand: [\n 'absolute left-1/2 top-[12%] h-[38%] w-0.5 origin-bottom bg-primary -translate-x-1/2 pointer-events-none',\n ],\n dialCenter: [\n 'absolute left-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary pointer-events-none',\n ],\n inputs: ['flex items-start gap-3'],\n inputBox: [\n 'w-24 h-20 rounded-small box-border text-center',\n 'bg-surface-container-highest text-on-surface text-display-large outline-none',\n 'border border-outline focus:border-2 focus:border-primary',\n '[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n ],\n inputCaption: ['block mt-1 text-body-small text-on-surface-variant'],\n },\n});\n\nconst tp = timePickerTv();\nexport const TimePicker = createTimePicker(() => ({\n root: tp.root(),\n header: tp.header(),\n display: tp.display(),\n field: tp.field(),\n colon: tp.colon(),\n periods: tp.periods(),\n period: tp.period(),\n dial: tp.dial(),\n dialNumber: tp.dialNumber(),\n dialHand: tp.dialHand(),\n dialCenter: tp.dialCenter(),\n inputs: tp.inputs(),\n inputBox: tp.inputBox(),\n inputCaption: tp.inputCaption(),\n}));\n"]}
@@ -2,7 +2,7 @@
2
2
  import { createToolbar } from '@m3-baseui/core';
3
3
  import { tv as tv$1 } from 'tailwind-variants';
4
4
 
5
- // src/toolbar.ts
5
+ // src/components/toolbar/toolbar.ts
6
6
  var TYPESCALE = [
7
7
  "display-large",
8
8
  "display-medium",
@@ -31,7 +31,7 @@ var tv = (options, config) => tv$1(options, {
31
31
  }
32
32
  });
33
33
 
34
- // src/toolbar.ts
34
+ // src/components/toolbar/toolbar.ts
35
35
  var toolbarTv = tv({
36
36
  base: "inline-flex items-center justify-center gap-1 box-border rounded-full shadow-level3 [&_svg]:size-6",
37
37
  variants: {
@@ -51,5 +51,5 @@ var Toolbar = createToolbar(
51
51
  );
52
52
 
53
53
  export { Toolbar, toolbarTv };
54
- //# sourceMappingURL=toolbar.js.map
55
- //# sourceMappingURL=toolbar.js.map
54
+ //# sourceMappingURL=index.js.map
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tv.ts","../../../src/components/toolbar/toolbar.ts"],"names":["baseTv"],"mappings":";;;;;AAeA,IAAM,SAAA,GAAY;AAAA,EAChB,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,EAAA,GAAS,CAAC,OAAA,EAAS,MAAA,KAC9BA,KAAO,OAAA,EAAS;AAAA,EACd,GAAG,MAAA;AAAA,EACH,aAAA,EAAe;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa;AAAA,QACX,WAAA,EAAa,CAAC,EAAE,IAAA,EAAM,CAAC,GAAG,SAAS,GAAG;AAAA;AACxC;AACF;AAEJ,CAAC,CAAA;;;AC5BI,IAAM,YAAY,EAAA,CAAG;AAAA,EAC1B,IAAA,EAAM,oGAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,8CAAA;AAAA,MACV,OAAA,EACE;AAAA,KACJ;AAAA,IACA,WAAA,EAAa;AAAA,MACX,UAAA,EAAY,oBAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,OAAA,EAAS,UAAA,EAAY,aAAa,YAAA;AACvD,CAAC;AAEM,IAAM,OAAA,GAAU,aAAA;AAAA,EAAc,CAAC,EAAE,OAAA,EAAS,WAAA,OAC/C,SAAA,CAAU,EAAE,OAAA,EAAS,WAAA,EAAa;AACpC","file":"index.js","sourcesContent":["/**\n * tv.ts — a tailwind-variants factory pre-configured for the M3 typescale.\n *\n * The Tailwind v4 preset exposes the 15 typescale roles as `text-<role>`\n * font-size utilities (e.g. `text-body-small`, `text-label-large`). Stock\n * tailwind-merge does not know these custom names, so it groups them with the\n * `text-<color>` utilities and drops one when a slot sets both a color *and* a\n * typescale (the common M3 case). That silently strips either the color or the\n * type, breaking token compliance.\n *\n * Teaching tailwind-merge that the typescale names belong to the `font-size`\n * group keeps color and type independent, so both survive the merge.\n */\nimport { type TV, tv as baseTv } from 'tailwind-variants';\n\nconst TYPESCALE = [\n 'display-large',\n 'display-medium',\n 'display-small',\n 'headline-large',\n 'headline-medium',\n 'headline-small',\n 'title-large',\n 'title-medium',\n 'title-small',\n 'body-large',\n 'body-medium',\n 'body-small',\n 'label-large',\n 'label-medium',\n 'label-small',\n] as const;\n\nexport const tv: TV = (options, config) =>\n baseTv(options, {\n ...config,\n twMergeConfig: {\n extend: {\n classGroups: {\n 'font-size': [{ text: [...TYPESCALE] }],\n },\n },\n },\n });\n","/**\n * toolbar.ts — tailwind-variants for the M3 Expressive Toolbar.\n *\n * A floating, full-radius pill (elevation level3) that groups action icons.\n * `standard` rides on surface-container; `vibrant` on primary-container — and\n * forces its interactive children (icon buttons / links) to the matching\n * on-primary-container foreground, since `IconButton` otherwise paints its own\n * `on-surface-variant`. The descendant selector outranks the button's own color\n * class but not its higher-specificity `data-[disabled]` rule, so disabled\n * actions still dim. `vertical` swaps the main axis and the fixed dimension.\n * Same DOM + `data-*` as the VE build.\n */\nimport { createToolbar } from '@m3-baseui/core';\nimport { tv } from '../../tv';\n\nexport const toolbarTv = tv({\n base: 'inline-flex items-center justify-center gap-1 box-border rounded-full shadow-level3 [&_svg]:size-6',\n variants: {\n variant: {\n standard: 'bg-surface-container text-on-surface-variant',\n vibrant:\n 'bg-primary-container text-on-primary-container [&_button]:text-on-primary-container [&_a]:text-on-primary-container',\n },\n orientation: {\n horizontal: 'flex-row h-16 px-2',\n vertical: 'flex-col w-16 py-2',\n },\n },\n defaultVariants: { variant: 'standard', orientation: 'horizontal' },\n});\n\nexport const Toolbar = createToolbar(({ variant, orientation }) =>\n toolbarTv({ variant, orientation }),\n);\nexport type { ToolbarProps, ToolbarVariant, ToolbarOrientation } from '@m3-baseui/core';\n"]}
@@ -1,20 +1,21 @@
1
1
  import * as react from 'react';
2
2
  import * as _base_ui_react from '@base-ui/react';
3
- import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
4
3
  import * as tailwind_variants from 'tailwind-variants';
4
+ import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
5
+ import * as tailwind_merge from 'tailwind-merge';
5
6
 
6
7
  declare const tooltipTv: tailwind_variants.TVReturnType<{
7
8
  [key: string]: {
8
- [key: string]: tailwind_variants.ClassValue | {
9
- popup?: tailwind_variants.ClassValue;
10
- arrow?: tailwind_variants.ClassValue;
9
+ [key: string]: tailwind_merge.ClassNameValue | {
10
+ popup?: tailwind_merge.ClassNameValue;
11
+ arrow?: tailwind_merge.ClassNameValue;
11
12
  };
12
13
  };
13
14
  } | {
14
15
  [x: string]: {
15
- [x: string]: tailwind_variants.ClassValue | {
16
- popup?: tailwind_variants.ClassValue;
17
- arrow?: tailwind_variants.ClassValue;
16
+ [x: string]: tailwind_merge.ClassNameValue | {
17
+ popup?: tailwind_merge.ClassNameValue;
18
+ arrow?: tailwind_merge.ClassNameValue;
18
19
  };
19
20
  };
20
21
  } | {}, {
@@ -22,16 +23,16 @@ declare const tooltipTv: tailwind_variants.TVReturnType<{
22
23
  arrow: string[];
23
24
  }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
24
25
  [key: string]: {
25
- [key: string]: tailwind_variants.ClassValue | {
26
- popup?: tailwind_variants.ClassValue;
27
- arrow?: tailwind_variants.ClassValue;
26
+ [key: string]: tailwind_merge.ClassNameValue | {
27
+ popup?: tailwind_merge.ClassNameValue;
28
+ arrow?: tailwind_merge.ClassNameValue;
28
29
  };
29
30
  };
30
31
  } | {}>, {
31
32
  [key: string]: {
32
- [key: string]: tailwind_variants.ClassValue | {
33
- popup?: tailwind_variants.ClassValue;
34
- arrow?: tailwind_variants.ClassValue;
33
+ [key: string]: tailwind_merge.ClassNameValue | {
34
+ popup?: tailwind_merge.ClassNameValue;
35
+ arrow?: tailwind_merge.ClassNameValue;
35
36
  };
36
37
  };
37
38
  } | {}, {
@@ -42,30 +43,30 @@ declare const tooltipTv: tailwind_variants.TVReturnType<{
42
43
  arrow: string[];
43
44
  }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
44
45
  [key: string]: {
45
- [key: string]: tailwind_variants.ClassValue | {
46
- popup?: tailwind_variants.ClassValue;
47
- arrow?: tailwind_variants.ClassValue;
46
+ [key: string]: tailwind_merge.ClassNameValue | {
47
+ popup?: tailwind_merge.ClassNameValue;
48
+ arrow?: tailwind_merge.ClassNameValue;
48
49
  };
49
50
  };
50
51
  } | {}>, unknown, unknown, undefined>>;
51
52
  declare const richTooltipTv: tailwind_variants.TVReturnType<{
52
53
  [key: string]: {
53
- [key: string]: tailwind_variants.ClassValue | {
54
- actions?: tailwind_variants.ClassValue;
55
- popup?: tailwind_variants.ClassValue;
56
- supportingText?: tailwind_variants.ClassValue;
57
- arrow?: tailwind_variants.ClassValue;
58
- subhead?: tailwind_variants.ClassValue;
54
+ [key: string]: tailwind_merge.ClassNameValue | {
55
+ popup?: tailwind_merge.ClassNameValue;
56
+ supportingText?: tailwind_merge.ClassNameValue;
57
+ arrow?: tailwind_merge.ClassNameValue;
58
+ subhead?: tailwind_merge.ClassNameValue;
59
+ actions?: tailwind_merge.ClassNameValue;
59
60
  };
60
61
  };
61
62
  } | {
62
63
  [x: string]: {
63
- [x: string]: tailwind_variants.ClassValue | {
64
- actions?: tailwind_variants.ClassValue;
65
- popup?: tailwind_variants.ClassValue;
66
- supportingText?: tailwind_variants.ClassValue;
67
- arrow?: tailwind_variants.ClassValue;
68
- subhead?: tailwind_variants.ClassValue;
64
+ [x: string]: tailwind_merge.ClassNameValue | {
65
+ popup?: tailwind_merge.ClassNameValue;
66
+ supportingText?: tailwind_merge.ClassNameValue;
67
+ arrow?: tailwind_merge.ClassNameValue;
68
+ subhead?: tailwind_merge.ClassNameValue;
69
+ actions?: tailwind_merge.ClassNameValue;
69
70
  };
70
71
  };
71
72
  } | {}, {
@@ -76,22 +77,22 @@ declare const richTooltipTv: tailwind_variants.TVReturnType<{
76
77
  actions: string[];
77
78
  }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
78
79
  [key: string]: {
79
- [key: string]: tailwind_variants.ClassValue | {
80
- actions?: tailwind_variants.ClassValue;
81
- popup?: tailwind_variants.ClassValue;
82
- supportingText?: tailwind_variants.ClassValue;
83
- arrow?: tailwind_variants.ClassValue;
84
- subhead?: tailwind_variants.ClassValue;
80
+ [key: string]: tailwind_merge.ClassNameValue | {
81
+ popup?: tailwind_merge.ClassNameValue;
82
+ supportingText?: tailwind_merge.ClassNameValue;
83
+ arrow?: tailwind_merge.ClassNameValue;
84
+ subhead?: tailwind_merge.ClassNameValue;
85
+ actions?: tailwind_merge.ClassNameValue;
85
86
  };
86
87
  };
87
88
  } | {}>, {
88
89
  [key: string]: {
89
- [key: string]: tailwind_variants.ClassValue | {
90
- actions?: tailwind_variants.ClassValue;
91
- popup?: tailwind_variants.ClassValue;
92
- supportingText?: tailwind_variants.ClassValue;
93
- arrow?: tailwind_variants.ClassValue;
94
- subhead?: tailwind_variants.ClassValue;
90
+ [key: string]: tailwind_merge.ClassNameValue | {
91
+ popup?: tailwind_merge.ClassNameValue;
92
+ supportingText?: tailwind_merge.ClassNameValue;
93
+ arrow?: tailwind_merge.ClassNameValue;
94
+ subhead?: tailwind_merge.ClassNameValue;
95
+ actions?: tailwind_merge.ClassNameValue;
95
96
  };
96
97
  };
97
98
  } | {}, {
@@ -108,12 +109,12 @@ declare const richTooltipTv: tailwind_variants.TVReturnType<{
108
109
  actions: string[];
109
110
  }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
110
111
  [key: string]: {
111
- [key: string]: tailwind_variants.ClassValue | {
112
- actions?: tailwind_variants.ClassValue;
113
- popup?: tailwind_variants.ClassValue;
114
- supportingText?: tailwind_variants.ClassValue;
115
- arrow?: tailwind_variants.ClassValue;
116
- subhead?: tailwind_variants.ClassValue;
112
+ [key: string]: tailwind_merge.ClassNameValue | {
113
+ popup?: tailwind_merge.ClassNameValue;
114
+ supportingText?: tailwind_merge.ClassNameValue;
115
+ arrow?: tailwind_merge.ClassNameValue;
116
+ subhead?: tailwind_merge.ClassNameValue;
117
+ actions?: tailwind_merge.ClassNameValue;
117
118
  };
118
119
  };
119
120
  } | {}>, unknown, unknown, undefined>>;
@@ -2,7 +2,7 @@
2
2
  import { createTooltip, createRichTooltip } from '@m3-baseui/core';
3
3
  import { tv as tv$1 } from 'tailwind-variants';
4
4
 
5
- // src/tooltip.ts
5
+ // src/components/tooltip/tooltip.ts
6
6
  var TYPESCALE = [
7
7
  "display-large",
8
8
  "display-medium",
@@ -31,7 +31,7 @@ var tv = (options, config) => tv$1(options, {
31
31
  }
32
32
  });
33
33
 
34
- // src/tooltip.ts
34
+ // src/components/tooltip/tooltip.ts
35
35
  var transition = [
36
36
  "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
37
37
  "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
@@ -76,5 +76,5 @@ var RichTooltip = createRichTooltip({
76
76
  });
77
77
 
78
78
  export { RichTooltip, Tooltip, richTooltipTv, tooltipTv };
79
- //# sourceMappingURL=tooltip.js.map
80
- //# sourceMappingURL=tooltip.js.map
79
+ //# sourceMappingURL=index.js.map
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tv.ts","../../../src/components/tooltip/tooltip.ts"],"names":["baseTv"],"mappings":";;;;;AAeA,IAAM,SAAA,GAAY;AAAA,EAChB,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,EAAA,GAAS,CAAC,OAAA,EAAS,MAAA,KAC9BA,KAAO,OAAA,EAAS;AAAA,EACd,GAAG,MAAA;AAAA,EACH,aAAA,EAAe;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa;AAAA,QACX,WAAA,EAAa,CAAC,EAAE,IAAA,EAAM,CAAC,GAAG,SAAS,GAAG;AAAA;AACxC;AACF;AAEJ,CAAC,CAAA;;;AC3BH,IAAM,UAAA,GAAa;AAAA,EACjB,4FAAA;AAAA,EACA,gEAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,YAAY,EAAA,CAAG;AAAA,EAC1B,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,4DAAA;AAAA,MACA,yDAAA;AAAA,MACA,GAAG;AAAA,KACL;AAAA,IACA,KAAA,EAAO,CAAC,sBAAsB;AAAA;AAElC,CAAC;AAEM,IAAM,gBAAgB,EAAA,CAAG;AAAA,EAC9B,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,oDAAA;AAAA,MACA,4DAAA;AAAA,MACA,cAAA;AAAA,MACA,GAAG;AAAA,KACL;AAAA,IACA,KAAA,EAAO,CAAC,wBAAwB,CAAA;AAAA,IAChC,OAAA,EAAS,CAAC,sCAAsC,CAAA;AAAA,IAChD,cAAA,EAAgB,CAAC,8CAA8C,CAAA;AAAA;AAAA;AAAA;AAAA,IAI/D,OAAA,EAAS,CAAC,8CAA8C;AAAA;AAE5D,CAAC;AAED,IAAM,IAAI,SAAA,EAAU;AACb,IAAM,OAAA,GAAU,aAAA,CAAc,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,EAAG;AAE3E,IAAM,IAAI,aAAA,EAAc;AACjB,IAAM,cAAc,iBAAA,CAAkB;AAAA,EAC3C,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,EACf,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,EACf,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,cAAA,EAAgB,EAAE,cAAA,EAAe;AAAA,EACjC,OAAA,EAAS,EAAE,OAAA;AACb,CAAC","file":"index.js","sourcesContent":["/**\n * tv.ts — a tailwind-variants factory pre-configured for the M3 typescale.\n *\n * The Tailwind v4 preset exposes the 15 typescale roles as `text-<role>`\n * font-size utilities (e.g. `text-body-small`, `text-label-large`). Stock\n * tailwind-merge does not know these custom names, so it groups them with the\n * `text-<color>` utilities and drops one when a slot sets both a color *and* a\n * typescale (the common M3 case). That silently strips either the color or the\n * type, breaking token compliance.\n *\n * Teaching tailwind-merge that the typescale names belong to the `font-size`\n * group keeps color and type independent, so both survive the merge.\n */\nimport { type TV, tv as baseTv } from 'tailwind-variants';\n\nconst TYPESCALE = [\n 'display-large',\n 'display-medium',\n 'display-small',\n 'headline-large',\n 'headline-medium',\n 'headline-small',\n 'title-large',\n 'title-medium',\n 'title-small',\n 'body-large',\n 'body-medium',\n 'body-small',\n 'label-large',\n 'label-medium',\n 'label-small',\n] as const;\n\nexport const tv: TV = (options, config) =>\n baseTv(options, {\n ...config,\n twMergeConfig: {\n extend: {\n classGroups: {\n 'font-size': [{ text: [...TYPESCALE] }],\n },\n },\n },\n });\n","/**\n * tooltip.ts — Tailwind classes for the M3 Tooltip (plain + rich).\n *\n * Plain (`Tooltip`, Base UI Tooltip): inverse-surface background, body-small\n * text, extra-small corners, with a fade + small-move transition driven by Base\n * UI's data-[starting-style] / data-[ending-style] attributes.\n *\n * Rich (`RichTooltip`, Base UI Popover): surface-container surface (level2\n * elevation, 12dp corner, 320dp max) holding an optional title-small subhead,\n * body-medium supporting text, and a leading-aligned action row at the bottom\n * (M3 places rich-tooltip actions bottom-left). Built on Popover so its buttons\n * are reachable by keyboard and touch.\n */\nimport { createTooltip, createRichTooltip } from '@m3-baseui/core';\nimport { tv } from '../../tv';\n\nconst transition = [\n 'origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard',\n 'data-[starting-style]:opacity-0 data-[starting-style]:scale-95',\n 'data-[ending-style]:opacity-0 data-[ending-style]:scale-95',\n];\n\nexport const tooltipTv = tv({\n slots: {\n popup: [\n 'bg-inverse-surface text-inverse-on-surface text-body-small',\n 'rounded-extra-small px-2 py-1 max-w-[224px] select-none',\n ...transition,\n ],\n arrow: ['text-inverse-surface'],\n },\n});\n\nexport const richTooltipTv = tv({\n slots: {\n popup: [\n 'bg-surface-container text-on-surface shadow-level2',\n 'rounded-medium px-4 py-3 max-w-[320px] flex flex-col gap-1',\n 'outline-none',\n ...transition,\n ],\n arrow: ['text-surface-container'],\n subhead: ['text-title-small text-on-surface m-0'],\n supportingText: ['text-body-medium text-on-surface-variant m-0'],\n // M3 places rich-tooltip actions at the bottom-left (leading), not trailing\n // like a dialog. -ml-2 pulls the text button so its label optically aligns\n // with the content's left edge.\n actions: ['flex flex-wrap items-center gap-2 mt-1 -ml-2'],\n },\n});\n\nconst t = tooltipTv();\nexport const Tooltip = createTooltip({ popup: t.popup(), arrow: t.arrow() });\n\nconst r = richTooltipTv();\nexport const RichTooltip = createRichTooltip({\n popup: r.popup(),\n arrow: r.arrow(),\n subhead: r.subhead(),\n supportingText: r.supportingText(),\n actions: r.actions(),\n});\n"]}
@@ -2,7 +2,7 @@
2
2
  import { createTopAppBar } from '@m3-baseui/core';
3
3
  import { tv as tv$1 } from 'tailwind-variants';
4
4
 
5
- // src/top-app-bar.ts
5
+ // src/components/top-app-bar/top-app-bar.ts
6
6
  var TYPESCALE = [
7
7
  "display-large",
8
8
  "display-medium",
@@ -31,7 +31,7 @@ var tv = (options, config) => tv$1(options, {
31
31
  }
32
32
  });
33
33
 
34
- // src/top-app-bar.ts
34
+ // src/components/top-app-bar/top-app-bar.ts
35
35
  var topAppBarTv = tv({
36
36
  slots: {
37
37
  root: "flex flex-col w-full box-border h-16 bg-surface text-on-surface",
@@ -64,5 +64,5 @@ var TopAppBar = createTopAppBar((args) => {
64
64
  });
65
65
 
66
66
  export { TopAppBar, topAppBarTv };
67
- //# sourceMappingURL=top-app-bar.js.map
68
- //# sourceMappingURL=top-app-bar.js.map
67
+ //# sourceMappingURL=index.js.map
68
+ //# sourceMappingURL=index.js.map