@lindle/linoardo 1.0.16 → 1.0.17

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 (96) hide show
  1. package/dist/ExpansionPanelItem-Bd6ZWGkR.d.cts +58 -0
  2. package/dist/ExpansionPanelItem-DOjgDeB6.d.ts +58 -0
  3. package/dist/button.cjs +206 -0
  4. package/dist/button.cjs.map +1 -0
  5. package/dist/button.d.cts +19 -0
  6. package/dist/button.d.ts +19 -0
  7. package/dist/button.js +4 -0
  8. package/dist/button.js.map +1 -0
  9. package/dist/chip.cjs +247 -0
  10. package/dist/chip.cjs.map +1 -0
  11. package/dist/chip.d.cts +368 -0
  12. package/dist/chip.d.ts +368 -0
  13. package/dist/chip.js +4 -0
  14. package/dist/chip.js.map +1 -0
  15. package/dist/chunk-32KFNI6K.js +114 -0
  16. package/dist/chunk-32KFNI6K.js.map +1 -0
  17. package/dist/chunk-3EGIRBQ3.js +100 -0
  18. package/dist/chunk-3EGIRBQ3.js.map +1 -0
  19. package/dist/chunk-5GY2JCBO.js +92 -0
  20. package/dist/chunk-5GY2JCBO.js.map +1 -0
  21. package/dist/chunk-7LLAWEDF.js +179 -0
  22. package/dist/chunk-7LLAWEDF.js.map +1 -0
  23. package/dist/chunk-E32P5AHO.js +125 -0
  24. package/dist/chunk-E32P5AHO.js.map +1 -0
  25. package/dist/chunk-GA6HSRN6.js +235 -0
  26. package/dist/chunk-GA6HSRN6.js.map +1 -0
  27. package/dist/chunk-IEILIKS2.js +8 -0
  28. package/dist/chunk-IEILIKS2.js.map +1 -0
  29. package/dist/chunk-PWK6MLZT.js +239 -0
  30. package/dist/chunk-PWK6MLZT.js.map +1 -0
  31. package/dist/chunk-TTDFAKOL.js +98 -0
  32. package/dist/chunk-TTDFAKOL.js.map +1 -0
  33. package/dist/chunk-U6NAIIDI.js +99 -0
  34. package/dist/chunk-U6NAIIDI.js.map +1 -0
  35. package/dist/chunk-XFPBICJG.js +127 -0
  36. package/dist/chunk-XFPBICJG.js.map +1 -0
  37. package/dist/dialog.cjs +121 -0
  38. package/dist/dialog.cjs.map +1 -0
  39. package/dist/dialog.d.cts +17 -0
  40. package/dist/dialog.d.ts +17 -0
  41. package/dist/dialog.js +3 -0
  42. package/dist/dialog.js.map +1 -0
  43. package/dist/expansion-panel/item.cjs +195 -0
  44. package/dist/expansion-panel/item.cjs.map +1 -0
  45. package/dist/expansion-panel/item.d.cts +3 -0
  46. package/dist/expansion-panel/item.d.ts +3 -0
  47. package/dist/expansion-panel/item.js +3 -0
  48. package/dist/expansion-panel/item.js.map +1 -0
  49. package/dist/expansion-panel.cjs +356 -0
  50. package/dist/expansion-panel.cjs.map +1 -0
  51. package/dist/expansion-panel.d.cts +8 -0
  52. package/dist/expansion-panel.d.ts +8 -0
  53. package/dist/expansion-panel.js +4 -0
  54. package/dist/expansion-panel.js.map +1 -0
  55. package/dist/global.types-E2uVLemv.d.cts +7 -0
  56. package/dist/global.types-E2uVLemv.d.ts +7 -0
  57. package/dist/index-Md3BuoGM.d.cts +32 -0
  58. package/dist/index-d_JuI06O.d.ts +32 -0
  59. package/dist/index.cjs +148 -144
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +12 -549
  62. package/dist/index.d.ts +12 -549
  63. package/dist/index.js +11 -1330
  64. package/dist/index.js.map +1 -1
  65. package/dist/input.cjs +106 -0
  66. package/dist/input.cjs.map +1 -0
  67. package/dist/input.d.cts +22 -0
  68. package/dist/input.d.ts +22 -0
  69. package/dist/input.js +4 -0
  70. package/dist/input.js.map +1 -0
  71. package/dist/list/item.cjs +149 -0
  72. package/dist/list/item.cjs.map +1 -0
  73. package/dist/list/item.d.cts +3 -0
  74. package/dist/list/item.d.ts +3 -0
  75. package/dist/list/item.js +3 -0
  76. package/dist/list/item.js.map +1 -0
  77. package/dist/list.cjs +235 -0
  78. package/dist/list.cjs.map +1 -0
  79. package/dist/list.d.cts +17 -0
  80. package/dist/list.d.ts +17 -0
  81. package/dist/list.js +4 -0
  82. package/dist/list.js.map +1 -0
  83. package/dist/menu.cjs +122 -0
  84. package/dist/menu.cjs.map +1 -0
  85. package/dist/menu.d.cts +20 -0
  86. package/dist/menu.d.ts +20 -0
  87. package/dist/menu.js +3 -0
  88. package/dist/menu.js.map +1 -0
  89. package/dist/styles.css +0 -24
  90. package/dist/tooltip.cjs +136 -0
  91. package/dist/tooltip.cjs.map +1 -0
  92. package/dist/tooltip.d.cts +19 -0
  93. package/dist/tooltip.d.ts +19 -0
  94. package/dist/tooltip.js +3 -0
  95. package/dist/tooltip.js.map +1 -0
  96. package/package.json +52 -2
