@sth87/shadcn-design-system 0.0.34 → 0.0.36
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/README.md +20 -2
- package/dist/AI_CONTEXT.md +3 -0
- package/dist/cjs/components/FloatLabel.cjs +1 -1
- package/dist/cjs/components/FloatLabel.cjs.map +1 -1
- package/dist/cjs/components/Input/Input.cjs +1 -1
- package/dist/cjs/components/Input/Input.cjs.map +1 -1
- package/dist/cjs/components/Select/Select.cjs +1 -1
- package/dist/cjs/components/Select/Select.cjs.map +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/cjs/styles/index.css +1 -1
- package/dist/esm/components/FloatLabel.js +30 -19
- package/dist/esm/components/FloatLabel.js.map +1 -1
- package/dist/esm/components/Input/Input.js +91 -85
- package/dist/esm/components/Input/Input.js.map +1 -1
- package/dist/esm/components/Select/Select.js +100 -94
- package/dist/esm/components/Select/Select.js.map +1 -1
- package/dist/esm/components/Textarea/Textarea.js +58 -52
- package/dist/esm/components/Textarea/Textarea.js.map +1 -1
- package/dist/esm/styles/index.css +1 -1
- package/dist/types/components/FloatLabel.d.ts +1 -0
- package/dist/types/components/FloatLabel.d.ts.map +1 -1
- package/dist/types/components/Input/Input.d.ts +1 -0
- package/dist/types/components/Input/Input.d.ts.map +1 -1
- package/dist/types/components/Select/Select.d.ts +2 -0
- package/dist/types/components/Select/Select.d.ts.map +1 -1
- package/dist/types/components/Textarea/Textarea.d.ts +1 -0
- package/dist/types/components/Textarea/Textarea.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,134 +1,139 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsx as l, jsxs as m, Fragment as X } from "react/jsx-runtime";
|
|
2
2
|
import s from "react";
|
|
3
|
-
import { MultiSelect as
|
|
4
|
-
import { Combobox as
|
|
5
|
-
import { cn as
|
|
6
|
-
import { FloatingLabel as
|
|
7
|
-
import { Info as
|
|
8
|
-
import { Tooltip as
|
|
9
|
-
const
|
|
3
|
+
import { MultiSelect as Y, MultiSelectTrigger as Z, MultiSelectValue as $, MultiSelectContent as B, MultiSelectGroup as F, MultiSelectItem as H, MultiSelectSeparator as R } from "../../packages/ui/src/components/select.js";
|
|
4
|
+
import { Combobox as q } from "../../packages/ui/src/components/combobox.js";
|
|
5
|
+
import { cn as o } from "../../packages/ui/src/lib/utils.js";
|
|
6
|
+
import { FloatingLabel as O } from "../FloatLabel.js";
|
|
7
|
+
import { Info as z } from "lucide-react";
|
|
8
|
+
import { Tooltip as L } from "../Tooltip/Tooltip.js";
|
|
9
|
+
const ee = s.forwardRef(
|
|
10
10
|
({
|
|
11
|
-
className:
|
|
12
|
-
label:
|
|
11
|
+
className: N,
|
|
12
|
+
label: u,
|
|
13
13
|
helperText: w,
|
|
14
14
|
state: f = "default",
|
|
15
15
|
size: t = "normal",
|
|
16
16
|
isFloatLabel: n,
|
|
17
17
|
infoTooltip: p,
|
|
18
18
|
clearable: y = !1,
|
|
19
|
-
placeholder:
|
|
20
|
-
options:
|
|
19
|
+
placeholder: b = "",
|
|
20
|
+
options: g = [],
|
|
21
21
|
tagRender: d,
|
|
22
22
|
multiple: S = !1,
|
|
23
23
|
value: a,
|
|
24
|
-
defaultValue:
|
|
25
|
-
onValueChange:
|
|
26
|
-
values:
|
|
24
|
+
defaultValue: T,
|
|
25
|
+
onValueChange: I,
|
|
26
|
+
values: A,
|
|
27
27
|
defaultValues: v,
|
|
28
|
-
onValuesChange:
|
|
28
|
+
onValuesChange: j,
|
|
29
29
|
search: h,
|
|
30
|
-
clickToRemove:
|
|
31
|
-
overflowBehavior:
|
|
32
|
-
disabled:
|
|
33
|
-
onChange:
|
|
34
|
-
onFocus:
|
|
35
|
-
onBlur:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
clickToRemove: D = !0,
|
|
31
|
+
overflowBehavior: J = "wrap-when-open",
|
|
32
|
+
disabled: C,
|
|
33
|
+
onChange: x,
|
|
34
|
+
onFocus: k,
|
|
35
|
+
onBlur: E,
|
|
36
|
+
required: M
|
|
37
|
+
}, K) => {
|
|
38
|
+
const i = s.useId(), [V, _] = s.useState(
|
|
39
|
+
a ?? T ?? ""
|
|
39
40
|
);
|
|
40
41
|
s.useEffect(() => {
|
|
41
|
-
!S && a !== void 0 &&
|
|
42
|
+
!S && a !== void 0 && _(a);
|
|
42
43
|
}, [S, a]);
|
|
43
|
-
const
|
|
44
|
-
(
|
|
45
|
-
const c =
|
|
46
|
-
a === void 0 &&
|
|
44
|
+
const P = s.useCallback(
|
|
45
|
+
(r) => {
|
|
46
|
+
const c = r || "";
|
|
47
|
+
a === void 0 && _(c), I?.(c), x?.(c);
|
|
47
48
|
},
|
|
48
|
-
[
|
|
49
|
-
),
|
|
50
|
-
(
|
|
51
|
-
|
|
49
|
+
[I, x, a]
|
|
50
|
+
), Q = s.useCallback(
|
|
51
|
+
(r) => {
|
|
52
|
+
j?.(r), x?.(r);
|
|
52
53
|
},
|
|
53
|
-
[
|
|
54
|
-
),
|
|
54
|
+
[j, x]
|
|
55
|
+
), U = {
|
|
55
56
|
default: "text-muted-foreground",
|
|
56
57
|
success: "text-success",
|
|
57
58
|
warning: "text-warning",
|
|
58
59
|
error: "text-error"
|
|
59
|
-
},
|
|
60
|
-
const
|
|
61
|
-
return
|
|
60
|
+
}, G = n ? t === "xl" || t === "lg" ? t : "xl" : t, W = s.useMemo(() => {
|
|
61
|
+
const r = /* @__PURE__ */ new Map();
|
|
62
|
+
return g.forEach((c) => {
|
|
62
63
|
const e = c.group;
|
|
63
|
-
|
|
64
|
-
}),
|
|
65
|
-
}, [
|
|
66
|
-
return /* @__PURE__ */
|
|
64
|
+
r.has(e) || r.set(e, []), r.get(e).push(c);
|
|
65
|
+
}), r;
|
|
66
|
+
}, [g]);
|
|
67
|
+
return /* @__PURE__ */ l("div", { className: N, children: /* @__PURE__ */ m(
|
|
67
68
|
"div",
|
|
68
69
|
{
|
|
69
|
-
ref:
|
|
70
|
-
className:
|
|
70
|
+
ref: K,
|
|
71
|
+
className: o("flex flex-col gap-1.5 relative", {
|
|
71
72
|
"floating-label relative": n
|
|
72
73
|
}),
|
|
73
74
|
children: [
|
|
74
|
-
!n &&
|
|
75
|
+
!n && u && /* @__PURE__ */ m(
|
|
75
76
|
"label",
|
|
76
77
|
{
|
|
77
78
|
htmlFor: i,
|
|
78
79
|
className: "flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
79
80
|
children: [
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
/* @__PURE__ */ m("span", { children: [
|
|
82
|
+
u,
|
|
83
|
+
M && /* @__PURE__ */ l("span", { className: "text-error ml-0.5", children: "*" })
|
|
84
|
+
] }),
|
|
85
|
+
p && /* @__PURE__ */ l(L, { content: p, children: /* @__PURE__ */ l(z, { className: "size-3.5 min-w-3.5" }) })
|
|
82
86
|
]
|
|
83
87
|
}
|
|
84
88
|
),
|
|
85
|
-
/* @__PURE__ */
|
|
89
|
+
/* @__PURE__ */ l("div", { className: "relative", children: S ? (
|
|
86
90
|
// Multi Mode
|
|
87
91
|
/* @__PURE__ */ m(
|
|
88
|
-
|
|
92
|
+
Y,
|
|
89
93
|
{
|
|
90
|
-
values:
|
|
94
|
+
values: A,
|
|
91
95
|
defaultValues: typeof v == "string" ? [v] : v,
|
|
92
|
-
onValuesChange:
|
|
96
|
+
onValuesChange: Q,
|
|
93
97
|
children: [
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
-
|
|
98
|
+
/* @__PURE__ */ l(
|
|
99
|
+
Z,
|
|
96
100
|
{
|
|
97
101
|
id: i,
|
|
98
|
-
disabled:
|
|
99
|
-
className:
|
|
102
|
+
disabled: C,
|
|
103
|
+
className: o(
|
|
100
104
|
"peer w-full",
|
|
101
105
|
{
|
|
102
106
|
"pt-5 pb-1": n && t !== "lg"
|
|
103
107
|
},
|
|
104
|
-
|
|
108
|
+
N
|
|
105
109
|
),
|
|
106
|
-
size:
|
|
110
|
+
size: G,
|
|
107
111
|
state: f,
|
|
108
|
-
onFocus:
|
|
109
|
-
onBlur:
|
|
110
|
-
children: /* @__PURE__ */
|
|
111
|
-
|
|
112
|
+
onFocus: k,
|
|
113
|
+
onBlur: E,
|
|
114
|
+
children: /* @__PURE__ */ l(
|
|
115
|
+
$,
|
|
112
116
|
{
|
|
113
|
-
placeholder:
|
|
114
|
-
clickToRemove:
|
|
115
|
-
overflowBehavior:
|
|
117
|
+
placeholder: b,
|
|
118
|
+
clickToRemove: D && y,
|
|
119
|
+
overflowBehavior: J
|
|
116
120
|
}
|
|
117
121
|
)
|
|
118
122
|
}
|
|
119
123
|
),
|
|
120
|
-
n && /* @__PURE__ */
|
|
121
|
-
|
|
124
|
+
n && /* @__PURE__ */ l(
|
|
125
|
+
O,
|
|
122
126
|
{
|
|
123
127
|
htmlFor: i,
|
|
124
128
|
size: t,
|
|
125
129
|
infoTooltip: p,
|
|
126
|
-
|
|
130
|
+
required: M,
|
|
131
|
+
children: u
|
|
127
132
|
}
|
|
128
133
|
),
|
|
129
|
-
/* @__PURE__ */
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
|
|
134
|
+
/* @__PURE__ */ l(B, { search: h, children: [...W.entries()].map(([r, c]) => r ? /* @__PURE__ */ m(s.Fragment, { children: [
|
|
135
|
+
/* @__PURE__ */ l(F, { heading: r, children: c.map((e) => /* @__PURE__ */ l(
|
|
136
|
+
H,
|
|
132
137
|
{
|
|
133
138
|
value: e.value,
|
|
134
139
|
disabled: e?.disabled,
|
|
@@ -138,9 +143,9 @@ const L = s.forwardRef(
|
|
|
138
143
|
},
|
|
139
144
|
e.value
|
|
140
145
|
)) }),
|
|
141
|
-
/* @__PURE__ */
|
|
142
|
-
] },
|
|
143
|
-
|
|
146
|
+
/* @__PURE__ */ l(R, {})
|
|
147
|
+
] }, r) : c.map((e) => /* @__PURE__ */ l(
|
|
148
|
+
H,
|
|
144
149
|
{
|
|
145
150
|
value: e.value,
|
|
146
151
|
disabled: e?.disabled,
|
|
@@ -155,57 +160,58 @@ const L = s.forwardRef(
|
|
|
155
160
|
)
|
|
156
161
|
) : (
|
|
157
162
|
// Single Mode
|
|
158
|
-
/* @__PURE__ */ m(
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
-
|
|
163
|
+
/* @__PURE__ */ m(X, { children: [
|
|
164
|
+
/* @__PURE__ */ l(
|
|
165
|
+
q,
|
|
161
166
|
{
|
|
162
|
-
value: a ??
|
|
163
|
-
options:
|
|
164
|
-
placeHolder:
|
|
167
|
+
value: a ?? V,
|
|
168
|
+
options: g,
|
|
169
|
+
placeHolder: b,
|
|
165
170
|
emptyText: typeof h == "object" ? h.emptyMessage : "No results found",
|
|
166
|
-
onChange:
|
|
171
|
+
onChange: P,
|
|
167
172
|
clearable: y,
|
|
168
|
-
disabled:
|
|
173
|
+
disabled: C,
|
|
169
174
|
id: i,
|
|
170
|
-
className:
|
|
175
|
+
className: o(
|
|
171
176
|
"peer w-full justify-start",
|
|
172
177
|
{
|
|
173
178
|
"pt-5 pb-1": n && t !== "lg"
|
|
174
179
|
}
|
|
175
180
|
// className,
|
|
176
181
|
),
|
|
177
|
-
size:
|
|
182
|
+
size: G,
|
|
178
183
|
state: f,
|
|
179
|
-
dropdownClassName:
|
|
184
|
+
dropdownClassName: o("opacity-40", {
|
|
180
185
|
"translate-y-[-8px]": n && t !== "lg"
|
|
181
186
|
}),
|
|
182
187
|
searchable: !!h,
|
|
183
188
|
tagRender: d,
|
|
184
|
-
onFocus:
|
|
185
|
-
onBlur:
|
|
189
|
+
onFocus: k,
|
|
190
|
+
onBlur: E
|
|
186
191
|
}
|
|
187
192
|
),
|
|
188
|
-
n && /* @__PURE__ */
|
|
189
|
-
|
|
193
|
+
n && /* @__PURE__ */ l(
|
|
194
|
+
O,
|
|
190
195
|
{
|
|
191
196
|
htmlFor: i,
|
|
192
197
|
size: t,
|
|
193
198
|
infoTooltip: p,
|
|
194
|
-
|
|
199
|
+
required: M,
|
|
200
|
+
shouldFloat: !!(a ?? V),
|
|
195
201
|
className: "pointer-events-none",
|
|
196
|
-
children:
|
|
202
|
+
children: u
|
|
197
203
|
}
|
|
198
204
|
)
|
|
199
205
|
] })
|
|
200
206
|
) }),
|
|
201
|
-
w && /* @__PURE__ */
|
|
207
|
+
w && /* @__PURE__ */ l("p", { className: o("text-xs", f ? U[f] : ""), children: w })
|
|
202
208
|
]
|
|
203
209
|
}
|
|
204
210
|
) });
|
|
205
211
|
}
|
|
206
212
|
);
|
|
207
|
-
|
|
213
|
+
ee.displayName = "Select";
|
|
208
214
|
export {
|
|
209
|
-
|
|
215
|
+
ee as default
|
|
210
216
|
};
|
|
211
217
|
//# sourceMappingURL=Select.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sources":["../../../../src/components/Select/Select.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n MultiSelect as BaseMultiSelect,\n MultiSelectTrigger as BaseMultiSelectTrigger,\n MultiSelectValue as BaseMultiSelectValue,\n MultiSelectContent as BaseMultiSelectContent,\n MultiSelectItem as BaseMultiSelectItem,\n MultiSelectGroup as BaseMultiSelectGroup,\n MultiSelectSeparator as BaseMultiSelectSeparator,\n} from \"@dsui/ui/components/select\";\nimport {\n Combobox,\n type ComboboxProps,\n type SelectOption as SSelectOption,\n} from \"@dsui/ui/components/combobox\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Info } from \"lucide-react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport type SelectOption = SSelectOption;\n\nexport type SelectProps = Omit<ComboboxProps, \"ref\"> & {\n label?: string;\n helperText?: React.ReactNode;\n state?: \"default\" | \"success\" | \"warning\" | \"error\";\n size?: \"xs\" | \"sm\" | \"normal\" | \"lg\" | \"xl\";\n isFloatLabel?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n placeholder?: string;\n options?: SelectOption[];\n tagRender?: (option: SelectOption) => React.ReactNode;\n multiple?: boolean;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n values?: string[];\n defaultValues?: string | string[];\n onValuesChange?: (values: string[]) => void;\n search?: boolean | { placeholder?: string; emptyMessage?: string };\n clickToRemove?: boolean;\n overflowBehavior?: \"wrap\" | \"wrap-when-open\" | \"cutoff\";\n className?: string;\n disabled?: boolean;\n onChange?: (value: string | string[]) => void;\n onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n};\n\nconst Select = React.forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n className,\n label,\n helperText,\n state = \"default\",\n size = \"normal\",\n isFloatLabel,\n infoTooltip,\n clearable = false,\n placeholder = \"\",\n options = [],\n tagRender,\n multiple = false,\n value,\n defaultValue,\n onValueChange,\n values,\n defaultValues,\n onValuesChange,\n search,\n clickToRemove = true,\n overflowBehavior = \"wrap-when-open\",\n disabled,\n onChange,\n onFocus,\n onBlur,\n },\n ref\n ) => {\n const selectId = React.useId();\n\n // For single select, use controlled value or internal state\n const [internalValue, setInternalValue] = React.useState(\n value ?? defaultValue ?? \"\"\n );\n\n React.useEffect(() => {\n if (!multiple && value !== undefined) {\n setInternalValue(value);\n }\n }, [multiple, value]);\n\n // Handle single select value change\n const handleSingleValueChange = React.useCallback(\n (newValue?: string | null) => {\n const val = newValue || \"\";\n if (value === undefined) {\n setInternalValue(val);\n }\n onValueChange?.(val);\n onChange?.(val);\n },\n [onValueChange, onChange, value]\n );\n\n // Handle multi select values change\n const handleMultiValuesChange = React.useCallback(\n (newValues: string[]) => {\n onValuesChange?.(newValues);\n onChange?.(newValues);\n },\n [onValuesChange, onChange]\n );\n\n // Helper text styles\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size;\n\n // Group options by group property\n const groupedOptions = React.useMemo(() => {\n const groups = new Map<string | undefined, SelectOption[]>();\n options.forEach((option) => {\n const group = option.group;\n if (!groups.has(group)) {\n groups.set(group, []);\n }\n groups.get(group)!.push(option);\n });\n return groups;\n }, [options]);\n\n return (\n <div className={className}>\n <div\n ref={ref}\n className={cn(\"flex flex-col gap-1.5 relative\", {\n \"floating-label relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <label\n htmlFor={selectId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </label>\n )}\n\n <div className=\"relative\">\n {!multiple ? (\n // Single Mode\n <>\n <Combobox\n value={value ?? internalValue}\n options={options}\n placeHolder={placeholder}\n emptyText={\n typeof search === \"object\"\n ? search.emptyMessage\n : \"No results found\"\n }\n onChange={handleSingleValueChange}\n clearable={clearable}\n disabled={disabled}\n id={selectId}\n className={cn(\n \"peer w-full justify-start\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n }\n // className,\n )}\n size={currentSize}\n state={state}\n dropdownClassName={cn(\"opacity-40\", {\n \"translate-y-[-8px]\": isFloatLabel && size !== \"lg\",\n })}\n searchable={!!search}\n tagRender={tagRender}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={selectId}\n size={size}\n infoTooltip={infoTooltip}\n shouldFloat={!!(value ?? internalValue)}\n className=\"pointer-events-none\"\n >\n {label}\n </FloatingLabel>\n )}\n </>\n ) : (\n // Multi Mode\n <BaseMultiSelect\n values={values}\n defaultValues={\n typeof defaultValues === \"string\"\n ? [defaultValues]\n : defaultValues\n }\n onValuesChange={handleMultiValuesChange}\n >\n <BaseMultiSelectTrigger\n id={selectId}\n disabled={disabled}\n className={cn(\n \"peer w-full\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n },\n className\n )}\n size={currentSize}\n state={state}\n onFocus={onFocus}\n onBlur={onBlur}\n >\n <BaseMultiSelectValue\n placeholder={placeholder}\n clickToRemove={clickToRemove && clearable}\n overflowBehavior={overflowBehavior}\n />\n </BaseMultiSelectTrigger>\n\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={selectId}\n size={size}\n infoTooltip={infoTooltip}\n >\n {label}\n </FloatingLabel>\n )}\n\n <BaseMultiSelectContent search={search}>\n {[...groupedOptions.entries()].map(([group, items]) => {\n if (group) {\n return (\n <React.Fragment key={group}>\n <BaseMultiSelectGroup heading={group}>\n {items.map((option) => (\n <BaseMultiSelectItem\n key={option.value}\n value={option.value}\n disabled={option?.disabled}\n icon={option?.icon}\n tagRender={!!tagRender}\n >\n {tagRender ? tagRender(option) : option.label}\n </BaseMultiSelectItem>\n ))}\n </BaseMultiSelectGroup>\n <BaseMultiSelectSeparator />\n </React.Fragment>\n );\n }\n return items.map((option) => (\n <BaseMultiSelectItem\n key={option.value}\n value={option.value}\n disabled={option?.disabled}\n icon={option?.icon}\n tagRender={!!tagRender}\n >\n {tagRender ? tagRender(option) : option.label}\n </BaseMultiSelectItem>\n ));\n })}\n </BaseMultiSelectContent>\n </BaseMultiSelect>\n )}\n </div>\n\n {helperText && (\n <p className={cn(\"text-xs\", state ? helperTextStyles[state] : \"\")}>\n {helperText}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nSelect.displayName = \"Select\";\nexport default Select;\n"],"names":["Select","React","className","label","helperText","state","size","isFloatLabel","infoTooltip","clearable","placeholder","options","tagRender","multiple","value","defaultValue","onValueChange","values","defaultValues","onValuesChange","search","clickToRemove","overflowBehavior","disabled","onChange","onFocus","onBlur","ref","selectId","internalValue","setInternalValue","handleSingleValueChange","newValue","val","handleMultiValuesChange","newValues","helperTextStyles","currentSize","groupedOptions","groups","option","group","jsx","jsxs","cn","Tooltip","Info","BaseMultiSelect","BaseMultiSelectTrigger","BaseMultiSelectValue","FloatingLabel","BaseMultiSelectContent","items","BaseMultiSelectGroup","BaseMultiSelectItem","BaseMultiSelectSeparator","Fragment","Combobox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../../../src/components/Select/Select.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n MultiSelect as BaseMultiSelect,\n MultiSelectTrigger as BaseMultiSelectTrigger,\n MultiSelectValue as BaseMultiSelectValue,\n MultiSelectContent as BaseMultiSelectContent,\n MultiSelectItem as BaseMultiSelectItem,\n MultiSelectGroup as BaseMultiSelectGroup,\n MultiSelectSeparator as BaseMultiSelectSeparator,\n} from \"@dsui/ui/components/select\";\nimport {\n Combobox,\n type ComboboxProps,\n type SelectOption as SSelectOption,\n} from \"@dsui/ui/components/combobox\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Info } from \"lucide-react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport type SelectOption = SSelectOption;\n\nexport type SelectProps = Omit<ComboboxProps, \"ref\"> & {\n label?: string;\n helperText?: React.ReactNode;\n state?: \"default\" | \"success\" | \"warning\" | \"error\";\n size?: \"xs\" | \"sm\" | \"normal\" | \"lg\" | \"xl\";\n isFloatLabel?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n placeholder?: string;\n options?: SelectOption[];\n tagRender?: (option: SelectOption) => React.ReactNode;\n multiple?: boolean;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n values?: string[];\n defaultValues?: string | string[];\n onValuesChange?: (values: string[]) => void;\n search?: boolean | { placeholder?: string; emptyMessage?: string };\n clickToRemove?: boolean;\n overflowBehavior?: \"wrap\" | \"wrap-when-open\" | \"cutoff\";\n className?: string;\n disabled?: boolean;\n onChange?: (value: string | string[]) => void;\n onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n required?: boolean;\n};\n\nconst Select = React.forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n className,\n label,\n helperText,\n state = \"default\",\n size = \"normal\",\n isFloatLabel,\n infoTooltip,\n clearable = false,\n placeholder = \"\",\n options = [],\n tagRender,\n multiple = false,\n value,\n defaultValue,\n onValueChange,\n values,\n defaultValues,\n onValuesChange,\n search,\n clickToRemove = true,\n overflowBehavior = \"wrap-when-open\",\n disabled,\n onChange,\n onFocus,\n onBlur,\n required,\n },\n ref\n ) => {\n const selectId = React.useId();\n\n // For single select, use controlled value or internal state\n const [internalValue, setInternalValue] = React.useState(\n value ?? defaultValue ?? \"\"\n );\n\n React.useEffect(() => {\n if (!multiple && value !== undefined) {\n setInternalValue(value);\n }\n }, [multiple, value]);\n\n // Handle single select value change\n const handleSingleValueChange = React.useCallback(\n (newValue?: string | null) => {\n const val = newValue || \"\";\n if (value === undefined) {\n setInternalValue(val);\n }\n onValueChange?.(val);\n onChange?.(val);\n },\n [onValueChange, onChange, value]\n );\n\n // Handle multi select values change\n const handleMultiValuesChange = React.useCallback(\n (newValues: string[]) => {\n onValuesChange?.(newValues);\n onChange?.(newValues);\n },\n [onValuesChange, onChange]\n );\n\n // Helper text styles\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size;\n\n // Group options by group property\n const groupedOptions = React.useMemo(() => {\n const groups = new Map<string | undefined, SelectOption[]>();\n options.forEach((option) => {\n const group = option.group;\n if (!groups.has(group)) {\n groups.set(group, []);\n }\n groups.get(group)!.push(option);\n });\n return groups;\n }, [options]);\n\n return (\n <div className={className}>\n <div\n ref={ref}\n className={cn(\"flex flex-col gap-1.5 relative\", {\n \"floating-label relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <label\n htmlFor={selectId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n <span>\n {label}\n {required && <span className=\"text-error ml-0.5\">*</span>}\n </span>\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </label>\n )}\n\n <div className=\"relative\">\n {!multiple ? (\n // Single Mode\n <>\n <Combobox\n value={value ?? internalValue}\n options={options}\n placeHolder={placeholder}\n emptyText={\n typeof search === \"object\"\n ? search.emptyMessage\n : \"No results found\"\n }\n onChange={handleSingleValueChange}\n clearable={clearable}\n disabled={disabled}\n id={selectId}\n className={cn(\n \"peer w-full justify-start\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n }\n // className,\n )}\n size={currentSize}\n state={state}\n dropdownClassName={cn(\"opacity-40\", {\n \"translate-y-[-8px]\": isFloatLabel && size !== \"lg\",\n })}\n searchable={!!search}\n tagRender={tagRender}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={selectId}\n size={size}\n infoTooltip={infoTooltip}\n required={required}\n shouldFloat={!!(value ?? internalValue)}\n className=\"pointer-events-none\"\n >\n {label}\n </FloatingLabel>\n )}\n </>\n ) : (\n // Multi Mode\n <BaseMultiSelect\n values={values}\n defaultValues={\n typeof defaultValues === \"string\"\n ? [defaultValues]\n : defaultValues\n }\n onValuesChange={handleMultiValuesChange}\n >\n <BaseMultiSelectTrigger\n id={selectId}\n disabled={disabled}\n className={cn(\n \"peer w-full\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n },\n className\n )}\n size={currentSize}\n state={state}\n onFocus={onFocus}\n onBlur={onBlur}\n >\n <BaseMultiSelectValue\n placeholder={placeholder}\n clickToRemove={clickToRemove && clearable}\n overflowBehavior={overflowBehavior}\n />\n </BaseMultiSelectTrigger>\n\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={selectId}\n size={size}\n infoTooltip={infoTooltip}\n required={required}\n >\n {label}\n </FloatingLabel>\n )}\n\n <BaseMultiSelectContent search={search}>\n {[...groupedOptions.entries()].map(([group, items]) => {\n if (group) {\n return (\n <React.Fragment key={group}>\n <BaseMultiSelectGroup heading={group}>\n {items.map((option) => (\n <BaseMultiSelectItem\n key={option.value}\n value={option.value}\n disabled={option?.disabled}\n icon={option?.icon}\n tagRender={!!tagRender}\n >\n {tagRender ? tagRender(option) : option.label}\n </BaseMultiSelectItem>\n ))}\n </BaseMultiSelectGroup>\n <BaseMultiSelectSeparator />\n </React.Fragment>\n );\n }\n return items.map((option) => (\n <BaseMultiSelectItem\n key={option.value}\n value={option.value}\n disabled={option?.disabled}\n icon={option?.icon}\n tagRender={!!tagRender}\n >\n {tagRender ? tagRender(option) : option.label}\n </BaseMultiSelectItem>\n ));\n })}\n </BaseMultiSelectContent>\n </BaseMultiSelect>\n )}\n </div>\n\n {helperText && (\n <p className={cn(\"text-xs\", state ? helperTextStyles[state] : \"\")}>\n {helperText}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nSelect.displayName = \"Select\";\nexport default Select;\n"],"names":["Select","React","className","label","helperText","state","size","isFloatLabel","infoTooltip","clearable","placeholder","options","tagRender","multiple","value","defaultValue","onValueChange","values","defaultValues","onValuesChange","search","clickToRemove","overflowBehavior","disabled","onChange","onFocus","onBlur","required","ref","selectId","internalValue","setInternalValue","handleSingleValueChange","newValue","val","handleMultiValuesChange","newValues","helperTextStyles","currentSize","groupedOptions","groups","option","group","jsx","jsxs","cn","Tooltip","Info","BaseMultiSelect","BaseMultiSelectTrigger","BaseMultiSelectValue","FloatingLabel","BaseMultiSelectContent","items","BaseMultiSelectGroup","BaseMultiSelectItem","BaseMultiSelectSeparator","Fragment","Combobox"],"mappings":";;;;;;;;AAmDA,MAAMA,KAASC,EAAM;AAAA,EACnB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,aAAAC,IAAc;AAAA,IACd,SAAAC,IAAU,CAAA;AAAA,IACV,WAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,QAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,kBAAAC,IAAmB;AAAA,IACnB,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,EAAA,GAEFC,MACG;AACH,UAAMC,IAAW5B,EAAM,MAAA,GAGjB,CAAC6B,GAAeC,CAAgB,IAAI9B,EAAM;AAAA,MAC9Ca,KAASC,KAAgB;AAAA,IAAA;AAG3Bd,IAAAA,EAAM,UAAU,MAAM;AACpB,MAAI,CAACY,KAAYC,MAAU,UACzBiB,EAAiBjB,CAAK;AAAA,IAE1B,GAAG,CAACD,GAAUC,CAAK,CAAC;AAGpB,UAAMkB,IAA0B/B,EAAM;AAAA,MACpC,CAACgC,MAA6B;AAC5B,cAAMC,IAAMD,KAAY;AACxB,QAAInB,MAAU,UACZiB,EAAiBG,CAAG,GAEtBlB,IAAgBkB,CAAG,GACnBV,IAAWU,CAAG;AAAA,MAChB;AAAA,MACA,CAAClB,GAAeQ,GAAUV,CAAK;AAAA,IAAA,GAI3BqB,IAA0BlC,EAAM;AAAA,MACpC,CAACmC,MAAwB;AACvB,QAAAjB,IAAiBiB,CAAS,GAC1BZ,IAAWY,CAAS;AAAA,MACtB;AAAA,MACA,CAACjB,GAAgBK,CAAQ;AAAA,IAAA,GAIrBa,IAAmB;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,GAIHC,IAAc/B,IAChBD,MAAS,QAAQA,MAAS,OACxBA,IACA,OACFA,GAGEiC,IAAiBtC,EAAM,QAAQ,MAAM;AACzC,YAAMuC,wBAAa,IAAA;AACnB,aAAA7B,EAAQ,QAAQ,CAAC8B,MAAW;AAC1B,cAAMC,IAAQD,EAAO;AACrB,QAAKD,EAAO,IAAIE,CAAK,KACnBF,EAAO,IAAIE,GAAO,EAAE,GAEtBF,EAAO,IAAIE,CAAK,EAAG,KAAKD,CAAM;AAAA,MAChC,CAAC,GACMD;AAAA,IACT,GAAG,CAAC7B,CAAO,CAAC;AAEZ,WACE,gBAAAgC,EAAC,SAAI,WAAAzC,GACH,UAAA,gBAAA0C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAhB;AAAA,QACA,WAAWiB,EAAG,kCAAkC;AAAA,UAC9C,2BAA2BtC;AAAA,QAAA,CAC5B;AAAA,QAEA,UAAA;AAAA,UAAA,CAACA,KAAgBJ,KAChB,gBAAAyC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASf;AAAA,cACT,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAe,EAAC,QAAA,EACE,UAAA;AAAA,kBAAAzC;AAAA,kBACAwB,KAAY,gBAAAgB,EAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA,IAAA,CAAC;AAAA,gBAAA,GACpD;AAAA,gBACCnC,uBACEsC,GAAA,EAAQ,SAAStC,GAChB,UAAA,gBAAAmC,EAACI,GAAA,EAAK,WAAU,qBAAA,CAAqB,EAAA,CACvC;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKN,gBAAAJ,EAAC,OAAA,EAAI,WAAU,YACZ,UAAC9B;AAAA;AAAA,YAgDA,gBAAA+B;AAAA,cAACI;AAAAA,cAAA;AAAA,gBACC,QAAA/B;AAAA,gBACA,eACE,OAAOC,KAAkB,WACrB,CAACA,CAAa,IACdA;AAAA,gBAEN,gBAAgBiB;AAAA,gBAEhB,UAAA;AAAA,kBAAA,gBAAAQ;AAAA,oBAACM;AAAAA,oBAAA;AAAA,sBACC,IAAIpB;AAAA,sBACJ,UAAAN;AAAA,sBACA,WAAWsB;AAAA,wBACT;AAAA,wBACA;AAAA,0BACE,aAAatC,KAAgBD,MAAS;AAAA,wBAAA;AAAA,wBAExCJ;AAAA,sBAAA;AAAA,sBAEF,MAAMoC;AAAA,sBACN,OAAAjC;AAAA,sBACA,SAAAoB;AAAA,sBACA,QAAAC;AAAA,sBAEA,UAAA,gBAAAiB;AAAA,wBAACO;AAAAA,wBAAA;AAAA,0BACC,aAAAxC;AAAA,0BACA,eAAeW,KAAiBZ;AAAA,0BAChC,kBAAAa;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,kBAGDf,KACC,gBAAAoC;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBACC,SAAStB;AAAA,sBACT,MAAAvB;AAAA,sBACA,aAAAE;AAAA,sBACA,UAAAmB;AAAA,sBAEC,UAAAxB;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAIL,gBAAAwC,EAACS,GAAA,EAAuB,QAAAhC,GACrB,UAAA,CAAC,GAAGmB,EAAe,QAAA,CAAS,EAAE,IAAI,CAAC,CAACG,GAAOW,CAAK,MAC3CX,IAEA,gBAAAE,EAAC3C,EAAM,UAAN,EACC,UAAA;AAAA,oBAAA,gBAAA0C,EAACW,KAAqB,SAASZ,GAC5B,UAAAW,EAAM,IAAI,CAACZ,MACV,gBAAAE;AAAA,sBAACY;AAAAA,sBAAA;AAAA,wBAEC,OAAOd,EAAO;AAAA,wBACd,UAAUA,GAAQ;AAAA,wBAClB,MAAMA,GAAQ;AAAA,wBACd,WAAW,CAAC,CAAC7B;AAAA,wBAEZ,UAAAA,IAAYA,EAAU6B,CAAM,IAAIA,EAAO;AAAA,sBAAA;AAAA,sBANnCA,EAAO;AAAA,oBAAA,CAQf,GACH;AAAA,sCACCe,GAAA,CAAA,CAAyB;AAAA,kBAAA,EAAA,GAdPd,CAerB,IAGGW,EAAM,IAAI,CAACZ,MAChB,gBAAAE;AAAA,oBAACY;AAAAA,oBAAA;AAAA,sBAEC,OAAOd,EAAO;AAAA,sBACd,UAAUA,GAAQ;AAAA,sBAClB,MAAMA,GAAQ;AAAA,sBACd,WAAW,CAAC,CAAC7B;AAAA,sBAEZ,UAAAA,IAAYA,EAAU6B,CAAM,IAAIA,EAAO;AAAA,oBAAA;AAAA,oBANnCA,EAAO;AAAA,kBAAA,CAQf,CACF,EAAA,CACH;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA;AAAA;AAAA,YA1HF,gBAAAG,EAAAa,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAd;AAAA,gBAACe;AAAA,gBAAA;AAAA,kBACC,OAAO5C,KAASgB;AAAA,kBAChB,SAAAnB;AAAA,kBACA,aAAaD;AAAA,kBACb,WACE,OAAOU,KAAW,WACdA,EAAO,eACP;AAAA,kBAEN,UAAUY;AAAA,kBACV,WAAAvB;AAAA,kBACA,UAAAc;AAAA,kBACA,IAAIM;AAAA,kBACJ,WAAWgB;AAAA,oBACT;AAAA,oBACA;AAAA,sBACE,aAAatC,KAAgBD,MAAS;AAAA,oBAAA;AAAA;AAAA,kBACxC;AAAA,kBAGF,MAAMgC;AAAA,kBACN,OAAAjC;AAAA,kBACA,mBAAmBwC,EAAG,cAAc;AAAA,oBAClC,sBAAsBtC,KAAgBD,MAAS;AAAA,kBAAA,CAChD;AAAA,kBACD,YAAY,CAAC,CAACc;AAAA,kBACd,WAAAR;AAAA,kBACA,SAAAa;AAAA,kBACA,QAAAC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEDnB,KACC,gBAAAoC;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,SAAStB;AAAA,kBACT,MAAAvB;AAAA,kBACA,aAAAE;AAAA,kBACA,UAAAmB;AAAA,kBACA,aAAa,CAAC,EAAEb,KAASgB;AAAA,kBACzB,WAAU;AAAA,kBAET,UAAA3B;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,EAAA,CAEJ;AAAA,aAkFJ;AAAA,UAECC,KACC,gBAAAuC,EAAC,KAAA,EAAE,WAAWE,EAAG,WAAWxC,IAAQgC,EAAiBhC,CAAK,IAAI,EAAE,GAC7D,UAAAD,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,EAEJ;AACF;AAEAJ,GAAO,cAAc;"}
|
|
@@ -1,68 +1,72 @@
|
|
|
1
|
-
import { jsx as t, jsxs as
|
|
1
|
+
import { jsx as t, jsxs as a } from "react/jsx-runtime";
|
|
2
2
|
import c from "react";
|
|
3
|
-
import { Textarea as
|
|
3
|
+
import { Textarea as S } from "../../packages/ui/src/components/textarea.js";
|
|
4
4
|
import { cn as d } from "../../packages/ui/src/lib/utils.js";
|
|
5
|
-
import { Info as
|
|
6
|
-
import { Tooltip as
|
|
7
|
-
import { FloatingLabel as
|
|
8
|
-
import { Label as
|
|
9
|
-
const
|
|
5
|
+
import { Info as T, X as V } from "lucide-react";
|
|
6
|
+
import { Tooltip as _ } from "../Tooltip/Tooltip.js";
|
|
7
|
+
import { FloatingLabel as k } from "../FloatLabel.js";
|
|
8
|
+
import { Label as H } from "../../packages/ui/src/components/label.js";
|
|
9
|
+
const X = c.forwardRef(
|
|
10
10
|
({
|
|
11
|
-
className:
|
|
11
|
+
className: y,
|
|
12
12
|
label: u,
|
|
13
|
-
helperText:
|
|
14
|
-
state:
|
|
13
|
+
helperText: m,
|
|
14
|
+
state: i,
|
|
15
15
|
size: e = "normal",
|
|
16
16
|
isFloatLabel: r,
|
|
17
17
|
maxLength: s,
|
|
18
|
-
showCharCount:
|
|
18
|
+
showCharCount: h,
|
|
19
19
|
infoTooltip: f,
|
|
20
|
-
clearable:
|
|
21
|
-
onClear:
|
|
22
|
-
placeholder:
|
|
23
|
-
onChange:
|
|
20
|
+
clearable: v,
|
|
21
|
+
onClear: N,
|
|
22
|
+
placeholder: w = " ",
|
|
23
|
+
onChange: I,
|
|
24
|
+
required: p,
|
|
24
25
|
...n
|
|
25
|
-
},
|
|
26
|
-
const [
|
|
27
|
-
|
|
28
|
-
},
|
|
29
|
-
c.useImperativeHandle(
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
|
|
26
|
+
}, R) => {
|
|
27
|
+
const [x, b] = c.useState(() => typeof n.value == "string" ? n.value.length : typeof n.defaultValue == "string" ? n.defaultValue.length : 0), j = (o) => {
|
|
28
|
+
b(o.target.value.length), I?.(o);
|
|
29
|
+
}, g = c.useId(), l = c.useRef(null);
|
|
30
|
+
c.useImperativeHandle(R, () => l.current);
|
|
31
|
+
const C = () => {
|
|
32
|
+
if (l.current) {
|
|
33
|
+
l.current.value = "", b(0);
|
|
33
34
|
const o = new Event("input", { bubbles: !0 });
|
|
34
|
-
|
|
35
|
+
l.current.dispatchEvent(o), N && N();
|
|
35
36
|
}
|
|
36
|
-
},
|
|
37
|
+
}, E = {
|
|
37
38
|
default: "text-muted-foreground",
|
|
38
39
|
success: "text-success",
|
|
39
40
|
warning: "text-warning",
|
|
40
41
|
error: "text-error"
|
|
41
42
|
};
|
|
42
|
-
return /* @__PURE__ */ t("div", { className:
|
|
43
|
+
return /* @__PURE__ */ t("div", { className: y, children: /* @__PURE__ */ a(
|
|
43
44
|
"div",
|
|
44
45
|
{
|
|
45
46
|
className: d("flex flex-col gap-1.5 relative", {
|
|
46
47
|
"floating-label": r
|
|
47
48
|
}),
|
|
48
49
|
children: [
|
|
49
|
-
!r && u && /* @__PURE__ */
|
|
50
|
-
|
|
50
|
+
!r && u && /* @__PURE__ */ a(
|
|
51
|
+
H,
|
|
51
52
|
{
|
|
52
|
-
htmlFor:
|
|
53
|
+
htmlFor: g,
|
|
53
54
|
className: "flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
54
55
|
children: [
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
/* @__PURE__ */ a("span", { children: [
|
|
57
|
+
u,
|
|
58
|
+
p && /* @__PURE__ */ t("span", { className: "text-error ml-0.5", children: "*" })
|
|
59
|
+
] }),
|
|
60
|
+
f && /* @__PURE__ */ t(_, { content: f, children: /* @__PURE__ */ t(T, { className: "size-3.5 min-w-3.5" }) })
|
|
57
61
|
]
|
|
58
62
|
}
|
|
59
63
|
),
|
|
60
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ a("div", { className: "relative", children: [
|
|
61
65
|
/* @__PURE__ */ t(
|
|
62
|
-
|
|
66
|
+
S,
|
|
63
67
|
{
|
|
64
|
-
ref:
|
|
65
|
-
id:
|
|
68
|
+
ref: l,
|
|
69
|
+
id: g,
|
|
66
70
|
className: d(
|
|
67
71
|
"peer resize-y",
|
|
68
72
|
{
|
|
@@ -70,28 +74,30 @@ const H = c.forwardRef(
|
|
|
70
74
|
"pt-6 pb-1": r && e !== "lg" && e !== "xl",
|
|
71
75
|
"text-lg": (e === "xl" || e === "lg") && !r
|
|
72
76
|
},
|
|
73
|
-
|
|
77
|
+
v && x > 0 && "pr-10"
|
|
74
78
|
// className
|
|
75
79
|
),
|
|
76
|
-
placeholder:
|
|
80
|
+
placeholder: w,
|
|
77
81
|
maxLength: s,
|
|
78
|
-
onChange:
|
|
79
|
-
state:
|
|
82
|
+
onChange: j,
|
|
83
|
+
state: i,
|
|
80
84
|
size: r ? e === "xl" || e === "lg" ? e : "xl" : e,
|
|
85
|
+
required: p,
|
|
81
86
|
...n
|
|
82
87
|
}
|
|
83
88
|
),
|
|
84
89
|
r && /* @__PURE__ */ t(
|
|
85
|
-
|
|
90
|
+
k,
|
|
86
91
|
{
|
|
87
|
-
htmlFor:
|
|
92
|
+
htmlFor: g,
|
|
88
93
|
size: e,
|
|
89
94
|
infoTooltip: f,
|
|
95
|
+
required: p,
|
|
90
96
|
className: "peer-placeholder-shown:items-start",
|
|
91
97
|
children: u
|
|
92
98
|
}
|
|
93
99
|
),
|
|
94
|
-
|
|
100
|
+
v && x > 0 && /* @__PURE__ */ t(
|
|
95
101
|
"button",
|
|
96
102
|
{
|
|
97
103
|
type: "button",
|
|
@@ -99,25 +105,25 @@ const H = c.forwardRef(
|
|
|
99
105
|
className: d(
|
|
100
106
|
"absolute top-2 right-2 p-1 rounded hover:bg-accent transition-colors"
|
|
101
107
|
),
|
|
102
|
-
onClick:
|
|
108
|
+
onClick: C,
|
|
103
109
|
disabled: n.disabled,
|
|
104
|
-
children: /* @__PURE__ */ t(
|
|
110
|
+
children: /* @__PURE__ */ t(V, { className: "size-4" })
|
|
105
111
|
}
|
|
106
112
|
)
|
|
107
113
|
] }),
|
|
108
|
-
(
|
|
109
|
-
|
|
114
|
+
(m || h && typeof s == "number") && /* @__PURE__ */ a("div", { className: "flex items-center justify-between text-xs gap-2", children: [
|
|
115
|
+
m && /* @__PURE__ */ t(
|
|
110
116
|
"p",
|
|
111
117
|
{
|
|
112
118
|
className: d(
|
|
113
119
|
"text-xs",
|
|
114
|
-
|
|
120
|
+
i ? E?.[i] : ""
|
|
115
121
|
),
|
|
116
|
-
children:
|
|
122
|
+
children: m
|
|
117
123
|
}
|
|
118
124
|
),
|
|
119
|
-
|
|
120
|
-
|
|
125
|
+
h && typeof s == "number" && /* @__PURE__ */ a("span", { className: "ml-auto text-muted-foreground", children: [
|
|
126
|
+
x,
|
|
121
127
|
" / ",
|
|
122
128
|
s
|
|
123
129
|
] })
|
|
@@ -127,8 +133,8 @@ const H = c.forwardRef(
|
|
|
127
133
|
) });
|
|
128
134
|
}
|
|
129
135
|
);
|
|
130
|
-
|
|
136
|
+
X.displayName = "Textarea";
|
|
131
137
|
export {
|
|
132
|
-
|
|
138
|
+
X as default
|
|
133
139
|
};
|
|
134
140
|
//# sourceMappingURL=Textarea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Textarea as STextarea,\n type TextareaProps as STextareaProps,\n} from \"@dsui/ui/components/textarea\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { Info, X } from \"lucide-react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Label } from \"../Label\";\n\nexport type TextareaProps = Omit<\n STextareaProps,\n \"onChange\" | \"size\" | \"state\"\n> & {\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n size?: \"xs\" | \"sm\" | \"normal\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"warning\" | \"error\";\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n};\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size = \"normal\",\n isFloatLabel,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n placeholder = \" \",\n onChange,\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length);\n onChange?.(e);\n };\n\n const textareaId = React.useId();\n const innerRef = React.useRef<HTMLTextAreaElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n if (onClear) onClear();\n }\n };\n\n // State\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n return (\n <div className={className}>\n <div\n className={cn(\"flex flex-col gap-1.5 relative\", {\n \"floating-label\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={textareaId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"relative\">\n <STextarea\n ref={innerRef}\n id={textareaId}\n className={cn(\n \"peer resize-y\",\n {\n \"pt-6 pb-2\": isFloatLabel && (size === \"lg\" || size === \"xl\"),\n \"pt-6 pb-1\": isFloatLabel && size !== \"lg\" && size !== \"xl\",\n \"text-lg\": (size === \"xl\" || size === \"lg\") && !isFloatLabel,\n },\n clearable && charCount > 0 && \"pr-10\"\n // className\n )}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={textareaId}\n size={size}\n infoTooltip={infoTooltip}\n className=\"peer-placeholder-shown:items-start\"\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Clear Button */}\n {clearable && charCount > 0 && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-2 right-2 p-1 rounded hover:bg-accent transition-colors\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"size-4\" />\n </button>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"flex items-center justify-between text-xs gap-2\">\n {helperText && (\n <p\n className={cn(\n \"text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ml-auto text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\nexport default Textarea;\n"],"names":["Textarea","React","className","label","helperText","state","size","isFloatLabel","maxLength","showCharCount","infoTooltip","clearable","onClear","placeholder","onChange","props","ref","charCount","setCharCount","handleInput","e","textareaId","innerRef","handleClear","event","helperTextStyles","jsx","jsxs","cn","Label","Tooltip","Info","STextarea","FloatingLabel","X"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Textarea as STextarea,\n type TextareaProps as STextareaProps,\n} from \"@dsui/ui/components/textarea\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { Info, X } from \"lucide-react\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Label } from \"../Label\";\n\nexport type TextareaProps = Omit<\n STextareaProps,\n \"onChange\" | \"size\" | \"state\"\n> & {\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n size?: \"xs\" | \"sm\" | \"normal\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"warning\" | \"error\";\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n required?: boolean;\n};\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size = \"normal\",\n isFloatLabel,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n placeholder = \" \",\n onChange,\n required,\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length);\n onChange?.(e);\n };\n\n const textareaId = React.useId();\n const innerRef = React.useRef<HTMLTextAreaElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n if (onClear) onClear();\n }\n };\n\n // State\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n return (\n <div className={className}>\n <div\n className={cn(\"flex flex-col gap-1.5 relative\", {\n \"floating-label\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={textareaId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n <span>\n {label}\n {required && <span className=\"text-error ml-0.5\">*</span>}\n </span>\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"relative\">\n <STextarea\n ref={innerRef}\n id={textareaId}\n className={cn(\n \"peer resize-y\",\n {\n \"pt-6 pb-2\": isFloatLabel && (size === \"lg\" || size === \"xl\"),\n \"pt-6 pb-1\": isFloatLabel && size !== \"lg\" && size !== \"xl\",\n \"text-lg\": (size === \"xl\" || size === \"lg\") && !isFloatLabel,\n },\n clearable && charCount > 0 && \"pr-10\"\n // className\n )}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n required={required}\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={textareaId}\n size={size}\n infoTooltip={infoTooltip}\n required={required}\n className=\"peer-placeholder-shown:items-start\"\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Clear Button */}\n {clearable && charCount > 0 && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-2 right-2 p-1 rounded hover:bg-accent transition-colors\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"size-4\" />\n </button>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"flex items-center justify-between text-xs gap-2\">\n {helperText && (\n <p\n className={cn(\n \"text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ml-auto text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\nexport default Textarea;\n"],"names":["Textarea","React","className","label","helperText","state","size","isFloatLabel","maxLength","showCharCount","infoTooltip","clearable","onClear","placeholder","onChange","required","props","ref","charCount","setCharCount","handleInput","e","textareaId","innerRef","handleClear","event","helperTextStyles","jsx","jsxs","cn","Label","Tooltip","Info","STextarea","FloatingLabel","X"],"mappings":"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"}
|