@m3-baseui/react-tailwind 1.3.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 (175) 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/components/dialog/index.d.ts +116 -0
  26. package/dist/components/dialog/index.js +103 -0
  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} +12 -6
  40. package/dist/components/item/index.js.map +1 -0
  41. package/dist/{list.d.ts → components/list/index.d.ts} +4 -4
  42. package/dist/{list.js → components/list/index.js} +12 -6
  43. package/dist/components/list/index.js.map +1 -0
  44. package/dist/{loading-indicator.js → components/loading-indicator/index.js} +4 -4
  45. package/dist/components/loading-indicator/index.js.map +1 -0
  46. package/dist/{menu.d.ts → components/menu/index.d.ts} +61 -60
  47. package/dist/components/menu/index.js +179 -0
  48. package/dist/components/menu/index.js.map +1 -0
  49. package/dist/components/navigation-bar/index.d.ts +92 -0
  50. package/dist/{navigation-bar.js → components/navigation-bar/index.js} +3 -3
  51. package/dist/components/navigation-bar/index.js.map +1 -0
  52. package/dist/{navigation-drawer.js → components/navigation-drawer/index.js} +4 -4
  53. package/dist/components/navigation-drawer/index.js.map +1 -0
  54. package/dist/components/navigation-rail/index.d.ts +102 -0
  55. package/dist/{navigation-rail.js → components/navigation-rail/index.js} +4 -4
  56. package/dist/components/navigation-rail/index.js.map +1 -0
  57. package/dist/components/progress/index.d.ts +127 -0
  58. package/dist/components/progress/index.js +101 -0
  59. package/dist/components/progress/index.js.map +1 -0
  60. package/dist/{radio.d.ts → components/radio/index.d.ts} +17 -16
  61. package/dist/{radio.js → components/radio/index.js} +3 -3
  62. package/dist/components/radio/index.js.map +1 -0
  63. package/dist/{search.d.ts → components/search/index.d.ts} +62 -61
  64. package/dist/{search.js → components/search/index.js} +4 -4
  65. package/dist/components/search/index.js.map +1 -0
  66. package/dist/{segmented-button.d.ts → components/segmented-button/index.d.ts} +32 -31
  67. package/dist/{segmented-button.js → components/segmented-button/index.js} +4 -4
  68. package/dist/components/segmented-button/index.js.map +1 -0
  69. package/dist/components/select/index.d.ts +253 -0
  70. package/dist/components/select/index.js +271 -0
  71. package/dist/components/select/index.js.map +1 -0
  72. package/dist/{side-sheet.js → components/side-sheet/index.js} +4 -4
  73. package/dist/components/side-sheet/index.js.map +1 -0
  74. package/dist/{slider.d.ts → components/slider/index.d.ts} +52 -51
  75. package/dist/{slider.js → components/slider/index.js} +4 -4
  76. package/dist/components/slider/index.js.map +1 -0
  77. package/dist/{snackbar.d.ts → components/snackbar/index.d.ts} +42 -41
  78. package/dist/{snackbar.js → components/snackbar/index.js} +9 -4
  79. package/dist/components/snackbar/index.js.map +1 -0
  80. package/dist/{split-button.js → components/split-button/index.js} +4 -4
  81. package/dist/components/split-button/index.js.map +1 -0
  82. package/dist/components/switch/index.d.ts +73 -0
  83. package/dist/{switch.js → components/switch/index.js} +3 -3
  84. package/dist/components/switch/index.js.map +1 -0
  85. package/dist/{tabs.js → components/tabs/index.js} +4 -4
  86. package/dist/components/tabs/index.js.map +1 -0
  87. package/dist/{textfield.d.ts → components/textfield/index.d.ts} +7 -1
  88. package/dist/{textfield.js → components/textfield/index.js} +35 -13
  89. package/dist/components/textfield/index.js.map +1 -0
  90. package/dist/components/time-picker/index.d.ts +153 -0
  91. package/dist/{time-picker.js → components/time-picker/index.js} +28 -13
  92. package/dist/components/time-picker/index.js.map +1 -0
  93. package/dist/{toolbar.js → components/toolbar/index.js} +4 -4
  94. package/dist/components/toolbar/index.js.map +1 -0
  95. package/dist/components/tooltip/index.d.ts +143 -0
  96. package/dist/components/tooltip/index.js +80 -0
  97. package/dist/components/tooltip/index.js.map +1 -0
  98. package/dist/{top-app-bar.js → components/top-app-bar/index.js} +4 -4
  99. package/dist/components/top-app-bar/index.js.map +1 -0
  100. package/dist/index.d.ts +40 -39
  101. package/dist/index.js +489 -129
  102. package/dist/index.js.map +1 -1
  103. package/package.json +151 -151
  104. package/styles/preset.css +75 -7
  105. package/styles/theme.css +2 -0
  106. package/styles/tokens.css +2 -0
  107. package/dist/badge.js.map +0 -1
  108. package/dist/bottom-app-bar.js.map +0 -1
  109. package/dist/bottom-sheet.js.map +0 -1
  110. package/dist/button-group.js.map +0 -1
  111. package/dist/button.js.map +0 -1
  112. package/dist/card.js.map +0 -1
  113. package/dist/carousel.js.map +0 -1
  114. package/dist/checkbox.js.map +0 -1
  115. package/dist/chip.js.map +0 -1
  116. package/dist/date-picker.d.ts +0 -188
  117. package/dist/date-picker.js.map +0 -1
  118. package/dist/dialog.d.ts +0 -86
  119. package/dist/dialog.js +0 -68
  120. package/dist/dialog.js.map +0 -1
  121. package/dist/divider.js.map +0 -1
  122. package/dist/fab-menu.js.map +0 -1
  123. package/dist/fab.js +0 -47
  124. package/dist/fab.js.map +0 -1
  125. package/dist/icon-button.js.map +0 -1
  126. package/dist/item.d.ts +0 -94
  127. package/dist/item.js.map +0 -1
  128. package/dist/list.js.map +0 -1
  129. package/dist/loading-indicator.js.map +0 -1
  130. package/dist/menu.js +0 -114
  131. package/dist/menu.js.map +0 -1
  132. package/dist/navigation-bar.d.ts +0 -91
  133. package/dist/navigation-bar.js.map +0 -1
  134. package/dist/navigation-drawer.js.map +0 -1
  135. package/dist/navigation-rail.d.ts +0 -101
  136. package/dist/navigation-rail.js.map +0 -1
  137. package/dist/progress.d.ts +0 -118
  138. package/dist/progress.js +0 -41
  139. package/dist/progress.js.map +0 -1
  140. package/dist/radio.js.map +0 -1
  141. package/dist/search.js.map +0 -1
  142. package/dist/segmented-button.js.map +0 -1
  143. package/dist/select.d.ts +0 -125
  144. package/dist/select.js +0 -99
  145. package/dist/select.js.map +0 -1
  146. package/dist/side-sheet.js.map +0 -1
  147. package/dist/slider.js.map +0 -1
  148. package/dist/snackbar.js.map +0 -1
  149. package/dist/split-button.js.map +0 -1
  150. package/dist/switch.d.ts +0 -72
  151. package/dist/switch.js.map +0 -1
  152. package/dist/tabs.js.map +0 -1
  153. package/dist/textfield.js.map +0 -1
  154. package/dist/time-picker.d.ts +0 -144
  155. package/dist/time-picker.js.map +0 -1
  156. package/dist/toolbar.js.map +0 -1
  157. package/dist/tooltip.d.ts +0 -61
  158. package/dist/tooltip.js +0 -52
  159. package/dist/tooltip.js.map +0 -1
  160. package/dist/top-app-bar.js.map +0 -1
  161. /package/dist/{badge.d.ts → components/badge/index.d.ts} +0 -0
  162. /package/dist/{button.d.ts → components/button/index.d.ts} +0 -0
  163. /package/dist/{button-group.d.ts → components/button-group/index.d.ts} +0 -0
  164. /package/dist/{card.d.ts → components/card/index.d.ts} +0 -0
  165. /package/dist/{carousel.d.ts → components/carousel/index.d.ts} +0 -0
  166. /package/dist/{chip.d.ts → components/chip/index.d.ts} +0 -0
  167. /package/dist/{divider.d.ts → components/divider/index.d.ts} +0 -0
  168. /package/dist/{icon-button.d.ts → components/icon-button/index.d.ts} +0 -0
  169. /package/dist/{loading-indicator.d.ts → components/loading-indicator/index.d.ts} +0 -0
  170. /package/dist/{navigation-drawer.d.ts → components/navigation-drawer/index.d.ts} +0 -0
  171. /package/dist/{side-sheet.d.ts → components/side-sheet/index.d.ts} +0 -0
  172. /package/dist/{split-button.d.ts → components/split-button/index.d.ts} +0 -0
  173. /package/dist/{tabs.d.ts → components/tabs/index.d.ts} +0 -0
  174. /package/dist/{toolbar.d.ts → components/toolbar/index.d.ts} +0 -0
  175. /package/dist/{top-app-bar.d.ts → components/top-app-bar/index.d.ts} +0 -0
