@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.
Files changed (29) hide show
  1. package/README.md +20 -2
  2. package/dist/AI_CONTEXT.md +3 -0
  3. package/dist/cjs/components/FloatLabel.cjs +1 -1
  4. package/dist/cjs/components/FloatLabel.cjs.map +1 -1
  5. package/dist/cjs/components/Input/Input.cjs +1 -1
  6. package/dist/cjs/components/Input/Input.cjs.map +1 -1
  7. package/dist/cjs/components/Select/Select.cjs +1 -1
  8. package/dist/cjs/components/Select/Select.cjs.map +1 -1
  9. package/dist/cjs/components/Textarea/Textarea.cjs +1 -1
  10. package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -1
  11. package/dist/cjs/styles/index.css +1 -1
  12. package/dist/esm/components/FloatLabel.js +30 -19
  13. package/dist/esm/components/FloatLabel.js.map +1 -1
  14. package/dist/esm/components/Input/Input.js +91 -85
  15. package/dist/esm/components/Input/Input.js.map +1 -1
  16. package/dist/esm/components/Select/Select.js +100 -94
  17. package/dist/esm/components/Select/Select.js.map +1 -1
  18. package/dist/esm/components/Textarea/Textarea.js +58 -52
  19. package/dist/esm/components/Textarea/Textarea.js.map +1 -1
  20. package/dist/esm/styles/index.css +1 -1
  21. package/dist/types/components/FloatLabel.d.ts +1 -0
  22. package/dist/types/components/FloatLabel.d.ts.map +1 -1
  23. package/dist/types/components/Input/Input.d.ts +1 -0
  24. package/dist/types/components/Input/Input.d.ts.map +1 -1
  25. package/dist/types/components/Select/Select.d.ts +2 -0
  26. package/dist/types/components/Select/Select.d.ts.map +1 -1
  27. package/dist/types/components/Textarea/Textarea.d.ts +1 -0
  28. package/dist/types/components/Textarea/Textarea.d.ts.map +1 -1
  29. package/package.json +1 -1
@@ -1,134 +1,139 @@
1
- import { jsx as r, jsxs as m, Fragment as U } from "react/jsx-runtime";
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 W, MultiSelectTrigger as X, MultiSelectValue as Y, MultiSelectContent as Z, MultiSelectGroup as $, MultiSelectItem as G, MultiSelectSeparator as B } from "../../packages/ui/src/components/select.js";
4
- import { Combobox as F } from "../../packages/ui/src/components/combobox.js";
5
- import { cn as u } from "../../packages/ui/src/lib/utils.js";
6
- import { FloatingLabel as H } from "../FloatLabel.js";
7
- import { Info as R } from "lucide-react";
8
- import { Tooltip as z } from "../Tooltip/Tooltip.js";
9
- const L = s.forwardRef(
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: M,
12
- label: o,
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: N = "",
20
- options: x = [],
19
+ placeholder: b = "",
20
+ options: g = [],
21
21
  tagRender: d,
22
22
  multiple: S = !1,
23
23
  value: a,
24
- defaultValue: O,
25
- onValueChange: b,
26
- values: T,
24
+ defaultValue: T,
25
+ onValueChange: I,
26
+ values: A,
27
27
  defaultValues: v,
28
- onValuesChange: I,
28
+ onValuesChange: j,
29
29
  search: h,
30
- clickToRemove: q = !0,
31
- overflowBehavior: A = "wrap-when-open",
32
- disabled: j,
33
- onChange: g,
34
- onFocus: C,
35
- onBlur: k
36
- }, D) => {
37
- const i = s.useId(), [E, V] = s.useState(
38
- a ?? O ?? ""
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 && V(a);
42
+ !S && a !== void 0 && _(a);
42
43
  }, [S, a]);
