@m3-baseui/react-tailwind 1.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 (82) hide show
  1. package/dist/badge.d.ts +45 -0
  2. package/dist/badge.js +50 -0
  3. package/dist/badge.js.map +1 -0
  4. package/dist/button.d.ts +69 -0
  5. package/dist/button.js +74 -0
  6. package/dist/button.js.map +1 -0
  7. package/dist/card.d.ts +80 -0
  8. package/dist/card.js +77 -0
  9. package/dist/card.js.map +1 -0
  10. package/dist/checkbox.d.ts +63 -0
  11. package/dist/checkbox.js +60 -0
  12. package/dist/checkbox.js.map +1 -0
  13. package/dist/chip.d.ts +165 -0
  14. package/dist/chip.js +76 -0
  15. package/dist/chip.js.map +1 -0
  16. package/dist/dialog.d.ts +86 -0
  17. package/dist/dialog.js +68 -0
  18. package/dist/dialog.js.map +1 -0
  19. package/dist/divider.d.ts +83 -0
  20. package/dist/divider.js +34 -0
  21. package/dist/divider.js.map +1 -0
  22. package/dist/fab.d.ts +104 -0
  23. package/dist/fab.js +43 -0
  24. package/dist/fab.js.map +1 -0
  25. package/dist/icon-button.d.ts +174 -0
  26. package/dist/icon-button.js +121 -0
  27. package/dist/icon-button.js.map +1 -0
  28. package/dist/index.d.ts +29 -0
  29. package/dist/index.js +1157 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/item.d.ts +94 -0
  32. package/dist/item.js +62 -0
  33. package/dist/item.js.map +1 -0
  34. package/dist/list.d.ts +163 -0
  35. package/dist/list.js +94 -0
  36. package/dist/list.js.map +1 -0
  37. package/dist/menu.d.ts +119 -0
  38. package/dist/menu.js +114 -0
  39. package/dist/menu.js.map +1 -0
  40. package/dist/navigation-bar.d.ts +91 -0
  41. package/dist/navigation-bar.js +48 -0
  42. package/dist/navigation-bar.js.map +1 -0
  43. package/dist/navigation-drawer.d.ts +86 -0
  44. package/dist/navigation-drawer.js +78 -0
  45. package/dist/navigation-drawer.js.map +1 -0
  46. package/dist/progress.d.ts +118 -0
  47. package/dist/progress.js +41 -0
  48. package/dist/progress.js.map +1 -0
  49. package/dist/radio.d.ts +56 -0
  50. package/dist/radio.js +47 -0
  51. package/dist/radio.js.map +1 -0
  52. package/dist/segmented-button.d.ts +83 -0
  53. package/dist/segmented-button.js +71 -0
  54. package/dist/segmented-button.js.map +1 -0
  55. package/dist/select.d.ts +125 -0
  56. package/dist/select.js +99 -0
  57. package/dist/select.js.map +1 -0
  58. package/dist/slider.d.ts +94 -0
  59. package/dist/slider.js +71 -0
  60. package/dist/slider.js.map +1 -0
  61. package/dist/snackbar.d.ts +108 -0
  62. package/dist/snackbar.js +57 -0
  63. package/dist/snackbar.js.map +1 -0
  64. package/dist/switch.d.ts +72 -0
  65. package/dist/switch.js +66 -0
  66. package/dist/switch.js.map +1 -0
  67. package/dist/tabs.d.ts +118 -0
  68. package/dist/tabs.js +97 -0
  69. package/dist/tabs.js.map +1 -0
  70. package/dist/textfield.d.ts +127 -0
  71. package/dist/textfield.js +83 -0
  72. package/dist/textfield.js.map +1 -0
  73. package/dist/tooltip.d.ts +61 -0
  74. package/dist/tooltip.js +52 -0
  75. package/dist/tooltip.js.map +1 -0
  76. package/dist/tv.d.ts +19 -0
  77. package/dist/tv.js +35 -0
  78. package/dist/tv.js.map +1 -0
  79. package/package.json +171 -0
  80. package/styles/preset.css +30 -0
  81. package/styles/theme.css +213 -0
  82. package/styles/tokens.css +361 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tv.ts","../src/list.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;;;AC9BI,IAAM,SAAS,EAAA,CAAG;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,wCAAA;AAAA,IACN,IAAA,EAAM;AAAA,MACJ,yEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS,kFAAA;AAAA,IACT,OAAA,EAAS,8BAAA;AAAA,IACT,QAAA,EAAU,0EAAA;AAAA,IACV,UAAA,EAAY,mFAAA;AAAA,IACZ,QAAA,EAAU;AAAA,MACR,oFAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,CAAA,EAAG,EAAE,IAAA,EAAM,eAAA,EAAgB;AAAA,MAC3B,CAAA,EAAG,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,MAC/B,CAAA,EAAG,EAAE,IAAA,EAAM,+BAAA;AAAgC,KAC7C;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM;AAAA,UACJ,yDAAA;AAAA,UACA,4IAAA;AAAA,UACA,kDAAA;AAAA,UACA,0DAAA;AAAA,UACA,qDAAA;AAAA,UACA,sEAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,OAAO;AAAC;AACV,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAC;AAEM,IAAM,OAAO,UAAA,CAAW;AAAA,EAC7B,IAAA,EAAM,MAAA,EAAO,CAAE,IAAA,EAAK;AAAA,EACpB,IAAA,EAAM,CAAC,EAAE,KAAA,EAAO,aAAY,KAAM;AAChC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAE,KAAA,EAAO,aAAa,CAAA;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,MACb,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,MACnB,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,MACnB,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,MACrB,UAAA,EAAY,EAAE,UAAA,EAAW;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA;AAAS,KACvB;AAAA,EACF;AACF,CAAC","file":"list.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 * list.ts — tailwind-variants slots for the M3 List.\n *\n * `surface` container with 8dp block padding; rows are 56/72/88dp for\n * one/two/three-line. Interactive rows get a `currentColor` state-layer\n * `::before` (the pointer ripple is added by the factory) and dim per-token when\n * `data-disabled`. Headline is `body-large`/`on-surface`, supporting\n * `body-medium`/`on-surface-variant`, leading/trailing `on-surface-variant`.\n * Same DOM as the VE build.\n */\nimport { createList } from '@m3-baseui/core';\nimport { tv } from './tv';\n\nexport const listTv = tv({\n slots: {\n root: 'list-none m-0 px-0 py-2 bg-transparent',\n item: [\n 'group relative flex w-full items-center gap-4 box-border px-4 text-left',\n 'bg-transparent border-0 text-on-surface no-underline',\n ],\n leading: 'flex items-center justify-center shrink-0 text-on-surface-variant [&_svg]:size-6',\n content: 'flex flex-col min-w-0 flex-1',\n headline: 'text-body-large text-on-surface group-data-[disabled]:text-on-surface/38',\n supporting: 'text-body-medium text-on-surface-variant group-data-[disabled]:text-on-surface/38',\n trailing: [\n 'flex items-center shrink-0 text-label-small text-on-surface-variant [&_svg]:size-6',\n 'group-data-[disabled]:text-on-surface/38',\n ],\n },\n variants: {\n lines: {\n 1: { item: 'min-h-14 py-2' },\n 2: { item: 'min-h-[72px] py-2' },\n 3: { item: 'min-h-[88px] items-start py-3' },\n },\n interactive: {\n true: {\n item: [\n 'cursor-pointer select-none overflow-hidden outline-none',\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-[disabled]:pointer-events-none data-[disabled]:before:opacity-0',\n 'disabled:pointer-events-none disabled:before:opacity-0',\n ],\n },\n false: {},\n },\n },\n defaultVariants: {\n lines: 1,\n interactive: false,\n },\n});\n\nexport const List = createList({\n root: listTv().root(),\n item: ({ lines, interactive }) => {\n const c = listTv({ lines, interactive });\n return {\n item: c.item(),\n leading: c.leading(),\n content: c.content(),\n headline: c.headline(),\n supporting: c.supporting(),\n trailing: c.trailing(),\n };\n },\n});\nexport type { ListItemProps, ListItemLines } from '@m3-baseui/core';\n"]}
package/dist/menu.d.ts ADDED
@@ -0,0 +1,119 @@
1
+ import * as react from 'react';
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
+ import * as tailwind_variants from 'tailwind-variants';
5
+
6
+ declare const menuTv: tailwind_variants.TVReturnType<{
7
+ [key: string]: {
8
+ [key: string]: tailwind_variants.ClassValue | {
9
+ separator?: tailwind_variants.ClassValue;
10
+ popup?: tailwind_variants.ClassValue;
11
+ itemIndicator?: tailwind_variants.ClassValue;
12
+ item?: tailwind_variants.ClassValue;
13
+ groupLabel?: tailwind_variants.ClassValue;
14
+ submenuTrigger?: tailwind_variants.ClassValue;
15
+ checkboxItem?: tailwind_variants.ClassValue;
16
+ radioItem?: tailwind_variants.ClassValue;
17
+ };
18
+ };
19
+ } | {
20
+ [x: string]: {
21
+ [x: string]: tailwind_variants.ClassValue | {
22
+ separator?: tailwind_variants.ClassValue;
23
+ popup?: tailwind_variants.ClassValue;
24
+ itemIndicator?: tailwind_variants.ClassValue;
25
+ item?: tailwind_variants.ClassValue;
26
+ groupLabel?: tailwind_variants.ClassValue;
27
+ submenuTrigger?: tailwind_variants.ClassValue;
28
+ checkboxItem?: tailwind_variants.ClassValue;
29
+ radioItem?: tailwind_variants.ClassValue;
30
+ };
31
+ };
32
+ } | {}, {
33
+ popup: string[];
34
+ item: string[];
35
+ separator: string[];
36
+ groupLabel: string[];
37
+ submenuTrigger: string[];
38
+ checkboxItem: string[];
39
+ radioItem: string[];
40
+ itemIndicator: string;
41
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
42
+ [key: string]: {
43
+ [key: string]: tailwind_variants.ClassValue | {
44
+ separator?: tailwind_variants.ClassValue;
45
+ popup?: tailwind_variants.ClassValue;
46
+ itemIndicator?: tailwind_variants.ClassValue;
47
+ item?: tailwind_variants.ClassValue;
48
+ groupLabel?: tailwind_variants.ClassValue;
49
+ submenuTrigger?: tailwind_variants.ClassValue;
50
+ checkboxItem?: tailwind_variants.ClassValue;
51
+ radioItem?: tailwind_variants.ClassValue;
52
+ };
53
+ };
54
+ } | {}>, {
55
+ [key: string]: {
56
+ [key: string]: tailwind_variants.ClassValue | {
57
+ separator?: tailwind_variants.ClassValue;
58
+ popup?: tailwind_variants.ClassValue;
59
+ itemIndicator?: tailwind_variants.ClassValue;
60
+ item?: tailwind_variants.ClassValue;
61
+ groupLabel?: tailwind_variants.ClassValue;
62
+ submenuTrigger?: tailwind_variants.ClassValue;
63
+ checkboxItem?: tailwind_variants.ClassValue;
64
+ radioItem?: tailwind_variants.ClassValue;
65
+ };
66
+ };
67
+ } | {}, {
68
+ popup: string[];
69
+ item: string[];
70
+ separator: string[];
71
+ groupLabel: string[];
72
+ submenuTrigger: string[];
73
+ checkboxItem: string[];
74
+ radioItem: string[];
75
+ itemIndicator: string;
76
+ }, tailwind_variants.TVReturnType<unknown, {
77
+ popup: string[];
78
+ item: string[];
79
+ separator: string[];
80
+ groupLabel: string[];
81
+ submenuTrigger: string[];
82
+ checkboxItem: string[];
83
+ radioItem: string[];
84
+ itemIndicator: string;
85
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
86
+ [key: string]: {
87
+ [key: string]: tailwind_variants.ClassValue | {
88
+ separator?: tailwind_variants.ClassValue;
89
+ popup?: tailwind_variants.ClassValue;
90
+ itemIndicator?: tailwind_variants.ClassValue;
91
+ item?: tailwind_variants.ClassValue;
92
+ groupLabel?: tailwind_variants.ClassValue;
93
+ submenuTrigger?: tailwind_variants.ClassValue;
94
+ checkboxItem?: tailwind_variants.ClassValue;
95
+ radioItem?: tailwind_variants.ClassValue;
96
+ };
97
+ };
98
+ } | {}>, unknown, unknown, undefined>>;
99
+ declare const Menu: {
100
+ Root: <Payload>(props: _base_ui_react.MenuRoot.Props<Payload>) => react.JSX.Element;
101
+ Trigger: _base_ui_react.MenuTrigger;
102
+ 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>>;
105
+ Item: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuItemProps, "ref"> & react.RefAttributes<HTMLElement>, "ref"> & react.RefAttributes<unknown>>;
106
+ Separator: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.SeparatorProps, "ref"> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<unknown>>;
107
+ Group: react.ForwardRefExoticComponent<Omit<_base_ui_react.ContextMenuGroupProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
108
+ GroupLabel: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuGroupLabelProps, "ref"> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<unknown>>;
109
+ SubmenuRoot: typeof _base_ui_react.MenuSubmenuRoot;
110
+ SubmenuTrigger: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuSubmenuTriggerProps, "ref"> & react.RefAttributes<HTMLElement>, "ref"> & react.RefAttributes<unknown>>;
111
+ RadioGroup: react.NamedExoticComponent<Omit<_base_ui_react.ContextMenuRadioGroupProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
112
+ CheckboxItem: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuCheckboxItemProps, "ref"> & react.RefAttributes<HTMLElement>, "ref"> & react.RefAttributes<unknown>>;
113
+ RadioItem: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuRadioItemProps, "ref"> & react.RefAttributes<HTMLElement>, "ref"> & react.RefAttributes<unknown>>;
114
+ CheckboxItemIndicator: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuCheckboxItemIndicatorProps, "ref"> & react.RefAttributes<HTMLSpanElement>, "ref"> & react.RefAttributes<unknown>>;
115
+ RadioItemIndicator: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.ContextMenuRadioItemIndicatorProps, "ref"> & react.RefAttributes<HTMLSpanElement>, "ref"> & react.RefAttributes<unknown>>;
116
+ Check: () => React.JSX.Element;
117
+ };
118
+
119
+ export { Menu, menuTv };
package/dist/menu.js ADDED
@@ -0,0 +1,114 @@
1
+ "use client";
2
+ import { createMenu } from '@m3-baseui/core';
3
+ import { tv as tv$1 } from 'tailwind-variants';
4
+
5
+ // src/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/menu.ts
35
+ var menuTv = tv({
36
+ slots: {
37
+ popup: [
38
+ "min-w-[112px] max-w-[280px] py-2",
39
+ "bg-surface-container text-on-surface rounded-extra-small shadow-level2",
40
+ "origin-[var(--transform-origin)] transition-[opacity,transform] duration-150 ease-standard",
41
+ "data-[starting-style]:opacity-0 data-[starting-style]:scale-95",
42
+ "data-[ending-style]:opacity-0",
43
+ "focus:outline-none"
44
+ ],
45
+ item: [
46
+ "relative flex items-center gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none",
47
+ "text-label-large text-on-surface",
48
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
49
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
50
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
51
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
52
+ // M3 disabled (per-token, not a blanket fade): label + leading/trailing
53
+ // icon on-surface/0.38, no state layer.
54
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
55
+ "data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38] data-[disabled]:[&_[data-slot=menu-trailing]]:text-on-surface/[0.38]",
56
+ // M3 leading icon (24dp) + trailing supporting text (shortcut/meta).
57
+ "[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6",
58
+ "[&_[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"
59
+ ],
60
+ separator: ["my-2 h-px border-0 bg-outline-variant"],
61
+ groupLabel: ["px-3 py-2 text-label-small text-on-surface-variant"],
62
+ // Submenu trigger: item look + trailing chevron, highlighted while open.
63
+ submenuTrigger: [
64
+ "relative flex items-center justify-between gap-3 h-12 px-3 overflow-hidden cursor-pointer select-none outline-none",
65
+ "text-label-large text-on-surface",
66
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
67
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
68
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
69
+ "data-[popup-open]:before:opacity-[var(--md-sys-state-hover)]",
70
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
71
+ // M3 disabled (per-token): label + leading icon on-surface/0.38, no state layer.
72
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none",
73
+ "data-[disabled]:[&_[data-slot=menu-leading]]:text-on-surface/[0.38]",
74
+ "[&_[data-slot=menu-leading]]:inline-flex [&_[data-slot=menu-leading]]:text-on-surface-variant [&_[data-slot=menu-leading]>svg]:size-6"
75
+ ],
76
+ // Selectable items: 24dp leading indicator column + label.
77
+ checkboxItem: [
78
+ "group relative grid grid-cols-[24px_1fr] items-center gap-3 h-12 px-3 overflow-hidden",
79
+ "cursor-pointer select-none outline-none text-label-large text-on-surface",
80
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
81
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
82
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
83
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
84
+ // M3 disabled (per-token): label on-surface/0.38, no state layer.
85
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none"
86
+ ],
87
+ radioItem: [
88
+ "group relative grid grid-cols-[24px_1fr] items-center gap-3 h-12 px-3 overflow-hidden",
89
+ "cursor-pointer select-none outline-none text-label-large text-on-surface",
90
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
91
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
92
+ "data-[highlighted]:before:opacity-[var(--md-sys-state-hover)]",
93
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
94
+ // M3 disabled (per-token): label on-surface/0.38, no state layer.
95
+ "data-[disabled]:text-on-surface/[0.38] data-[disabled]:before:opacity-0 data-[disabled]:pointer-events-none"
96
+ ],
97
+ itemIndicator: "inline-flex items-center justify-center text-on-surface invisible group-data-[checked]:visible group-data-[disabled]:text-on-surface/[0.38]"
98
+ }
99
+ });
100
+ var m = menuTv();
101
+ var Menu = createMenu({
102
+ popup: m.popup(),
103
+ item: m.item(),
104
+ separator: m.separator(),
105
+ groupLabel: m.groupLabel(),
106
+ submenuTrigger: m.submenuTrigger(),
107
+ checkboxItem: m.checkboxItem(),
108
+ radioItem: m.radioItem(),
109
+ itemIndicator: m.itemIndicator()
110
+ });
111
+
112
+ export { Menu, menuTv };
113
+ //# sourceMappingURL=menu.js.map
114
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tv.ts","../src/menu.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;;;ACjCI,IAAM,SAAS,EAAA,CAAG;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,kCAAA;AAAA,MACA,wEAAA;AAAA,MACA,4FAAA;AAAA,MACA,gEAAA;AAAA,MACA,+BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,oGAAA;AAAA,MACA,kCAAA;AAAA,MACA,4IAAA;AAAA,MACA,kDAAA;AAAA,MACA,+DAAA;AAAA,MACA,qDAAA;AAAA;AAAA;AAAA,MAGA,6GAAA;AAAA,MACA,0IAAA;AAAA;AAAA,MAEA,uIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAW,CAAC,uCAAuC,CAAA;AAAA,IACnD,UAAA,EAAY,CAAC,oDAAoD,CAAA;AAAA;AAAA,IAEjE,cAAA,EAAgB;AAAA,MACd,oHAAA;AAAA,MACA,kCAAA;AAAA,MACA,4IAAA;AAAA,MACA,kDAAA;AAAA,MACA,+DAAA;AAAA,MACA,8DAAA;AAAA,MACA,qDAAA;AAAA;AAAA,MAEA,6GAAA;AAAA,MACA,qEAAA;AAAA,MACA;AAAA,KACF;AAAA;AAAA,IAEA,YAAA,EAAc;AAAA,MACZ,uFAAA;AAAA,MACA,0EAAA;AAAA,MACA,4IAAA;AAAA,MACA,kDAAA;AAAA,MACA,+DAAA;AAAA,MACA,qDAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAAA,IACA,SAAA,EAAW;AAAA,MACT,uFAAA;AAAA,MACA,0EAAA;AAAA,MACA,4IAAA;AAAA,MACA,kDAAA;AAAA,MACA,+DAAA;AAAA,MACA,qDAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAAA,IACA,aAAA,EACE;AAAA;AAEN,CAAC;AAED,IAAM,IAAI,MAAA,EAAO;AACV,IAAM,OAAO,UAAA,CAAW;AAAA,EAC7B,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,EACf,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACb,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,EACvB,UAAA,EAAY,EAAE,UAAA,EAAW;AAAA,EACzB,cAAA,EAAgB,EAAE,cAAA,EAAe;AAAA,EACjC,YAAA,EAAc,EAAE,YAAA,EAAa;AAAA,EAC7B,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,EACvB,aAAA,EAAe,EAAE,aAAA;AACnB,CAAC","file":"menu.js","sourcesContent":["/**\n * tv.ts — a tailwind-variants factory pre-configured for the M3 typescale.\n *\n * The Tailwind v4 preset exposes the 15 typescale roles as `text-<role>`\n * font-size utilities (e.g. `text-body-small`, `text-label-large`). Stock\n * tailwind-merge does not know these custom names, so it groups them with the\n * `text-<color>` utilities and drops one when a slot sets both a color *and* a\n * typescale (the common M3 case). That silently strips either the color or the\n * type, breaking token compliance.\n *\n * Teaching tailwind-merge that the typescale names belong to the `font-size`\n * group keeps color and type independent, so both survive the merge.\n */\nimport { type TV, tv as baseTv } from 'tailwind-variants';\n\nconst TYPESCALE = [\n 'display-large',\n 'display-medium',\n 'display-small',\n 'headline-large',\n 'headline-medium',\n 'headline-small',\n 'title-large',\n 'title-medium',\n 'title-small',\n 'body-large',\n 'body-medium',\n 'body-small',\n 'label-large',\n 'label-medium',\n 'label-small',\n] as const;\n\nexport const tv: TV = (options, config) =>\n baseTv(options, {\n ...config,\n twMergeConfig: {\n extend: {\n classGroups: {\n 'font-size': [{ text: [...TYPESCALE] }],\n },\n },\n },\n });\n","/**\n * 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]. Same DOM\n * + ripple as the VE build.\n */\nimport { createMenu } from '@m3-baseui/core';\nimport { tv } from './tv';\n\nexport const menuTv = tv({\n slots: {\n popup: [\n 'min-w-[112px] max-w-[280px] 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 ],\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: ['px-3 py-2 text-label-small text-on-surface-variant'],\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 // Selectable items: 24dp leading indicator column + label.\n checkboxItem: [\n 'group relative grid grid-cols-[24px_1fr] items-center gap-3 h-12 px-3 overflow-hidden',\n 'cursor-pointer select-none outline-none 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): label 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 ],\n radioItem: [\n 'group relative grid grid-cols-[24px_1fr] items-center gap-3 h-12 px-3 overflow-hidden',\n 'cursor-pointer select-none outline-none 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): label 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 ],\n itemIndicator:\n 'inline-flex items-center justify-center text-on-surface invisible group-data-[checked]:visible group-data-[disabled]:text-on-surface/[0.38]',\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,91 @@
1
+ import * as react from 'react';
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
+ import * as tailwind_variants from 'tailwind-variants';
5
+
6
+ declare const navigationBarTv: tailwind_variants.TVReturnType<{
7
+ [key: string]: {
8
+ [key: string]: tailwind_variants.ClassValue | {
9
+ label?: tailwind_variants.ClassValue;
10
+ icon?: tailwind_variants.ClassValue;
11
+ root?: tailwind_variants.ClassValue;
12
+ indicator?: tailwind_variants.ClassValue;
13
+ item?: tailwind_variants.ClassValue;
14
+ iconWrap?: tailwind_variants.ClassValue;
15
+ };
16
+ };
17
+ } | {
18
+ [x: string]: {
19
+ [x: string]: tailwind_variants.ClassValue | {
20
+ label?: tailwind_variants.ClassValue;
21
+ icon?: tailwind_variants.ClassValue;
22
+ root?: tailwind_variants.ClassValue;
23
+ indicator?: tailwind_variants.ClassValue;
24
+ item?: tailwind_variants.ClassValue;
25
+ iconWrap?: tailwind_variants.ClassValue;
26
+ };
27
+ };
28
+ } | {}, {
29
+ root: string;
30
+ item: string[];
31
+ iconWrap: string;
32
+ indicator: string[];
33
+ icon: string[];
34
+ label: string[];
35
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
36
+ [key: string]: {
37
+ [key: string]: tailwind_variants.ClassValue | {
38
+ label?: tailwind_variants.ClassValue;
39
+ icon?: tailwind_variants.ClassValue;
40
+ root?: tailwind_variants.ClassValue;
41
+ indicator?: tailwind_variants.ClassValue;
42
+ item?: tailwind_variants.ClassValue;
43
+ iconWrap?: tailwind_variants.ClassValue;
44
+ };
45
+ };
46
+ } | {}>, {
47
+ [key: string]: {
48
+ [key: string]: tailwind_variants.ClassValue | {
49
+ label?: tailwind_variants.ClassValue;
50
+ icon?: tailwind_variants.ClassValue;
51
+ root?: tailwind_variants.ClassValue;
52
+ indicator?: tailwind_variants.ClassValue;
53
+ item?: tailwind_variants.ClassValue;
54
+ iconWrap?: tailwind_variants.ClassValue;
55
+ };
56
+ };
57
+ } | {}, {
58
+ root: string;
59
+ item: string[];
60
+ iconWrap: string;
61
+ indicator: string[];
62
+ icon: string[];
63
+ label: string[];
64
+ }, tailwind_variants.TVReturnType<unknown, {
65
+ root: string;
66
+ item: string[];
67
+ iconWrap: string;
68
+ indicator: string[];
69
+ icon: string[];
70
+ label: string[];
71
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
72
+ [key: string]: {
73
+ [key: string]: tailwind_variants.ClassValue | {
74
+ label?: tailwind_variants.ClassValue;
75
+ icon?: tailwind_variants.ClassValue;
76
+ root?: tailwind_variants.ClassValue;
77
+ indicator?: tailwind_variants.ClassValue;
78
+ item?: tailwind_variants.ClassValue;
79
+ iconWrap?: tailwind_variants.ClassValue;
80
+ };
81
+ };
82
+ } | {}>, unknown, unknown, undefined>>;
83
+ declare const NavigationBar: {
84
+ Root: react.ForwardRefExoticComponent<Omit<_base_ui_react.ToggleGroup.Props<string> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
85
+ Item: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.Toggle.Props<string> & react.RefAttributes<HTMLButtonElement>, "ref">, "children"> & {
86
+ icon?: React.ReactNode;
87
+ children?: React.ReactNode;
88
+ } & react.RefAttributes<HTMLButtonElement>>;
89
+ };
90
+
91
+ export { NavigationBar, navigationBarTv };
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { createNavigationBar } from '@m3-baseui/core';
3
+ import { tv } from 'tailwind-variants';
4
+
5
+ // src/navigation-bar.ts
6
+ var navigationBarTv = tv({
7
+ slots: {
8
+ root: "flex items-stretch justify-around w-full h-20 bg-surface-container",
9
+ item: [
10
+ "group relative flex flex-1 flex-col items-center justify-center gap-1 px-1 pt-3 pb-4",
11
+ "bg-transparent border-0 cursor-pointer select-none outline-none",
12
+ "data-[disabled]:opacity-[0.38] data-[disabled]:pointer-events-none"
13
+ ],
14
+ iconWrap: "relative flex items-center justify-center w-16 h-8",
15
+ indicator: [
16
+ "absolute inset-0 rounded-full bg-transparent overflow-hidden",
17
+ "transition-colors duration-150 ease-standard",
18
+ "group-data-[pressed]:bg-secondary-container",
19
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
20
+ "group-hover:before:opacity-[var(--md-sys-state-hover)]",
21
+ "group-focus-visible:before:opacity-[var(--md-sys-state-focus)]",
22
+ "group-active:before:opacity-[var(--md-sys-state-pressed)]"
23
+ ],
24
+ icon: [
25
+ "relative flex items-center justify-center text-on-surface-variant",
26
+ "transition-colors duration-150 ease-standard",
27
+ "group-data-[pressed]:text-on-secondary-container"
28
+ ],
29
+ label: [
30
+ "text-label-medium text-on-surface-variant",
31
+ "transition-colors duration-150 ease-standard",
32
+ "group-data-[pressed]:text-on-surface group-data-[pressed]:font-bold"
33
+ ]
34
+ }
35
+ });
36
+ var s = navigationBarTv();
37
+ var NavigationBar = createNavigationBar({
38
+ root: s.root(),
39
+ item: s.item(),
40
+ iconWrap: s.iconWrap(),
41
+ indicator: s.indicator(),
42
+ icon: s.icon(),
43
+ label: s.label()
44
+ });
45
+
46
+ export { NavigationBar, navigationBarTv };
47
+ //# sourceMappingURL=navigation-bar.js.map
48
+ //# sourceMappingURL=navigation-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/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,MACA;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;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,mEAAA;AAAA,MACA,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,2CAAA;AAAA,MACA,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":"navigation-bar.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 'data-[disabled]:opacity-[0.38] 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 ],\n icon: [\n 'relative flex items-center justify-center text-on-surface-variant',\n 'transition-colors duration-150 ease-standard',\n 'group-data-[pressed]:text-on-secondary-container',\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 ],\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"]}
@@ -0,0 +1,86 @@
1
+ import * as react from 'react';
2
+ import * as _m3_baseui_core from '@m3-baseui/core';
3
+ export { NavigationDrawerVariant } from '@m3-baseui/core';
4
+ import * as tailwind_variants from 'tailwind-variants';
5
+ import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
6
+
7
+ declare const navigationDrawerTv: tailwind_variants.TVReturnType<{
8
+ variant: {
9
+ standard: {};
10
+ modal: {
11
+ root: string;
12
+ };
13
+ };
14
+ }, {
15
+ root: string;
16
+ headline: string;
17
+ item: string[];
18
+ leading: string;
19
+ label: string;
20
+ trailing: string;
21
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<{
22
+ variant: {
23
+ standard: {};
24
+ modal: {
25
+ root: string;
26
+ };
27
+ };
28
+ }, {
29
+ variant: {
30
+ standard: {};
31
+ modal: {
32
+ root: string;
33
+ };
34
+ };
35
+ }>, {
36
+ variant: {
37
+ standard: {};
38
+ modal: {
39
+ root: string;
40
+ };
41
+ };
42
+ }, {
43
+ root: string;
44
+ headline: string;
45
+ item: string[];
46
+ leading: string;
47
+ label: string;
48
+ trailing: string;
49
+ }, tailwind_variants.TVReturnType<{
50
+ variant: {
51
+ standard: {};
52
+ modal: {
53
+ root: string;
54
+ };
55
+ };
56
+ }, {
57
+ root: string;
58
+ headline: string;
59
+ item: string[];
60
+ leading: string;
61
+ label: string;
62
+ trailing: string;
63
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<{
64
+ variant: {
65
+ standard: {};
66
+ modal: {
67
+ root: string;
68
+ };
69
+ };
70
+ }, {
71
+ variant: {
72
+ standard: {};
73
+ modal: {
74
+ root: string;
75
+ };
76
+ };
77
+ }>, unknown, unknown, undefined>>;
78
+ declare const NavigationDrawer: {
79
+ Root: react.ForwardRefExoticComponent<_m3_baseui_core.NavigationDrawerOwnProps & react.HTMLAttributes<HTMLElement> & react.RefAttributes<HTMLElement>>;
80
+ Headline: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLHeadingElement> & react.RefAttributes<HTMLHeadingElement>>;
81
+ Item: react.ForwardRefExoticComponent<_m3_baseui_core.NavigationDrawerItemOwnProps & Omit<react.HTMLAttributes<HTMLElement>, "color"> & {
82
+ href?: string;
83
+ } & react.RefAttributes<HTMLElement>>;
84
+ };
85
+
86
+ export { NavigationDrawer, navigationDrawerTv };
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { createNavigationDrawer } from '@m3-baseui/core';
3
+ import { tv as tv$1 } from 'tailwind-variants';
4
+
5
+ // src/navigation-drawer.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/navigation-drawer.ts
35
+ var navigationDrawerTv = tv({
36
+ slots: {
37
+ root: "flex flex-col gap-1 box-border w-[360px] p-3 bg-surface-container-low text-on-surface",
38
+ headline: "px-4 pt-4 pb-1 text-title-small text-on-surface-variant",
39
+ item: [
40
+ "group relative flex w-full items-center gap-3 box-border h-14 px-4 rounded-full text-left",
41
+ "bg-transparent border-0 text-on-surface-variant no-underline cursor-pointer select-none overflow-hidden outline-none",
42
+ "text-label-large",
43
+ "transition-colors duration-150 ease-standard",
44
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
45
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
46
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
47
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
48
+ "data-[selected]:bg-secondary-container data-[selected]:text-on-secondary-container",
49
+ "data-[disabled]:pointer-events-none data-[disabled]:before:opacity-0 data-[disabled]:text-on-surface/38",
50
+ "disabled:pointer-events-none disabled:before:opacity-0 disabled:text-on-surface/38"
51
+ ],
52
+ leading: "flex items-center justify-center shrink-0 [&_svg]:size-6",
53
+ label: "flex-1 min-w-0 truncate",
54
+ trailing: "flex items-center shrink-0 text-label-small"
55
+ },
56
+ variants: {
57
+ variant: {
58
+ standard: {},
59
+ modal: { root: "shadow-level1 rounded-e-large" }
60
+ }
61
+ },
62
+ defaultVariants: {
63
+ variant: "standard"
64
+ }
65
+ });
66
+ var s = navigationDrawerTv();
67
+ var NavigationDrawer = createNavigationDrawer({
68
+ root: ({ variant }) => navigationDrawerTv({ variant }).root(),
69
+ headline: s.headline(),
70
+ item: s.item(),
71
+ leading: s.leading(),
72
+ label: s.label(),
73
+ trailing: s.trailing()
74
+ });
75
+
76
+ export { NavigationDrawer, navigationDrawerTv };
77
+ //# sourceMappingURL=navigation-drawer.js.map
78
+ //# sourceMappingURL=navigation-drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tv.ts","../src/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":"navigation-drawer.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"]}