@lindle/linoardo 1.0.42 → 1.0.44
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.
- package/dist/{ExpansionPanelItem-CEhDj2Uw.d.cts → ExpansionPanelItem-B9srsYMI.d.cts} +0 -1
- package/dist/{ExpansionPanelItem-C4-2nlhq.d.ts → ExpansionPanelItem-DYcbxZnv.d.ts} +0 -1
- package/dist/chunk-F3PI7A6V.js +200 -0
- package/dist/chunk-F3PI7A6V.js.map +1 -0
- package/dist/chunk-FJNKMRYQ.js +85 -0
- package/dist/chunk-FJNKMRYQ.js.map +1 -0
- package/dist/{chunk-KRYWWWXR.js → chunk-RG5FCFLX.js} +25 -52
- package/dist/chunk-RG5FCFLX.js.map +1 -0
- package/dist/expansion-panel/item.cjs +22 -49
- package/dist/expansion-panel/item.cjs.map +1 -1
- package/dist/expansion-panel/item.d.cts +1 -1
- package/dist/expansion-panel/item.d.ts +1 -1
- package/dist/expansion-panel/item.js +1 -1
- package/dist/expansion-panel.cjs +37 -109
- package/dist/expansion-panel.cjs.map +1 -1
- package/dist/expansion-panel.d.cts +8 -5
- package/dist/expansion-panel.d.ts +8 -5
- package/dist/expansion-panel.js +2 -2
- package/dist/index.cjs +276 -216
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -3
- package/dist/index.d.ts +23 -3
- package/dist/index.js +123 -13
- package/dist/index.js.map +1 -1
- package/dist/select.cjs +128 -105
- package/dist/select.cjs.map +1 -1
- package/dist/select.d.cts +1 -0
- package/dist/select.d.ts +1 -0
- package/dist/select.js +1 -1
- package/dist/styles.css +72 -11
- package/package.json +3 -2
- package/dist/chunk-HBF4S2KY.js +0 -131
- package/dist/chunk-HBF4S2KY.js.map +0 -1
- package/dist/chunk-KRYWWWXR.js.map +0 -1
- package/dist/chunk-LULQOD2K.js +0 -177
- package/dist/chunk-LULQOD2K.js.map +0 -1
|
@@ -28,7 +28,6 @@ interface ExpansionPanelMultipleProps extends ExpansionPanelSharedProps {
|
|
|
28
28
|
type ExpansionPanelProps = ExpansionPanelSingleProps | ExpansionPanelMultipleProps;
|
|
29
29
|
interface ExpansionPanelContextValue {
|
|
30
30
|
expandedValues: ExpansionPanelValue[];
|
|
31
|
-
toggle: (value: ExpansionPanelValue, disabled?: boolean) => void;
|
|
32
31
|
density: ExpansionPanelDensity;
|
|
33
32
|
color: Palette;
|
|
34
33
|
divider: boolean;
|
|
@@ -28,7 +28,6 @@ interface ExpansionPanelMultipleProps extends ExpansionPanelSharedProps {
|
|
|
28
28
|
type ExpansionPanelProps = ExpansionPanelSingleProps | ExpansionPanelMultipleProps;
|
|
29
29
|
interface ExpansionPanelContextValue {
|
|
30
30
|
expandedValues: ExpansionPanelValue[];
|
|
31
|
-
toggle: (value: ExpansionPanelValue, disabled?: boolean) => void;
|
|
32
31
|
density: ExpansionPanelDensity;
|
|
33
32
|
color: Palette;
|
|
34
33
|
divider: boolean;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { generateString } from './chunk-6SKW43XI.js';
|
|
2
|
+
import { iconBaseClasses } from './chunk-IEILIKS2.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var baseClass = "select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400";
|
|
8
|
+
var variantClasses = {
|
|
9
|
+
solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
|
|
10
|
+
sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
|
|
11
|
+
outline: "rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40",
|
|
12
|
+
text: "rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70",
|
|
13
|
+
ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25",
|
|
14
|
+
filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30",
|
|
15
|
+
underlined: "rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-300 dark:focus-visible:border-primary/70",
|
|
16
|
+
rounded: "rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20"
|
|
17
|
+
};
|
|
18
|
+
var sizeClasses = {
|
|
19
|
+
"x-small": { padding: "pl-2 pr-8 py-2", text: "text-xs" },
|
|
20
|
+
small: { padding: "pl-2.5 pr-9 py-2.5", text: "text-sm" },
|
|
21
|
+
medium: { padding: "pl-3 pr-10 py-3", text: "text-base" },
|
|
22
|
+
large: { padding: "pl-3.5 pr-11 py-3.5", text: "text-lg" },
|
|
23
|
+
"x-large": { padding: "pl-4 pr-12 py-4", text: "text-xl" }
|
|
24
|
+
};
|
|
25
|
+
var normalizeOption = (option) => {
|
|
26
|
+
if (typeof option === "string") {
|
|
27
|
+
return { label: option, value: option };
|
|
28
|
+
}
|
|
29
|
+
return option;
|
|
30
|
+
};
|
|
31
|
+
var toIdSafe = (value) => {
|
|
32
|
+
const sanitized = value.replace(/\s+/g, "-").replace(/[^A-Za-z0-9_-]/g, "");
|
|
33
|
+
return sanitized || "opt";
|
|
34
|
+
};
|
|
35
|
+
var resolveIconClassName = (icon) => {
|
|
36
|
+
if (!icon) {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
if (typeof icon === "string") {
|
|
40
|
+
const trimmed = icon.trim();
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
return void 0;
|
|
43
|
+
}
|
|
44
|
+
if (trimmed.includes(" ")) {
|
|
45
|
+
return trimmed;
|
|
46
|
+
}
|
|
47
|
+
const normalizedName2 = trimmed.startsWith("mdi-") ? trimmed : `mdi-${trimmed}`;
|
|
48
|
+
return ["mdi", normalizedName2].join(" ");
|
|
49
|
+
}
|
|
50
|
+
const [library, iconNameRaw] = icon;
|
|
51
|
+
const baseClasses = iconBaseClasses[library] ?? [library];
|
|
52
|
+
const iconName = iconNameRaw.trim();
|
|
53
|
+
if (!iconName) {
|
|
54
|
+
return baseClasses.join(" ");
|
|
55
|
+
}
|
|
56
|
+
const normalizedName = iconName.startsWith("mdi-") ? iconName : `mdi-${iconName}`;
|
|
57
|
+
const classes = [...baseClasses, normalizedName];
|
|
58
|
+
return Array.from(new Set(classes)).join(" ");
|
|
59
|
+
};
|
|
60
|
+
var Select = React.forwardRef(
|
|
61
|
+
({
|
|
62
|
+
options,
|
|
63
|
+
label,
|
|
64
|
+
placeholder,
|
|
65
|
+
variant = "outline",
|
|
66
|
+
size = "medium",
|
|
67
|
+
className,
|
|
68
|
+
wrapperClassName,
|
|
69
|
+
id,
|
|
70
|
+
name,
|
|
71
|
+
multiple,
|
|
72
|
+
value,
|
|
73
|
+
defaultValue,
|
|
74
|
+
error,
|
|
75
|
+
helperText,
|
|
76
|
+
disabled,
|
|
77
|
+
required,
|
|
78
|
+
onChange,
|
|
79
|
+
onBlur,
|
|
80
|
+
onFocus,
|
|
81
|
+
...props
|
|
82
|
+
}, ref) => {
|
|
83
|
+
const selectId = id || name || generateString();
|
|
84
|
+
const inputName = name || selectId;
|
|
85
|
+
const variantClass = variantClasses[variant] ?? variantClasses.outline;
|
|
86
|
+
const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;
|
|
87
|
+
const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;
|
|
88
|
+
const normalizedOptions = options.map(normalizeOption);
|
|
89
|
+
const selectedValueList = value !== void 0 ? (Array.isArray(value) ? value : [value]).map(String) : defaultValue !== void 0 ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]).map(String) : [];
|
|
90
|
+
const selectedLabels = normalizedOptions.filter((option) => selectedValueList.includes(String(option.value))).map((option) => option.label);
|
|
91
|
+
const hasSelection = selectedLabels.length > 0;
|
|
92
|
+
const summaryText = hasSelection ? multiple ? selectedLabels.join(", ") : selectedLabels[0] : placeholder || "\xA0";
|
|
93
|
+
const handleOptionChange = (event) => {
|
|
94
|
+
onChange?.(event);
|
|
95
|
+
if (multiple) return;
|
|
96
|
+
const detailsEl = event.currentTarget.closest("details");
|
|
97
|
+
detailsEl?.removeAttribute("open");
|
|
98
|
+
};
|
|
99
|
+
const handleDetailsBlur = (event) => {
|
|
100
|
+
const nextFocus = event.relatedTarget;
|
|
101
|
+
if (nextFocus && event.currentTarget.contains(nextFocus)) return;
|
|
102
|
+
event.currentTarget.removeAttribute("open");
|
|
103
|
+
};
|
|
104
|
+
const handleDetailsFocus = (event) => {
|
|
105
|
+
if (normalizedOptions.length === 0) {
|
|
106
|
+
onFocus?.(event);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
return /* @__PURE__ */ jsxs("div", { className: twMerge("flex flex-col gap-1", wrapperClassName), children: [
|
|
110
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
111
|
+
/* @__PURE__ */ jsxs(
|
|
112
|
+
"details",
|
|
113
|
+
{
|
|
114
|
+
className: "group w-full",
|
|
115
|
+
...props,
|
|
116
|
+
onBlur: onBlur ? void 0 : handleDetailsBlur,
|
|
117
|
+
onFocus: onFocus ? handleDetailsFocus : void 0,
|
|
118
|
+
open: void 0,
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ jsxs(
|
|
121
|
+
"summary",
|
|
122
|
+
{
|
|
123
|
+
className: twMerge(
|
|
124
|
+
baseClass,
|
|
125
|
+
variantClass,
|
|
126
|
+
sizeClass,
|
|
127
|
+
"list-none cursor-pointer flex items-center justify-between pr-10 relative [&::-webkit-details-marker]:hidden",
|
|
128
|
+
error && "border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500",
|
|
129
|
+
disabled && "pointer-events-none opacity-50 cursor-not-allowed",
|
|
130
|
+
className
|
|
131
|
+
),
|
|
132
|
+
style: { minHeight: "2.75rem" },
|
|
133
|
+
onClick: (e) => disabled && e.preventDefault(),
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ jsx("span", { className: twMerge("truncate", !hasSelection && "text-gray-500 dark:text-gray-400"), children: summaryText }),
|
|
136
|
+
/* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300", children: /* @__PURE__ */ jsx("i", { className: "mdi mdi-chevron-down text-base leading-none transition-transform duration-200 group-open:rotate-180", "aria-hidden": true }) })
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
/* @__PURE__ */ jsx("div", { className: "absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-slate-800 dark:border-slate-700", children: normalizedOptions.map((option, index) => {
|
|
141
|
+
const optionValueStr = String(option.value);
|
|
142
|
+
const isSelected = Array.isArray(value) ? value.map(String).includes(optionValueStr) : String(value) === optionValueStr;
|
|
143
|
+
const isDefaultSelected = Array.isArray(defaultValue) ? defaultValue.map(String).includes(optionValueStr) : String(defaultValue) === optionValueStr;
|
|
144
|
+
const iconClassName = resolveIconClassName(option.icon);
|
|
145
|
+
const inputId = `${selectId}-${toIdSafe(optionValueStr)}-${index}`;
|
|
146
|
+
return /* @__PURE__ */ jsxs(
|
|
147
|
+
"label",
|
|
148
|
+
{
|
|
149
|
+
htmlFor: inputId,
|
|
150
|
+
className: twMerge(
|
|
151
|
+
"relative flex cursor-pointer select-none items-center gap-2 px-4 py-2 text-sm text-gray-900 hover:bg-gray-50 dark:text-gray-100 dark:hover:bg-slate-700",
|
|
152
|
+
option.disabled && "cursor-not-allowed opacity-50"
|
|
153
|
+
),
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ jsx(
|
|
156
|
+
"input",
|
|
157
|
+
{
|
|
158
|
+
type: multiple ? "checkbox" : "radio",
|
|
159
|
+
id: inputId,
|
|
160
|
+
name: inputName,
|
|
161
|
+
value: option.value,
|
|
162
|
+
disabled: option.disabled || disabled,
|
|
163
|
+
checked: value !== void 0 ? isSelected : void 0,
|
|
164
|
+
defaultChecked: defaultValue !== void 0 ? isDefaultSelected : void 0,
|
|
165
|
+
onChange: handleOptionChange,
|
|
166
|
+
onBlur,
|
|
167
|
+
ref,
|
|
168
|
+
required: required && !multiple,
|
|
169
|
+
className: "peer sr-only"
|
|
170
|
+
}
|
|
171
|
+
),
|
|
172
|
+
iconClassName && /* @__PURE__ */ jsx("i", { className: twMerge(iconClassName, "text-lg text-gray-500 peer-checked:text-primary dark:text-gray-400") }),
|
|
173
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 truncate peer-checked:font-medium peer-checked:text-primary", children: option.label }),
|
|
174
|
+
/* @__PURE__ */ jsx("i", { className: "mdi mdi-check invisible ml-auto text-primary peer-checked:visible" })
|
|
175
|
+
]
|
|
176
|
+
},
|
|
177
|
+
`${optionValueStr}-${index}`
|
|
178
|
+
);
|
|
179
|
+
}) })
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
),
|
|
183
|
+
label && /* @__PURE__ */ jsx(
|
|
184
|
+
"label",
|
|
185
|
+
{
|
|
186
|
+
className: twMerge("absolute left-3 -top-1.5 text-xs bg-white px-1 text-gray-500 transition-all dark:bg-slate-900 dark:text-gray-400"),
|
|
187
|
+
children: label
|
|
188
|
+
}
|
|
189
|
+
)
|
|
190
|
+
] }),
|
|
191
|
+
helperText && /* @__PURE__ */ jsx("p", { className: twMerge("mt-1 text-xs text-gray-500", error && "text-red-500"), children: helperText })
|
|
192
|
+
] });
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
Select.displayName = "Select";
|
|
196
|
+
var Select_default = Select;
|
|
197
|
+
|
|
198
|
+
export { Select_default };
|
|
199
|
+
//# sourceMappingURL=chunk-F3PI7A6V.js.map
|
|
200
|
+
//# sourceMappingURL=chunk-F3PI7A6V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Form/Select/index.tsx"],"names":["normalizedName"],"mappings":"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","file":"chunk-F3PI7A6V.js","sourcesContent":["import React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { iconBaseClasses } from '@lindle/linoardo/globals';\nimport type { GlobalSize, PropIcon } from '@lindle/linoardo/global.types';\nimport type { InputVariant } from '../Input/types';\nimport { generateString } from '../../utils/helpers/randomStr';\n\nexport interface SelectOptionObject {\n value: string | number;\n label: string;\n disabled?: boolean;\n icon?: PropIcon;\n}\n\nexport type SelectOption = SelectOptionObject | string;\n\nexport interface SelectProps extends Omit<React.DetailsHTMLAttributes<HTMLDetailsElement>, 'onBlur' | 'onChange' | 'value' | 'defaultValue'> {\n options: SelectOption[];\n label?: string;\n placeholder?: string;\n variant?: InputVariant;\n size?: GlobalSize;\n wrapperClassName?: string;\n error?: boolean;\n helperText?: string;\n value?: string | number | readonly string[];\n defaultValue?: string | number | readonly string[];\n name?: string;\n multiple?: boolean;\n disabled?: boolean;\n required?: boolean;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n onFocus?: React.FocusEventHandler<HTMLDetailsElement>;\n}\n\nconst baseClass =\n 'select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400';\n\nconst variantClasses = {\n solid:\n 'rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n sharp:\n 'rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n outline:\n 'rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40',\n text: 'rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\n ghost:\n 'rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30',\n underlined:\n 'rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-300 dark:focus-visible:border-primary/70',\n rounded:\n 'rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20'\n} satisfies Record<InputVariant, string>;\n\nconst sizeClasses = {\n 'x-small': { padding: 'pl-2 pr-8 py-2', text: 'text-xs' },\n small: { padding: 'pl-2.5 pr-9 py-2.5', text: 'text-sm' },\n medium: { padding: 'pl-3 pr-10 py-3', text: 'text-base' },\n large: { padding: 'pl-3.5 pr-11 py-3.5', text: 'text-lg' },\n 'x-large': { padding: 'pl-4 pr-12 py-4', text: 'text-xl' }\n} satisfies Record<GlobalSize, { padding: string; text: string }>;\n\nconst normalizeOption = (option: SelectOption): SelectOptionObject => {\n if (typeof option === 'string') {\n return { label: option, value: option };\n }\n return option;\n};\n\nconst toIdSafe = (value: string) => {\n const sanitized = value.replace(/\\s+/g, '-').replace(/[^A-Za-z0-9_-]/g, '');\n return sanitized || 'opt';\n};\n\nconst resolveIconClassName = (icon?: PropIcon) => {\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 normalizedName = trimmed.startsWith('mdi-') ? trimmed : `mdi-${trimmed}`;\n return ['mdi', normalizedName].join(' ');\n }\n\n const [library, iconNameRaw] = icon;\n const baseClasses = iconBaseClasses[library] ?? [library];\n const iconName = iconNameRaw.trim();\n if (!iconName) {\n return baseClasses.join(' ');\n }\n\n const normalizedName = iconName.startsWith('mdi-') ? iconName : `mdi-${iconName}`;\n const classes = [...baseClasses, normalizedName];\n return Array.from(new Set(classes)).join(' ');\n};\n\n/**\n * Custom styled Select component using <details> and radio/checkbox inputs.\n * Supports icons and custom styling while remaining a Server Component (no hooks).\n */\nconst Select = React.forwardRef<HTMLInputElement, SelectProps>(\n (\n {\n options,\n label,\n placeholder,\n variant = 'outline',\n size = 'medium',\n className,\n wrapperClassName,\n id,\n name,\n multiple,\n value,\n defaultValue,\n error,\n helperText,\n disabled,\n required,\n onChange,\n onBlur,\n onFocus,\n ...props\n },\n ref\n ) => {\n const selectId = id || name || generateString();\n const inputName = name || selectId;\n const variantClass = variantClasses[variant] ?? variantClasses.outline;\n const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;\n const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;\n const normalizedOptions = options.map(normalizeOption);\n const selectedValueList =\n value !== undefined\n ? (Array.isArray(value) ? value : [value]).map(String)\n : defaultValue !== undefined\n ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]).map(String)\n : [];\n const selectedLabels = normalizedOptions.filter(option => selectedValueList.includes(String(option.value))).map(option => option.label);\n const hasSelection = selectedLabels.length > 0;\n const summaryText = hasSelection ? (multiple ? selectedLabels.join(', ') : selectedLabels[0]) : placeholder || '\\u00A0';\n const handleOptionChange: React.ChangeEventHandler<HTMLInputElement> = event => {\n onChange?.(event);\n if (multiple) return;\n const detailsEl = event.currentTarget.closest('details');\n detailsEl?.removeAttribute('open');\n };\n const handleDetailsBlur: React.FocusEventHandler<HTMLDetailsElement> = event => {\n const nextFocus = event.relatedTarget as Node | null;\n if (nextFocus && event.currentTarget.contains(nextFocus)) return;\n event.currentTarget.removeAttribute('open');\n };\n const handleDetailsFocus: React.FocusEventHandler<HTMLDetailsElement> = event => {\n if (normalizedOptions.length === 0) {\n onFocus?.(event);\n }\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative'>\n <details\n className='group w-full'\n {...props}\n onBlur={onBlur ? undefined : handleDetailsBlur}\n onFocus={onFocus ? handleDetailsFocus : undefined}\n open={undefined}\n >\n <summary\n className={twMerge(\n baseClass,\n variantClass,\n sizeClass,\n 'list-none cursor-pointer flex items-center justify-between pr-10 relative [&::-webkit-details-marker]:hidden',\n error && 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500',\n disabled && 'pointer-events-none opacity-50 cursor-not-allowed',\n className\n )}\n style={{ minHeight: '2.75rem' }}\n onClick={e => disabled && e.preventDefault()}\n >\n <span className={twMerge('truncate', !hasSelection && 'text-gray-500 dark:text-gray-400')}>{summaryText}</span>\n <span className='pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300'>\n <i className='mdi mdi-chevron-down text-base leading-none transition-transform duration-200 group-open:rotate-180' aria-hidden />\n </span>\n </summary>\n\n <div className='absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-slate-800 dark:border-slate-700'>\n {normalizedOptions.map((option, index) => {\n const optionValueStr = String(option.value);\n const isSelected = Array.isArray(value) ? value.map(String).includes(optionValueStr) : String(value) === optionValueStr;\n const isDefaultSelected = Array.isArray(defaultValue)\n ? defaultValue.map(String).includes(optionValueStr)\n : String(defaultValue) === optionValueStr;\n const iconClassName = resolveIconClassName(option.icon);\n const inputId = `${selectId}-${toIdSafe(optionValueStr)}-${index}`;\n\n return (\n <label\n key={`${optionValueStr}-${index}`}\n htmlFor={inputId}\n className={twMerge(\n 'relative flex cursor-pointer select-none items-center gap-2 px-4 py-2 text-sm text-gray-900 hover:bg-gray-50 dark:text-gray-100 dark:hover:bg-slate-700',\n option.disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n <input\n type={multiple ? 'checkbox' : 'radio'}\n id={inputId}\n name={inputName}\n value={option.value}\n disabled={option.disabled || disabled}\n checked={value !== undefined ? isSelected : undefined}\n defaultChecked={defaultValue !== undefined ? isDefaultSelected : undefined}\n onChange={handleOptionChange}\n onBlur={onBlur}\n ref={ref}\n required={required && !multiple}\n className='peer sr-only'\n />\n {iconClassName && <i className={twMerge(iconClassName, 'text-lg text-gray-500 peer-checked:text-primary dark:text-gray-400')} />}\n <span className='flex-1 truncate peer-checked:font-medium peer-checked:text-primary'>{option.label}</span>\n <i className='mdi mdi-check invisible ml-auto text-primary peer-checked:visible' />\n </label>\n );\n })}\n </div>\n </details>\n\n {label && (\n <label\n className={twMerge('absolute left-3 -top-1.5 text-xs bg-white px-1 text-gray-500 transition-all dark:bg-slate-900 dark:text-gray-400')}\n >\n {label}\n </label>\n )}\n </div>\n {helperText && <p className={twMerge('mt-1 text-xs text-gray-500', error && 'text-red-500')}>{helperText}</p>}\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n\nexport default Select;\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ExpansionPanelItem_default, injectExpansionPanelContext } from './chunk-RG5FCFLX.js';
|
|
2
|
+
import { forwardRef } 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 ExpansionPanelInner = (props, forwardedRef) => {
|
|
31
|
+
const {
|
|
32
|
+
variant = "elevated",
|
|
33
|
+
rounded = "lg",
|
|
34
|
+
density = "default",
|
|
35
|
+
color = "primary",
|
|
36
|
+
divider = true,
|
|
37
|
+
multiple = false,
|
|
38
|
+
className,
|
|
39
|
+
children,
|
|
40
|
+
value,
|
|
41
|
+
defaultValue,
|
|
42
|
+
onChange,
|
|
43
|
+
...rest
|
|
44
|
+
} = props;
|
|
45
|
+
const allowMultiple = multiple ?? false;
|
|
46
|
+
const resolvedValue = value !== void 0 ? value : defaultValue;
|
|
47
|
+
const expandedValues = normalizeValues(resolvedValue, allowMultiple);
|
|
48
|
+
const providerValue = {
|
|
49
|
+
expandedValues,
|
|
50
|
+
density,
|
|
51
|
+
color,
|
|
52
|
+
divider,
|
|
53
|
+
rounded,
|
|
54
|
+
variant
|
|
55
|
+
};
|
|
56
|
+
const variantClass = divider ? variantContainerClasses[variant] : "bg-transparent border border-transparent shadow-none";
|
|
57
|
+
const shapeClass = roundedClasses[rounded] ?? roundedClasses.lg;
|
|
58
|
+
const layoutClass = divider ? "divide-y divide-gray-100 overflow-hidden" : "gap-4";
|
|
59
|
+
const enhancedChildren = injectExpansionPanelContext(children, providerValue);
|
|
60
|
+
return /* @__PURE__ */ jsx(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
...rest,
|
|
64
|
+
ref: forwardedRef,
|
|
65
|
+
className: twMerge(
|
|
66
|
+
"expansion-panel flex w-full flex-col text-gray-900",
|
|
67
|
+
variantClass,
|
|
68
|
+
shapeClass,
|
|
69
|
+
layoutClass,
|
|
70
|
+
className
|
|
71
|
+
),
|
|
72
|
+
children: enhancedChildren
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
};
|
|
76
|
+
var ExpansionPanelBase = forwardRef(ExpansionPanelInner);
|
|
77
|
+
var ExpansionPanel = Object.assign(ExpansionPanelBase, {
|
|
78
|
+
Item: ExpansionPanelItem_default
|
|
79
|
+
});
|
|
80
|
+
ExpansionPanel.displayName = "ExpansionPanel";
|
|
81
|
+
var ExpansionPanel_default = ExpansionPanel;
|
|
82
|
+
|
|
83
|
+
export { ExpansionPanel_default };
|
|
84
|
+
//# sourceMappingURL=chunk-FJNKMRYQ.js.map
|
|
85
|
+
//# sourceMappingURL=chunk-FJNKMRYQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Containment/ExpansionPanel/index.tsx"],"names":[],"mappings":";;;;;AAcA,IAAM,uBAAA,GAAiE;AAAA,EACrE,QAAA,EAAU,8DAAA;AAAA,EACV,QAAA,EAAU,iCAAA;AAAA,EACV,KAAA,EAAO,mCAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,cAAA,GAAwD;AAAA,EAC5D,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,MAAA,KAAkC,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAElF,IAAM,eAAA,GAAkB,CACtB,KAAA,EACA,aAAA,KAC0B;AAC1B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACxD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,aAAa,UAAU,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,WAAW,MAAA,GAAS,CAAC,WAAW,CAAC,CAAC,IAAI,EAAC;AAChD,CAAA;AAKA,IAAM,mBAAA,GAAsB,CAC1B,KAAA,EACA,YAAA,KACG;AACH,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,UAAA;AAAA,IACV,OAAA,GAAU,IAAA;AAAA,IACV,OAAA,GAAU,SAAA;AAAA,IACV,KAAA,GAAQ,SAAA;AAAA,IACR,OAAA,GAAU,IAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,gBAAgB,QAAA,IAAY,KAAA;AAClC,EAAA,MAAM,aAAA,GAAgB,KAAA,KAAU,MAAA,GAAY,KAAA,GAAQ,YAAA;AACpD,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,aAAA,EAAe,aAAa,CAAA;AAEnE,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,cAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA,GACjB,uBAAA,CAAwB,OAAO,CAAA,GAC/B,sDAAA;AACJ,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,OAAO,CAAA,IAAK,cAAA,CAAe,EAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,UAAU,0CAAA,GAA6C,OAAA;AAE3E,EAAA,MAAM,gBAAA,GAAmB,2BAAA,CAA4B,QAAA,EAAU,aAAa,CAAA;AAE5E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,OAAA;AAAA,QACT,oDAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AAQA,IAAM,kBAAA,GAAqB,WAAgD,mBAAmB,CAAA;AAE9F,IAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,kBAAA,EAAoB;AAAA,EACvD,IAAA,EAAM;AACR,CAAC,CAAA;AAED,cAAA,CAAe,WAAA,GAAc,gBAAA;AAW7B,IAAO,sBAAA,GAAQ","file":"chunk-FJNKMRYQ.js","sourcesContent":["import { forwardRef } from 'react';\nimport type { ForwardRefExoticComponent, RefAttributes } 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} 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\n/**\n * Accordion-style container that provides contextual styling and initial expanded state.\n */\nconst ExpansionPanelInner = (\n props: ExpansionPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) => {\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 resolvedValue = value !== undefined ? value : defaultValue;\n const expandedValues = normalizeValues(resolvedValue, allowMultiple);\n\n const providerValue = {\n expandedValues,\n density,\n color,\n divider,\n rounded,\n variant\n };\n\n const variantClass = divider\n ? variantContainerClasses[variant]\n : '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(\n 'expansion-panel flex w-full flex-col text-gray-900',\n variantClass,\n shapeClass,\n layoutClass,\n className\n )}\n >\n {enhancedChildren}\n </div>\n );\n};\n\ntype ExpansionPanelComponent = ForwardRefExoticComponent<\n ExpansionPanelProps & RefAttributes<HTMLDivElement>\n> & {\n Item: typeof ExpansionPanelItem;\n};\n\nconst ExpansionPanelBase = forwardRef<HTMLDivElement, ExpansionPanelProps>(ExpansionPanelInner);\n\nconst ExpansionPanel = Object.assign(ExpansionPanelBase, {\n Item: ExpansionPanelItem\n}) as ExpansionPanelComponent;\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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { forwardRef,
|
|
1
|
+
import { forwardRef, isValidElement, cloneElement } from 'react';
|
|
2
2
|
import { twMerge } from 'tailwind-merge';
|
|
3
3
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -107,31 +107,17 @@ var ExpansionPanelItemInner = (props) => {
|
|
|
107
107
|
__expansionPanelContext,
|
|
108
108
|
...rest
|
|
109
109
|
} = props;
|
|
110
|
-
const [standaloneExpanded, setStandaloneExpanded] = useState(false);
|
|
111
|
-
const generatedValueRef = useRef(null);
|
|
112
|
-
if (generatedValueRef.current === null) {
|
|
113
|
-
generatedValueRef.current = generateId("expansion-panel-value");
|
|
114
|
-
}
|
|
115
|
-
const generatedValue = generatedValueRef.current;
|
|
116
|
-
const headerIdRef = useRef(null);
|
|
117
|
-
if (!headerIdRef.current) {
|
|
118
|
-
headerIdRef.current = generateId("expansion-panel-header");
|
|
119
|
-
}
|
|
120
|
-
const headerId = headerIdRef.current;
|
|
121
|
-
const contentIdRef = useRef(null);
|
|
122
|
-
if (!contentIdRef.current) {
|
|
123
|
-
contentIdRef.current = generateId("expansion-panel-content");
|
|
124
|
-
}
|
|
125
|
-
const contentId = contentIdRef.current;
|
|
126
110
|
const context = __expansionPanelContext ?? null;
|
|
127
|
-
const
|
|
111
|
+
const safeValue = typeof value === "string" || typeof value === "number" ? String(value) : null;
|
|
112
|
+
const idBase = safeValue ?? generateId("expansion-panel");
|
|
113
|
+
const inputId = `expansion-panel-toggle-${idBase}`;
|
|
128
114
|
const density = context?.density ?? "default";
|
|
129
115
|
const color = colorOverride ?? context?.color ?? "primary";
|
|
130
116
|
const divider = context?.divider ?? true;
|
|
131
117
|
const variant = context?.variant ?? "elevated";
|
|
132
118
|
const rounded = context?.rounded ?? "lg";
|
|
133
119
|
const accent = accentClasses[color] ?? accentClasses.primary;
|
|
134
|
-
const isExpanded =
|
|
120
|
+
const isExpanded = value !== null && value !== void 0 ? context?.expandedValues.includes(value) ?? false : false;
|
|
135
121
|
const rootSurface = divider ? "bg-transparent border-0 shadow-none" : itemVariantClasses[variant];
|
|
136
122
|
const shapeClass = divider ? void 0 : roundedClasses[rounded] ?? roundedClasses.lg;
|
|
137
123
|
const densityPadding = densityClasses[density] ?? densityClasses.default;
|
|
@@ -149,30 +135,19 @@ var ExpansionPanelItemInner = (props) => {
|
|
|
149
135
|
}
|
|
150
136
|
);
|
|
151
137
|
const hasContent = Boolean(children ?? text);
|
|
152
|
-
const contentAnimationClass = isExpanded ? "pb-5 opacity-100" : "pb-0 opacity-0";
|
|
153
138
|
const toggleIconNode = hideToggleIcon ? null : isExpanded && collapseIcon ? collapseIcon : expandIcon ?? defaultToggleIcon;
|
|
154
139
|
const shouldRotateDefaultIcon = !expandIcon && !collapseIcon && !hideToggleIcon;
|
|
155
140
|
const toggleWrapperClass = twMerge(
|
|
156
|
-
"ml-3 flex h-6 w-6 items-center justify-center text-gray-500 transition-transform duration-200",
|
|
141
|
+
"expansion-panel-item__icon ml-3 flex h-6 w-6 items-center justify-center text-gray-500 transition-transform duration-200",
|
|
157
142
|
shouldRotateDefaultIcon && isExpanded ? "rotate-180" : void 0
|
|
158
143
|
);
|
|
159
|
-
const handleToggle = () => {
|
|
160
|
-
if (disabled) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (context) {
|
|
164
|
-
context.toggle(panelValue, disabled);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
setStandaloneExpanded((prev) => !prev);
|
|
168
|
-
};
|
|
169
144
|
return /* @__PURE__ */ jsxs(
|
|
170
145
|
"div",
|
|
171
146
|
{
|
|
172
147
|
...rest,
|
|
173
148
|
ref: forwardedRef,
|
|
174
149
|
className: twMerge(
|
|
175
|
-
"expansion-panel-item flex flex-col overflow-hidden transition-colors duration-200",
|
|
150
|
+
"expansion-panel-item group flex flex-col overflow-hidden transition-colors duration-200",
|
|
176
151
|
rootSurface,
|
|
177
152
|
shapeClass,
|
|
178
153
|
className
|
|
@@ -180,22 +155,28 @@ var ExpansionPanelItemInner = (props) => {
|
|
|
180
155
|
"data-state": isExpanded ? "open" : "closed",
|
|
181
156
|
"data-disabled": disabled || void 0,
|
|
182
157
|
children: [
|
|
158
|
+
/* @__PURE__ */ jsx(
|
|
159
|
+
"input",
|
|
160
|
+
{
|
|
161
|
+
id: inputId,
|
|
162
|
+
type: "checkbox",
|
|
163
|
+
className: "expansion-panel-item__toggle",
|
|
164
|
+
defaultChecked: isExpanded,
|
|
165
|
+
disabled
|
|
166
|
+
}
|
|
167
|
+
),
|
|
183
168
|
/* @__PURE__ */ jsxs(
|
|
184
|
-
"
|
|
169
|
+
"label",
|
|
185
170
|
{
|
|
186
|
-
|
|
187
|
-
id: headerId,
|
|
188
|
-
onClick: handleToggle,
|
|
189
|
-
disabled,
|
|
190
|
-
"aria-expanded": isExpanded,
|
|
191
|
-
"aria-controls": hasContent ? contentId : void 0,
|
|
171
|
+
htmlFor: inputId,
|
|
192
172
|
className: twMerge(
|
|
193
|
-
"flex w-full items-center gap-4 px-4 text-left
|
|
173
|
+
"expansion-panel-item__header flex w-full list-none items-center gap-4 px-4 text-left",
|
|
194
174
|
densityPadding,
|
|
195
175
|
disabledClass,
|
|
196
176
|
isExpanded ? accent.bg : void 0,
|
|
197
177
|
headerClassName
|
|
198
178
|
),
|
|
179
|
+
"aria-disabled": disabled || void 0,
|
|
199
180
|
"data-state": isExpanded ? "open" : "closed",
|
|
200
181
|
children: [
|
|
201
182
|
prepend && /* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 items-center justify-center text-gray-500", children: prepend }),
|
|
@@ -211,22 +192,14 @@ var ExpansionPanelItemInner = (props) => {
|
|
|
211
192
|
hasContent && /* @__PURE__ */ jsx(
|
|
212
193
|
"div",
|
|
213
194
|
{
|
|
214
|
-
className: "
|
|
215
|
-
style: { gridTemplateRows: isExpanded ? "1fr" : "0fr" },
|
|
216
|
-
"aria-hidden": isExpanded ? void 0 : true,
|
|
195
|
+
className: "expansion-panel-item__content overflow-hidden border-t border-gray-100",
|
|
217
196
|
"data-state": isExpanded ? "open" : "closed",
|
|
218
197
|
children: /* @__PURE__ */ jsx(
|
|
219
198
|
"div",
|
|
220
199
|
{
|
|
221
|
-
id: contentId,
|
|
222
|
-
role: "region",
|
|
223
|
-
"aria-labelledby": headerId,
|
|
224
|
-
"data-state": isExpanded ? "open" : "closed",
|
|
225
200
|
className: twMerge(
|
|
226
|
-
"min-h-0 px-4 pt-0 text-sm text-gray-600
|
|
201
|
+
"expansion-panel-item__body min-h-0 px-4 pt-0 text-sm text-gray-600",
|
|
227
202
|
activeBorderClass,
|
|
228
|
-
contentAnimationClass,
|
|
229
|
-
isExpanded ? "pointer-events-auto" : "pointer-events-none",
|
|
230
203
|
contentClassName
|
|
231
204
|
),
|
|
232
205
|
children: children ?? text
|
|
@@ -244,5 +217,5 @@ markExpansionPanelItem(ExpansionPanelItem);
|
|
|
244
217
|
var ExpansionPanelItem_default = ExpansionPanelItem;
|
|
245
218
|
|
|
246
219
|
export { ExpansionPanelItem_default, injectExpansionPanelContext };
|
|
247
|
-
//# sourceMappingURL=chunk-
|
|
248
|
-
//# sourceMappingURL=chunk-
|
|
220
|
+
//# sourceMappingURL=chunk-RG5FCFLX.js.map
|
|
221
|
+
//# sourceMappingURL=chunk-RG5FCFLX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Containment/ExpansionPanel/context.ts","../src/Containment/ExpansionPanel/ExpansionPanelItem.tsx"],"names":[],"mappings":"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","file":"chunk-RG5FCFLX.js","sourcesContent":["import { cloneElement, isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport type { ExpansionPanelContextValue } from './types.expansion-panel';\n\nexport const EXPANSION_PANEL_CONTEXT_PROP = '__expansionPanelContext' as const;\nconst EXPANSION_PANEL_ITEM_MARKER = '__isExpansionPanelItem';\n\ntype MarkerTarget = Record<string | number | symbol, unknown> & {\n type?: unknown;\n};\n\ntype ElementProps = Record<string | number | symbol, unknown> & {\n children?: ReactNode;\n};\n\nconst hasMarker = (type: unknown): boolean => {\n if (!type || (typeof type !== 'function' && typeof type !== 'object')) {\n return false;\n }\n\n if ((type as MarkerTarget)[EXPANSION_PANEL_ITEM_MARKER]) {\n return true;\n }\n\n const innerType = (type as MarkerTarget).type;\n if (innerType && innerType !== type) {\n return hasMarker(innerType);\n }\n\n return false;\n};\n\nconst traverseNode = (\n node: ReactNode,\n value: ExpansionPanelContextValue\n): { node: ReactNode; changed: boolean } => {\n if (Array.isArray(node)) {\n let changed = false;\n const nextArray = node.map(child => {\n const result = traverseNode(child, value);\n if (result.changed) {\n changed = true;\n }\n return result.node;\n });\n return { node: changed ? nextArray : node, changed };\n }\n\n if (\n node === null ||\n node === undefined ||\n typeof node === 'boolean' ||\n typeof node === 'string' ||\n typeof node === 'number'\n ) {\n return { node, changed: false };\n }\n\n if (!isValidElement<ElementProps>(node)) {\n return { node, changed: false };\n }\n\n const element = node as ReactElement<ElementProps>;\n\n const { node: mappedChildren, changed: childrenChanged } = traverseNode(\n element.props.children,\n value\n );\n const shouldInject = hasMarker(element.type);\n\n if (!shouldInject && !childrenChanged) {\n return { node, changed: false };\n }\n\n const injectedProps = shouldInject\n ? ({ [EXPANSION_PANEL_CONTEXT_PROP]: value } as Partial<ElementProps>)\n : undefined;\n const cloned =\n mappedChildren === undefined\n ? cloneElement(element, injectedProps)\n : cloneElement(element, injectedProps, mappedChildren);\n\n return { node: cloned, changed: true };\n};\n\nexport const injectExpansionPanelContext = (\n children: ReactNode,\n value: ExpansionPanelContextValue\n): ReactNode => traverseNode(children, value).node;\n\nexport const markExpansionPanelItem = (component: unknown) => {\n if (typeof component !== 'function' && (typeof component !== 'object' || component === null)) {\n return;\n }\n\n (component as MarkerTarget)[EXPANSION_PANEL_ITEM_MARKER] = true;\n};\n","import { forwardRef } from 'react';\nimport type { Ref } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { markExpansionPanelItem } from './context';\nimport type {\n ExpansionPanelDensity,\n ExpansionPanelItemProps,\n ExpansionPanelContextValue\n} from './types.expansion-panel';\nimport type { Palette } from '@lindle/linoardo/global.types';\n\nconst densityClasses: Record<ExpansionPanelDensity, string> = {\n comfortable: 'py-5',\n default: 'py-4',\n compact: 'py-3'\n};\n\nconst roundedClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl'\n};\n\nconst itemVariantClasses = {\n elevated: 'bg-white border border-gray-200 shadow-sm shadow-gray-900/5',\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 accentClasses: Record<Palette, { text: string; bg: string; border: string }> = {\n primary: { text: 'text-primary', bg: 'bg-primary/5', border: 'border-primary/30' },\n neutral: { text: 'text-gray-900', bg: 'bg-gray-100', border: 'border-gray-200' },\n info: { text: 'text-sky-600', bg: 'bg-sky-50', border: 'border-sky-200' },\n success: { text: 'text-emerald-600', bg: 'bg-emerald-50', border: 'border-emerald-200' },\n warning: { text: 'text-amber-600', bg: 'bg-amber-50', border: 'border-amber-200' },\n danger: { text: 'text-red-600', bg: 'bg-red-50', border: 'border-red-200' },\n surface: { text: 'text-gray-900', bg: 'bg-gray-100', border: 'border-gray-200' },\n bw: { text: 'text-gray-900', bg: 'bg-gray-100', border: 'border-gray-200' }\n};\n\nlet uniqueIdCounter = 0;\nconst generateId = (prefix: string) => `${prefix}-${++uniqueIdCounter}`;\n\ntype ForwardedRef = Ref<HTMLDivElement>;\n\ninterface ExpansionPanelItemInnerProps extends ExpansionPanelItemProps {\n forwardedRef?: ForwardedRef;\n}\n\n/**\n * Single expandable section used inside `ExpansionPanel`, rendered with a CSS-only toggle.\n */\nconst ExpansionPanelItemInner = (props: ExpansionPanelItemInnerProps) => {\n const {\n value,\n title,\n subtitle,\n text,\n prepend,\n append,\n expandIcon,\n collapseIcon,\n hideToggleIcon = false,\n headerClassName,\n contentClassName,\n className,\n disabled = false,\n children,\n color: colorOverride,\n forwardedRef,\n __expansionPanelContext,\n ...rest\n } = props;\n\n const context: ExpansionPanelContextValue | null = __expansionPanelContext ?? null;\n const safeValue =\n typeof value === 'string' || typeof value === 'number' ? String(value) : null;\n const idBase = safeValue ?? generateId('expansion-panel');\n const inputId = `expansion-panel-toggle-${idBase}`;\n const density = context?.density ?? 'default';\n const color = colorOverride ?? context?.color ?? 'primary';\n const divider = context?.divider ?? true;\n const variant = context?.variant ?? 'elevated';\n const rounded = context?.rounded ?? 'lg';\n const accent = accentClasses[color] ?? accentClasses.primary;\n const isExpanded =\n value !== null && value !== undefined\n ? context?.expandedValues.includes(value) ?? false\n : false;\n\n const rootSurface = divider ? 'bg-transparent border-0 shadow-none' : itemVariantClasses[variant];\n const shapeClass = divider ? undefined : roundedClasses[rounded] ?? roundedClasses.lg;\n const densityPadding = densityClasses[density] ?? densityClasses.default;\n const disabledClass = disabled ? 'cursor-not-allowed opacity-60' : 'cursor-pointer';\n const titleClass = isExpanded ? accent.text : undefined;\n const activeBorderClass = twMerge(\n 'border-l-2 border-transparent',\n isExpanded ? accent.border : undefined\n );\n const defaultToggleIcon = (\n <i\n className='mdi mdi-chevron-down text-lg leading-none transition-transform duration-200'\n aria-hidden\n />\n );\n\n const hasContent = Boolean(children ?? text);\n const toggleIconNode = hideToggleIcon\n ? null\n : isExpanded && collapseIcon\n ? collapseIcon\n : expandIcon ?? defaultToggleIcon;\n\n const shouldRotateDefaultIcon = !expandIcon && !collapseIcon && !hideToggleIcon;\n const toggleWrapperClass = twMerge(\n 'expansion-panel-item__icon ml-3 flex h-6 w-6 items-center justify-center text-gray-500 transition-transform duration-200',\n shouldRotateDefaultIcon && isExpanded ? 'rotate-180' : undefined\n );\n\n return (\n <div\n {...rest}\n ref={forwardedRef}\n className={twMerge(\n 'expansion-panel-item group flex flex-col overflow-hidden transition-colors duration-200',\n rootSurface,\n shapeClass,\n className\n )}\n data-state={isExpanded ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n >\n <input\n id={inputId}\n type='checkbox'\n className='expansion-panel-item__toggle'\n defaultChecked={isExpanded}\n disabled={disabled}\n />\n <label\n htmlFor={inputId}\n className={twMerge(\n 'expansion-panel-item__header flex w-full list-none items-center gap-4 px-4 text-left',\n densityPadding,\n disabledClass,\n isExpanded ? accent.bg : undefined,\n headerClassName\n )}\n aria-disabled={disabled || undefined}\n data-state={isExpanded ? 'open' : 'closed'}\n >\n {prepend && (\n <span className='flex h-10 w-10 items-center justify-center text-gray-500'>\n {prepend}\n </span>\n )}\n <span className='flex min-w-0 flex-1 flex-col gap-0.5 text-left'>\n {title && (\n <span className={twMerge('truncate font-medium text-gray-900', titleClass)}>\n {title}\n </span>\n )}\n {subtitle && <span className='text-sm text-gray-500'>{subtitle}</span>}\n </span>\n {append && (\n <span className='ml-auto flex items-center gap-2 text-sm text-gray-500'>{append}</span>\n )}\n {!hideToggleIcon && <span className={toggleWrapperClass}>{toggleIconNode}</span>}\n </label>\n {hasContent && (\n <div\n className='expansion-panel-item__content overflow-hidden border-t border-gray-100'\n data-state={isExpanded ? 'open' : 'closed'}\n >\n <div\n className={twMerge(\n 'expansion-panel-item__body min-h-0 px-4 pt-0 text-sm text-gray-600',\n activeBorderClass,\n contentClassName\n )}\n >\n {children ?? text}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nconst ExpansionPanelItem = forwardRef<HTMLDivElement, ExpansionPanelItemProps>((props, ref) => (\n <ExpansionPanelItemInner {...props} forwardedRef={ref} />\n));\n\nExpansionPanelItem.displayName = 'ExpansionPanelItem';\nmarkExpansionPanelItem(ExpansionPanelItem);\n\nexport default ExpansionPanelItem;\n"]}
|