@@ -0,0 +1,92 @@
1
+ import { Item_default } from './chunk-XFPBICJG.js';
2
+ import * as React from 'react';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var listBaseClasses = "flex w-full min-w-0 flex-col text-gray-900 transition-colors duration-150";
7
+ var listVariantClasses = {
8
+ solid: "bg-white border border-gray-200 shadow-sm shadow-gray-900/5",
9
+ sharp: "bg-white border border-gray-200 shadow-sm shadow-gray-900/5 rounded-none",
10
+ outline: "bg-transparent border border-gray-300",
11
+ ghost: "bg-gray-50 border border-transparent",
12
+ text: "bg-transparent border border-transparent",
13
+ filled: "bg-gray-50 border border-gray-200 shadow-inner shadow-gray-900/5",
14
+ underlined: "bg-transparent border border-transparent border-b border-gray-200 rounded-none",
15
+ rounded: "bg-white border border-gray-200 shadow-lg shadow-gray-900/10"
16
+ };
17
+ var listRoundedClasses = {
18
+ none: "rounded-none",
19
+ sm: "rounded-sm",
20
+ md: "rounded-md",
21
+ lg: "rounded-lg",
22
+ xl: "rounded-xl",
23
+ pill: "rounded-full"
24
+ };
25
+ var isListItemElement = (element) => {
26
+ if (!React.isValidElement(element)) {
27
+ return false;
28
+ }
29
+ const elementType = element.type;
30
+ return element.type === Item_default || elementType.displayName === Item_default.displayName;
31
+ };
32
+ var List = React.forwardRef((props, ref) => {
33
+ const {
34
+ variant = "solid",
35
+ density = "default",
36
+ lines = "one",
37
+ nav = false,
38
+ divided = false,
39
+ rounded = "lg",
40
+ color = "primary",
41
+ className,
42
+ role,
43
+ children,
44
+ ...rest
45
+ } = props;
46
+ const isSharpVariant = variant === "sharp";
47
+ const variantClass = listVariantClasses[variant] ?? listVariantClasses.solid;
48
+ const roundedClass = isSharpVariant ? "rounded-none" : listRoundedClasses[rounded] ?? listRoundedClasses.lg;
49
+ const dividerClass = divided ? "divide-y divide-gray-100" : void 0;
50
+ const gapClass = divided ? "p-0" : "gap-1 p-1";
51
+ const navClass = nav ? "py-1" : void 0;
52
+ const accentColor = color;
53
+ const enhanceChild = (child) => {
54
+ if (!React.isValidElement(child)) {
55
+ return child;
56
+ }
57
+ if (isListItemElement(child)) {
58
+ return React.cloneElement(child, {
59
+ density: child.props.density ?? density,
60
+ lines: child.props.lines ?? lines,
61
+ nav: child.props.nav ?? nav,
62
+ divided: child.props.divided ?? divided,
63
+ color: child.props.color ?? accentColor,
64
+ sharp: child.props.sharp ?? isSharpVariant
65
+ });
66
+ }
67
+ if (child.props && typeof child.props === "object" && "children" in child.props) {
68
+ const nestedChildren = React.Children.map(child.props.children, enhanceChild);
69
+ if (nestedChildren !== child.props.children) {
70
+ return React.cloneElement(child, void 0, nestedChildren);
71
+ }
72
+ }
73
+ return child;
74
+ };
75
+ const resolvedChildren = React.Children.map(children, enhanceChild);
76
+ return /* @__PURE__ */ jsx(
77
+ "div",
78
+ {
79
+ ...rest,
80
+ ref,
81
+ role: role ?? "list",
82
+ className: twMerge(listBaseClasses, variantClass, roundedClass, dividerClass, gapClass, navClass, className),
83
+ children: resolvedChildren
84
+ }
85
+ );
86
+ });
87
+ List.displayName = "List";
88
+ var List_default = List;
89
+
90
+ export { List_default };
91
+ //# sourceMappingURL=chunk-5GY2JCBO.js.map
92
+ //# sourceMappingURL=chunk-5GY2JCBO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Containment/List/index.tsx"],"names":[],"mappings":"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","file":"chunk-5GY2JCBO.js","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { Palette } from '@lindle/linoardo/global.types';\n\nimport ListItem from './Item';\nimport type { ListItemProps } from './Item';\nimport type { ListDensity, ListLines, ListRounded, ListVariant } from './types.list';\n\nconst listBaseClasses = 'flex w-full min-w-0 flex-col text-gray-900 transition-colors duration-150';\n\nconst listVariantClasses: Record<ListVariant, string> = {\n solid: 'bg-white border border-gray-200 shadow-sm shadow-gray-900/5',\n sharp: 'bg-white border border-gray-200 shadow-sm shadow-gray-900/5 rounded-none',\n outline: 'bg-transparent border border-gray-300',\n ghost: 'bg-gray-50 border border-transparent',\n text: 'bg-transparent border border-transparent',\n filled: 'bg-gray-50 border border-gray-200 shadow-inner shadow-gray-900/5',\n underlined: 'bg-transparent border border-transparent border-b border-gray-200 rounded-none',\n rounded: 'bg-white border border-gray-200 shadow-lg shadow-gray-900/10'\n};\n\nconst listRoundedClasses: Record<ListRounded, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n pill: 'rounded-full'\n};\n\nexport interface ListProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: ListVariant;\n density?: ListDensity;\n lines?: ListLines;\n nav?: boolean;\n divided?: boolean;\n rounded?: ListRounded;\n color?: Palette;\n}\n\nconst isListItemElement = (element: React.ReactNode): element is React.ReactElement<ListItemProps> => {\n if (!React.isValidElement(element)) {\n return false;\n }\n\n const elementType = element.type as { displayName?: string };\n return element.type === ListItem || elementType.displayName === ListItem.displayName;\n};\n\nconst List = React.forwardRef<HTMLDivElement, ListProps>((props, ref) => {\n const {\n variant = 'solid',\n density = 'default',\n lines = 'one',\n nav = false,\n divided = false,\n rounded = 'lg',\n color = 'primary',\n className,\n role,\n children,\n ...rest\n } = props;\n\n const isSharpVariant = variant === 'sharp';\n const variantClass = listVariantClasses[variant] ?? listVariantClasses.solid;\n const roundedClass = isSharpVariant ? 'rounded-none' : listRoundedClasses[rounded] ?? listRoundedClasses.lg;\n const dividerClass = divided ? 'divide-y divide-gray-100' : undefined;\n const gapClass = divided ? 'p-0' : 'gap-1 p-1';\n const navClass = nav ? 'py-1' : undefined;\n const accentColor = color;\n\n const enhanceChild = (child: React.ReactNode): React.ReactNode => {\n if (!React.isValidElement(child)) {\n return child;\n }\n\n if (isListItemElement(child)) {\n return React.cloneElement(child, {\n density: child.props.density ?? density,\n lines: child.props.lines ?? lines,\n nav: child.props.nav ?? nav,\n divided: child.props.divided ?? divided,\n color: child.props.color ?? accentColor,\n sharp: child.props.sharp ?? isSharpVariant\n });\n }\n\n if (child.props && typeof child.props === 'object' && 'children' in child.props) {\n const nestedChildren = React.Children.map(child.props.children as React.ReactNode, enhanceChild);\n if (nestedChildren !== child.props.children) {\n return React.cloneElement(child, undefined, nestedChildren);\n }\n }\n\n return child;\n };\n\n const resolvedChildren = React.Children.map(children, enhanceChild);\n\n return (\n <div\n {...rest}\n ref={ref}\n role={role ?? 'list'}\n className={twMerge(listBaseClasses, variantClass, roundedClass, dividerClass, gapClass, navClass, className)}\n >\n {resolvedChildren}\n </div>\n );\n});\n\nList.displayName = 'List';\n\nexport { ListItem };\nexport type { ListItemProps } from './Item';\nexport type { ListVariant, ListDensity, ListLines, ListRounded } from './types.list';\nexport default List;\n"]}
@@ -0,0 +1,179 @@
1
+ import { iconBaseClasses } from './chunk-IEILIKS2.js';
2
+ import * as React from 'react';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var base = "btn-base focus-visible:outline-none focus-visible:ring-2 rounded-lg transition-colors duration-200 font-medium disabled:opacity-50 disabled:cursor-not-allowed";
7
+ var blackAndWhiteVariantClass = "bg-white text-black border border-black focus-visible:ring-black/40 focus-visible:ring-offset-white";
8
+ var blackAndWhitePaletteClasses = {
9
+ solid: twMerge(blackAndWhiteVariantClass, "bg-black text-white"),
10
+ outline: blackAndWhiteVariantClass,
11
+ ghost: "bg-neutral-300 text-white",
12
+ text: blackAndWhiteVariantClass,
13
+ filled: "bg-black text-white",
14
+ underlined: twMerge(blackAndWhiteVariantClass, "b"),
15
+ rounded: blackAndWhiteVariantClass,
16
+ sharp: "bg-black text-white rounded-none"
17
+ };
18
+ var paletteVariantClasses = {
19
+ primary: {
20
+ solid: "bg-primary text-white hover:bg-primary/90 focus-visible:ring-primary",
21
+ sharp: "rounded-none bg-primary text-white hover:bg-primary/90 focus-visible:ring-primary",
22
+ outline: "border border-primary text-primary bg-white hover:bg-primary hover:text-white focus-visible:ring-primary",
23
+ ghost: "text-primary bg-primary/10 hover:bg-primary/20 focus-visible:ring-primary/40 border border-transparent",
24
+ text: "bg-transparent text-primary hover:bg-primary/10 focus-visible:ring-primary/30 underline-offset-2 border border-transparent",
25
+ filled: "bg-primary/15 text-primary border border-primary/30 hover:bg-primary/25 focus-visible:ring-primary/25",
26
+ underlined: "bg-transparent text-primary border border-transparent underline decoration-2 underline-offset-4 hover:bg-primary/5 focus-visible:ring-primary/25",
27
+ rounded: "rounded-full border border-primary/60 bg-primary/10 text-primary hover:bg-primary/20 focus-visible:ring-primary/25"
28
+ },
29
+ neutral: {
30
+ solid: "bg-gray-600 text-white hover:bg-gray-700 focus-visible:ring-gray-500",
31
+ sharp: "rounded-none bg-gray-600 text-white hover:bg-gray-700 focus-visible:ring-gray-500",
32
+ outline: "border border-gray-400 text-gray-700 bg-white hover:bg-gray-700 hover:text-white focus-visible:ring-gray-400",
33
+ ghost: "text-gray-700 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-300 border border-transparent",
34
+ text: "bg-transparent text-gray-700 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2 border border-transparent",
35
+ filled: "bg-gray-200 text-gray-900 border border-gray-300 hover:bg-gray-300 focus-visible:ring-gray-300",
36
+ underlined: "bg-transparent text-gray-900 border border-transparent underline decoration-2 underline-offset-4 hover:bg-gray-100 focus-visible:ring-gray-300",
37
+ rounded: "rounded-full border border-gray-400 bg-white text-gray-800 hover:bg-gray-100 focus-visible:ring-gray-300"
38
+ },
39
+ info: {
40
+ solid: "bg-sky-500 text-white hover:bg-sky-600 focus-visible:ring-sky-400",
41
+ sharp: "rounded-none bg-sky-500 text-white hover:bg-sky-600 focus-visible:ring-sky-400",
42
+ outline: "border border-sky-500 text-sky-600 bg-white hover:bg-sky-500 hover:text-white focus-visible:ring-sky-400",
43
+ ghost: "text-sky-600 bg-sky-100 hover:bg-sky-200 focus-visible:ring-sky-300 border border-transparent",
44
+ text: "bg-transparent text-sky-600 hover:bg-sky-100 focus-visible:ring-sky-200 underline-offset-2 border border-transparent",
45
+ filled: "bg-sky-100 text-sky-700 border border-sky-200 hover:bg-sky-200 focus-visible:ring-sky-200",
46
+ underlined: "bg-transparent text-sky-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-sky-50 focus-visible:ring-sky-200",
47
+ rounded: "rounded-full border border-sky-500/70 bg-sky-50 text-sky-700 hover:bg-sky-100 focus-visible:ring-sky-200"
48
+ },
49
+ success: {
50
+ solid: "bg-emerald-500 text-white hover:bg-emerald-600 focus-visible:ring-emerald-400",
51
+ sharp: "rounded-none bg-emerald-500 text-white hover:bg-emerald-600 focus-visible:ring-emerald-400",
52
+ outline: "border border-emerald-500 text-emerald-600 bg-white hover:bg-emerald-500 hover:text-white focus-visible:ring-emerald-400",
53
+ ghost: "text-emerald-600 bg-emerald-100 hover:bg-emerald-200 focus-visible:ring-emerald-300 border border-transparent",
54
+ text: "bg-transparent text-emerald-600 hover:bg-emerald-100 focus-visible:ring-emerald-200 underline-offset-2 border border-transparent",
55
+ filled: "bg-emerald-100 text-emerald-700 border border-emerald-200 hover:bg-emerald-200 focus-visible:ring-emerald-200",
56
+ underlined: "bg-transparent text-emerald-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-emerald-50 focus-visible:ring-emerald-200",
57
+ rounded: "rounded-full border border-emerald-500/70 bg-emerald-50 text-emerald-700 hover:bg-emerald-100 focus-visible:ring-emerald-200"
58
+ },
59
+ warning: {
60
+ solid: "bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-400",
61
+ sharp: "rounded-none bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-400",
62
+ outline: "border border-amber-500 text-amber-600 bg-white hover:bg-amber-500 hover:text-white focus-visible:ring-amber-400",
63
+ ghost: "text-amber-600 bg-amber-100 hover:bg-amber-200 focus-visible:ring-amber-300 border border-transparent",
64
+ text: "bg-transparent text-amber-600 hover:bg-amber-100 focus-visible:ring-amber-200 underline-offset-2 border border-transparent",
65
+ filled: "bg-amber-100 text-amber-800 border border-amber-200 hover:bg-amber-200 focus-visible:ring-amber-200",
66
+ underlined: "bg-transparent text-amber-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-amber-50 focus-visible:ring-amber-200",
67
+ rounded: "rounded-full border border-amber-500/70 bg-amber-50 text-amber-700 hover:bg-amber-100 focus-visible:ring-amber-200"
68
+ },
69
+ danger: {
70
+ solid: "bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-400",
71
+ sharp: "rounded-none bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-400",
72
+ outline: "border border-red-500 text-red-600 bg-white hover:bg-red-500 hover:text-white focus-visible:ring-red-400",
73
+ ghost: "text-red-600 bg-red-100 hover:bg-red-200 focus-visible:ring-red-300 border border-transparent",
74
+ text: "bg-transparent text-red-600 hover:bg-red-100 focus-visible:ring-red-200 underline-offset-2 border border-transparent",
75
+ filled: "bg-red-100 text-red-700 border border-red-200 hover:bg-red-200 focus-visible:ring-red-200",
76
+ underlined: "bg-transparent text-red-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-red-50 focus-visible:ring-red-200",
77
+ rounded: "rounded-full border border-red-500/70 bg-red-50 text-red-700 hover:bg-red-100 focus-visible:ring-red-200"
78
+ },
79
+ surface: {
80
+ solid: "bg-white text-gray-900 border border-gray-200 hover:bg-gray-50 focus-visible:ring-gray-200",
81
+ sharp: "rounded-none bg-white text-gray-900 border border-gray-200 hover:bg-gray-50 focus-visible:ring-gray-200",
82
+ outline: "border border-gray-300 text-gray-900 bg-white hover:bg-gray-100 focus-visible:ring-gray-200",
83
+ ghost: "text-gray-900 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-200 border border-transparent",
84
+ text: "bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2 border border-transparent",
85
+ filled: "bg-gray-50 text-gray-900 border border-gray-200 hover:bg-white focus-visible:ring-gray-200",
86
+ underlined: "bg-transparent text-gray-900 border border-transparent underline decoration-2 underline-offset-4 hover:bg-gray-100 focus-visible:ring-gray-200",
87
+ rounded: "rounded-full border border-gray-300 bg-white text-gray-900 hover:bg-gray-50 focus-visible:ring-gray-200"
88
+ },
89
+ bw: blackAndWhitePaletteClasses
90
+ };
91
+ var resolveVariantClass = (variant, palette) => {
92
+ const paletteVariants = paletteVariantClasses[palette] ?? paletteVariantClasses.primary;
93
+ return paletteVariants[variant] ?? paletteVariants.solid;
94
+ };
95
+ var resolveIconClassName = (icon) => {
96
+ if (!icon) {
97
+ return void 0;
98
+ }
99
+ if (typeof icon === "string") {
100
+ const trimmed = icon.trim();
101
+ if (!trimmed) {
102
+ return void 0;
103
+ }
104
+ if (trimmed.includes(" ")) {
105
+ return trimmed;
106
+ }
107
+ const normalized2 = trimmed.startsWith("mdi-") ? trimmed : `mdi-${trimmed}`;
108
+ return ["mdi", normalized2].join(" ");
109
+ }
110
+ const [library, providedName] = icon;
111
+ const normalizedLibrary = library.trim();
112
+ const baseClasses = iconBaseClasses[normalizedLibrary] ?? [normalizedLibrary];
113
+ const iconName = providedName.trim();
114
+ if (!iconName) {
115
+ return baseClasses.join(" ");
116
+ }
117
+ const normalized = iconName.startsWith("mdi-") ? iconName : `mdi-${iconName}`;
118
+ return Array.from(/* @__PURE__ */ new Set([...baseClasses, normalized])).join(" ");
119
+ };
120
+ var sizeClasses = {
121
+ "x-small": "px-2.5 py-1 text-xs",
122
+ small: "px-3 py-1.5 text-sm",
123
+ medium: "px-4 py-2 text-base",
124
+ large: "px-6 py-3 text-lg",
125
+ "x-large": "px-7 py-3.5 text-xl"
126
+ };
127
+ var Button = React.forwardRef(
128
+ ({
129
+ variant = "solid",
130
+ color = "primary",
131
+ size = "medium",
132
+ block = false,
133
+ loading = false,
134
+ loadingText,
135
+ icon,
136
+ className,
137
+ children,
138
+ disabled,
139
+ onClick,
140
+ ...rest
141
+ }, ref) => {
142
+ const variantClass = resolveVariantClass(variant, color);
143
+ const sizeClass = sizeClasses[size] ?? sizeClasses.medium;
144
+ const blockClass = block ? "w-full" : null;
145
+ const isDisabled = disabled || loading;
146
+ const cursor = onClick && !isDisabled ? "cursor-pointer" : "cursor-default";
147
+ const resolvedIconClass = resolveIconClassName(icon);
148
+ const shouldRenderIcon = Boolean(resolvedIconClass && !loading);
149
+ const isLoadingTextProvided = loadingText !== void 0 && loadingText !== null;
150
+ const content = loading && isLoadingTextProvided ? loadingText : children;
151
+ const hasDecorators = (loading || shouldRenderIcon) && Boolean(content);
152
+ const gapClass = hasDecorators ? "gap-2" : void 0;
153
+ const loadingIconClass = loading ? twMerge("mdi mdi-loading mdi-spin", "leading-none") : void 0;
154
+ const iconClassName = shouldRenderIcon ? twMerge("leading-none", resolvedIconClass) : void 0;
155
+ return /* @__PURE__ */ jsxs(
156
+ "button",
157
+ {
158
+ ...rest,
159
+ ref,
160
+ onClick,
161
+ disabled: isDisabled,
162
+ className: twMerge(base, cursor, variantClass, sizeClass, blockClass, gapClass, className),
163
+ "data-loading": loading || void 0,
164
+ "aria-busy": loading || void 0,
165
+ children: [
166
+ loading && /* @__PURE__ */ jsx("i", { className: loadingIconClass, "aria-hidden": true }),
167
+ iconClassName && /* @__PURE__ */ jsx("i", { className: iconClassName, "aria-hidden": true }),
168
+ content
169
+ ]
170
+ }
171
+ );
172
+ }
173
+ );
174
+ Button.displayName = "Button";
175
+ var Button_default = Button;
176
+
177
+ export { Button_default };
178
+ //# sourceMappingURL=chunk-7LLAWEDF.js.map
179
+ //# sourceMappingURL=chunk-7LLAWEDF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Containment/Button/states.button.ts","../src/Containment/Button/index.tsx"],"names":["normalized","twMerge"],"mappings":";;;;;AAKO,IAAM,IAAA,GACX,gKAAA;AAEF,IAAM,yBAAA,GACJ,qGAAA;AAEF,IAAM,2BAAA,GAA8B;AAAA,EAClC,KAAA,EAAO,OAAA,CAAQ,yBAAA,EAA2B,qBAAqB,CAAA;AAAA,EAC/D,OAAA,EAAS,yBAAA;AAAA,EACT,KAAA,EAAO,2BAAA;AAAA,EACP,IAAA,EAAM,yBAAA;AAAA,EACN,MAAA,EAAQ,qBAAA;AAAA,EACR,UAAA,EAAY,OAAA,CAAQ,yBAAA,EAA2B,GAAG,CAAA;AAAA,EAClD,OAAA,EAAS,yBAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,qBAAA,GAAwE;AAAA,EAC5E,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,sEAAA;AAAA,IACP,KAAA,EAAO,mFAAA;AAAA,IACP,OAAA,EAAS,0GAAA;AAAA,IACT,KAAA,EAAO,wGAAA;AAAA,IACP,IAAA,EAAM,4HAAA;AAAA,IACN,MAAA,EAAQ,uGAAA;AAAA,IACR,UAAA,EACE,kJAAA;AAAA,IACF,OAAA,EACE;AAAA,GACJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,sEAAA;AAAA,IACP,KAAA,EAAO,mFAAA;AAAA,IACP,OAAA,EACE,8GAAA;AAAA,IACF,KAAA,EAAO,mGAAA;AAAA,IACP,IAAA,EAAM,yHAAA;AAAA,IACN,MAAA,EAAQ,gGAAA;AAAA,IACR,UAAA,EACE,gJAAA;AAAA,IACF,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,mEAAA;AAAA,IACP,KAAA,EAAO,gFAAA;AAAA,IACP,OAAA,EAAS,0GAAA;AAAA,IACT,KAAA,EAAO,+FAAA;AAAA,IACP,IAAA,EAAM,sHAAA;AAAA,IACN,MAAA,EAAQ,2FAAA;AAAA,IACR,UAAA,EACE,4IAAA;AAAA,IACF,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,+EAAA;AAAA,IACP,KAAA,EAAO,4FAAA;AAAA,IACP,OAAA,EACE,0HAAA;AAAA,IACF,KAAA,EACE,+GAAA;AAAA,IACF,IAAA,EAAM,kIAAA;AAAA,IACN,MAAA,EACE,+GAAA;AAAA,IACF,UAAA,EACE,wJAAA;AAAA,IACF,OAAA,EACE;AAAA,GACJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,yEAAA;AAAA,IACP,KAAA,EAAO,sFAAA;AAAA,IACP,OAAA,EACE,kHAAA;AAAA,IACF,KAAA,EAAO,uGAAA;AAAA,IACP,IAAA,EAAM,4HAAA;AAAA,IACN,MAAA,EAAQ,qGAAA;AAAA,IACR,UAAA,EACE,kJAAA;AAAA,IACF,OAAA,EACE;AAAA,GACJ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,mEAAA;AAAA,IACP,KAAA,EAAO,gFAAA;AAAA,IACP,OAAA,EAAS,0GAAA;AAAA,IACT,KAAA,EAAO,+FAAA;AAAA,IACP,IAAA,EAAM,sHAAA;AAAA,IACN,MAAA,EAAQ,2FAAA;AAAA,IACR,UAAA,EACE,4IAAA;AAAA,IACF,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,4FAAA;AAAA,IACP,KAAA,EAAO,yGAAA;AAAA,IACP,OAAA,EAAS,6FAAA;AAAA,IACT,KAAA,EAAO,mGAAA;AAAA,IACP,IAAA,EAAM,yHAAA;AAAA,IACN,MAAA,EAAQ,4FAAA;AAAA,IACR,UAAA,EACE,gJAAA;AAAA,IACF,OAAA,EAAS;AAAA,GACX;AAAA,EACA,EAAA,EAAI;AACN,CAAA;AAEO,IAAM,mBAAA,GAAsB,CAAC,OAAA,EAAwB,OAAA,KAAqB;AAC/E,EAAA,MAAM,eAAA,GAAkB,qBAAA,CAAsB,OAAO,CAAA,IAAK,qBAAA,CAAsB,OAAA;AAChF,EAAA,OAAO,eAAA,CAAgB,OAAO,CAAA,IAAK,eAAA,CAAgB,KAAA;AACrD,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAA+B;AAClE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAMA,cAAa,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,GAAI,OAAA,GAAU,OAAO,OAAO,CAAA,CAAA;AACxE,IAAA,OAAO,CAAC,KAAA,EAAOA,WAAU,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,YAAY,CAAA,GAAI,IAAA;AAChC,EAAA,MAAM,iBAAA,GAAoB,QAAQ,IAAA,EAAK;AACvC,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,iBAAiD,CAAA,IAAK,CAAC,iBAAiB,CAAA;AAC5G,EAAA,MAAM,QAAA,GAAW,aAAa,IAAA,EAAK;AACnC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,aAAa,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,GAAI,QAAA,GAAW,OAAO,QAAQ,CAAA,CAAA;AAC3E,EAAA,OAAO,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,WAAA,EAAa,UAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACnE,CAAA;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW,qBAAA;AAAA,EACX,KAAA,EAAO,qBAAA;AAAA,EACP,MAAA,EAAQ,qBAAA;AAAA,EACR,KAAA,EAAO,mBAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;ACjJA,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EACnB,CACE;AAAA,IACE,OAAA,GAAU,OAAA;AAAA,IACV,KAAA,GAAQ,SAAA;AAAA,IACR,IAAA,GAAO,QAAA;AAAA,IACP,KAAA,GAAQ,KAAA;AAAA,IACR,OAAA,GAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,OAAA,EAAS,KAAK,CAAA;AACvD,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAI,CAAA,IAAK,WAAA,CAAY,MAAA;AACnD,IAAA,MAAM,UAAA,GAAa,QAAQ,QAAA,GAAW,IAAA;AACtC,IAAA,MAAM,aAAa,QAAA,IAAY,OAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,OAAA,IAAW,CAAC,UAAA,GAAa,gBAAA,GAAmB,gBAAA;AAC3D,IAAA,MAAM,iBAAA,GAAoB,qBAAqB,IAAI,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,iBAAA,IAAqB,CAAC,OAAO,CAAA;AAC9D,IAAA,MAAM,qBAAA,GAAwB,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,IAAA;AAC3E,IAAA,MAAM,OAAA,GAAU,OAAA,IAAW,qBAAA,GAAwB,WAAA,GAAc,QAAA;AACjE,IAAA,MAAM,aAAA,GAAA,CAAiB,OAAA,IAAW,gBAAA,KAAqB,OAAA,CAAQ,OAAO,CAAA;AACtE,IAAA,MAAM,QAAA,GAAW,gBAAgB,OAAA,GAAU,MAAA;AAC3C,IAAA,MAAM,gBAAA,GAAmB,OAAA,GAAUC,OAAAA,CAAQ,0BAAA,EAA4B,cAAc,CAAA,GAAI,MAAA;AACzF,IAAA,MAAM,aAAA,GAAgB,gBAAA,GAAmBA,OAAAA,CAAQ,cAAA,EAAgB,iBAAiB,CAAA,GAAI,MAAA;AAEtF,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAWA,QAAQ,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EAAW,UAAA,EAAY,UAAU,SAAS,CAAA;AAAA,QACzF,gBAAc,OAAA,IAAW,MAAA;AAAA,QACzB,aAAW,OAAA,IAAW,MAAA;AAAA,QAErB,QAAA,EAAA;AAAA,UAAA,OAAA,oBAAW,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAA,EAAkB,eAAW,IAAA,EAAC,CAAA;AAAA,UACvD,iCAAiB,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,aAAA,EAAe,eAAW,IAAA,EAAC,CAAA;AAAA,UAC1D;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AAErB,IAAO,cAAA,GAAQ","file":"chunk-7LLAWEDF.js","sourcesContent":["import { iconBaseClasses } from '@lindle/linoardo/globals';\nimport type { GlobalSize, Palette } from '@lindle/linoardo/global.types';\nimport type { ButtonProps, ButtonVariant } from './types.button';\nimport { twMerge } from 'tailwind-merge';\n\nexport const base =\n 'btn-base focus-visible:outline-none focus-visible:ring-2 rounded-lg transition-colors duration-200 font-medium disabled:opacity-50 disabled:cursor-not-allowed';\n\nconst blackAndWhiteVariantClass =\n 'bg-white text-black border border-black focus-visible:ring-black/40 focus-visible:ring-offset-white';\n\nconst blackAndWhitePaletteClasses = {\n solid: twMerge(blackAndWhiteVariantClass, 'bg-black text-white'),\n outline: blackAndWhiteVariantClass,\n ghost: 'bg-neutral-300 text-white',\n text: blackAndWhiteVariantClass,\n filled: 'bg-black text-white',\n underlined: twMerge(blackAndWhiteVariantClass, 'b'),\n rounded: blackAndWhiteVariantClass,\n sharp: 'bg-black text-white rounded-none'\n} satisfies Record<ButtonVariant, string>;\n\nconst paletteVariantClasses: Record<Palette, Record<ButtonVariant, string>> = {\n primary: {\n solid: 'bg-primary text-white hover:bg-primary/90 focus-visible:ring-primary',\n sharp: 'rounded-none bg-primary text-white hover:bg-primary/90 focus-visible:ring-primary',\n outline: 'border border-primary text-primary bg-white hover:bg-primary hover:text-white focus-visible:ring-primary',\n ghost: 'text-primary bg-primary/10 hover:bg-primary/20 focus-visible:ring-primary/40 border border-transparent',\n text: 'bg-transparent text-primary hover:bg-primary/10 focus-visible:ring-primary/30 underline-offset-2 border border-transparent',\n filled: 'bg-primary/15 text-primary border border-primary/30 hover:bg-primary/25 focus-visible:ring-primary/25',\n underlined:\n 'bg-transparent text-primary border border-transparent underline decoration-2 underline-offset-4 hover:bg-primary/5 focus-visible:ring-primary/25',\n rounded:\n 'rounded-full border border-primary/60 bg-primary/10 text-primary hover:bg-primary/20 focus-visible:ring-primary/25'\n },\n neutral: {\n solid: 'bg-gray-600 text-white hover:bg-gray-700 focus-visible:ring-gray-500',\n sharp: 'rounded-none bg-gray-600 text-white hover:bg-gray-700 focus-visible:ring-gray-500',\n outline:\n 'border border-gray-400 text-gray-700 bg-white hover:bg-gray-700 hover:text-white focus-visible:ring-gray-400',\n ghost: 'text-gray-700 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-300 border border-transparent',\n text: 'bg-transparent text-gray-700 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2 border border-transparent',\n filled: 'bg-gray-200 text-gray-900 border border-gray-300 hover:bg-gray-300 focus-visible:ring-gray-300',\n underlined:\n 'bg-transparent text-gray-900 border border-transparent underline decoration-2 underline-offset-4 hover:bg-gray-100 focus-visible:ring-gray-300',\n rounded: 'rounded-full border border-gray-400 bg-white text-gray-800 hover:bg-gray-100 focus-visible:ring-gray-300'\n },\n info: {\n solid: 'bg-sky-500 text-white hover:bg-sky-600 focus-visible:ring-sky-400',\n sharp: 'rounded-none bg-sky-500 text-white hover:bg-sky-600 focus-visible:ring-sky-400',\n outline: 'border border-sky-500 text-sky-600 bg-white hover:bg-sky-500 hover:text-white focus-visible:ring-sky-400',\n ghost: 'text-sky-600 bg-sky-100 hover:bg-sky-200 focus-visible:ring-sky-300 border border-transparent',\n text: 'bg-transparent text-sky-600 hover:bg-sky-100 focus-visible:ring-sky-200 underline-offset-2 border border-transparent',\n filled: 'bg-sky-100 text-sky-700 border border-sky-200 hover:bg-sky-200 focus-visible:ring-sky-200',\n underlined:\n 'bg-transparent text-sky-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-sky-50 focus-visible:ring-sky-200',\n rounded: 'rounded-full border border-sky-500/70 bg-sky-50 text-sky-700 hover:bg-sky-100 focus-visible:ring-sky-200'\n },\n success: {\n solid: 'bg-emerald-500 text-white hover:bg-emerald-600 focus-visible:ring-emerald-400',\n sharp: 'rounded-none bg-emerald-500 text-white hover:bg-emerald-600 focus-visible:ring-emerald-400',\n outline:\n 'border border-emerald-500 text-emerald-600 bg-white hover:bg-emerald-500 hover:text-white focus-visible:ring-emerald-400',\n ghost:\n 'text-emerald-600 bg-emerald-100 hover:bg-emerald-200 focus-visible:ring-emerald-300 border border-transparent',\n text: 'bg-transparent text-emerald-600 hover:bg-emerald-100 focus-visible:ring-emerald-200 underline-offset-2 border border-transparent',\n filled:\n 'bg-emerald-100 text-emerald-700 border border-emerald-200 hover:bg-emerald-200 focus-visible:ring-emerald-200',\n underlined:\n 'bg-transparent text-emerald-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-emerald-50 focus-visible:ring-emerald-200',\n rounded:\n 'rounded-full border border-emerald-500/70 bg-emerald-50 text-emerald-700 hover:bg-emerald-100 focus-visible:ring-emerald-200'\n },\n warning: {\n solid: 'bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-400',\n sharp: 'rounded-none bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-400',\n outline:\n 'border border-amber-500 text-amber-600 bg-white hover:bg-amber-500 hover:text-white focus-visible:ring-amber-400',\n ghost: 'text-amber-600 bg-amber-100 hover:bg-amber-200 focus-visible:ring-amber-300 border border-transparent',\n text: 'bg-transparent text-amber-600 hover:bg-amber-100 focus-visible:ring-amber-200 underline-offset-2 border border-transparent',\n filled: 'bg-amber-100 text-amber-800 border border-amber-200 hover:bg-amber-200 focus-visible:ring-amber-200',\n underlined:\n 'bg-transparent text-amber-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-amber-50 focus-visible:ring-amber-200',\n rounded:\n 'rounded-full border border-amber-500/70 bg-amber-50 text-amber-700 hover:bg-amber-100 focus-visible:ring-amber-200'\n },\n danger: {\n solid: 'bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-400',\n sharp: 'rounded-none bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-400',\n outline: 'border border-red-500 text-red-600 bg-white hover:bg-red-500 hover:text-white focus-visible:ring-red-400',\n ghost: 'text-red-600 bg-red-100 hover:bg-red-200 focus-visible:ring-red-300 border border-transparent',\n text: 'bg-transparent text-red-600 hover:bg-red-100 focus-visible:ring-red-200 underline-offset-2 border border-transparent',\n filled: 'bg-red-100 text-red-700 border border-red-200 hover:bg-red-200 focus-visible:ring-red-200',\n underlined:\n 'bg-transparent text-red-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-red-50 focus-visible:ring-red-200',\n rounded: 'rounded-full border border-red-500/70 bg-red-50 text-red-700 hover:bg-red-100 focus-visible:ring-red-200'\n },\n surface: {\n solid: 'bg-white text-gray-900 border border-gray-200 hover:bg-gray-50 focus-visible:ring-gray-200',\n sharp: 'rounded-none bg-white text-gray-900 border border-gray-200 hover:bg-gray-50 focus-visible:ring-gray-200',\n outline: 'border border-gray-300 text-gray-900 bg-white hover:bg-gray-100 focus-visible:ring-gray-200',\n ghost: 'text-gray-900 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-200 border border-transparent',\n text: 'bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2 border border-transparent',\n filled: 'bg-gray-50 text-gray-900 border border-gray-200 hover:bg-white focus-visible:ring-gray-200',\n underlined:\n 'bg-transparent text-gray-900 border border-transparent underline decoration-2 underline-offset-4 hover:bg-gray-100 focus-visible:ring-gray-200',\n rounded: 'rounded-full border border-gray-300 bg-white text-gray-900 hover:bg-gray-50 focus-visible:ring-gray-200'\n },\n bw: blackAndWhitePaletteClasses\n};\n\nexport const resolveVariantClass = (variant: ButtonVariant, palette: Palette) => {\n const paletteVariants = paletteVariantClasses[palette] ?? paletteVariantClasses.primary;\n return paletteVariants[variant] ?? paletteVariants.solid;\n};\n\nexport const resolveIconClassName = (icon?: ButtonProps['icon']) => {\n if (!icon) {\n return undefined;\n }\n\n if (typeof icon === 'string') {\n const trimmed = icon.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.includes(' ')) {\n return trimmed;\n }\n\n const normalized = trimmed.startsWith('mdi-') ? trimmed : `mdi-${trimmed}`;\n return ['mdi', normalized].join(' ');\n }\n\n const [library, providedName] = icon;\n const normalizedLibrary = library.trim();\n const baseClasses = iconBaseClasses[normalizedLibrary as keyof typeof iconBaseClasses] ?? [normalizedLibrary];\n const iconName = providedName.trim();\n if (!iconName) {\n return baseClasses.join(' ');\n }\n\n const normalized = iconName.startsWith('mdi-') ? iconName : `mdi-${iconName}`;\n return Array.from(new Set([...baseClasses, normalized])).join(' ');\n};\n\nexport const sizeClasses = {\n 'x-small': 'px-2.5 py-1 text-xs',\n small: 'px-3 py-1.5 text-sm',\n medium: 'px-4 py-2 text-base',\n large: 'px-6 py-3 text-lg',\n 'x-large': 'px-7 py-3.5 text-xl'\n} satisfies Record<GlobalSize, string>;\n","import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { ButtonProps } from './types.button';\nimport { base, resolveIconClassName, resolveVariantClass, sizeClasses } from './states.button';\n\n/**\n * Containment button supporting variant, size, block layout and loading states.\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'solid',\n color = 'primary',\n size = 'medium',\n block = false,\n loading = false,\n loadingText,\n icon,\n className,\n children,\n disabled,\n onClick,\n ...rest\n },\n ref\n ) => {\n const variantClass = resolveVariantClass(variant, color);\n const sizeClass = sizeClasses[size] ?? sizeClasses.medium;\n const blockClass = block ? 'w-full' : null;\n const isDisabled = disabled || loading;\n const cursor = onClick && !isDisabled ? 'cursor-pointer' : 'cursor-default';\n const resolvedIconClass = resolveIconClassName(icon);\n const shouldRenderIcon = Boolean(resolvedIconClass && !loading);\n const isLoadingTextProvided = loadingText !== undefined && loadingText !== null;\n const content = loading && isLoadingTextProvided ? loadingText : children;\n const hasDecorators = (loading || shouldRenderIcon) && Boolean(content);\n const gapClass = hasDecorators ? 'gap-2' : undefined;\n const loadingIconClass = loading ? twMerge('mdi mdi-loading mdi-spin', 'leading-none') : undefined;\n const iconClassName = shouldRenderIcon ? twMerge('leading-none', resolvedIconClass) : undefined;\n\n return (\n <button\n {...rest}\n ref={ref}\n onClick={onClick}\n disabled={isDisabled}\n className={twMerge(base, cursor, variantClass, sizeClass, blockClass, gapClass, className)}\n data-loading={loading || undefined}\n aria-busy={loading || undefined}\n >\n {loading && <i className={loadingIconClass} aria-hidden />}\n {iconClassName && <i className={iconClassName} aria-hidden />}\n {content}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n"]}
@@ -0,0 +1,125 @@
1
+ import { injectExpansionPanelContext } from './chunk-GA6HSRN6.js';
2
+ import { forwardRef, useState, useRef, useEffect, useCallback, useMemo } from 'react';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var variantContainerClasses = {
7
+ elevated: "bg-white border border-gray-200 shadow-lg shadow-gray-900/10",
8
+ outlined: "bg-white border border-gray-200",
9
+ tonal: "bg-gray-50 border border-gray-100",
10
+ plain: "bg-transparent border border-transparent"
11
+ };
12
+ var roundedClasses = {
13
+ none: "rounded-none",
14
+ sm: "rounded-sm",
15
+ md: "rounded-md",
16
+ lg: "rounded-lg",
17
+ xl: "rounded-xl"
18
+ };
19
+ var uniqueValues = (values) => Array.from(new Set(values));
20
+ var normalizeValues = (value, allowMultiple) => {
21
+ if (value === void 0 || value === null) {
22
+ return [];
23
+ }
24
+ const normalized = Array.isArray(value) ? value : [value];
25
+ if (allowMultiple) {
26
+ return uniqueValues(normalized);
27
+ }
28
+ return normalized.length ? [normalized[0]] : [];
29
+ };
30
+ var clampValues = (values, allowMultiple) => allowMultiple ? uniqueValues(values) : values.length ? [values[0]] : [];
31
+ var ExpansionPanelInner = (props, forwardedRef) => {
32
+ const {
33
+ variant = "elevated",
34
+ rounded = "lg",
35
+ density = "default",
36
+ color = "primary",
37
+ divider = true,
38
+ multiple = false,
39
+ className,
40
+ children,
41
+ value,
42
+ defaultValue,
43
+ onChange,
44
+ ...rest
45
+ } = props;
46
+ const allowMultiple = multiple ?? false;
47
+ const isControlled = value !== void 0;
48
+ const [internalValues, setInternalValues] = useState(
49
+ () => normalizeValues(defaultValue, allowMultiple)
50
+ );
51
+ const prevAllowMultipleRef = useRef(allowMultiple);
52
+ const prevIsControlledRef = useRef(isControlled);
53
+ useEffect(() => {
54
+ const prevAllowMultiple = prevAllowMultipleRef.current;
55
+ const wasControlled = prevIsControlledRef.current;
56
+ if (!isControlled && (allowMultiple !== prevAllowMultiple || wasControlled !== isControlled)) {
57
+ setInternalValues((prev) => clampValues(prev, allowMultiple));
58
+ }
59
+ prevAllowMultipleRef.current = allowMultiple;
60
+ prevIsControlledRef.current = isControlled;
61
+ }, [allowMultiple, isControlled]);
62
+ const handleValueChange = useCallback(
63
+ (next) => {
64
+ if (!isControlled) {
65
+ setInternalValues(next);
66
+ }
67
+ if (onChange) {
68
+ if (allowMultiple) {
69
+ onChange(next);
70
+ } else {
71
+ onChange(next[0] ?? null);
72
+ }
73
+ }
74
+ },
75
+ [allowMultiple, isControlled, onChange]
76
+ );
77
+ const handleToggle = useCallback(
78
+ (panelValue, disabled) => {
79
+ if (disabled) {
80
+ return;
81
+ }
82
+ const expandedValues2 = isControlled ? normalizeValues(value, allowMultiple) : internalValues;
83
+ const isActive = expandedValues2.includes(panelValue);
84
+ const next = allowMultiple ? isActive ? expandedValues2.filter((v) => v !== panelValue) : [...expandedValues2, panelValue] : isActive ? [] : [panelValue];
85
+ handleValueChange(next);
86
+ },
87
+ [allowMultiple, handleValueChange, internalValues, isControlled, value]
88
+ );
89
+ const expandedValues = useMemo(
90
+ () => isControlled ? normalizeValues(value, allowMultiple) : internalValues,
91
+ [allowMultiple, internalValues, isControlled, value]
92
+ );
93
+ const providerValue = useMemo(
94
+ () => ({
95
+ expandedValues,
96
+ toggle: handleToggle,
97
+ density,
98
+ color,
99
+ divider,
100
+ rounded,
101
+ variant
102
+ }),
103
+ [color, density, divider, expandedValues, handleToggle, rounded, variant]
104
+ );
105
+ const variantClass = divider ? variantContainerClasses[variant] : "bg-transparent border border-transparent shadow-none";
106
+ const shapeClass = roundedClasses[rounded] ?? roundedClasses.lg;
107
+ const layoutClass = divider ? "divide-y divide-gray-100 overflow-hidden" : "gap-4";
108
+ const enhancedChildren = injectExpansionPanelContext(children, providerValue);
109
+ return /* @__PURE__ */ jsx(
110
+ "div",
111
+ {
112
+ ...rest,
113
+ ref: forwardedRef,
114
+ className: twMerge("expansion-panel flex w-full flex-col text-gray-900", variantClass, shapeClass, layoutClass, className),
115
+ children: enhancedChildren
116
+ }
117
+ );
118
+ };
119
+ var ExpansionPanel = forwardRef(ExpansionPanelInner);
120
+ ExpansionPanel.displayName = "ExpansionPanel";
121
+ var ExpansionPanel_default = ExpansionPanel;
122
+
123
+ export { ExpansionPanel_default };
124
+ //# sourceMappingURL=chunk-E32P5AHO.js.map
125
+ //# sourceMappingURL=chunk-E32P5AHO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Containment/ExpansionPanel/index.tsx"],"names":["expandedValues"],"mappings":"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","file":"chunk-E32P5AHO.js","sourcesContent":["import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ForwardedRef } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nimport { injectExpansionPanelContext } from './context';\nimport type {\n ExpansionPanelProps,\n ExpansionPanelValue,\n ExpansionPanelVariant,\n ExpansionPanelRounded,\n ExpansionPanelMultipleProps,\n ExpansionPanelSingleProps\n} from './types.expansion-panel';\nimport ExpansionPanelItem from './ExpansionPanelItem';\n\nconst variantContainerClasses: Record<ExpansionPanelVariant, string> = {\n elevated: 'bg-white border border-gray-200 shadow-lg shadow-gray-900/10',\n outlined: 'bg-white border border-gray-200',\n tonal: 'bg-gray-50 border border-gray-100',\n plain: 'bg-transparent border border-transparent'\n};\n\nconst roundedClasses: Record<ExpansionPanelRounded, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl'\n};\n\nconst uniqueValues = (values: ExpansionPanelValue[]) => Array.from(new Set(values));\n\nconst normalizeValues = (\n value: ExpansionPanelValue | ExpansionPanelValue[] | null | undefined,\n allowMultiple: boolean\n): ExpansionPanelValue[] => {\n if (value === undefined || value === null) {\n return [];\n }\n\n const normalized = Array.isArray(value) ? value : [value];\n if (allowMultiple) {\n return uniqueValues(normalized);\n }\n\n return normalized.length ? [normalized[0]] : [];\n};\n\nconst clampValues = (values: ExpansionPanelValue[], allowMultiple: boolean) =>\n allowMultiple ? uniqueValues(values) : values.length ? [values[0]] : [];\n\nconst ExpansionPanelInner = (props: ExpansionPanelProps, forwardedRef: ForwardedRef<HTMLDivElement>) => {\n const {\n variant = 'elevated',\n rounded = 'lg',\n density = 'default',\n color = 'primary',\n divider = true,\n multiple = false,\n className,\n children,\n value,\n defaultValue,\n onChange,\n ...rest\n } = props;\n\n const allowMultiple = multiple ?? false;\n const isControlled = value !== undefined;\n\n const [internalValues, setInternalValues] = useState<ExpansionPanelValue[]>(() =>\n normalizeValues(defaultValue, allowMultiple)\n );\n\n const prevAllowMultipleRef = useRef(allowMultiple);\n const prevIsControlledRef = useRef(isControlled);\n\n useEffect(() => {\n const prevAllowMultiple = prevAllowMultipleRef.current;\n const wasControlled = prevIsControlledRef.current;\n\n if (!isControlled && (allowMultiple !== prevAllowMultiple || wasControlled !== isControlled)) {\n setInternalValues(prev => clampValues(prev, allowMultiple));\n }\n\n prevAllowMultipleRef.current = allowMultiple;\n prevIsControlledRef.current = isControlled;\n }, [allowMultiple, isControlled]);\n\n const handleValueChange = useCallback(\n (next: ExpansionPanelValue[]) => {\n if (!isControlled) {\n setInternalValues(next);\n }\n\n if (onChange) {\n if (allowMultiple) {\n (onChange as NonNullable<ExpansionPanelMultipleProps['onChange']>)(next);\n } else {\n (onChange as NonNullable<ExpansionPanelSingleProps['onChange']>)(next[0] ?? null);\n }\n }\n },\n [allowMultiple, isControlled, onChange]\n );\n\n const handleToggle = useCallback(\n (panelValue: ExpansionPanelValue, disabled?: boolean) => {\n if (disabled) {\n return;\n }\n\n const expandedValues = isControlled ? normalizeValues(value, allowMultiple) : internalValues;\n const isActive = expandedValues.includes(panelValue);\n const next = allowMultiple\n ? isActive\n ? expandedValues.filter(v => v !== panelValue)\n : [...expandedValues, panelValue]\n : isActive\n ? []\n : [panelValue];\n\n handleValueChange(next);\n },\n [allowMultiple, handleValueChange, internalValues, isControlled, value]\n );\n\n const expandedValues = useMemo(\n () => (isControlled ? normalizeValues(value, allowMultiple) : internalValues),\n [allowMultiple, internalValues, isControlled, value]\n );\n\n const providerValue = useMemo(\n () => ({\n expandedValues,\n toggle: handleToggle,\n density,\n color,\n divider,\n rounded,\n variant\n }),\n [color, density, divider, expandedValues, handleToggle, rounded, variant]\n );\n\n const variantClass = divider ? variantContainerClasses[variant] : 'bg-transparent border border-transparent shadow-none';\n const shapeClass = roundedClasses[rounded] ?? roundedClasses.lg;\n const layoutClass = divider ? 'divide-y divide-gray-100 overflow-hidden' : 'gap-4';\n\n const enhancedChildren = injectExpansionPanelContext(children, providerValue);\n\n return (\n <div\n {...rest}\n ref={forwardedRef}\n className={twMerge('expansion-panel flex w-full flex-col text-gray-900', variantClass, shapeClass, layoutClass, className)}\n >\n {enhancedChildren}\n </div>\n );\n};\n\nconst ExpansionPanel = forwardRef<HTMLDivElement, ExpansionPanelProps>(ExpansionPanelInner);\n\nExpansionPanel.displayName = 'ExpansionPanel';\n\nexport { ExpansionPanelItem };\nexport type {\n ExpansionPanelItemProps,\n ExpansionPanelProps,\n ExpansionPanelValue,\n ExpansionPanelVariant,\n ExpansionPanelDensity,\n ExpansionPanelRounded\n} from './types.expansion-panel';\nexport default ExpansionPanel;\n"]}