@@ -1,98 +1,99 @@
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 menuTv: tailwind_variants.TVReturnType<{
7
8
  [key: string]: {
8
- [key: string]: tailwind_variants.ClassValue | {
9
- separator?: tailwind_variants.ClassValue;
10
- popup?: tailwind_variants.ClassValue;
11
- item?: tailwind_variants.ClassValue;
12
- itemIndicator?: tailwind_variants.ClassValue;
13
- groupLabel?: tailwind_variants.ClassValue;
14
- submenuTrigger?: tailwind_variants.ClassValue;
15
- checkboxItem?: tailwind_variants.ClassValue;
16
- radioItem?: tailwind_variants.ClassValue;
9
+ [key: string]: tailwind_merge.ClassNameValue | {
10
+ separator?: tailwind_merge.ClassNameValue;
11
+ popup?: tailwind_merge.ClassNameValue;
12
+ itemIndicator?: tailwind_merge.ClassNameValue;
13
+ groupLabel?: tailwind_merge.ClassNameValue;
14
+ item?: tailwind_merge.ClassNameValue;
15
+ submenuTrigger?: tailwind_merge.ClassNameValue;
16
+ checkboxItem?: tailwind_merge.ClassNameValue;
17
+ radioItem?: tailwind_merge.ClassNameValue;
17
18
  };
18
19
  };
19
20
  } | {
20
21
  [x: string]: {
21
- [x: string]: tailwind_variants.ClassValue | {
22
- separator?: tailwind_variants.ClassValue;
23
- popup?: tailwind_variants.ClassValue;
24
- item?: tailwind_variants.ClassValue;
25
- itemIndicator?: tailwind_variants.ClassValue;
26
- groupLabel?: tailwind_variants.ClassValue;
27
- submenuTrigger?: tailwind_variants.ClassValue;
28
- checkboxItem?: tailwind_variants.ClassValue;
29
- radioItem?: tailwind_variants.ClassValue;
22
+ [x: string]: tailwind_merge.ClassNameValue | {
23
+ separator?: tailwind_merge.ClassNameValue;
24
+ popup?: tailwind_merge.ClassNameValue;
25
+ itemIndicator?: tailwind_merge.ClassNameValue;
26
+ groupLabel?: tailwind_merge.ClassNameValue;
27
+ item?: tailwind_merge.ClassNameValue;
28
+ submenuTrigger?: tailwind_merge.ClassNameValue;
29
+ checkboxItem?: tailwind_merge.ClassNameValue;
30
+ radioItem?: tailwind_merge.ClassNameValue;
30
31
  };
31
32
  };
32
33
  } | {}, {
33
- popup: string[];
34
+ popup: string;
34
35
  item: string[];
35
36
  separator: string[];
36
- groupLabel: string[];
37
+ groupLabel: string;
37
38
  submenuTrigger: string[];
38
- checkboxItem: string[];
39
- radioItem: string[];
39
+ checkboxItem: string;
40
+ radioItem: string;
40
41
  itemIndicator: string;
41
42
  }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
42
43
  [key: string]: {
43
- [key: string]: tailwind_variants.ClassValue | {
44
- separator?: tailwind_variants.ClassValue;
45
- popup?: tailwind_variants.ClassValue;
46
- item?: tailwind_variants.ClassValue;
47
- itemIndicator?: tailwind_variants.ClassValue;
48
- groupLabel?: tailwind_variants.ClassValue;
49
- submenuTrigger?: tailwind_variants.ClassValue;
50
- checkboxItem?: tailwind_variants.ClassValue;
51
- radioItem?: tailwind_variants.ClassValue;
44
+ [key: string]: tailwind_merge.ClassNameValue | {
45
+ separator?: tailwind_merge.ClassNameValue;
46
+ popup?: tailwind_merge.ClassNameValue;
47
+ itemIndicator?: tailwind_merge.ClassNameValue;
48
+ groupLabel?: tailwind_merge.ClassNameValue;
49
+ item?: tailwind_merge.ClassNameValue;
50
+ submenuTrigger?: tailwind_merge.ClassNameValue;
51
+ checkboxItem?: tailwind_merge.ClassNameValue;
52
+ radioItem?: tailwind_merge.ClassNameValue;
52
53
  };
53
54
  };
54
55
  } | {}>, {
55
56
  [key: string]: {
56
- [key: string]: tailwind_variants.ClassValue | {
57
- separator?: tailwind_variants.ClassValue;
58
- popup?: tailwind_variants.ClassValue;
59
- item?: tailwind_variants.ClassValue;
60
- itemIndicator?: tailwind_variants.ClassValue;
61
- groupLabel?: tailwind_variants.ClassValue;
62
- submenuTrigger?: tailwind_variants.ClassValue;
63
- checkboxItem?: tailwind_variants.ClassValue;
64
- radioItem?: tailwind_variants.ClassValue;
57
+ [key: string]: tailwind_merge.ClassNameValue | {
58
+ separator?: tailwind_merge.ClassNameValue;
59
+ popup?: tailwind_merge.ClassNameValue;
60
+ itemIndicator?: tailwind_merge.ClassNameValue;
61
+ groupLabel?: tailwind_merge.ClassNameValue;
62
+ item?: tailwind_merge.ClassNameValue;
63
+ submenuTrigger?: tailwind_merge.ClassNameValue;
64
+ checkboxItem?: tailwind_merge.ClassNameValue;
65
+ radioItem?: tailwind_merge.ClassNameValue;
65
66
  };
66
67
  };
67
68
  } | {}, {
68
- popup: string[];
69
+ popup: string;
69
70
  item: string[];
70
71
  separator: string[];
71
- groupLabel: string[];
72
+ groupLabel: string;
72
73
  submenuTrigger: string[];
73
- checkboxItem: string[];
74
- radioItem: string[];
74
+ checkboxItem: string;
75
+ radioItem: string;
75
76
  itemIndicator: string;
76
77
  }, tailwind_variants.TVReturnType<unknown, {
77
- popup: string[];
78
+ popup: string;
78
79
  item: string[];
79
80
  separator: string[];
80
- groupLabel: string[];
81
+ groupLabel: string;
81
82
  submenuTrigger: string[];
82
- checkboxItem: string[];
83
- radioItem: string[];
83
+ checkboxItem: string;
84
+ radioItem: string;
84
85
  itemIndicator: string;
85
86
  }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
86
87
  [key: string]: {
87
- [key: string]: tailwind_variants.ClassValue | {
88
- separator?: tailwind_variants.ClassValue;
89
- popup?: tailwind_variants.ClassValue;
90
- item?: tailwind_variants.ClassValue;
91
- itemIndicator?: tailwind_variants.ClassValue;
92
- groupLabel?: tailwind_variants.ClassValue;
93
- submenuTrigger?: tailwind_variants.ClassValue;
94
- checkboxItem?: tailwind_variants.ClassValue;
95
- radioItem?: tailwind_variants.ClassValue;
88
+ [key: string]: tailwind_merge.ClassNameValue | {
89
+ separator?: tailwind_merge.ClassNameValue;
90
+ popup?: tailwind_merge.ClassNameValue;
91
+ itemIndicator?: tailwind_merge.ClassNameValue;
92
+ groupLabel?: tailwind_merge.ClassNameValue;
93
+ item?: tailwind_merge.ClassNameValue;
94
+ submenuTrigger?: tailwind_merge.ClassNameValue;
95
+ checkboxItem?: tailwind_merge.ClassNameValue;
96
+ radioItem?: tailwind_merge.ClassNameValue;
96
97
  };
97
98
  };
98
99
  } | {}>, unknown, unknown, undefined>>;
@@ -100,8 +101,8 @@ declare const Menu: {
100
101
  Root: <Payload>(props: _base_ui_react.MenuRoot.Props<Payload>) => react.JSX.Element;
101
102
  Trigger: _base_ui_react.MenuTrigger;
102
103
  Portal: react.ForwardRefExoticComponent<Omit<_base_ui_react.ContextMenuPortalProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
103
- Positioner: react.ForwardRefExoticComponent<Omit<_base_ui_react.ContextMenuPositionerProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
104
- Popup: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuPopupProps, "ref"> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<unknown>>;
104
+ Positioner: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuPositionerProps, "ref"> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
105
+ Popup: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuPopupProps, "ref"> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
105
106
  Item: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuItemProps, "ref"> & react.RefAttributes<HTMLElement>, "ref"> & react.RefAttributes<unknown>>;
106
107
  Separator: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.SeparatorProps, "ref"> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<unknown>>;
107
108
  Group: react.ForwardRefExoticComponent<Omit<_base_ui_react.ContextMenuGroupProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,179 @@
1
+ "use client";
2
+ import { createMenu } from '@m3-baseui/core';
3
+ import { tv as tv$1 } from 'tailwind-variants';
4
+
5
+ // src/components/menu/menu.ts
6
+ var TYPESCALE = [
7
+ "display-large",
8
+ "display-medium",
9
+ "display-small",
10
+ "headline-large",
11
+ "headline-medium",
12
+ "headline-small",
13
+ "title-large",
14
+ "title-medium",
15
+ "title-small",
16
+ "body-large",
17
+ "body-medium",
18
+ "body-small",
19
+ "label-large",
20
+ "label-medium",
21
+ "label-small"
22
+ ];
23
+ var tv = (options, config) => tv$1(options, {
24
+ ...config,
25
+ twMergeConfig: {
26
+ extend: {
27
+ classGroups: {
28
+ "font-size": [{ text: [...TYPESCALE] }]
29
+ }
30
+ }
31
+ }
32
+ });
33
+
34
+ // src/components/menu/menu-selectable-item.ts
35
+ var menuSelectableItemStateLayer = [
36
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
37
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
38
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
39
+ "active:before:opacity-[var(--md-sys-state-pressed)]"
40
+ ];
41
+ var menuSelectableItemSelectedFill = [
42
+ "data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container",
43
+ "data-[checked]:bg-secondary-container data-[checked]:text-on-secondary-container"
44
+ ];
45
+ var menuSelectableItemPositionShape = [
46
+ "data-[selected]:data-[position=only]:rounded-extra-small",
47
+ "data-[selected]:data-[position=first]:rounded-t-extra-small",
48
+ "data-[selected]:data-[position=middle]:rounded-none",
49
+ "data-[selected]:data-[position=last]:rounded-b-extra-small",
50
+ "data-[checked]:data-[position=only]:rounded-extra-small",
51
+ "data-[checked]:data-[position=first]:rounded-t-extra-small",
52
+ "data-[checked]:data-[position=middle]:rounded-none",
53
+ "data-[checked]:data-[position=last]:rounded-b-extra-small"
54
+ ];
55
+ var menuSelectableItemPositionShapeFallback = [
56
+ "data-[selected]:not([data-position]):rounded-extra-small",
57
+ "data-[checked]:not([data-position]):rounded-extra-small"
58
+ ];
59
+ var menuSelectableItemDisabled = [
60
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
61
+ "data-[disabled]:data-[selected]:bg-transparent data-[disabled]:data-[selected]:text-on-surface/[0.38]",
62
+ "data-[disabled]:data-[checked]:bg-transparent data-[disabled]:data-[checked]:text-on-surface/[0.38]"
63
+ ];
64
+ var menuSelectableItemBase = [
65
+ "group relative cursor-pointer select-none outline-none text-label-large text-on-surface",
66
+ "h-12 px-3 overflow-hidden",
67
+ ...menuSelectableItemStateLayer,
68
+ ...menuSelectableItemSelectedFill,
69
+ ...menuSelectableItemPositionShape,
70
+ ...menuSelectableItemPositionShapeFallback,
71
+ ...menuSelectableItemDisabled
72
+ ];
73
+ var menuSelectableItemTv = tv({
74
+ slots: {
75
+ /** Select row: check + label + optional trailing meta. */
76
+ selectItem: ["grid grid-cols-[24px_1fr_auto] items-center gap-3", ...menuSelectableItemBase],
77
+ /** Menu checkbox / radio row: check + label. */
78
+ menuSelectableItem: ["grid grid-cols-[24px_1fr] items-center gap-3", ...menuSelectableItemBase],
79
+ itemIndicator: [
80
+ "inline-flex items-center justify-center text-on-surface",
81
+ "invisible group-data-[selected]:visible group-data-[checked]:visible",
82
+ "group-data-[selected]:text-on-secondary-container group-data-[checked]:text-on-secondary-container",
83
+ "group-data-[disabled]:text-on-surface/[0.38]"
84
+ ]
85
+ }
86
+ });
87
+ var menuSelectableItem = menuSelectableItemTv();
88
+
89
+ // src/components/menu/menu-surface.ts
90
+ var menuSurfaceBase = [
91
+ "py-2",
92
+ "bg-surface-container text-on-surface rounded-extra-small shadow-level2",
93
+ "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
94
+ "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
95
+ "data-[ending-style]:opacity-0",
96
+ "focus:outline-none"
97
+ ];
98
+ var menuSurfaceTv = tv({
99
+ slots: {
100
+ popup: ["max-w-[280px]", ...menuSurfaceBase],
101
+ groupLabel: "px-3 py-2 text-label-small text-on-surface-variant"
102
+ },
103
+ variants: {
104
+ width: {
105
+ /** Standalone Menu: 112–280dp. */
106
+ standard: { popup: "min-w-[112px]" },
107
+ /** Exposed Dropdown / Select: at least anchor width, capped at 280dp. */
108
+ anchor: { popup: "min-w-[max(112px,var(--anchor-width))]" }
109
+ },
110
+ scroll: {
111
+ none: {},
112
+ /** Select popup: clamp height and scroll the list. */
113
+ auto: { popup: "max-h-[var(--available-height)] overflow-auto" }
114
+ }
115
+ },
116
+ defaultVariants: {
117
+ width: "standard",
118
+ scroll: "none"
119
+ }
120
+ });
121
+ menuSurfaceTv();
122
+
123
+ // src/components/menu/menu.ts
124
+ var surface = menuSurfaceTv({ width: "standard", scroll: "none" });
125
+ var selectable = menuSelectableItem;
126
+ var menuTv = tv({
127
+ slots: {
128
+ popup: surface.popup(),
129
+ item: [
130
+ "relative flex items-center gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none",
131
+ "text-label-large text-on-surface",
132
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
133
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
134
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
135
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
136
+ // M3 disabled (per-token, not a blanket fade): label + leading/trailing
137
+ // icon on-surface/0.38, no state layer.
138
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
139
+ "data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38] data-[disabled]:[&_[data-slot=menu-trailing]]:text-on-surface/[0.38]",
140
+ // M3 leading icon (24dp) + trailing supporting text (shortcut/meta).
141
+ "[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6",
142
+ "[&_[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"
143
+ ],
144
+ separator: ["my-2 h-px border-0 bg-outline-variant"],
145
+ groupLabel: surface.groupLabel(),
146
+ // Submenu trigger: item look + trailing chevron, highlighted while open.
147
+ submenuTrigger: [
148
+ "relative flex items-center justify-between gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none",
149
+ "text-label-large text-on-surface",
150
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
151
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
152
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
153
+ "data-[popup-open]:before:opacity-[var(--md-sys-state-hover)]",
154
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
155
+ // M3 disabled (per-token): label + leading icon on-surface/0.38, no state layer.
156
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
157
+ "data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38]",
158
+ "[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6"
159
+ ],
160
+ checkboxItem: selectable.menuSelectableItem(),
161
+ radioItem: selectable.menuSelectableItem(),
162
+ itemIndicator: selectable.itemIndicator()
163
+ }
164
+ });
165
+ var m = menuTv();
166
+ var Menu = createMenu({
167
+ popup: m.popup(),
168
+ item: m.item(),
169
+ separator: m.separator(),
170
+ groupLabel: m.groupLabel(),
171
+ submenuTrigger: m.submenuTrigger(),
172
+ checkboxItem: m.checkboxItem(),
173
+ radioItem: m.radioItem(),
174
+ itemIndicator: m.itemIndicator()
175
+ });
176
+
177
+ export { Menu, menuTv };
178
+ //# sourceMappingURL=index.js.map
179
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tv.ts","../../../src/components/menu/menu-selectable-item.ts","../../../src/components/menu/menu-surface.ts","../../../src/components/menu/menu.ts"],"names":["baseTv"],"mappings":"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","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 * menu-selectable-item.ts — shared M3 selectable menu row tokens.\n *\n * Select.Item and Menu CheckboxItem / RadioItem share secondary-container fill,\n * position-based selected shapes (issue #98), and the 24dp leading indicator column.\n */\nimport { tv } from '../../tv';\n\n/** State layer on selectable rows (hover / highlighted / pressed). */\nexport const menuSelectableItemStateLayer = [\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n] as const;\n\n/** M3 selectable row fill when selected or checked. */\nexport const menuSelectableItemSelectedFill = [\n 'data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container',\n 'data-[checked]:bg-secondary-container data-[checked]:text-on-secondary-container',\n] as const;\n\n/** M3 MenuDefaults.itemShape — corner radii on the selected/checked container. */\nexport const menuSelectableItemPositionShape = [\n 'data-[selected]:data-[position=only]:rounded-extra-small',\n 'data-[selected]:data-[position=first]:rounded-t-extra-small',\n 'data-[selected]:data-[position=middle]:rounded-none',\n 'data-[selected]:data-[position=last]:rounded-b-extra-small',\n 'data-[checked]:data-[position=only]:rounded-extra-small',\n 'data-[checked]:data-[position=first]:rounded-t-extra-small',\n 'data-[checked]:data-[position=middle]:rounded-none',\n 'data-[checked]:data-[position=last]:rounded-b-extra-small',\n] as const;\n\n/** Fallback when rows are rendered via a wrapper and data-position is not stamped. */\nexport const menuSelectableItemPositionShapeFallback = [\n 'data-[selected]:not([data-position]):rounded-extra-small',\n 'data-[checked]:not([data-position]):rounded-extra-small',\n] as const;\n\nexport const menuSelectableItemDisabled = [\n 'data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none',\n 'data-[disabled]:data-[selected]:bg-transparent data-[disabled]:data-[selected]:text-on-surface/[0.38]',\n 'data-[disabled]:data-[checked]:bg-transparent data-[disabled]:data-[checked]:text-on-surface/[0.38]',\n] as const;\n\nexport const menuSelectableItemBase = [\n 'group relative cursor-pointer select-none outline-none text-label-large text-on-surface',\n 'h-12 px-3 overflow-hidden',\n ...menuSelectableItemStateLayer,\n ...menuSelectableItemSelectedFill,\n ...menuSelectableItemPositionShape,\n ...menuSelectableItemPositionShapeFallback,\n ...menuSelectableItemDisabled,\n] as const;\n\nexport const menuSelectableItemTv = tv({\n slots: {\n /** Select row: check + label + optional trailing meta. */\n selectItem: ['grid grid-cols-[24px_1fr_auto] items-center gap-3', ...menuSelectableItemBase],\n /** Menu checkbox / radio row: check + label. */\n menuSelectableItem: ['grid grid-cols-[24px_1fr] items-center gap-3', ...menuSelectableItemBase],\n itemIndicator: [\n 'inline-flex items-center justify-center text-on-surface',\n 'invisible group-data-[selected]:visible group-data-[checked]:visible',\n 'group-data-[selected]:text-on-secondary-container group-data-[checked]:text-on-secondary-container',\n 'group-data-[disabled]:text-on-surface/[0.38]',\n ],\n },\n});\n\nexport const menuSelectableItem = menuSelectableItemTv();\n","/**\n * menu-surface.ts — shared M3 menu popup surface tokens (Menus specs).\n *\n * Used by Menu (standard width) and Select (anchor-width + scroll). Engine-neutral\n * class strings; both components compose variants on top.\n */\nimport { tv } from '../../tv';\n\n/** Base popup surface shared by Menu and Select list popups. */\nexport const menuSurfaceBase = [\n 'py-2',\n 'bg-surface-container text-on-surface rounded-extra-small shadow-level2',\n 'origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard',\n 'data-[starting-style]:opacity-0 data-[starting-style]:scale-95',\n 'data-[ending-style]:opacity-0',\n 'focus:outline-none',\n] as const;\n\nexport const menuSurfaceTv = tv({\n slots: {\n popup: ['max-w-[280px]', ...menuSurfaceBase],\n groupLabel: 'px-3 py-2 text-label-small text-on-surface-variant',\n },\n variants: {\n width: {\n /** Standalone Menu: 112–280dp. */\n standard: { popup: 'min-w-[112px]' },\n /** Exposed Dropdown / Select: at least anchor width, capped at 280dp. */\n anchor: { popup: 'min-w-[max(112px,var(--anchor-width))]' },\n },\n scroll: {\n none: {},\n /** Select popup: clamp height and scroll the list. */\n auto: { popup: 'max-h-[var(--available-height)] overflow-auto' },\n },\n },\n defaultVariants: {\n width: 'standard',\n scroll: 'none',\n },\n});\n\nexport const menuSurface = menuSurfaceTv();\n","/**\n * menu.ts — Tailwind classes for the M3 Menu.\n *\n * surface-container popup (elevation 2, extra-small corners); 48dp items with a\n * `before:` state layer keyed to hover + Base UI's data-[highlighted]. Selectable\n * checkbox/radio rows share menu-selectable-item tokens with Select. Same DOM\n * + ripple as the VE build.\n */\nimport { createMenu } from '@m3-baseui/core';\nimport { tv } from '../../tv';\nimport { menuSelectableItem } from './menu-selectable-item';\nimport { menuSurfaceTv } from './menu-surface';\n\nconst surface = menuSurfaceTv({ width: 'standard', scroll: 'none' });\nconst selectable = menuSelectableItem;\n\nexport const menuTv = tv({\n slots: {\n popup: surface.popup(),\n item: [\n 'relative flex items-center gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none',\n 'text-label-large text-on-surface',\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n // M3 disabled (per-token, not a blanket fade): label + leading/trailing\n // icon on-surface/0.38, no state layer.\n 'data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none',\n 'data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38] data-[disabled]:[&_[data-slot=menu-trailing]]:text-on-surface/[0.38]',\n // M3 leading icon (24dp) + trailing supporting text (shortcut/meta).\n '[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6',\n '[&_[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',\n ],\n separator: ['my-2 h-px border-0 bg-outline-variant'],\n groupLabel: surface.groupLabel(),\n // Submenu trigger: item look + trailing chevron, highlighted while open.\n submenuTrigger: [\n 'relative flex items-center justify-between gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none',\n 'text-label-large text-on-surface',\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]',\n 'data-[popup-open]:before:opacity-[var(--md-sys-state-hover)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n // M3 disabled (per-token): label + leading icon on-surface/0.38, no state layer.\n 'data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none',\n 'data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38]',\n '[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6',\n ],\n checkboxItem: selectable.menuSelectableItem(),\n radioItem: selectable.menuSelectableItem(),\n itemIndicator: selectable.itemIndicator(),\n },\n});\n\nconst m = menuTv();\nexport const Menu = createMenu({\n popup: m.popup(),\n item: m.item(),\n separator: m.separator(),\n groupLabel: m.groupLabel(),\n submenuTrigger: m.submenuTrigger(),\n checkboxItem: m.checkboxItem(),\n radioItem: m.radioItem(),\n itemIndicator: m.itemIndicator(),\n});\n"]}
@@ -0,0 +1,92 @@
1
+ import * as react from 'react';
2
+ import * as _base_ui_react from '@base-ui/react';
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 navigationBarTv: tailwind_variants.TVReturnType<{
8
+ [key: string]: {
9
+ [key: string]: tailwind_merge.ClassNameValue | {
10
+ label?: tailwind_merge.ClassNameValue;
11
+ icon?: tailwind_merge.ClassNameValue;
12
+ root?: tailwind_merge.ClassNameValue;
13
+ indicator?: tailwind_merge.ClassNameValue;
14
+ item?: tailwind_merge.ClassNameValue;
15
+ iconWrap?: tailwind_merge.ClassNameValue;
16
+ };
17
+ };
18
+ } | {
19
+ [x: string]: {
20
+ [x: string]: tailwind_merge.ClassNameValue | {
21
+ label?: tailwind_merge.ClassNameValue;
22
+ icon?: tailwind_merge.ClassNameValue;
23
+ root?: tailwind_merge.ClassNameValue;
24
+ indicator?: tailwind_merge.ClassNameValue;
25
+ item?: tailwind_merge.ClassNameValue;
26
+ iconWrap?: tailwind_merge.ClassNameValue;
27
+ };
28
+ };
29
+ } | {}, {
30
+ root: string;
31
+ item: string[];
32
+ iconWrap: string;
33
+ indicator: string[];
34
+ icon: string[];
35
+ label: string[];
36
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
37
+ [key: string]: {
38
+ [key: string]: tailwind_merge.ClassNameValue | {
39
+ label?: tailwind_merge.ClassNameValue;
40
+ icon?: tailwind_merge.ClassNameValue;
41
+ root?: tailwind_merge.ClassNameValue;
42
+ indicator?: tailwind_merge.ClassNameValue;
43
+ item?: tailwind_merge.ClassNameValue;
44
+ iconWrap?: tailwind_merge.ClassNameValue;
45
+ };
46
+ };
47
+ } | {}>, {
48
+ [key: string]: {
49
+ [key: string]: tailwind_merge.ClassNameValue | {
50
+ label?: tailwind_merge.ClassNameValue;
51
+ icon?: tailwind_merge.ClassNameValue;
52
+ root?: tailwind_merge.ClassNameValue;
53
+ indicator?: tailwind_merge.ClassNameValue;
54
+ item?: tailwind_merge.ClassNameValue;
55
+ iconWrap?: tailwind_merge.ClassNameValue;
56
+ };
57
+ };
58
+ } | {}, {
59
+ root: string;
60
+ item: string[];
61
+ iconWrap: string;
62
+ indicator: string[];
63
+ icon: string[];
64
+ label: string[];
65
+ }, tailwind_variants.TVReturnType<unknown, {
66
+ root: string;
67
+ item: string[];
68
+ iconWrap: string;
69
+ indicator: string[];
70
+ icon: string[];
71
+ label: string[];
72
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
73
+ [key: string]: {
74
+ [key: string]: tailwind_merge.ClassNameValue | {
75
+ label?: tailwind_merge.ClassNameValue;
76
+ icon?: tailwind_merge.ClassNameValue;
77
+ root?: tailwind_merge.ClassNameValue;
78
+ indicator?: tailwind_merge.ClassNameValue;
79
+ item?: tailwind_merge.ClassNameValue;
80
+ iconWrap?: tailwind_merge.ClassNameValue;
81
+ };
82
+ };
83
+ } | {}>, unknown, unknown, undefined>>;
84
+ declare const NavigationBar: {
85
+ Root: react.ForwardRefExoticComponent<Omit<_base_ui_react.ToggleGroup.Props<string> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
86
+ Item: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.Toggle.Props<string> & react.RefAttributes<HTMLButtonElement>, "ref">, "children"> & {
87
+ icon?: React.ReactNode;
88
+ children?: React.ReactNode;
89
+ } & react.RefAttributes<HTMLButtonElement>>;
90
+ };
91
+
92
+ export { NavigationBar, navigationBarTv };
@@ -2,7 +2,7 @@
2
2
  import { createNavigationBar } from '@m3-baseui/core';
3
3
  import { tv } from 'tailwind-variants';
4
4
 
5
- // src/navigation-bar.ts
5
+ // src/components/navigation-bar/navigation-bar.ts
6
6
  var navigationBarTv = tv({
7
7
  slots: {
8
8
  root: "flex items-stretch justify-around w-full h-20 bg-surface-container",
@@ -60,5 +60,5 @@ var NavigationBar = createNavigationBar({
60
60
  });
61
61
 
62
62
  export { NavigationBar, navigationBarTv };
63
- //# sourceMappingURL=navigation-bar.js.map
64
- //# sourceMappingURL=navigation-bar.js.map
63
+ //# sourceMappingURL=index.js.map
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/navigation-bar/navigation-bar.ts"],"names":[],"mappings":";;;;;AAWO,IAAM,kBAAkB,EAAA,CAAG;AAAA,EAChC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,oEAAA;AAAA,IACN,IAAA,EAAM;AAAA,MACJ,sFAAA;AAAA,MACA,iEAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,oDAAA;AAAA,IACV,SAAA,EAAW;AAAA,MACT,8DAAA;AAAA,MACA,8CAAA;AAAA,MACA,6CAAA;AAAA,MACA,4IAAA;AAAA,MACA,wDAAA;AAAA,MACA,gEAAA;AAAA,MACA,2DAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,mEAAA;AAAA,MACA,8CAAA;AAAA;AAAA,MAEA,gBAAA;AAAA,MACA,kDAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,2CAAA;AAAA,MACA,8CAAA;AAAA,MACA,qEAAA;AAAA;AAAA;AAAA,MAGA,8CAAA;AAAA,MACA;AAAA;AACF;AAEJ,CAAC;AAED,IAAM,IAAI,eAAA,EAAgB;AACnB,IAAM,gBAAgB,mBAAA,CAAoB;AAAA,EAC/C,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACb,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACb,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,EACrB,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,EACvB,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACb,KAAA,EAAO,EAAE,KAAA;AACX,CAAC","file":"index.js","sourcesContent":["/**\n * navigation-bar.ts — tailwind-variants slots for the M3 NavigationBar.\n *\n * 80dp bar on surface-container. The selected item surfaces `data-pressed`\n * (Base UI Toggle); the pill, icon and label colors key off it via the `group`\n * on each item. State layer is the pill `::before`; the pointer ripple is added\n * by the factory. Same DOM as the VE build.\n */\nimport { createNavigationBar } from '@m3-baseui/core';\nimport { tv } from 'tailwind-variants';\n\nexport const navigationBarTv = tv({\n slots: {\n root: 'flex items-stretch justify-around w-full h-20 bg-surface-container',\n item: [\n 'group relative flex flex-1 flex-col items-center justify-center gap-1 px-1 pt-3 pb-4',\n 'bg-transparent border-0 cursor-pointer select-none outline-none',\n // M3 disabled is per-token (icon + label dimmed below), not a blanket fade.\n 'data-[disabled]:pointer-events-none',\n ],\n iconWrap: 'relative flex items-center justify-center w-16 h-8',\n indicator: [\n 'absolute inset-0 rounded-full bg-transparent overflow-hidden',\n 'transition-colors duration-150 ease-standard',\n 'group-data-[pressed]:bg-secondary-container',\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'group-hover:before:opacity-[var(--md-sys-state-hover)]',\n 'group-focus-visible:before:opacity-[var(--md-sys-state-focus)]',\n 'group-active:before:opacity-[var(--md-sys-state-pressed)]',\n // No state layer on a disabled destination.\n 'group-data-[disabled]:before:opacity-0',\n ],\n icon: [\n 'relative flex items-center justify-center text-on-surface-variant',\n 'transition-colors duration-150 ease-standard',\n // Raw <svg> icons render at 24dp (Material Symbols set their own size).\n '[&_svg]:size-6',\n 'group-data-[pressed]:text-on-secondary-container',\n // M3 disabled: icon dims to on-surface/0.38. The item is the only `.group`,\n // so the disabled+active override must test both attributes on that single\n // element (`.group[data-disabled][data-pressed] &`) to outrank the equal-\n // specificity data-[pressed] color — a stacked `group-data-*:group-data-*`\n // would expect two nested groups and never match.\n 'group-data-[disabled]:text-on-surface/[0.38]',\n 'group-[&[data-disabled][data-pressed]]:text-on-surface/[0.38]',\n ],\n label: [\n 'text-label-medium text-on-surface-variant',\n 'transition-colors duration-150 ease-standard',\n 'group-data-[pressed]:text-on-surface group-data-[pressed]:font-bold',\n // M3 disabled: label dims to on-surface/0.38. Same-element override (see the\n // icon slot) keeps a disabled+active label dimmed.\n 'group-data-[disabled]:text-on-surface/[0.38]',\n 'group-[&[data-disabled][data-pressed]]:text-on-surface/[0.38]',\n ],\n },\n});\n\nconst s = navigationBarTv();\nexport const NavigationBar = createNavigationBar({\n root: s.root(),\n item: s.item(),\n iconWrap: s.iconWrap(),\n indicator: s.indicator(),\n icon: s.icon(),\n label: s.label(),\n});\n"]}
@@ -2,7 +2,7 @@
2
2
  import { createNavigationDrawer } from '@m3-baseui/core';
3
3
  import { tv as tv$1 } from 'tailwind-variants';
4
4
 
5
- // src/navigation-drawer.ts
5
+ // src/components/navigation-drawer/navigation-drawer.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/navigation-drawer.ts
34
+ // src/components/navigation-drawer/navigation-drawer.ts
35
35
  var navigationDrawerTv = tv({
36
36
  slots: {
37
37
  root: "flex flex-col gap-1 box-border w-[360px] p-3 bg-surface-container-low text-on-surface",
@@ -74,5 +74,5 @@ var NavigationDrawer = createNavigationDrawer({
74
74
  });
75
75
 
76
76
  export { NavigationDrawer, navigationDrawerTv };
77
- //# sourceMappingURL=navigation-drawer.js.map
78
- //# sourceMappingURL=navigation-drawer.js.map
77
+ //# sourceMappingURL=index.js.map
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tv.ts","../../../src/components/navigation-drawer/navigation-drawer.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/BI,IAAM,qBAAqB,EAAA,CAAG;AAAA,EACnC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,uFAAA;AAAA,IACN,QAAA,EAAU,yDAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,2FAAA;AAAA,MACA,sHAAA;AAAA,MACA,kBAAA;AAAA,MACA,8CAAA;AAAA,MACA,4IAAA;AAAA,MACA,kDAAA;AAAA,MACA,0DAAA;AAAA,MACA,qDAAA;AAAA,MACA,oFAAA;AAAA,MACA,yGAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS,0DAAA;AAAA,IACT,KAAA,EAAO,yBAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,UAAU,EAAC;AAAA,MACX,KAAA,EAAO,EAAE,IAAA,EAAM,+BAAA;AAAgC;AACjD,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC;AAED,IAAM,IAAI,kBAAA,EAAmB;AACtB,IAAM,mBAAmB,sBAAA,CAAuB;AAAA,EACrD,IAAA,EAAM,CAAC,EAAE,OAAA,EAAQ,KAAM,mBAAmB,EAAE,OAAA,EAAS,CAAA,CAAE,IAAA,EAAK;AAAA,EAC5D,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,EACrB,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACb,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,EACf,QAAA,EAAU,EAAE,QAAA;AACd,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 * navigation-drawer.ts — tailwind-variants slots for the M3 NavigationDrawer.\n *\n * A 360dp `surface-container-low` panel. `standard` is inline; `modal` floats\n * with elevation + a rounded trailing edge. Destinations are 56dp full-corner\n * pills; the active one (`data-selected`) fills with secondary-container. State\n * layer is the item `::before` (ripple added by the factory); disabled rows dim\n * per-token. Same DOM + `data-*` as the VE build.\n */\nimport { createNavigationDrawer } from '@m3-baseui/core';\nimport { tv } from '../../tv';\n\nexport const navigationDrawerTv = tv({\n slots: {\n root: 'flex flex-col gap-1 box-border w-[360px] p-3 bg-surface-container-low text-on-surface',\n headline: 'px-4 pt-4 pb-1 text-title-small text-on-surface-variant',\n item: [\n 'group relative flex w-full items-center gap-3 box-border h-14 px-4 rounded-full text-left',\n 'bg-transparent border-0 text-on-surface-variant no-underline cursor-pointer select-none overflow-hidden outline-none',\n 'text-label-large',\n 'transition-colors duration-150 ease-standard',\n 'before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'focus-visible:before:opacity-[var(--md-sys-state-focus)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n 'data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container',\n 'data-[disabled]:pointer-events-none data-[disabled]:before:opacity-0 data-[disabled]:text-on-surface/38',\n 'disabled:pointer-events-none disabled:before:opacity-0 disabled:text-on-surface/38',\n ],\n leading: 'flex items-center justify-center shrink-0 [&_svg]:size-6',\n label: 'flex-1 min-w-0 truncate',\n trailing: 'flex items-center shrink-0 text-label-small',\n },\n variants: {\n variant: {\n standard: {},\n modal: { root: 'shadow-level1 rounded-e-large' },\n },\n },\n defaultVariants: {\n variant: 'standard',\n },\n});\n\nconst s = navigationDrawerTv();\nexport const NavigationDrawer = createNavigationDrawer({\n root: ({ variant }) => navigationDrawerTv({ variant }).root(),\n headline: s.headline(),\n item: s.item(),\n leading: s.leading(),\n label: s.label(),\n trailing: s.trailing(),\n});\nexport type { NavigationDrawerVariant } from '@m3-baseui/core';\n"]}
@@ -0,0 +1,102 @@
1
+ import * as react from 'react';
2
+ import * as _base_ui_react from '@base-ui/react';
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 navigationRailTv: tailwind_variants.TVReturnType<{
8
+ [key: string]: {
9
+ [key: string]: tailwind_merge.ClassNameValue | {
10
+ header?: tailwind_merge.ClassNameValue;
11
+ label?: tailwind_merge.ClassNameValue;
12
+ icon?: tailwind_merge.ClassNameValue;
13
+ root?: tailwind_merge.ClassNameValue;
14
+ indicator?: tailwind_merge.ClassNameValue;
15
+ item?: tailwind_merge.ClassNameValue;
16
+ iconWrap?: tailwind_merge.ClassNameValue;
17
+ };
18
+ };
19
+ } | {
20
+ [x: string]: {
21
+ [x: string]: tailwind_merge.ClassNameValue | {
22
+ header?: tailwind_merge.ClassNameValue;
23
+ label?: tailwind_merge.ClassNameValue;
24
+ icon?: tailwind_merge.ClassNameValue;
25
+ root?: tailwind_merge.ClassNameValue;
26
+ indicator?: tailwind_merge.ClassNameValue;
27
+ item?: tailwind_merge.ClassNameValue;
28
+ iconWrap?: tailwind_merge.ClassNameValue;
29
+ };
30
+ };
31
+ } | {}, {
32
+ root: string;
33
+ header: string;
34
+ item: string[];
35
+ iconWrap: string;
36
+ indicator: string[];
37
+ icon: string[];
38
+ label: string[];
39
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
40
+ [key: string]: {
41
+ [key: string]: tailwind_merge.ClassNameValue | {
42
+ header?: tailwind_merge.ClassNameValue;
43
+ label?: tailwind_merge.ClassNameValue;
44
+ icon?: tailwind_merge.ClassNameValue;
45
+ root?: tailwind_merge.ClassNameValue;
46
+ indicator?: tailwind_merge.ClassNameValue;
47
+ item?: tailwind_merge.ClassNameValue;
48
+ iconWrap?: tailwind_merge.ClassNameValue;
49
+ };
50
+ };
51
+ } | {}>, {
52
+ [key: string]: {
53
+ [key: string]: tailwind_merge.ClassNameValue | {
54
+ header?: tailwind_merge.ClassNameValue;
55
+ label?: tailwind_merge.ClassNameValue;
56
+ icon?: tailwind_merge.ClassNameValue;
57
+ root?: tailwind_merge.ClassNameValue;
58
+ indicator?: tailwind_merge.ClassNameValue;
59
+ item?: tailwind_merge.ClassNameValue;
60
+ iconWrap?: tailwind_merge.ClassNameValue;
61
+ };
62
+ };
63
+ } | {}, {
64
+ root: string;
65
+ header: string;
66
+ item: string[];
67
+ iconWrap: string;
68
+ indicator: string[];
69
+ icon: string[];
70
+ label: string[];
71
+ }, tailwind_variants.TVReturnType<unknown, {
72
+ root: string;
73
+ header: string;
74
+ item: string[];
75
+ iconWrap: string;
76
+ indicator: string[];
77
+ icon: string[];
78
+ label: string[];
79
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
80
+ [key: string]: {
81
+ [key: string]: tailwind_merge.ClassNameValue | {
82
+ header?: tailwind_merge.ClassNameValue;
83
+ label?: tailwind_merge.ClassNameValue;
84
+ icon?: tailwind_merge.ClassNameValue;
85
+ root?: tailwind_merge.ClassNameValue;
86
+ indicator?: tailwind_merge.ClassNameValue;
87
+ item?: tailwind_merge.ClassNameValue;
88
+ iconWrap?: tailwind_merge.ClassNameValue;
89
+ };
90
+ };
91
+ } | {}>, unknown, unknown, undefined>>;
92
+ declare const NavigationRail: {
93
+ Root: react.ForwardRefExoticComponent<Omit<_base_ui_react.ToggleGroup.Props<string> & react.RefAttributes<HTMLDivElement>, "ref"> & {
94
+ header?: React.ReactNode;
95
+ } & react.RefAttributes<HTMLDivElement>>;
96
+ Item: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.Toggle.Props<string> & react.RefAttributes<HTMLButtonElement>, "ref">, "children"> & {
97
+ icon?: React.ReactNode;
98
+ children?: React.ReactNode;
99
+ } & react.RefAttributes<HTMLButtonElement>>;
100
+ };
101
+
102
+ export { NavigationRail, navigationRailTv };