@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,45 @@
1
+ import * as react from 'react';
2
+ import * as _m3_baseui_core from '@m3-baseui/core';
3
+ export { BadgeProps, BadgeSize } 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 badgeTv: tailwind_variants.TVReturnType<{
8
+ size: {
9
+ small: string;
10
+ large: string;
11
+ };
12
+ }, undefined, "pointer-events-none select-none inline-flex items-center justify-center bg-error text-on-error", tailwind_variants_dist_config_js.TVConfig<{
13
+ size: {
14
+ small: string;
15
+ large: string;
16
+ };
17
+ }, {
18
+ size: {
19
+ small: string;
20
+ large: string;
21
+ };
22
+ }>, {
23
+ size: {
24
+ small: string;
25
+ large: string;
26
+ };
27
+ }, undefined, tailwind_variants.TVReturnType<{
28
+ size: {
29
+ small: string;
30
+ large: string;
31
+ };
32
+ }, undefined, "pointer-events-none select-none inline-flex items-center justify-center bg-error text-on-error", tailwind_variants_dist_config_js.TVConfig<{
33
+ size: {
34
+ small: string;
35
+ large: string;
36
+ };
37
+ }, {
38
+ size: {
39
+ small: string;
40
+ large: string;
41
+ };
42
+ }>, unknown, unknown, undefined>>;
43
+ declare const Badge: react.ForwardRefExoticComponent<_m3_baseui_core.BadgeOwnProps & Omit<react.HTMLAttributes<HTMLSpanElement>, "children"> & react.RefAttributes<HTMLSpanElement>>;
44
+
45
+ export { Badge, badgeTv };
package/dist/badge.js ADDED
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { createBadge } from '@m3-baseui/core';
3
+ import { tv as tv$1 } from 'tailwind-variants';
4
+
5
+ // src/badge.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/badge.ts
35
+ var badgeTv = tv({
36
+ base: "pointer-events-none select-none inline-flex items-center justify-center bg-error text-on-error",
37
+ variants: {
38
+ size: {
39
+ small: "absolute top-1 right-1 size-1.5 rounded-full",
40
+ large: "absolute -top-1 -right-1 min-w-4 h-4 px-1 rounded-full text-label-small leading-none tabular-nums"
41
+ }
42
+ }
43
+ });
44
+ var Badge = createBadge({
45
+ root: ({ size }) => badgeTv({ size })
46
+ });
47
+
48
+ export { Badge, badgeTv };
49
+ //# sourceMappingURL=badge.js.map
50
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tv.ts","../src/badge.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,UAAU,EAAA,CAAG;AAAA,EACxB,IAAA,EAAM,gGAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,8CAAA;AAAA,MACP,KAAA,EACE;AAAA;AACJ;AAEJ,CAAC;AAEM,IAAM,QAAQ,WAAA,CAAY;AAAA,EAC/B,IAAA,EAAM,CAAC,EAAE,IAAA,OAAW,OAAA,CAAQ,EAAE,MAAM;AACtC,CAAC","file":"badge.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 * badge.ts — tailwind-variants slots for the M3 Badge.\n *\n * error/on-error marker that anchors to the top-right of a positioned parent.\n * `small` is a 6dp dot; `large` is a 16dp pill carrying a `label-small` number.\n * Same DOM + `data-size` as the VE build.\n */\nimport { createBadge } from '@m3-baseui/core';\nimport { tv } from './tv';\n\nexport const badgeTv = tv({\n base: 'pointer-events-none select-none inline-flex items-center justify-center bg-error text-on-error',\n variants: {\n size: {\n small: 'absolute top-1 right-1 size-1.5 rounded-full',\n large:\n 'absolute -top-1 -right-1 min-w-4 h-4 px-1 rounded-full text-label-small leading-none tabular-nums',\n },\n },\n});\n\nexport const Badge = createBadge({\n root: ({ size }) => badgeTv({ size }),\n});\nexport type { BadgeProps, BadgeSize } from '@m3-baseui/core';\n"]}
@@ -0,0 +1,69 @@
1
+ import * as _base_ui_react from '@base-ui/react';
2
+ import * as react from 'react';
3
+ import * as _m3_baseui_core from '@m3-baseui/core';
4
+ export { ButtonProps, ButtonVariant } from '@m3-baseui/core';
5
+ import * as tailwind_variants from 'tailwind-variants';
6
+ import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
7
+
8
+ declare const button: tailwind_variants.TVReturnType<{
9
+ variant: {
10
+ filled: string[];
11
+ tonal: string[];
12
+ outlined: string[];
13
+ elevated: string[];
14
+ text: string[];
15
+ };
16
+ }, undefined, string[], tailwind_variants_dist_config_js.TVConfig<{
17
+ variant: {
18
+ filled: string[];
19
+ tonal: string[];
20
+ outlined: string[];
21
+ elevated: string[];
22
+ text: string[];
23
+ };
24
+ }, {
25
+ variant: {
26
+ filled: string[];
27
+ tonal: string[];
28
+ outlined: string[];
29
+ elevated: string[];
30
+ text: string[];
31
+ };
32
+ }>, {
33
+ variant: {
34
+ filled: string[];
35
+ tonal: string[];
36
+ outlined: string[];
37
+ elevated: string[];
38
+ text: string[];
39
+ };
40
+ }, undefined, tailwind_variants.TVReturnType<{
41
+ variant: {
42
+ filled: string[];
43
+ tonal: string[];
44
+ outlined: string[];
45
+ elevated: string[];
46
+ text: string[];
47
+ };
48
+ }, undefined, string[], tailwind_variants_dist_config_js.TVConfig<{
49
+ variant: {
50
+ filled: string[];
51
+ tonal: string[];
52
+ outlined: string[];
53
+ elevated: string[];
54
+ text: string[];
55
+ };
56
+ }, {
57
+ variant: {
58
+ filled: string[];
59
+ tonal: string[];
60
+ outlined: string[];
61
+ elevated: string[];
62
+ text: string[];
63
+ };
64
+ }>, unknown, unknown, undefined>>;
65
+ declare const Button: react.ForwardRefExoticComponent<_m3_baseui_core.ButtonOwnProps & Omit<react.ButtonHTMLAttributes<HTMLButtonElement>, "color"> & {
66
+ render?: _base_ui_react.useRender.RenderProp;
67
+ } & react.RefAttributes<HTMLButtonElement>>;
68
+
69
+ export { Button, button };
package/dist/button.js ADDED
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ import { createButton } from '@m3-baseui/core';
3
+ import { tv } from 'tailwind-variants';
4
+
5
+ // src/button.ts
6
+ var button = tv({
7
+ base: [
8
+ "relative inline-flex items-center justify-center gap-2",
9
+ "h-10 px-6 rounded-full overflow-hidden cursor-pointer select-none border-0",
10
+ "text-label-large",
11
+ // M3 with-icon padding: the icon side trims to 16dp (label side stays 24dp).
12
+ "data-[with-start-icon]:pl-4 data-[with-end-icon]:pr-4",
13
+ // Icon slot: 18dp, centered.
14
+ "[&_[data-slot=button-icon]]:inline-flex [&_[data-slot=button-icon]]:items-center [&_[data-slot=button-icon]]:justify-center",
15
+ "[&_[data-slot=button-icon]>svg]:size-[18px]",
16
+ "transition-[box-shadow,background-color,color,border-color] duration-200 ease-[var(--md-sys-motion-easing-standard)]",
17
+ // State layer overlay
18
+ "before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none",
19
+ "before:transition-opacity before:duration-100",
20
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
21
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
22
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
23
+ "data-[pressed]:before:opacity-[var(--md-sys-state-pressed)]",
24
+ // Focus ring (M3: 3px secondary, 2px offset)
25
+ "focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary",
26
+ // Disabled: no interaction, no state layer, no elevation. Per-variant
27
+ // colors (container on-surface/12, label on-surface/38) live on each variant.
28
+ "disabled:pointer-events-none disabled:shadow-none disabled:before:opacity-0",
29
+ "data-[disabled]:pointer-events-none data-[disabled]:shadow-none data-[disabled]:before:opacity-0"
30
+ ],
31
+ variants: {
32
+ // M3 elevation per variant: filled/tonal rest level0→hover level1→pressed level0;
33
+ // elevated rest level1→hover level2→pressed level1. Disabled container is
34
+ // on-surface/12 and label on-surface/38, matching material-web.
35
+ variant: {
36
+ filled: [
37
+ "bg-primary text-on-primary",
38
+ "hover:shadow-level1 focus-visible:shadow-none active:shadow-none data-[pressed]:shadow-none",
39
+ "disabled:bg-on-surface/12 disabled:text-on-surface/38",
40
+ "data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38"
41
+ ],
42
+ tonal: [
43
+ "bg-secondary-container text-on-secondary-container",
44
+ "hover:shadow-level1 focus-visible:shadow-none active:shadow-none data-[pressed]:shadow-none",
45
+ "disabled:bg-on-surface/12 disabled:text-on-surface/38",
46
+ "data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38"
47
+ ],
48
+ outlined: [
49
+ "bg-transparent text-primary border border-outline",
50
+ "disabled:text-on-surface/38 disabled:border-on-surface/12",
51
+ "data-[disabled]:text-on-surface/38 data-[disabled]:border-on-surface/12"
52
+ ],
53
+ elevated: [
54
+ "bg-surface-container-low text-primary shadow-level1",
55
+ "hover:shadow-level2 focus-visible:shadow-level1 active:shadow-level1 data-[pressed]:shadow-level1",
56
+ "disabled:bg-on-surface/12 disabled:text-on-surface/38",
57
+ "data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38"
58
+ ],
59
+ text: [
60
+ "bg-transparent text-primary px-3",
61
+ "disabled:text-on-surface/38",
62
+ "data-[disabled]:text-on-surface/38"
63
+ ]
64
+ }
65
+ },
66
+ defaultVariants: {
67
+ variant: "filled"
68
+ }
69
+ });
70
+ var Button = createButton(({ variant }) => button({ variant }));
71
+
72
+ export { Button, button };
73
+ //# sourceMappingURL=button.js.map
74
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/button.ts"],"names":[],"mappings":";;;;;AAcO,IAAM,SAAS,EAAA,CAAG;AAAA,EACvB,IAAA,EAAM;AAAA,IACJ,wDAAA;AAAA,IACA,4EAAA;AAAA,IACA,kBAAA;AAAA;AAAA,IAEA,uDAAA;AAAA;AAAA,IAEA,6HAAA;AAAA,IACA,6CAAA;AAAA,IACA,sHAAA;AAAA;AAAA,IAEA,uHAAA;AAAA,IACA,+CAAA;AAAA,IACA,kDAAA;AAAA,IACA,0DAAA;AAAA,IACA,qDAAA;AAAA,IACA,6DAAA;AAAA;AAAA,IAEA,4FAAA;AAAA;AAAA;AAAA,IAGA,6EAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,IAIR,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,4BAAA;AAAA,QACA,6FAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,oDAAA;AAAA,QACA,6FAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,mDAAA;AAAA,QACA,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,qDAAA;AAAA,QACA,mGAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,kCAAA;AAAA,QACA,6BAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC;AAEM,IAAM,MAAA,GAAS,YAAA,CAAa,CAAC,EAAE,OAAA,OAAc,MAAA,CAAO,EAAE,OAAA,EAAS,CAAC","file":"button.js","sourcesContent":["/**\n * button.ts — tailwind-variants resolver wired into the shared factory.\n *\n * Emits the same DOM and `data-*` state as the vanilla-extract build; only the\n * class strings differ. Utilities such as `bg-primary`, `text-on-primary`,\n * `rounded-full`, `shadow-level1`, and `text-label-large` are produced by the\n * Tailwind v4 `@theme` preset shipped in `@m3-baseui/tokens/theme.css`.\n *\n * Opacity modifiers (`before:opacity-[var(--md-sys-state-hover)]`) drive the\n * state layer off the channel-triple colors.\n */\nimport { createButton } from '@m3-baseui/core';\nimport { tv } from 'tailwind-variants';\n\nexport const button = tv({\n base: [\n 'relative inline-flex items-center justify-center gap-2',\n 'h-10 px-6 rounded-full overflow-hidden cursor-pointer select-none border-0',\n 'text-label-large',\n // M3 with-icon padding: the icon side trims to 16dp (label side stays 24dp).\n 'data-[with-start-icon]:pl-4 data-[with-end-icon]:pr-4',\n // Icon slot: 18dp, centered.\n '[&_[data-slot=button-icon]]:inline-flex [&_[data-slot=button-icon]]:items-center [&_[data-slot=button-icon]]:justify-center',\n '[&_[data-slot=button-icon]>svg]:size-[18px]',\n 'transition-[box-shadow,background-color,color,border-color] duration-200 ease-[var(--md-sys-motion-easing-standard)]',\n // State layer overlay\n 'before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:pointer-events-none',\n 'before:transition-opacity before:duration-100',\n 'hover:before:opacity-[var(--md-sys-state-hover)]',\n 'focus-visible:before:opacity-[var(--md-sys-state-focus)]',\n 'active:before:opacity-[var(--md-sys-state-pressed)]',\n 'data-[pressed]:before:opacity-[var(--md-sys-state-pressed)]',\n // Focus ring (M3: 3px secondary, 2px offset)\n 'focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary',\n // Disabled: no interaction, no state layer, no elevation. Per-variant\n // colors (container on-surface/12, label on-surface/38) live on each variant.\n 'disabled:pointer-events-none disabled:shadow-none disabled:before:opacity-0',\n 'data-[disabled]:pointer-events-none data-[disabled]:shadow-none data-[disabled]:before:opacity-0',\n ],\n variants: {\n // M3 elevation per variant: filled/tonal rest level0→hover level1→pressed level0;\n // elevated rest level1→hover level2→pressed level1. Disabled container is\n // on-surface/12 and label on-surface/38, matching material-web.\n variant: {\n filled: [\n 'bg-primary text-on-primary',\n 'hover:shadow-level1 focus-visible:shadow-none active:shadow-none data-[pressed]:shadow-none',\n 'disabled:bg-on-surface/12 disabled:text-on-surface/38',\n 'data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38',\n ],\n tonal: [\n 'bg-secondary-container text-on-secondary-container',\n 'hover:shadow-level1 focus-visible:shadow-none active:shadow-none data-[pressed]:shadow-none',\n 'disabled:bg-on-surface/12 disabled:text-on-surface/38',\n 'data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38',\n ],\n outlined: [\n 'bg-transparent text-primary border border-outline',\n 'disabled:text-on-surface/38 disabled:border-on-surface/12',\n 'data-[disabled]:text-on-surface/38 data-[disabled]:border-on-surface/12',\n ],\n elevated: [\n 'bg-surface-container-low text-primary shadow-level1',\n 'hover:shadow-level2 focus-visible:shadow-level1 active:shadow-level1 data-[pressed]:shadow-level1',\n 'disabled:bg-on-surface/12 disabled:text-on-surface/38',\n 'data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38',\n ],\n text: [\n 'bg-transparent text-primary px-3',\n 'disabled:text-on-surface/38',\n 'data-[disabled]:text-on-surface/38',\n ],\n },\n },\n defaultVariants: {\n variant: 'filled',\n },\n});\n\nexport const Button = createButton(({ variant }) => button({ variant }));\nexport type { ButtonProps, ButtonVariant } from '@m3-baseui/core';\n"]}
package/dist/card.d.ts ADDED
@@ -0,0 +1,80 @@
1
+ import * as react from 'react';
2
+ import * as _m3_baseui_core from '@m3-baseui/core';
3
+ export { CardProps, CardVariant } 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 cardTv: tailwind_variants.TVReturnType<{
8
+ variant: {
9
+ elevated: string;
10
+ filled: string;
11
+ outlined: string;
12
+ };
13
+ interactive: {
14
+ true: string[];
15
+ false: string;
16
+ };
17
+ }, undefined, "relative box-border rounded-medium text-on-surface", tailwind_variants_dist_config_js.TVConfig<{
18
+ variant: {
19
+ elevated: string;
20
+ filled: string;
21
+ outlined: string;
22
+ };
23
+ interactive: {
24
+ true: string[];
25
+ false: string;
26
+ };
27
+ }, {
28
+ variant: {
29
+ elevated: string;
30
+ filled: string;
31
+ outlined: string;
32
+ };
33
+ interactive: {
34
+ true: string[];
35
+ false: string;
36
+ };
37
+ }>, {
38
+ variant: {
39
+ elevated: string;
40
+ filled: string;
41
+ outlined: string;
42
+ };
43
+ interactive: {
44
+ true: string[];
45
+ false: string;
46
+ };
47
+ }, undefined, tailwind_variants.TVReturnType<{
48
+ variant: {
49
+ elevated: string;
50
+ filled: string;
51
+ outlined: string;
52
+ };
53
+ interactive: {
54
+ true: string[];
55
+ false: string;
56
+ };
57
+ }, undefined, "relative box-border rounded-medium text-on-surface", tailwind_variants_dist_config_js.TVConfig<{
58
+ variant: {
59
+ elevated: string;
60
+ filled: string;
61
+ outlined: string;
62
+ };
63
+ interactive: {
64
+ true: string[];
65
+ false: string;
66
+ };
67
+ }, {
68
+ variant: {
69
+ elevated: string;
70
+ filled: string;
71
+ outlined: string;
72
+ };
73
+ interactive: {
74
+ true: string[];
75
+ false: string;
76
+ };
77
+ }>, unknown, unknown, undefined>>;
78
+ declare const Card: react.ForwardRefExoticComponent<_m3_baseui_core.CardOwnProps & Omit<react.HTMLAttributes<HTMLElement>, "color"> & react.RefAttributes<HTMLElement>>;
79
+
80
+ export { Card, cardTv };
package/dist/card.js ADDED
@@ -0,0 +1,77 @@
1
+ "use client";
2
+ import { createCard } from '@m3-baseui/core';
3
+ import { tv as tv$1 } from 'tailwind-variants';
4
+
5
+ // src/card.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/card.ts
35
+ var cardTv = tv({
36
+ base: "relative box-border rounded-medium text-on-surface",
37
+ variants: {
38
+ variant: {
39
+ elevated: "bg-surface-container-low shadow-level1",
40
+ filled: "bg-surface-container-highest",
41
+ outlined: "bg-surface border border-outline-variant"
42
+ },
43
+ interactive: {
44
+ true: [
45
+ "group overflow-hidden cursor-pointer select-none text-left w-full outline-none",
46
+ "before:absolute before:inset-0 before:bg-current before:opacity-0 before:pointer-events-none before:transition-opacity before:duration-100",
47
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
48
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
49
+ "active:before:opacity-[var(--md-sys-state-pressed)]",
50
+ "focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary",
51
+ // M3 disabled: drop the shadow + state layer, dim the content per-token.
52
+ "disabled:pointer-events-none disabled:before:opacity-0 disabled:shadow-none disabled:text-on-surface/38",
53
+ "data-[disabled]:pointer-events-none data-[disabled]:before:opacity-0 data-[disabled]:shadow-none data-[disabled]:text-on-surface/38"
54
+ ],
55
+ false: ""
56
+ }
57
+ },
58
+ compoundVariants: [
59
+ // M3 interactive elevated: lifts to level2 on hover, settles to level1 on press.
60
+ {
61
+ variant: "elevated",
62
+ interactive: true,
63
+ class: "hover:shadow-level2 active:shadow-level1"
64
+ }
65
+ ],
66
+ defaultVariants: {
67
+ variant: "elevated",
68
+ interactive: false
69
+ }
70
+ });
71
+ var Card = createCard({
72
+ root: ({ variant, interactive }) => cardTv({ variant, interactive })
73
+ });
74
+
75
+ export { Card, cardTv };
76
+ //# sourceMappingURL=card.js.map
77
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tv.ts","../src/card.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,SAAS,EAAA,CAAG;AAAA,EACvB,IAAA,EAAM,oDAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,wCAAA;AAAA,MACV,MAAA,EAAQ,8BAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,gFAAA;AAAA,QACA,4IAAA;AAAA,QACA,kDAAA;AAAA,QACA,0DAAA;AAAA,QACA,qDAAA;AAAA,QACA,4FAAA;AAAA;AAAA,QAEA,yGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA;AAAA,IAEhB;AAAA,MACE,OAAA,EAAS,UAAA;AAAA,MACT,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,UAAA;AAAA,IACT,WAAA,EAAa;AAAA;AAEjB,CAAC;AAEM,IAAM,OAAO,UAAA,CAAW;AAAA,EAC7B,IAAA,EAAM,CAAC,EAAE,OAAA,EAAS,WAAA,OAAkB,MAAA,CAAO,EAAE,OAAA,EAAS,WAAA,EAAa;AACrE,CAAC","file":"card.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 * card.ts — tailwind-variants slots for the M3 Card.\n *\n * 12dp corners. `elevated` is surface-container-low + level1, `filled` is\n * surface-container-highest (level0), `outlined` is surface + outline-variant.\n * Interactive cards add the `currentColor` state-layer `::before` (the pointer\n * ripple is added by the factory), a focus ring and per-token disabled dimming.\n * Same DOM + `data-*` as the VE build.\n */\nimport { createCard } from '@m3-baseui/core';\nimport { tv } from './tv';\n\nexport const cardTv = tv({\n base: 'relative box-border rounded-medium text-on-surface',\n variants: {\n variant: {\n elevated: 'bg-surface-container-low shadow-level1',\n filled: 'bg-surface-container-highest',\n outlined: 'bg-surface border border-outline-variant',\n },\n interactive: {\n true: [\n 'group overflow-hidden cursor-pointer select-none text-left w-full 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 'focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary',\n // M3 disabled: drop the shadow + state layer, dim the content per-token.\n 'disabled:pointer-events-none disabled:before:opacity-0 disabled:shadow-none disabled:text-on-surface/38',\n 'data-[disabled]:pointer-events-none data-[disabled]:before:opacity-0 data-[disabled]:shadow-none data-[disabled]:text-on-surface/38',\n ],\n false: '',\n },\n },\n compoundVariants: [\n // M3 interactive elevated: lifts to level2 on hover, settles to level1 on press.\n {\n variant: 'elevated',\n interactive: true,\n class: 'hover:shadow-level2 active:shadow-level1',\n },\n ],\n defaultVariants: {\n variant: 'elevated',\n interactive: false,\n },\n});\n\nexport const Card = createCard({\n root: ({ variant, interactive }) => cardTv({ variant, interactive }),\n});\nexport type { CardProps, CardVariant } from '@m3-baseui/core';\n"]}
@@ -0,0 +1,63 @@
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 checkboxTv: tailwind_variants.TVReturnType<{
7
+ [key: string]: {
8
+ [key: string]: tailwind_variants.ClassValue | {
9
+ icon?: tailwind_variants.ClassValue;
10
+ root?: tailwind_variants.ClassValue;
11
+ indicator?: tailwind_variants.ClassValue;
12
+ };
13
+ };
14
+ } | {
15
+ [x: string]: {
16
+ [x: string]: tailwind_variants.ClassValue | {
17
+ icon?: tailwind_variants.ClassValue;
18
+ root?: tailwind_variants.ClassValue;
19
+ indicator?: tailwind_variants.ClassValue;
20
+ };
21
+ };
22
+ } | {}, {
23
+ root: string[];
24
+ indicator: string[];
25
+ icon: string[];
26
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
27
+ [key: string]: {
28
+ [key: string]: tailwind_variants.ClassValue | {
29
+ icon?: tailwind_variants.ClassValue;
30
+ root?: tailwind_variants.ClassValue;
31
+ indicator?: tailwind_variants.ClassValue;
32
+ };
33
+ };
34
+ } | {}>, {
35
+ [key: string]: {
36
+ [key: string]: tailwind_variants.ClassValue | {
37
+ icon?: tailwind_variants.ClassValue;
38
+ root?: tailwind_variants.ClassValue;
39
+ indicator?: tailwind_variants.ClassValue;
40
+ };
41
+ };
42
+ } | {}, {
43
+ root: string[];
44
+ indicator: string[];
45
+ icon: string[];
46
+ }, tailwind_variants.TVReturnType<unknown, {
47
+ root: string[];
48
+ indicator: string[];
49
+ icon: string[];
50
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<unknown, {
51
+ [key: string]: {
52
+ [key: string]: tailwind_variants.ClassValue | {
53
+ icon?: tailwind_variants.ClassValue;
54
+ root?: tailwind_variants.ClassValue;
55
+ indicator?: tailwind_variants.ClassValue;
56
+ };
57
+ };
58
+ } | {}>, unknown, unknown, undefined>>;
59
+ declare const Checkbox: react.ForwardRefExoticComponent<Omit<Omit<_base_ui_react.CheckboxRootProps, "ref"> & react.RefAttributes<HTMLElement>, "ref"> & {
60
+ error?: boolean;
61
+ } & react.RefAttributes<HTMLElement>>;
62
+
63
+ export { Checkbox, checkboxTv };
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { createCheckbox } from '@m3-baseui/core';
3
+ import { tv } from 'tailwind-variants';
4
+
5
+ // src/checkbox.ts
6
+ var checkboxTv = tv({
7
+ slots: {
8
+ root: [
9
+ "group relative inline-flex items-center justify-center shrink-0 box-border",
10
+ "size-[18px] rounded-[2px] border-2 cursor-pointer bg-transparent",
11
+ // Outline is on-surface-variant; the state layer (text/currentColor) is
12
+ // on-surface unselected, primary when selected (material-web).
13
+ "border-on-surface-variant text-on-surface",
14
+ "transition-colors duration-150 ease-standard",
15
+ "data-[checked]:bg-primary data-[checked]:border-primary data-[checked]:text-primary",
16
+ "data-[indeterminate]:bg-primary data-[indeterminate]:border-primary data-[indeterminate]:text-primary",
17
+ // M3 pressed state layer inverts: unselected→primary, selected→on-surface
18
+ "active:text-primary",
19
+ "data-[checked]:active:text-on-surface data-[indeterminate]:active:text-on-surface",
20
+ // M3 error: error outline + error-filled box; state layer stays error
21
+ "data-[error]:border-error data-[error]:text-error data-[error]:active:text-error",
22
+ "data-[error]:data-[checked]:bg-error data-[error]:data-[checked]:border-error data-[error]:data-[checked]:text-error data-[error]:data-[checked]:active:text-error",
23
+ "data-[error]:data-[indeterminate]:bg-error data-[error]:data-[indeterminate]:border-error data-[error]:data-[indeterminate]:text-error data-[error]:data-[indeterminate]:active:text-error",
24
+ "focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary",
25
+ "data-[disabled]:pointer-events-none data-[disabled]:before:opacity-0",
26
+ // M3 disabled: unselected outline on-surface/38; selected/indeterminate
27
+ // box on-surface/38 with no outline (the check turns surface, below).
28
+ "data-[disabled]:border-on-surface/38",
29
+ "data-[disabled]:data-[checked]:bg-on-surface/38 data-[disabled]:data-[checked]:border-transparent",
30
+ "data-[disabled]:data-[indeterminate]:bg-on-surface/38 data-[disabled]:data-[indeterminate]:border-transparent",
31
+ // 40dp circular state layer
32
+ 'before:content-[""] before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',
33
+ "before:size-10 before:rounded-full before:bg-current before:opacity-0 before:transition-opacity before:duration-100",
34
+ "hover:before:opacity-[var(--md-sys-state-hover)]",
35
+ "focus-visible:before:opacity-[var(--md-sys-state-focus)]",
36
+ "active:before:opacity-[var(--md-sys-state-pressed)]"
37
+ ],
38
+ indicator: [
39
+ "group/cb relative inline-flex items-center justify-center size-full pointer-events-none text-on-primary",
40
+ // M3 error: the check / dash turn on-error on the error-filled box
41
+ "group-data-[error]:text-on-error",
42
+ // M3 disabled: the check / dash turn the surface color on the faint box
43
+ "group-data-[disabled]:text-surface",
44
+ "opacity-0 data-[checked]:opacity-100 data-[indeterminate]:opacity-100",
45
+ 'data-[indeterminate]:after:content-[""] data-[indeterminate]:after:absolute',
46
+ "data-[indeterminate]:after:w-[10px] data-[indeterminate]:after:h-[2px] data-[indeterminate]:after:rounded-full data-[indeterminate]:after:bg-current"
47
+ ],
48
+ icon: ["w-[18px] h-[18px] group-data-[indeterminate]/cb:opacity-0"]
49
+ }
50
+ });
51
+ var c = checkboxTv();
52
+ var Checkbox = createCheckbox({
53
+ root: c.root(),
54
+ indicator: c.indicator(),
55
+ icon: c.icon()
56
+ });
57
+
58
+ export { Checkbox, checkboxTv };
59
+ //# sourceMappingURL=checkbox.js.map
60
+ //# sourceMappingURL=checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/checkbox.ts"],"names":[],"mappings":";;;;;AAUO,IAAM,aAAa,EAAA,CAAG;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,4EAAA;AAAA,MACA,kEAAA;AAAA;AAAA;AAAA,MAGA,2CAAA;AAAA,MACA,8CAAA;AAAA,MACA,qFAAA;AAAA,MACA,uGAAA;AAAA;AAAA,MAEA,qBAAA;AAAA,MACA,mFAAA;AAAA;AAAA,MAEA,kFAAA;AAAA,MACA,oKAAA;AAAA,MACA,4LAAA;AAAA,MACA,4FAAA;AAAA,MACA,sEAAA;AAAA;AAAA;AAAA,MAGA,sCAAA;AAAA,MACA,mGAAA;AAAA,MACA,+GAAA;AAAA;AAAA,MAEA,oHAAA;AAAA,MACA,qHAAA;AAAA,MACA,kDAAA;AAAA,MACA,0DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAW;AAAA,MACT,yGAAA;AAAA;AAAA,MAEA,kCAAA;AAAA;AAAA,MAEA,oCAAA;AAAA,MACA,uEAAA;AAAA,MACA,6EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM,CAAC,2DAA2D;AAAA;AAEtE,CAAC;AAED,IAAM,IAAI,UAAA,EAAW;AACd,IAAM,WAAW,cAAA,CAAe;AAAA,EACrC,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACb,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,EACvB,IAAA,EAAM,EAAE,IAAA;AACV,CAAC","file":"checkbox.js","sourcesContent":["/**\n * checkbox.ts — tailwind-variants slots for the M3 Checkbox.\n *\n * 18dp box with a 40dp circular state layer. Checked/indeterminate fill the box\n * with primary; the indeterminate dash is an `::after` on the indicator and the\n * check SVG is hidden in that state via a group reference.\n */\nimport { createCheckbox } from '@m3-baseui/core';\nimport { tv } from 'tailwind-variants';\n\nexport const checkboxTv = tv({\n slots: {\n root: [\n 'group relative inline-flex items-center justify-center shrink-0 box-border',\n 'size-[18px] rounded-[2px] border-2 cursor-pointer bg-transparent',\n // Outline is on-surface-variant; the state layer (text/currentColor) is\n // on-surface unselected, primary when selected (material-web).\n 'border-on-surface-variant text-on-surface',\n 'transition-colors duration-150 ease-standard',\n 'data-[checked]:bg-primary data-[checked]:border-primary data-[checked]:text-primary',\n 'data-[indeterminate]:bg-primary data-[indeterminate]:border-primary data-[indeterminate]:text-primary',\n // M3 pressed state layer inverts: unselected→primary, selected→on-surface\n 'active:text-primary',\n 'data-[checked]:active:text-on-surface data-[indeterminate]:active:text-on-surface',\n // M3 error: error outline + error-filled box; state layer stays error\n 'data-[error]:border-error data-[error]:text-error data-[error]:active:text-error',\n 'data-[error]:data-[checked]:bg-error data-[error]:data-[checked]:border-error data-[error]:data-[checked]:text-error data-[error]:data-[checked]:active:text-error',\n 'data-[error]:data-[indeterminate]:bg-error data-[error]:data-[indeterminate]:border-error data-[error]:data-[indeterminate]:text-error data-[error]:data-[indeterminate]:active:text-error',\n 'focus-visible:outline-[3px] focus-visible:outline-offset-2 focus-visible:outline-secondary',\n 'data-[disabled]:pointer-events-none data-[disabled]:before:opacity-0',\n // M3 disabled: unselected outline on-surface/38; selected/indeterminate\n // box on-surface/38 with no outline (the check turns surface, below).\n 'data-[disabled]:border-on-surface/38',\n 'data-[disabled]:data-[checked]:bg-on-surface/38 data-[disabled]:data-[checked]:border-transparent',\n 'data-[disabled]:data-[indeterminate]:bg-on-surface/38 data-[disabled]:data-[indeterminate]:border-transparent',\n // 40dp circular state layer\n 'before:content-[\"\"] before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n 'before:size-10 before:rounded-full before:bg-current before:opacity-0 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 ],\n indicator: [\n 'group/cb relative inline-flex items-center justify-center size-full pointer-events-none text-on-primary',\n // M3 error: the check / dash turn on-error on the error-filled box\n 'group-data-[error]:text-on-error',\n // M3 disabled: the check / dash turn the surface color on the faint box\n 'group-data-[disabled]:text-surface',\n 'opacity-0 data-[checked]:opacity-100 data-[indeterminate]:opacity-100',\n 'data-[indeterminate]:after:content-[\"\"] data-[indeterminate]:after:absolute',\n 'data-[indeterminate]:after:w-[10px] data-[indeterminate]:after:h-[2px] data-[indeterminate]:after:rounded-full data-[indeterminate]:after:bg-current',\n ],\n icon: ['w-[18px] h-[18px] group-data-[indeterminate]/cb:opacity-0'],\n },\n});\n\nconst c = checkboxTv();\nexport const Checkbox = createCheckbox({\n root: c.root(),\n indicator: c.indicator(),\n icon: c.icon(),\n});\n"]}