43
- const J = s.useCallback(
44
- (l) => {
45
- const c = l || "";
46
- a === void 0 && V(c), b?.(c), g?.(c);
44
+ const P = s.useCallback(
45
+ (r) => {
46
+ const c = r || "";
47
+ a === void 0 && _(c), I?.(c), x?.(c);
47
48
  },
48
- [b, g, a]
49
- ), K = s.useCallback(
50
- (l) => {
51
- I?.(l), g?.(l);
49
+ [I, x, a]
50
+ ), Q = s.useCallback(
51
+ (r) => {
52
+ j?.(r), x?.(r);
52
53
  },
53
- [I, g]
54
- ), P = {
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
- }, _ = n ? t === "xl" || t === "lg" ? t : "xl" : t, Q = s.useMemo(() => {
60
- const l = /* @__PURE__ */ new Map();
61
- return x.forEach((c) => {
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
- l.has(e) || l.set(e, []), l.get(e).push(c);
64
- }), l;
65
- }, [x]);
66
- return /* @__PURE__ */ r("div", { className: M, children: /* @__PURE__ */ m(
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: D,
70
- className: u("flex flex-col gap-1.5 relative", {
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 && o && /* @__PURE__ */ m(
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
- o,
81
- p && /* @__PURE__ */ r(z, { content: p, children: /* @__PURE__ */ r(R, { className: "size-3.5 min-w-3.5" }) })
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__ */ r("div", { className: "relative", children: S ? (
89
+ /* @__PURE__ */ l("div", { className: "relative", children: S ? (
86
90
  // Multi Mode
87
91
  /* @__PURE__ */ m(
88
- W,
92
+ Y,
89
93
  {
90
- values: T,
94
+ values: A,
91
95
  defaultValues: typeof v == "string" ? [v] : v,
92
- onValuesChange: K,
96
+ onValuesChange: Q,
93
97
  children: [
94
- /* @__PURE__ */ r(
95
- X,
98
+ /* @__PURE__ */ l(
99
+ Z,
96
100
  {
97
101
  id: i,
98
- disabled: j,
99
- className: u(
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
- M
108
+ N
105
109
  ),
106
- size: _,
110
+ size: G,
107
111
  state: f,
108
- onFocus: C,
109
- onBlur: k,
110
- children: /* @__PURE__ */ r(
111
- Y,
112
+ onFocus: k,
113
+ onBlur: E,
114
+ children: /* @__PURE__ */ l(
115
+ $,
112
116
  {
113
- placeholder: N,
114
- clickToRemove: q && y,
115
- overflowBehavior: A
117
+ placeholder: b,
118
+ clickToRemove: D && y,
119
+ overflowBehavior: J
116
120
  }
117
121
  )
118
122
  }
119
123
  ),
120
- n && /* @__PURE__ */ r(
121
- H,
124
+ n && /* @__PURE__ */ l(
125
+ O,
122
126
  {
123
127
  htmlFor: i,
124
128
  size: t,
125
129
  infoTooltip: p,
126
- children: o
130
+ required: M,
131
+ children: u
127
132
  }
128
133
  ),
129
- /* @__PURE__ */ r(Z, { search: h, children: [...Q.entries()].map(([l, c]) => l ? /* @__PURE__ */ m(s.Fragment, { children: [
130
- /* @__PURE__ */ r($, { heading: l, children: c.map((e) => /* @__PURE__ */ r(
131
- G,
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__ */ r(B, {})
142
- ] }, l) : c.map((e) => /* @__PURE__ */ r(
143
- G,
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(U, { children: [
159
- /* @__PURE__ */ r(
160
- F,
163
+ /* @__PURE__ */ m(X, { children: [
164
+ /* @__PURE__ */ l(
165
+ q,
161
166
  {
162
- value: a ?? E,
163
- options: x,
164
- placeHolder: N,
167
+ value: a ?? V,
168
+ options: g,
169
+ placeHolder: b,
165
170
  emptyText: typeof h == "object" ? h.emptyMessage : "No results found",
166
- onChange: J,
171
+ onChange: P,
167
172
  clearable: y,
168
- disabled: j,
173
+ disabled: C,
169
174
  id: i,
170
- className: u(
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: u("opacity-40", {
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: C,
185
- onBlur: k
189
+ onFocus: k,
190
+ onBlur: E
186
191
  }
187
192
  ),
188
- n && /* @__PURE__ */ r(
189
- H,
193
+ n && /* @__PURE__ */ l(
194
+ O,
190
195
  {
191
196
  htmlFor: i,
192
197
  size: t,
193
198
  infoTooltip: p,
194
- shouldFloat: !!(a ?? E),
199
+ required: M,
200
+ shouldFloat: !!(a ?? V),
195
201
  className: "pointer-events-none",
196
- children: o
202
+ children: u
197
203
  }
198
204
  )
199
205
  ] })
200
206
  ) }),
201
- w && /* @__PURE__ */ r("p", { className: u("text-xs", f ? P[f] : ""), children: w })
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
- L.displayName = "Select";
213
+ ee.displayName = "Select";
208
214
  export {
209
- L as default
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":";;;;;;;;AAkDA,MAAMA,IAASC,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,EAAA,GAEFC,MACG;AACH,UAAMC,IAAW3B,EAAM,MAAA,GAGjB,CAAC4B,GAAeC,CAAgB,IAAI7B,EAAM;AAAA,MAC9Ca,KAASC,KAAgB;AAAA,IAAA;AAG3Bd,IAAAA,EAAM,UAAU,MAAM;AACpB,MAAI,CAACY,KAAYC,MAAU,UACzBgB,EAAiBhB,CAAK;AAAA,IAE1B,GAAG,CAACD,GAAUC,CAAK,CAAC;AAGpB,UAAMiB,IAA0B9B,EAAM;AAAA,MACpC,CAAC+B,MAA6B;AAC5B,cAAMC,IAAMD,KAAY;AACxB,QAAIlB,MAAU,UACZgB,EAAiBG,CAAG,GAEtBjB,IAAgBiB,CAAG,GACnBT,IAAWS,CAAG;AAAA,MAChB;AAAA,MACA,CAACjB,GAAeQ,GAAUV,CAAK;AAAA,IAAA,GAI3BoB,IAA0BjC,EAAM;AAAA,MACpC,CAACkC,MAAwB;AACvB,QAAAhB,IAAiBgB,CAAS,GAC1BX,IAAWW,CAAS;AAAA,MACtB;AAAA,MACA,CAAChB,GAAgBK,CAAQ;AAAA,IAAA,GAIrBY,IAAmB;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,GAIHC,IAAc9B,IAChBD,MAAS,QAAQA,MAAS,OACxBA,IACA,OACFA,GAGEgC,IAAiBrC,EAAM,QAAQ,MAAM;AACzC,YAAMsC,wBAAa,IAAA;AACnB,aAAA5B,EAAQ,QAAQ,CAAC6B,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,CAAC5B,CAAO,CAAC;AAEZ,WACE,gBAAA+B,EAAC,SAAI,WAAAxC,GACH,UAAA,gBAAAyC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAhB;AAAA,QACA,WAAWiB,EAAG,kCAAkC;AAAA,UAC9C,2BAA2BrC;AAAA,QAAA,CAC5B;AAAA,QAEA,UAAA;AAAA,UAAA,CAACA,KAAgBJ,KAChB,gBAAAwC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASf;AAAA,cACT,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAzB;AAAA,gBACAK,uBACEqC,GAAA,EAAQ,SAASrC,GAChB,UAAA,gBAAAkC,EAACI,GAAA,EAAK,WAAU,qBAAA,CAAqB,EAAA,CACvC;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKN,gBAAAJ,EAAC,OAAA,EAAI,WAAU,YACZ,UAAC7B;AAAA;AAAA,YA+CA,gBAAA8B;AAAA,cAACI;AAAAA,cAAA;AAAA,gBACC,QAAA9B;AAAA,gBACA,eACE,OAAOC,KAAkB,WACrB,CAACA,CAAa,IACdA;AAAA,gBAEN,gBAAgBgB;AAAA,gBAEhB,UAAA;AAAA,kBAAA,gBAAAQ;AAAA,oBAACM;AAAAA,oBAAA;AAAA,sBACC,IAAIpB;AAAA,sBACJ,UAAAL;AAAA,sBACA,WAAWqB;AAAA,wBACT;AAAA,wBACA;AAAA,0BACE,aAAarC,KAAgBD,MAAS;AAAA,wBAAA;AAAA,wBAExCJ;AAAA,sBAAA;AAAA,sBAEF,MAAMmC;AAAA,sBACN,OAAAhC;AAAA,sBACA,SAAAoB;AAAA,sBACA,QAAAC;AAAA,sBAEA,UAAA,gBAAAgB;AAAA,wBAACO;AAAAA,wBAAA;AAAA,0BACC,aAAAvC;AAAA,0BACA,eAAeW,KAAiBZ;AAAA,0BAChC,kBAAAa;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,kBAGDf,KACC,gBAAAmC;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBACC,SAAStB;AAAA,sBACT,MAAAtB;AAAA,sBACA,aAAAE;AAAA,sBAEC,UAAAL;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAIL,gBAAAuC,EAACS,GAAA,EAAuB,QAAA/B,GACrB,UAAA,CAAC,GAAGkB,EAAe,QAAA,CAAS,EAAE,IAAI,CAAC,CAACG,GAAOW,CAAK,MAC3CX,IAEA,gBAAAE,EAAC1C,EAAM,UAAN,EACC,UAAA;AAAA,oBAAA,gBAAAyC,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,CAAC5B;AAAA,wBAEZ,UAAAA,IAAYA,EAAU4B,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,CAAC5B;AAAA,sBAEZ,UAAAA,IAAYA,EAAU4B,CAAM,IAAIA,EAAO;AAAA,oBAAA;AAAA,oBANnCA,EAAO;AAAA,kBAAA,CAQf,CACF,EAAA,CACH;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA;AAAA;AAAA,YAxHF,gBAAAG,EAAAa,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAd;AAAA,gBAACe;AAAA,gBAAA;AAAA,kBACC,OAAO3C,KAASe;AAAA,kBAChB,SAAAlB;AAAA,kBACA,aAAaD;AAAA,kBACb,WACE,OAAOU,KAAW,WACdA,EAAO,eACP;AAAA,kBAEN,UAAUW;AAAA,kBACV,WAAAtB;AAAA,kBACA,UAAAc;AAAA,kBACA,IAAIK;AAAA,kBACJ,WAAWgB;AAAA,oBACT;AAAA,oBACA;AAAA,sBACE,aAAarC,KAAgBD,MAAS;AAAA,oBAAA;AAAA;AAAA,kBACxC;AAAA,kBAGF,MAAM+B;AAAA,kBACN,OAAAhC;AAAA,kBACA,mBAAmBuC,EAAG,cAAc;AAAA,oBAClC,sBAAsBrC,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,gBAAAmC;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,SAAStB;AAAA,kBACT,MAAAtB;AAAA,kBACA,aAAAE;AAAA,kBACA,aAAa,CAAC,EAAEM,KAASe;AAAA,kBACzB,WAAU;AAAA,kBAET,UAAA1B;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,EAAA,CAEJ;AAAA,aAiFJ;AAAA,UAECC,KACC,gBAAAsC,EAAC,KAAA,EAAE,WAAWE,EAAG,WAAWvC,IAAQ+B,EAAiB/B,CAAK,IAAI,EAAE,GAC7D,UAAAD,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,EAEJ;AACF;AAEAJ,EAAO,cAAc;"}
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":"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"}
@@ -1,68 +1,72 @@
1
- import { jsx as t, jsxs as l } from "react/jsx-runtime";
1
+ import { jsx as t, jsxs as a } from "react/jsx-runtime";
2
2
  import c from "react";
3
- import { Textarea as E } from "../../packages/ui/src/components/textarea.js";
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 S, X as T } from "lucide-react";
6
- import { Tooltip as V } from "../Tooltip/Tooltip.js";
7
- import { FloatingLabel as _ } from "../FloatLabel.js";
8
- import { Label as k } from "../../packages/ui/src/components/label.js";
9
- const H = c.forwardRef(
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: b,
11
+ className: y,
12
12
  label: u,
13
- helperText: i,
14
- state: m,
13
+ helperText: m,
14
+ state: i,
15
15
  size: e = "normal",
16
16
  isFloatLabel: r,
17
17
  maxLength: s,
18
- showCharCount: g,
18
+ showCharCount: h,
19
19
  infoTooltip: f,
20
- clearable: h,
21
- onClear: v,
22
- placeholder: y = " ",
23
- onChange: w,
20
+ clearable: v,
21
+ onClear: N,
22
+ placeholder: w = " ",
23
+ onChange: I,
24
+ required: p,
24
25
  ...n
25
- }, I) => {
26
- const [p, N] = c.useState(() => typeof n.value == "string" ? n.value.length : typeof n.defaultValue == "string" ? n.defaultValue.length : 0), R = (o) => {
27
- N(o.target.value.length), w?.(o);
28
- }, x = c.useId(), a = c.useRef(null);
29
- c.useImperativeHandle(I, () => a.current);
30
- const j = () => {
31
- if (a.current) {
32
- a.current.value = "", N(0);
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
- a.current.dispatchEvent(o), v && v();
35
+ l.current.dispatchEvent(o), N && N();
35
36
  }
36
- }, C = {
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: b, children: /* @__PURE__ */ l(
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__ */ l(
50
- k,
50
+ !r && u && /* @__PURE__ */ a(
51
+ H,
51
52
  {
52
- htmlFor: x,
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
- u,
56
- f && /* @__PURE__ */ t(V, { content: f, children: /* @__PURE__ */ t(S, { className: "size-3.5 min-w-3.5" }) })
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__ */ l("div", { className: "relative", children: [
64
+ /* @__PURE__ */ a("div", { className: "relative", children: [
61
65
  /* @__PURE__ */ t(
62
- E,
66
+ S,
63
67
  {
64
- ref: a,
65
- id: x,
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
- h && p > 0 && "pr-10"
77
+ v && x > 0 && "pr-10"
74
78
  // className
75
79
  ),
76
- placeholder: y,
80
+ placeholder: w,
77
81
  maxLength: s,
78
- onChange: R,
79
- state: m,
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: x,
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
- h && p > 0 && /* @__PURE__ */ t(
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: j,
108
+ onClick: C,
103
109
  disabled: n.disabled,
104
- children: /* @__PURE__ */ t(T, { className: "size-4" })
110
+ children: /* @__PURE__ */ t(V, { className: "size-4" })
105
111
  }
106
112
  )
107
113
  ] }),
108
- (i || g && typeof s == "number") && /* @__PURE__ */ l("div", { className: "flex items-center justify-between text-xs gap-2", children: [
109
- i && /* @__PURE__ */ t(
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
- m ? C?.[m] : ""
120
+ i ? E?.[i] : ""
115
121
  ),
116
- children: i
122
+ children: m
117
123
  }
118
124
  ),
119
- g && typeof s == "number" && /* @__PURE__ */ l("span", { className: "ml-auto text-muted-foreground", children: [
120
- p,
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
- H.displayName = "Textarea";
136
+ X.displayName = "Textarea";
131
137
  export {
132
- H as default
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":"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"}
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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"}