@mdigital_ui/ui 0.4.5 → 0.4.7

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 (128) hide show
  1. package/README.md +258 -662
  2. package/dist/anchor/index.js +4 -0
  3. package/dist/anchor/index.js.map +1 -0
  4. package/dist/autocomplete/index.js +6 -0
  5. package/dist/autocomplete/index.js.map +1 -0
  6. package/dist/breadcrumbs/index.js +3 -3
  7. package/dist/calendar/index.js +4 -0
  8. package/dist/calendar/index.js.map +1 -0
  9. package/dist/chunk-3Z7RLVWD.js +258 -0
  10. package/dist/chunk-3Z7RLVWD.js.map +1 -0
  11. package/dist/chunk-5YEC6FDN.js +263 -0
  12. package/dist/chunk-5YEC6FDN.js.map +1 -0
  13. package/dist/{chunk-OTNKP5CD.js → chunk-6NXZWLSM.js} +3 -3
  14. package/dist/{chunk-OTNKP5CD.js.map → chunk-6NXZWLSM.js.map} +1 -1
  15. package/dist/{chunk-AL2EEKUY.js → chunk-6ROGWFQ2.js} +3 -3
  16. package/dist/{chunk-AL2EEKUY.js.map → chunk-6ROGWFQ2.js.map} +1 -1
  17. package/dist/{chunk-LJOQ2C5W.js → chunk-6RZEJRTC.js} +3 -3
  18. package/dist/{chunk-LJOQ2C5W.js.map → chunk-6RZEJRTC.js.map} +1 -1
  19. package/dist/chunk-74AF6PO2.js +374 -0
  20. package/dist/chunk-74AF6PO2.js.map +1 -0
  21. package/dist/chunk-75N6T3IS.js +77 -0
  22. package/dist/chunk-75N6T3IS.js.map +1 -0
  23. package/dist/{chunk-BKLJDEUX.js → chunk-DBPLQZJ2.js} +38 -14
  24. package/dist/chunk-DBPLQZJ2.js.map +1 -0
  25. package/dist/{chunk-HVHQA34X.js → chunk-DIUOGEL3.js} +95 -100
  26. package/dist/chunk-DIUOGEL3.js.map +1 -0
  27. package/dist/chunk-ED4CQZ72.js +343 -0
  28. package/dist/chunk-ED4CQZ72.js.map +1 -0
  29. package/dist/{chunk-4ZXHLPRS.js → chunk-FY2TZ2NT.js} +4 -4
  30. package/dist/{chunk-4ZXHLPRS.js.map → chunk-FY2TZ2NT.js.map} +1 -1
  31. package/dist/{chunk-I5AD247M.js → chunk-HKQOAEFY.js} +13 -3
  32. package/dist/chunk-HKQOAEFY.js.map +1 -0
  33. package/dist/chunk-JWYBDNC6.js +307 -0
  34. package/dist/chunk-JWYBDNC6.js.map +1 -0
  35. package/dist/{chunk-W5VLFE4U.js → chunk-LHZJ2GJU.js} +32 -6
  36. package/dist/chunk-LHZJ2GJU.js.map +1 -0
  37. package/dist/{chunk-253JZOYG.js → chunk-NB66D6A5.js} +3 -2
  38. package/dist/chunk-NB66D6A5.js.map +1 -0
  39. package/dist/{chunk-BGMYX7L5.js → chunk-NF6JUJBE.js} +9 -7
  40. package/dist/chunk-NF6JUJBE.js.map +1 -0
  41. package/dist/chunk-NPK4ESMA.js +281 -0
  42. package/dist/chunk-NPK4ESMA.js.map +1 -0
  43. package/dist/{chunk-X7MF3TIF.js → chunk-PD3O6ZH4.js} +12 -5
  44. package/dist/chunk-PD3O6ZH4.js.map +1 -0
  45. package/dist/{chunk-HJITFPBT.js → chunk-QDJ5PZPP.js} +14 -9
  46. package/dist/chunk-QDJ5PZPP.js.map +1 -0
  47. package/dist/chunk-QEYNOLRC.js +157 -0
  48. package/dist/chunk-QEYNOLRC.js.map +1 -0
  49. package/dist/chunk-RNG7HR6U.js +174 -0
  50. package/dist/chunk-RNG7HR6U.js.map +1 -0
  51. package/dist/chunk-TDPJYCNI.js +96 -0
  52. package/dist/chunk-TDPJYCNI.js.map +1 -0
  53. package/dist/chunk-UFYG3HKL.js +374 -0
  54. package/dist/chunk-UFYG3HKL.js.map +1 -0
  55. package/dist/chunk-VNH6R5EU.js +211 -0
  56. package/dist/chunk-VNH6R5EU.js.map +1 -0
  57. package/dist/{chunk-XOEEAMMY.js → chunk-X3VT5SSK.js} +88 -98
  58. package/dist/chunk-X3VT5SSK.js.map +1 -0
  59. package/dist/{chunk-SFP77VS3.js → chunk-X7JN7WPF.js} +5 -2
  60. package/dist/chunk-X7JN7WPF.js.map +1 -0
  61. package/dist/chunk-YRSHBAUQ.js +201 -0
  62. package/dist/chunk-YRSHBAUQ.js.map +1 -0
  63. package/dist/chunk-YUACN5GJ.js +303 -0
  64. package/dist/chunk-YUACN5GJ.js.map +1 -0
  65. package/dist/color-picker/index.js +6 -0
  66. package/dist/color-picker/index.js.map +1 -0
  67. package/dist/date-picker/RangePicker.d.ts.map +1 -1
  68. package/dist/date-picker/index.d.ts.map +1 -1
  69. package/dist/date-picker/index.js +1 -1
  70. package/dist/date-picker/shared.d.ts +5 -0
  71. package/dist/date-picker/shared.d.ts.map +1 -1
  72. package/dist/dropdown/index.js +2 -2
  73. package/dist/float-button/index.js +5 -0
  74. package/dist/float-button/index.js.map +1 -0
  75. package/dist/index.js +50 -2995
  76. package/dist/index.js.map +1 -1
  77. package/dist/input/index.d.ts.map +1 -1
  78. package/dist/input/index.js +1 -1
  79. package/dist/input-password/index.js +2 -2
  80. package/dist/mentions/index.js +4 -0
  81. package/dist/mentions/index.js.map +1 -0
  82. package/dist/menubar/index.d.ts +3 -3
  83. package/dist/menubar/index.d.ts.map +1 -1
  84. package/dist/menubar/index.js +2 -2
  85. package/dist/multi-select/index.d.ts.map +1 -1
  86. package/dist/multi-select/index.js +4 -4
  87. package/dist/number-input/index.d.ts.map +1 -1
  88. package/dist/number-input/index.js +1 -1
  89. package/dist/qr-code/index.js +5 -0
  90. package/dist/qr-code/index.js.map +1 -0
  91. package/dist/resizable/index.js +4 -0
  92. package/dist/resizable/index.js.map +1 -0
  93. package/dist/result/index.js +4 -0
  94. package/dist/result/index.js.map +1 -0
  95. package/dist/select/index.d.ts.map +1 -1
  96. package/dist/select/index.js +4 -4
  97. package/dist/shared/useSelectBase.d.ts.map +1 -1
  98. package/dist/skeleton/index.d.ts.map +1 -1
  99. package/dist/skeleton/index.js +1 -1
  100. package/dist/table/index.js +4 -4
  101. package/dist/tabs/index.d.ts.map +1 -1
  102. package/dist/tabs/index.js +1 -1
  103. package/dist/tags-input/index.js +5 -0
  104. package/dist/tags-input/index.js.map +1 -0
  105. package/dist/toast/index.d.ts.map +1 -1
  106. package/dist/toast/index.js +1 -1
  107. package/dist/tooltip/index.d.ts.map +1 -1
  108. package/dist/tooltip/index.js +1 -1
  109. package/dist/tour/index.js +5 -0
  110. package/dist/tour/index.js.map +1 -0
  111. package/dist/typography/index.js +4 -0
  112. package/dist/typography/index.js.map +1 -0
  113. package/dist/watermark/index.js +4 -0
  114. package/dist/watermark/index.js.map +1 -0
  115. package/package.json +59 -11
  116. package/styles/global.css +6 -3
  117. package/dist/chunk-253JZOYG.js.map +0 -1
  118. package/dist/chunk-BGMYX7L5.js.map +0 -1
  119. package/dist/chunk-BKLJDEUX.js.map +0 -1
  120. package/dist/chunk-HJITFPBT.js.map +0 -1
  121. package/dist/chunk-HVHQA34X.js.map +0 -1
  122. package/dist/chunk-I5AD247M.js.map +0 -1
  123. package/dist/chunk-JBNFVXH5.js +0 -322
  124. package/dist/chunk-JBNFVXH5.js.map +0 -1
  125. package/dist/chunk-SFP77VS3.js.map +0 -1
  126. package/dist/chunk-W5VLFE4U.js.map +0 -1
  127. package/dist/chunk-X7MF3TIF.js.map +0 -1
  128. package/dist/chunk-XOEEAMMY.js.map +0 -1
@@ -0,0 +1,307 @@
1
+ import { Popover, PopoverAnchor, PopoverContent } from './chunk-ROQGBDET.js';
2
+ import { colorVars } from './chunk-G6QIIWKU.js';
3
+ import { cn, iconSizes, statusMessageVariants } from './chunk-RAS6HUEI.js';
4
+ import { cva } from 'class-variance-authority';
5
+ import React from 'react';
6
+ import { Loader2, X, ChevronDown } from 'lucide-react';
7
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
+
9
+ var inputVariants = cva(
10
+ "w-full flex items-center rounded-md bg-background text-text-primary border outline-none transition-colors",
11
+ {
12
+ variants: {
13
+ status: {
14
+ default: "border-border focus-within:border-slot hover:border-slot-50",
15
+ primary: "border-slot",
16
+ secondary: "border-slot",
17
+ accent: "border-slot",
18
+ success: "border-slot",
19
+ error: "border-slot",
20
+ warning: "border-slot",
21
+ info: "border-slot"
22
+ },
23
+ size: {
24
+ xs: "h-(--input-height-xs) px-2 text-xs gap-1.5",
25
+ sm: "h-(--input-height-sm) px-2.5 text-sm gap-2",
26
+ md: "h-(--input-height-md) px-3 text-base gap-2",
27
+ lg: "h-(--input-height-lg) px-3.5 text-lg gap-2.5"
28
+ },
29
+ fullWidth: {
30
+ true: "w-full",
31
+ false: ""
32
+ },
33
+ disabled: {
34
+ true: "opacity-50 cursor-not-allowed",
35
+ false: ""
36
+ }
37
+ },
38
+ defaultVariants: {
39
+ status: "default",
40
+ size: "md",
41
+ fullWidth: true,
42
+ disabled: false
43
+ }
44
+ }
45
+ );
46
+ function normalizeOption(opt) {
47
+ return typeof opt === "string" ? { label: opt, value: opt } : opt;
48
+ }
49
+ var defaultFilter = (query, option) => option.label.toLowerCase().includes(query.toLowerCase());
50
+ var Autocomplete = React.memo(
51
+ ({
52
+ value,
53
+ defaultValue = "",
54
+ onChange,
55
+ onSelect,
56
+ options: rawOptions,
57
+ placeholder,
58
+ label,
59
+ helperText,
60
+ error,
61
+ size = "md",
62
+ status: statusProp,
63
+ disabled = false,
64
+ loading = false,
65
+ clearable = false,
66
+ filter = defaultFilter,
67
+ limit = 10,
68
+ emptyMessage = "No results",
69
+ fullWidth = true,
70
+ className,
71
+ classNames
72
+ }) => {
73
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
74
+ const [isOpen, setIsOpen] = React.useState(false);
75
+ const [highlightIdx, setHighlightIdx] = React.useState(-1);
76
+ const inputRef = React.useRef(null);
77
+ const listRef = React.useRef(null);
78
+ const labelId = React.useId();
79
+ const selectingRef = React.useRef(false);
80
+ const currentValue = value !== void 0 ? value : internalValue;
81
+ const status = error ? "error" : statusProp || "default";
82
+ const options = React.useMemo(
83
+ () => rawOptions.map(normalizeOption),
84
+ [rawOptions]
85
+ );
86
+ const filtered = React.useMemo(() => {
87
+ if (!currentValue) return options.slice(0, limit);
88
+ return options.filter((o) => filter(currentValue, o)).slice(0, limit);
89
+ }, [currentValue, options, filter, limit]);
90
+ React.useEffect(() => {
91
+ setHighlightIdx(-1);
92
+ }, [filtered.length]);
93
+ const updateValue = (v) => {
94
+ if (value === void 0) setInternalValue(v);
95
+ onChange?.(v);
96
+ };
97
+ const open = () => {
98
+ if (!disabled) setIsOpen(true);
99
+ };
100
+ const close = () => {
101
+ setIsOpen(false);
102
+ setHighlightIdx(-1);
103
+ };
104
+ const handleInputChange = (e) => {
105
+ updateValue(e.target.value);
106
+ open();
107
+ };
108
+ const handleSelect = (option) => {
109
+ if (option.disabled) return;
110
+ updateValue(option.label);
111
+ onSelect?.(option);
112
+ close();
113
+ requestAnimationFrame(() => inputRef.current?.focus());
114
+ };
115
+ const handleClear = () => {
116
+ updateValue("");
117
+ inputRef.current?.focus();
118
+ };
119
+ const handleKeyDown = (e) => {
120
+ if (e.key === "ArrowDown") {
121
+ e.preventDefault();
122
+ if (!isOpen) {
123
+ open();
124
+ return;
125
+ }
126
+ setHighlightIdx((i) => Math.min(i + 1, filtered.length - 1));
127
+ } else if (e.key === "ArrowUp") {
128
+ e.preventDefault();
129
+ if (!isOpen) {
130
+ open();
131
+ return;
132
+ }
133
+ setHighlightIdx((i) => Math.max(i - 1, 0));
134
+ } else if (e.key === "Enter" && highlightIdx >= 0 && isOpen) {
135
+ e.preventDefault();
136
+ handleSelect(filtered[highlightIdx]);
137
+ } else if (e.key === "Escape") {
138
+ close();
139
+ } else if (e.key === "Tab") {
140
+ close();
141
+ }
142
+ };
143
+ const handleFocus = () => {
144
+ open();
145
+ };
146
+ const handleBlur = () => {
147
+ setTimeout(() => {
148
+ if (!selectingRef.current) close();
149
+ selectingRef.current = false;
150
+ }, 150);
151
+ };
152
+ React.useEffect(() => {
153
+ if (highlightIdx >= 0 && listRef.current) {
154
+ const el = listRef.current.children[highlightIdx];
155
+ el?.scrollIntoView?.({ block: "nearest" });
156
+ }
157
+ }, [highlightIdx]);
158
+ return /* @__PURE__ */ jsxs(
159
+ "div",
160
+ {
161
+ "data-slot": "root",
162
+ className: cn(
163
+ "autocomplete_root",
164
+ "flex flex-col gap-1.5",
165
+ colorVars[status === "default" ? "primary" : status],
166
+ fullWidth ? "w-full" : "inline-flex",
167
+ classNames?.root,
168
+ className
169
+ ),
170
+ children: [
171
+ label && /* @__PURE__ */ jsx(
172
+ "label",
173
+ {
174
+ id: labelId,
175
+ className: "text-sm font-medium text-text-primary",
176
+ children: label
177
+ }
178
+ ),
179
+ /* @__PURE__ */ jsxs(Popover, { open: isOpen && !disabled, onOpenChange: (v) => {
180
+ if (!v) close();
181
+ }, children: [
182
+ /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
183
+ "div",
184
+ {
185
+ className: inputVariants({ status, size, fullWidth, disabled }),
186
+ onClick: () => {
187
+ if (!isOpen) open();
188
+ inputRef.current?.focus();
189
+ },
190
+ children: [
191
+ /* @__PURE__ */ jsx(
192
+ "input",
193
+ {
194
+ ref: inputRef,
195
+ type: "text",
196
+ role: "combobox",
197
+ "aria-expanded": isOpen,
198
+ "aria-autocomplete": "list",
199
+ "aria-labelledby": label ? labelId : void 0,
200
+ className: "flex-1 min-w-0 bg-transparent outline-none placeholder:text-text-secondary/50",
201
+ placeholder,
202
+ value: currentValue,
203
+ onChange: handleInputChange,
204
+ onFocus: handleFocus,
205
+ onBlur: handleBlur,
206
+ onKeyDown: handleKeyDown,
207
+ disabled
208
+ }
209
+ ),
210
+ loading && /* @__PURE__ */ jsx(Loader2, { className: cn("animate-spin text-text-secondary", iconSizes[size]) }),
211
+ clearable && currentValue && !disabled && !loading && /* @__PURE__ */ jsx(
212
+ "button",
213
+ {
214
+ type: "button",
215
+ onMouseDown: (e) => e.preventDefault(),
216
+ onClick: (e) => {
217
+ e.stopPropagation();
218
+ handleClear();
219
+ },
220
+ className: "text-text-secondary hover:text-text-primary transition-colors cursor-pointer",
221
+ tabIndex: -1,
222
+ "aria-label": "Clear",
223
+ children: /* @__PURE__ */ jsx(X, { className: iconSizes[size] })
224
+ }
225
+ ),
226
+ !loading && !clearable && /* @__PURE__ */ jsx(
227
+ ChevronDown,
228
+ {
229
+ className: cn(
230
+ "text-text-secondary transition-transform duration-200",
231
+ iconSizes[size],
232
+ isOpen && "rotate-180"
233
+ )
234
+ }
235
+ )
236
+ ]
237
+ }
238
+ ) }),
239
+ /* @__PURE__ */ jsx(
240
+ PopoverContent,
241
+ {
242
+ className: cn(
243
+ "autocomplete_dropdown",
244
+ "p-1 w-[var(--radix-popover-trigger-width)] max-h-60 overflow-y-auto",
245
+ classNames?.dropdown
246
+ ),
247
+ align: "start",
248
+ onOpenAutoFocus: (e) => e.preventDefault(),
249
+ onCloseAutoFocus: (e) => e.preventDefault(),
250
+ onInteractOutside: (e) => {
251
+ const target = e.target;
252
+ if (inputRef.current?.contains(target)) {
253
+ e.preventDefault();
254
+ }
255
+ },
256
+ children: /* @__PURE__ */ jsx("div", { ref: listRef, role: "listbox", children: filtered.length === 0 ? /* @__PURE__ */ jsx(
257
+ "div",
258
+ {
259
+ className: cn(
260
+ "autocomplete_empty",
261
+ "px-3 py-2 text-sm text-text-secondary text-center",
262
+ classNames?.empty
263
+ ),
264
+ children: emptyMessage
265
+ }
266
+ ) : filtered.map((option, idx) => /* @__PURE__ */ jsx(
267
+ "div",
268
+ {
269
+ role: "option",
270
+ "aria-selected": idx === highlightIdx,
271
+ "aria-disabled": option.disabled,
272
+ onMouseDown: (e) => {
273
+ e.preventDefault();
274
+ selectingRef.current = true;
275
+ },
276
+ onClick: () => handleSelect(option),
277
+ onMouseEnter: () => setHighlightIdx(idx),
278
+ className: cn(
279
+ "autocomplete_option",
280
+ "px-3 py-2 text-sm rounded-md cursor-pointer transition-colors",
281
+ idx === highlightIdx && "bg-surface",
282
+ option.disabled && "opacity-50 cursor-not-allowed",
283
+ !option.disabled && "hover:bg-surface",
284
+ classNames?.option
285
+ ),
286
+ children: option.label
287
+ },
288
+ option.value
289
+ )) })
290
+ }
291
+ )
292
+ ] }),
293
+ (error || helperText) && /* @__PURE__ */ jsx("p", { className: cn(
294
+ "text-xs",
295
+ error ? statusMessageVariants({ status: "error" }) : "text-text-secondary"
296
+ ), children: error || helperText })
297
+ ]
298
+ }
299
+ );
300
+ }
301
+ );
302
+ Autocomplete.displayName = "Autocomplete";
303
+ var autocomplete_default = Autocomplete;
304
+
305
+ export { autocomplete_default };
306
+ //# sourceMappingURL=chunk-JWYBDNC6.js.map
307
+ //# sourceMappingURL=chunk-JWYBDNC6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/autocomplete/index.tsx"],"names":[],"mappings":"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","file":"chunk-JWYBDNC6.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { Loader2, X, ChevronDown } from 'lucide-react'\nimport { Popover, PopoverAnchor, PopoverContent } from '../popover'\nimport { cn, iconSizes, statusMessageVariants } from '../utils'\nimport { colorVars } from '../variants'\nimport type { AutocompleteOption, AutocompleteProps } from './types'\n\nconst inputVariants = cva(\n 'w-full flex items-center rounded-md bg-background text-text-primary border outline-none transition-colors',\n {\n variants: {\n status: {\n default: 'border-border focus-within:border-slot hover:border-slot-50',\n primary: 'border-slot', secondary: 'border-slot', accent: 'border-slot',\n success: 'border-slot', error: 'border-slot', warning: 'border-slot', info: 'border-slot',\n },\n size: {\n xs: 'h-(--input-height-xs) px-2 text-xs gap-1.5',\n sm: 'h-(--input-height-sm) px-2.5 text-sm gap-2',\n md: 'h-(--input-height-md) px-3 text-base gap-2',\n lg: 'h-(--input-height-lg) px-3.5 text-lg gap-2.5',\n },\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed',\n false: '',\n },\n },\n defaultVariants: {\n status: 'default',\n size: 'md',\n fullWidth: true,\n disabled: false,\n },\n },\n)\n\nfunction normalizeOption(opt: string | AutocompleteOption): AutocompleteOption {\n return typeof opt === 'string' ? { label: opt, value: opt } : opt\n}\n\nconst defaultFilter = (query: string, option: AutocompleteOption) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n\nconst Autocomplete = React.memo<AutocompleteProps>(\n ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n options: rawOptions,\n placeholder,\n label,\n helperText,\n error,\n size = 'md',\n status: statusProp,\n disabled = false,\n loading = false,\n clearable = false,\n filter = defaultFilter,\n limit = 10,\n emptyMessage = 'No results',\n fullWidth = true,\n className,\n classNames,\n }) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue)\n const [isOpen, setIsOpen] = React.useState(false)\n const [highlightIdx, setHighlightIdx] = React.useState(-1)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const listRef = React.useRef<HTMLDivElement>(null)\n const labelId = React.useId()\n // Guard against blur closing the dropdown while clicking an option\n const selectingRef = React.useRef(false)\n\n const currentValue = value !== undefined ? value : internalValue\n const status = error ? 'error' : statusProp || 'default'\n\n const options = React.useMemo(\n () => rawOptions.map(normalizeOption),\n [rawOptions],\n )\n\n const filtered = React.useMemo(() => {\n if (!currentValue) return options.slice(0, limit)\n return options.filter((o) => filter(currentValue, o)).slice(0, limit)\n }, [currentValue, options, filter, limit])\n\n // Reset highlight when filtered list changes\n React.useEffect(() => {\n setHighlightIdx(-1)\n }, [filtered.length])\n\n const updateValue = (v: string) => {\n if (value === undefined) setInternalValue(v)\n onChange?.(v)\n }\n\n const open = () => {\n if (!disabled) setIsOpen(true)\n }\n\n const close = () => {\n setIsOpen(false)\n setHighlightIdx(-1)\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n updateValue(e.target.value)\n open()\n }\n\n const handleSelect = (option: AutocompleteOption) => {\n if (option.disabled) return\n updateValue(option.label)\n onSelect?.(option)\n close()\n // Refocus input after selection\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n\n const handleClear = () => {\n updateValue('')\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n if (!isOpen) { open(); return }\n setHighlightIdx((i) => Math.min(i + 1, filtered.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n if (!isOpen) { open(); return }\n setHighlightIdx((i) => Math.max(i - 1, 0))\n } else if (e.key === 'Enter' && highlightIdx >= 0 && isOpen) {\n e.preventDefault()\n handleSelect(filtered[highlightIdx])\n } else if (e.key === 'Escape') {\n close()\n } else if (e.key === 'Tab') {\n close()\n }\n }\n\n const handleFocus = () => {\n open()\n }\n\n const handleBlur = () => {\n // Delay close so option mousedown/click can fire first\n setTimeout(() => {\n if (!selectingRef.current) close()\n selectingRef.current = false\n }, 150)\n }\n\n React.useEffect(() => {\n if (highlightIdx >= 0 && listRef.current) {\n const el = listRef.current.children[highlightIdx] as HTMLElement\n el?.scrollIntoView?.({ block: 'nearest' })\n }\n }, [highlightIdx])\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'autocomplete_root',\n 'flex flex-col gap-1.5',\n colorVars[status === 'default' ? 'primary' : status],\n fullWidth ? 'w-full' : 'inline-flex',\n classNames?.root,\n className,\n )}\n >\n {label && (\n <label\n id={labelId}\n className=\"text-sm font-medium text-text-primary\"\n >\n {label}\n </label>\n )}\n\n <Popover open={isOpen && !disabled} onOpenChange={(v) => { if (!v) close() }}>\n <PopoverAnchor asChild>\n <div\n className={inputVariants({ status, size, fullWidth, disabled })}\n onClick={() => { if (!isOpen) open(); inputRef.current?.focus() }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-autocomplete=\"list\"\n aria-labelledby={label ? labelId : undefined}\n className=\"flex-1 min-w-0 bg-transparent outline-none placeholder:text-text-secondary/50\"\n placeholder={placeholder}\n value={currentValue}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n />\n {loading && (\n <Loader2 className={cn('animate-spin text-text-secondary', iconSizes[size])} />\n )}\n {clearable && currentValue && !disabled && !loading && (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => { e.stopPropagation(); handleClear() }}\n className=\"text-text-secondary hover:text-text-primary transition-colors cursor-pointer\"\n tabIndex={-1}\n aria-label=\"Clear\"\n >\n <X className={iconSizes[size]} />\n </button>\n )}\n {!loading && !clearable && (\n <ChevronDown\n className={cn(\n 'text-text-secondary transition-transform duration-200',\n iconSizes[size],\n isOpen && 'rotate-180',\n )}\n />\n )}\n </div>\n </PopoverAnchor>\n\n <PopoverContent\n className={cn(\n 'autocomplete_dropdown',\n 'p-1 w-[var(--radix-popover-trigger-width)] max-h-60 overflow-y-auto',\n classNames?.dropdown,\n )}\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onInteractOutside={(e) => {\n // Don't close if clicking the anchor/input area\n const target = e.target as HTMLElement\n if (inputRef.current?.contains(target)) {\n e.preventDefault()\n }\n }}\n >\n <div ref={listRef} role=\"listbox\">\n {filtered.length === 0 ? (\n <div\n className={cn(\n 'autocomplete_empty',\n 'px-3 py-2 text-sm text-text-secondary text-center',\n classNames?.empty,\n )}\n >\n {emptyMessage}\n </div>\n ) : (\n filtered.map((option, idx) => (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={idx === highlightIdx}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n // Prevent blur from firing before select\n e.preventDefault()\n selectingRef.current = true\n }}\n onClick={() => handleSelect(option)}\n onMouseEnter={() => setHighlightIdx(idx)}\n className={cn(\n 'autocomplete_option',\n 'px-3 py-2 text-sm rounded-md cursor-pointer transition-colors',\n idx === highlightIdx && 'bg-surface',\n option.disabled && 'opacity-50 cursor-not-allowed',\n !option.disabled && 'hover:bg-surface',\n classNames?.option,\n )}\n >\n {option.label}\n </div>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n\n {(error || helperText) && (\n <p className={cn(\n 'text-xs',\n error ? statusMessageVariants({ status: 'error' }) : 'text-text-secondary',\n )}>\n {error || helperText}\n </p>\n )}\n </div>\n )\n },\n)\n\nAutocomplete.displayName = 'Autocomplete'\n\nexport type * from './types'\nexport default Autocomplete\n"]}
@@ -105,22 +105,48 @@ var Input = React.memo(
105
105
  loading && "opacity-50 cursor-not-allowed",
106
106
  classNames?.wrapper
107
107
  );
108
+ const leftIconOffset = {
109
+ xs: "left-2",
110
+ sm: "left-2.5",
111
+ md: "left-3",
112
+ lg: "left-3.5"
113
+ };
108
114
  const leftIconClass = cn(
109
115
  "input_leftIcon",
110
- "absolute left-3 flex items-center h-full top-0 text-text-secondary",
116
+ "absolute flex items-center h-full top-0 text-text-secondary pointer-events-none",
117
+ leftIconOffset[size],
111
118
  classNames?.leftIcon
112
119
  );
120
+ const leftIconPadding = {
121
+ xs: "pl-7",
122
+ sm: "pl-8",
123
+ md: "pl-10",
124
+ lg: "pl-11"
125
+ };
126
+ const rightIconPadding = {
127
+ xs: "pr-7",
128
+ sm: "pr-8",
129
+ md: "pr-9",
130
+ lg: "pr-10"
131
+ };
113
132
  const inputClass = cn(
114
133
  "input_input",
115
134
  inputVariants({ variant, status, size, fullWidth }),
116
- !!leftIcon && "pl-10",
117
- !!hasRightIcon && "pr-8",
135
+ !!leftIcon && leftIconPadding[size],
136
+ !!hasRightIcon && rightIconPadding[size],
118
137
  className,
119
138
  classNames?.input
120
139
  );
140
+ const rightIconOffset = {
141
+ xs: "right-2",
142
+ sm: "right-2.5",
143
+ md: "right-3",
144
+ lg: "right-3.5"
145
+ };
121
146
  const rightIconClass = cn(
122
147
  "input_rightIcon",
123
- "absolute right-3 flex gap-2 items-center h-full top-0 text-text-secondary",
148
+ "absolute flex gap-1.5 items-center h-full top-0 text-text-secondary",
149
+ rightIconOffset[size],
124
150
  classNames?.rightIcon
125
151
  );
126
152
  const clearButtonClass = cn(
@@ -217,5 +243,5 @@ Input.displayName = "Input";
217
243
  var input_default = Input;
218
244
 
219
245
  export { input_default };
220
- //# sourceMappingURL=chunk-W5VLFE4U.js.map
221
- //# sourceMappingURL=chunk-W5VLFE4U.js.map
246
+ //# sourceMappingURL=chunk-LHZJ2GJU.js.map
247
+ //# sourceMappingURL=chunk-LHZJ2GJU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/input/index.tsx"],"names":[],"mappings":"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","file":"chunk-LHZJ2GJU.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React, { useId, useMemo } from \"react\";\n\nimport { X } from 'lucide-react';\n\nimport Spinner from \"../spinner\";\n\nimport {\n cn,\n getValidationStatus,\n iconSizes,\n statusMessageVariants,\n} from \"../utils\";\nimport type { InputProps } from \"./types\";\n\nconst inputVariants = cva(\n \"w-full placeholder:text-text-secondary/50 rounded-md disabled:opacity-50 disabled:cursor-not-allowed read-only:bg-surface read-only:cursor-default outline-none text-text-primary transition-colors\",\n {\n variants: {\n variant: {\n outline: \"bg-background border border-border focus:border-primary\",\n filled: \"bg-surface border border-transparent focus:border-primary\",\n },\n status: {\n default: \"\",\n error: \"border-error focus:border-error\",\n warning: \"border-warning focus:border-warning\",\n info: \"border-info focus:border-info\",\n success: \"border-success focus:border-success\",\n },\n size: {\n xs: \"h-(--input-height-xs) px-(--input-padding-x-xs) text-xs\",\n sm: \"h-(--input-height-sm) px-(--input-padding-x-sm) text-sm\",\n md: \"h-(--input-height-md) px-(--input-padding-x-md) text-base\",\n lg: \"h-(--input-height-lg) px-(--input-padding-x-lg) text-lg\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"max-w-full\",\n },\n },\n defaultVariants: {\n variant: \"outline\",\n status: \"default\",\n size: \"md\",\n fullWidth: true,\n },\n },\n);\n\nconst Input = React.memo<InputProps>(\n ({\n variant = \"outline\",\n size = \"md\",\n label,\n error,\n warning,\n info,\n success,\n helperText,\n messagePosition = \"bottom\",\n leftIcon,\n rightIcon,\n clearable = false,\n onClear,\n loading = false,\n maxLength,\n showCount = false,\n fullWidth = true,\n className,\n wrapperClassName,\n classNames,\n value,\n onChange,\n ref,\n ...props\n }) => {\n\n\n const [internalValue, setInternalValue] = React.useState(props.defaultValue ?? '');\n const currentValue = value !== undefined ? value : internalValue;\n\n const uniqueId = useId();\n const inputId = props.id || `input-${uniqueId}`;\n const helperId = `input-helper-${uniqueId}`;\n const loadingId = `input-loading-${uniqueId}`;\n\n const { status, message: helperMessage } = useMemo(\n () => getValidationStatus({ error, warning, info, success, helperText }),\n [error, warning, info, success, helperText],\n );\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) setInternalValue(e.target.value);\n onChange?.(e);\n },\n [value, onChange],\n );\n\n const handleClear = React.useCallback(() => {\n if (value === undefined) setInternalValue('');\n\n onChange?.({\n target: { value: \"\" },\n } as React.ChangeEvent<HTMLInputElement>);\n onClear?.();\n }, [value, onChange, onClear]);\n\n const showClear =\n clearable && currentValue && !props.disabled && !props.readOnly;\n const hasRightIcon = rightIcon || showClear || loading;\n\n // Memoize aria-describedby to avoid array recreation on every render\n const ariaDescribedBy = useMemo(() => {\n const parts: string[] = [];\n if (helperMessage) parts.push(helperId);\n if (loading) parts.push(loadingId);\n return parts.length > 0 ? parts.join(\" \") : undefined;\n }, [helperMessage, helperId, loading, loadingId]);\n\n const wrapperClass = cn(\n \"input_wrapper\",\n \"relative w-full\",\n wrapperClassName,\n loading && \"opacity-50 cursor-not-allowed\",\n classNames?.wrapper,\n );\n\n const leftIconOffset: Record<string, string> = {\n xs: \"left-2\",\n sm: \"left-2.5\",\n md: \"left-3\",\n lg: \"left-3.5\",\n };\n\n const leftIconClass = cn(\n \"input_leftIcon\",\n \"absolute flex items-center h-full top-0 text-text-secondary pointer-events-none\",\n leftIconOffset[size],\n classNames?.leftIcon,\n );\n\n const leftIconPadding: Record<string, string> = {\n xs: \"pl-7\",\n sm: \"pl-8\",\n md: \"pl-10\",\n lg: \"pl-11\",\n };\n\n const rightIconPadding: Record<string, string> = {\n xs: \"pr-7\",\n sm: \"pr-8\",\n md: \"pr-9\",\n lg: \"pr-10\",\n };\n\n const inputClass = cn(\n \"input_input\",\n inputVariants({ variant, status, size, fullWidth }),\n !!leftIcon && leftIconPadding[size],\n !!hasRightIcon && rightIconPadding[size],\n className,\n classNames?.input,\n );\n\n const rightIconOffset: Record<string, string> = {\n xs: \"right-2\",\n sm: \"right-2.5\",\n md: \"right-3\",\n lg: \"right-3.5\",\n };\n\n const rightIconClass = cn(\n \"input_rightIcon\",\n \"absolute flex gap-1.5 items-center h-full top-0 text-text-secondary\",\n rightIconOffset[size],\n classNames?.rightIcon,\n );\n\n const clearButtonClass = cn(\n \"input_clearButton\",\n \"flex items-center h-full top-0 text-text-secondary hover:text-text-primary\",\n classNames?.clearButton,\n );\n\n const rootClass = cn(\n \"input_root\",\n \"w-full flex flex-col relative\",\n !fullWidth && \"inline-block\",\n classNames?.root,\n );\n\n const labelClass = cn(\n \"input_label\",\n \"text-sm font-medium text-text-secondary\",\n classNames?.label,\n );\n\n const helperClass = cn(\n \"input_helper\",\n statusMessageVariants({ status }),\n status === \"error\" ? classNames?.error : classNames?.helper,\n );\n\n const helperBottomClass = cn(\n \"input_helper\",\n statusMessageVariants({ status }),\n \"mt-0.5\",\n status === \"error\" ? classNames?.error : classNames?.helper,\n );\n\n const iconSize = iconSizes[size];\n\n const inputElement = (\n <div data-slot=\"wrapper\" className={wrapperClass}>\n {leftIcon && (\n <div\n data-slot=\"leftIcon\"\n className={leftIconClass}\n aria-hidden=\"true\"\n >\n {leftIcon}\n </div>\n )}\n <input\n ref={ref}\n id={inputId}\n data-slot=\"input\"\n className={inputClass}\n value={currentValue}\n onChange={handleChange}\n maxLength={maxLength}\n aria-invalid={status === \"error\"}\n aria-busy={loading}\n aria-describedby={ariaDescribedBy}\n {...props}\n />\n {(rightIcon || showClear || loading) && (\n <div data-slot=\"rightIcon\" className={rightIconClass}>\n {showClear && !loading && (\n <button\n type=\"button\"\n onClick={handleClear}\n data-slot=\"clearButton\"\n className={clearButtonClass}\n aria-label=\"Clear input\"\n >\n <X className={iconSize} aria-hidden=\"true\" />\n </button>\n )}\n {loading ? (\n <>\n <Spinner aria-hidden=\"true\" />\n <span id={loadingId} className=\"sr-only\">\n Loading\n </span>\n </>\n ) : (\n rightIcon && <span aria-hidden=\"true\">{rightIcon}</span>\n )}\n </div>\n )}\n </div>\n );\n\n return (\n <div data-slot=\"root\" className={rootClass}>\n <div className=\"flex gap-2 items-center relative mb-0.5\">\n {label && (\n <label htmlFor={inputId} data-slot=\"label\" className={labelClass}>\n {label}\n {props.required && <span className=\"text-error ml-1\">*</span>}\n </label>\n )}\n {helperMessage && messagePosition === \"top\" && (\n <p id={helperId} data-slot=\"helper\" className={helperClass}>\n {helperMessage}\n </p>\n )}\n {showCount && maxLength && (\n <span className=\"text-xs text-text-secondary absolute right-0\">\n {String(currentValue).length}/{maxLength}\n </span>\n )}\n </div>\n {inputElement}\n {helperMessage && messagePosition === \"bottom\" && (\n <p id={helperId} data-slot=\"helper\" className={helperBottomClass}>\n {helperMessage}\n </p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n\nexport type * from \"./types\";\nexport default Input;\n"]}
@@ -52,6 +52,7 @@ var Tooltip = React.memo(
52
52
  /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
53
53
  TooltipPrimitive.Content,
54
54
  {
55
+ "data-slot": "tooltip-content",
55
56
  side,
56
57
  align,
57
58
  className: cn(
@@ -72,5 +73,5 @@ Tooltip.displayName = "Tooltip";
72
73
  var tooltip_default = Tooltip;
73
74
 
74
75
  export { TooltipProvider, tooltip_default };
75
- //# sourceMappingURL=chunk-253JZOYG.js.map
76
- //# sourceMappingURL=chunk-253JZOYG.js.map
76
+ //# sourceMappingURL=chunk-NB66D6A5.js.map
77
+ //# sourceMappingURL=chunk-NB66D6A5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tooltip/index.tsx"],"names":[],"mappings":";;;;;;;AAUA,IAAM,sBAAA,GAAyB,GAAA;AAAA,EAC7B,smBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,mBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,uBAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,sBAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AAEO,IAAM,eAAA,GAAmC,gBAAA,CAAA;AAUhD,IAAM,UAAU,KAAA,CAAM,IAAA;AAAA,EACpB,CAAC;AAAA,IACC,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,GAAQ,SAAA;AAAA,IACR,IAAA,GAAO,IAAA;AAAA,IACP,OAAA,GAAU,OAAA;AAAA,IACV,IAAA,GAAO,KAAA;AAAA,IACP,KAAA,GAAQ,QAAA;AAAA,IACR,aAAA,GAAgB,GAAA;AAAA,IAChB,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAG;AAAA,GACL,KAAM;AACJ,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,uCAAU,QAAA,EAAS,CAAA;AAAA,IACrB;AAEA,IAAA,uBACE,IAAA,CAAkB,gBAAA,CAAA,IAAA,EAAjB,EAAsB,aAAA,EACrB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAkB,gBAAA,CAAA,OAAA,EAAjB,EAAyB,OAAA,EAAO,IAAA,EAAE,QAAA,EAAS,CAAA;AAAA,sBAC5C,GAAA,CAAkB,yBAAjB,EACC,QAAA,kBAAA,GAAA;AAAA,QAAkB,gBAAA,CAAA,OAAA;AAAA,QAAjB;AAAA,UACC,WAAA,EAAU,iBAAA;AAAA,UACV,IAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,iBAAA;AAAA,YACA,sBAAA,CAAuB,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,YAC/C,SAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACd;AAAA,UACA,UAAA,EAAY,CAAA;AAAA,UACX,GAAG,KAAA;AAAA,UAEH,QAAA,EAAA;AAAA;AAAA,OACH,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AAGtB,IAAO,eAAA,GAAQ","file":"chunk-NB66D6A5.js","sourcesContent":["'use client'\n\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { TooltipProps } from './types'\n\nconst tooltipContentVariants = cva(\n 'z-[var(--z-tooltip)] overflow-hidden rounded px-3 py-1.5 text-sm will-change-[transform,_opacity] animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:data-[side=bottom]:slide-out-to-top-2 data-[state=closed]:data-[side=left]:slide-out-to-right-2 data-[state=closed]:data-[side=right]:slide-out-to-left-2 data-[state=closed]:data-[side=top]:slide-out-to-bottom-2',\n {\n variants: {\n size: {\n xs: 'text-xs px-2 py-1',\n sm: 'text-sm px-2.5 py-1',\n md: 'text-base px-3 py-1.5',\n lg: 'text-lg px-4 py-2',\n },\n color: colorVars,\n variant: {\n solid: 'bg-slot text-slot-fg',\n soft: 'bg-slot-20 text-slot border border-slot-30',\n },\n },\n defaultVariants: {\n size: 'sm',\n color: 'default',\n variant: 'solid',\n },\n },\n)\n\nexport const TooltipProvider = TooltipPrimitive.Provider\n\nexport type {\n TooltipProps,\n TooltipProviderProps,\n TooltipColor,\n TooltipSize,\n TooltipVariant,\n} from './types'\n\nconst Tooltip = React.memo<TooltipProps>(\n ({\n content,\n children,\n color = 'default',\n size = 'sm',\n variant = 'solid',\n side = 'top',\n align = 'center',\n delayDuration = 200,\n disabled = false,\n className,\n classNames,\n ...props\n }) => {\n if (disabled) {\n return <>{children}</>\n }\n\n return (\n <TooltipPrimitive.Root delayDuration={delayDuration}>\n <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n side={side}\n align={align}\n className={cn(\n 'tooltip_content',\n tooltipContentVariants({ size, color, variant }),\n className,\n classNames?.content,\n )}\n sideOffset={4}\n {...props}\n >\n {content}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n )\n },\n)\n\nTooltip.displayName = 'Tooltip'\n\nexport type * from './types'\nexport default Tooltip\n"]}
@@ -38,15 +38,16 @@ var ToastRenderer = ({
38
38
  const color = options.color ?? "default";
39
39
  const closable = options.closable ?? !options.loading;
40
40
  const icon = options.loading ? /* @__PURE__ */ jsx(Loader2, { className: "w-5 h-5 animate-spin" }) : options.icon !== void 0 ? options.icon : defaultIcons[color];
41
- return /* @__PURE__ */ jsxs("div", { className: cn(toastVariants({ variant, color })), children: [
42
- icon && /* @__PURE__ */ jsx("div", { className: "shrink-0 mt-0.5", children: icon }),
43
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
44
- options.title && /* @__PURE__ */ jsx("div", { className: "font-semibold", children: options.title }),
45
- options.description && /* @__PURE__ */ jsx("div", { className: "opacity-90 mt-0.5", children: options.description }),
41
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "toast", className: cn(toastVariants({ variant, color })), children: [
42
+ icon && /* @__PURE__ */ jsx("div", { "data-slot": "toast-icon", className: "shrink-0 mt-0.5", children: icon }),
43
+ /* @__PURE__ */ jsxs("div", { "data-slot": "toast-content", className: "flex-1 min-w-0", children: [
44
+ options.title && /* @__PURE__ */ jsx("div", { "data-slot": "toast-title", className: "font-semibold", children: options.title }),
45
+ options.description && /* @__PURE__ */ jsx("div", { "data-slot": "toast-description", className: "opacity-90 mt-0.5", children: options.description }),
46
46
  options.action && /* @__PURE__ */ jsx(
47
47
  "button",
48
48
  {
49
49
  type: "button",
50
+ "data-slot": "toast-action",
50
51
  onClick: options.action.onClick,
51
52
  className: "mt-2 text-sm font-medium underline hover:no-underline",
52
53
  children: options.action.label
@@ -57,6 +58,7 @@ var ToastRenderer = ({
57
58
  "button",
58
59
  {
59
60
  type: "button",
61
+ "data-slot": "toast-close",
60
62
  onClick: () => toast.dismiss(id),
61
63
  className: "shrink-0 rounded-sm opacity-70 hover:opacity-100 transition-opacity",
62
64
  "aria-label": "Close",
@@ -191,5 +193,5 @@ var useToast = () => {
191
193
  };
192
194
 
193
195
  export { ToastProvider, useToast };
194
- //# sourceMappingURL=chunk-BGMYX7L5.js.map
195
- //# sourceMappingURL=chunk-BGMYX7L5.js.map
196
+ //# sourceMappingURL=chunk-NF6JUJBE.js.map
197
+ //# sourceMappingURL=chunk-NF6JUJBE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/toast/index.tsx"],"names":["sonnerToast","toast"],"mappings":";;;;;;;;AAyBA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB,6EAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,yCAAA;AAAA,QACT,KAAA,EAAO,sBAAA;AAAA,QACP,OAAA,EAAS,uEAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO;AAAA;AACT;AAEJ,CAAA;AAKA,IAAM,YAAA,GAA4D;AAAA,EAChE,OAAA,kBAAS,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,EAC3C,KAAA,kBAAO,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,EACxC,OAAA,kBAAS,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,EAC5C,IAAA,kBAAM,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAClC,CAAA;AAKA,IAAM,gBAAgB,CAAC;AAAA,EACrB,EAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,SAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,OAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,mBACnB,GAAA,CAAC,WAAQ,SAAA,EAAU,sBAAA,EAAuB,CAAA,GACxC,OAAA,CAAQ,IAAA,KAAS,MAAA,GACnB,OAAA,CAAQ,IAAA,GAER,aAAa,KAAK,CAAA;AAGpB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,OAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA,EACnE,QAAA,EAAA;AAAA,IAAA,IAAA,wBAAS,KAAA,EAAA,EAAI,WAAA,EAAU,YAAA,EAAa,SAAA,EAAU,mBAAmB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBACvE,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,eAAA,EAAgB,WAAU,gBAAA,EACtC,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,KAAA,wBAAU,KAAA,EAAA,EAAI,WAAA,EAAU,eAAc,SAAA,EAAU,eAAA,EAAiB,kBAAQ,KAAA,EAAM,CAAA;AAAA,MACvF,OAAA,CAAQ,+BACP,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,mBAAA,EAAoB,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY,CAAA;AAAA,MAEvF,QAAQ,MAAA,oBACP,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAA,EAAU,cAAA;AAAA,UACV,OAAA,EAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,UACxB,SAAA,EAAU,uDAAA;AAAA,UAET,kBAAQ,MAAA,CAAO;AAAA;AAAA;AAClB,KAAA,EAEJ,CAAA;AAAA,IACC,QAAA,oBACC,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,aAAA;AAAA,QACV,OAAA,EAAS,MAAMA,KAAA,CAAY,OAAA,CAAQ,EAAE,CAAA;AAAA,QACrC,SAAA,EAAU,qEAAA;AAAA,QACV,YAAA,EAAW,OAAA;AAAA,QAEX,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,eAAY,MAAA,EAAO;AAAA;AAAA;AAC5C,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAKA,IAAM,SAAA,GAAY,CAAC,OAAA,KACjBA,KAAA,CAAY,MAAA,CAAO,CAAC,EAAA,qBAAO,GAAA,CAAC,aAAA,EAAA,EAAc,EAAA,EAAQ,OAAA,EAAkB,CAAA,EAAI;AAAA,EACtE,QAAA,EAAU,OAAA,CAAQ,QAAA,KAAa,CAAA,GAAI,WAAW,OAAA,CAAQ,QAAA;AAAA,EACtD,WAAA,EAAa,QAAQ,QAAA,IAAY,IAAA;AAAA,EACjC,WAAW,OAAA,CAAQ;AACrB,CAAC,CAAA;AAKH,IAAM,YAAA,GAAe,cAAwC,IAAI,CAAA;AAK1D,IAAM,gBAAgB,KAAA,CAAM,IAAA;AAAA,EACjC,CAAC;AAAA,IACC,QAAA;AAAA,IACA,QAAA,GAAW,WAAA;AAAA,IACX,SAAA,GAAY,CAAA;AAAA,IACZ,MAAA,GAAS,EAAA;AAAA,IACT,KAAA,GAAQ,QAAA;AAAA,IACR,WAAA,GAAc,KAAA;AAAA,IACd,QAAA,GAAW,GAAA;AAAA,IACX;AAAA,GACF,KAAM;AACJ,IAAA,MAAMC,OAAA,GAAQ,WAAA;AAAA,MACZ,CAAC,OAAA,KAA2C,SAAA,CAAU,OAAO,CAAA;AAAA,MAC7D;AAAC,KACH;AAEA,IAAA,MAAM,OAAA,GAAU,WAAA;AAAA,MACd,CAAC,OAAe,WAAA,KACd,SAAA,CAAU,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,MACpD;AAAC,KACH;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,MACZ,CAAC,OAAe,WAAA,KACd,SAAA,CAAU,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,MAClD;AAAC,KACH;AAEA,IAAA,MAAM,OAAA,GAAU,WAAA;AAAA,MACd,CAAC,OAAe,WAAA,KACd,SAAA,CAAU,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,MACpD;AAAC,KACH;AAEA,IAAA,MAAM,IAAA,GAAO,WAAA;AAAA,MACX,CAAC,OAAe,WAAA,KACd,SAAA,CAAU,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,MACjD;AAAC,KACH;AAEA,IAAA,MAAM,OAAA,GAAU,WAAA;AAAA,MACd,CACE,GACA,IAAA,KAKoB;AACpB,QAAA,MAAM,EAAA,GAAKD,KAAA,CAAY,MAAA,CAAO,CAAC,GAAA,qBAC7B,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,GAAA;AAAA,YACJ,SAAS,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,SAAS,IAAA;AAAK;AAAA,SAEjD,CAAA;AAED,QAAA,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AACf,UAAAA,KAAA,CAAY,MAAA;AAAA,YACV,CAAC,GAAA,qBACC,GAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,GAAA;AAAA,gBACJ,OAAA,EAAS;AAAA,kBACP,KAAA,EACE,OAAO,IAAA,CAAK,OAAA,KAAY,aACpB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,GACjB,IAAA,CAAK,OAAA;AAAA,kBACX,KAAA,EAAO;AAAA;AACT;AAAA,aACF;AAAA,YAEF,EAAE,EAAA;AAAG,WACP;AAAA,QACF,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChB,UAAAA,KAAA,CAAY,MAAA;AAAA,YACV,CAAC,GAAA,qBACC,GAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,GAAA;AAAA,gBACJ,OAAA,EAAS;AAAA,kBACP,KAAA,EACE,OAAO,IAAA,CAAK,KAAA,KAAU,aAClB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GACd,IAAA,CAAK,KAAA;AAAA,kBACX,KAAA,EAAO;AAAA;AACT;AAAA,aACF;AAAA,YAEF,EAAE,EAAA;AAAG,WACP;AAAA,QACF,CAAC,CAAA;AAED,QAAA,OAAO,EAAA;AAAA,MACT,CAAA;AAAA,MACA;AAAC,KACH;AAEA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,EAAA,KAAwB;AACnD,MAAAA,KAAA,CAAY,QAAQ,EAAE,CAAA;AAAA,IACxB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,MAAAA,KAAA,CAAY,OAAA,EAAQ;AAAA,IACtB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,YAAA,GAAe,OAAA;AAAA,MACnB,OAAO;AAAA,eACLC,OAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAACA,SAAO,OAAA,EAAS,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,SAAS,UAAU;AAAA,KACrE;AAEA,IAAA,uBACE,IAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAO,YAAA,EAC3B,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,sBACD,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,aAAA,EAAe,SAAA;AAAA,UACf,MAAA;AAAA,UACA,KAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA;AAAA,UACA,YAAA,EAAc,EAAE,QAAA,EAAU,IAAA;AAAK;AAAA;AACjC,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AAKrB,IAAM,WAAW,MAAyB;AAC/C,EAAA,MAAM,OAAA,GAAU,WAAW,YAAY,CAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,OAAA;AACT","file":"chunk-NF6JUJBE.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport {\n AlertCircle,\n AlertTriangle,\n CheckCircle2,\n Info,\n Loader2,\n X,\n} from \"lucide-react\";\nimport React, { useCallback, useContext, createContext, useMemo } from \"react\";\nimport { Toaster, toast as sonnerToast } from \"sonner\";\n\nimport { cn } from \"../utils\";\nimport { colorVars } from \"../variants\";\nimport type {\n ToastContextValue,\n ToastOptions,\n ToastProviderProps,\n} from \"./types\";\n\n/**\n * Toast CVA — reuses the shared notification color variant system\n */\nconst toastVariants = cva(\n \"relative flex items-start gap-3 rounded-lg p-3 text-sm w-full min-w-[300px]\",\n {\n variants: {\n variant: {\n default: 'bg-slot border border-slot text-slot-fg',\n solid: 'bg-slot text-slot-fg',\n outline: 'bg-background border-2 border-slot border-l-4 border-l-slot text-slot',\n soft: 'bg-background border border-slot-30 text-slot shadow-sm',\n },\n color: colorVars,\n },\n defaultVariants: {\n variant: \"soft\",\n color: \"default\",\n },\n },\n);\n\n/**\n * Default icons per semantic color\n */\nconst defaultIcons: Partial<Record<string, React.ReactElement>> = {\n success: <CheckCircle2 className=\"w-5 h-5\" />,\n error: <AlertCircle className=\"w-5 h-5\" />,\n warning: <AlertTriangle className=\"w-5 h-5\" />,\n info: <Info className=\"w-5 h-5\" />,\n};\n\n/**\n * Internal toast renderer — styled with our CVA system\n */\nconst ToastRenderer = ({\n id,\n options,\n}: {\n id: string | number;\n options: Omit<ToastOptions, \"duration\"> & { loading?: boolean };\n}) => {\n const variant = options.variant ?? \"default\";\n const color = options.color ?? \"default\";\n const closable = options.closable ?? !options.loading;\n const icon = options.loading ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : options.icon !== undefined ? (\n options.icon\n ) : (\n defaultIcons[color]\n );\n\n return (\n <div data-slot=\"toast\" className={cn(toastVariants({ variant, color }))}>\n {icon && <div data-slot=\"toast-icon\" className=\"shrink-0 mt-0.5\">{icon}</div>}\n <div data-slot=\"toast-content\" className=\"flex-1 min-w-0\">\n {options.title && <div data-slot=\"toast-title\" className=\"font-semibold\">{options.title}</div>}\n {options.description && (\n <div data-slot=\"toast-description\" className=\"opacity-90 mt-0.5\">{options.description}</div>\n )}\n {options.action && (\n <button\n type=\"button\"\n data-slot=\"toast-action\"\n onClick={options.action.onClick}\n className=\"mt-2 text-sm font-medium underline hover:no-underline\"\n >\n {options.action.label}\n </button>\n )}\n </div>\n {closable && (\n <button\n type=\"button\"\n data-slot=\"toast-close\"\n onClick={() => sonnerToast.dismiss(id)}\n className=\"shrink-0 rounded-sm opacity-70 hover:opacity-100 transition-opacity\"\n aria-label=\"Close\"\n >\n <X className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n\n/**\n * Fire a toast with custom renderer\n */\nconst fireToast = (options: ToastOptions): string | number =>\n sonnerToast.custom((id) => <ToastRenderer id={id} options={options} />, {\n duration: options.duration === 0 ? Infinity : options.duration,\n dismissible: options.closable ?? true,\n onDismiss: options.onClose,\n }) as string | number;\n\n/**\n * Toast Context\n */\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\n/**\n * Toast Provider — Sonner handles positioning/stacking, we handle rendering\n */\nexport const ToastProvider = React.memo<ToastProviderProps>(\n ({\n children,\n position = \"top-right\",\n maxToasts = 5,\n offset = 16,\n theme = \"system\",\n closeButton = false,\n duration = 5000,\n className,\n }) => {\n const toast = useCallback(\n (options: ToastOptions): string | number => fireToast(options),\n [],\n );\n\n const success = useCallback(\n (title: string, description?: string): string | number =>\n fireToast({ title, description, color: \"success\" }),\n [],\n );\n\n const error = useCallback(\n (title: string, description?: string): string | number =>\n fireToast({ title, description, color: \"error\" }),\n [],\n );\n\n const warning = useCallback(\n (title: string, description?: string): string | number =>\n fireToast({ title, description, color: \"warning\" }),\n [],\n );\n\n const info = useCallback(\n (title: string, description?: string): string | number =>\n fireToast({ title, description, color: \"info\" }),\n [],\n );\n\n const promise = useCallback(\n <T,>(\n p: Promise<T>,\n opts: {\n loading: string;\n success: string | ((data: T) => string);\n error: string | ((err: unknown) => string);\n },\n ): string | number => {\n const id = sonnerToast.custom((tid) => (\n <ToastRenderer\n id={tid}\n options={{ title: opts.loading, loading: true }}\n />\n )) as string | number;\n\n p.then((data) => {\n sonnerToast.custom(\n (tid) => (\n <ToastRenderer\n id={tid}\n options={{\n title:\n typeof opts.success === \"function\"\n ? opts.success(data)\n : opts.success,\n color: \"success\",\n }}\n />\n ),\n { id },\n );\n }).catch((err) => {\n sonnerToast.custom(\n (tid) => (\n <ToastRenderer\n id={tid}\n options={{\n title:\n typeof opts.error === \"function\"\n ? opts.error(err)\n : opts.error,\n color: \"error\",\n }}\n />\n ),\n { id },\n );\n });\n\n return id;\n },\n [],\n );\n\n const dismiss = useCallback((id: string | number) => {\n sonnerToast.dismiss(id);\n }, []);\n\n const dismissAll = useCallback(() => {\n sonnerToast.dismiss();\n }, []);\n\n const contextValue = useMemo<ToastContextValue>(\n () => ({\n toast,\n success,\n error,\n warning,\n info,\n promise,\n dismiss,\n dismissAll,\n }),\n [toast, success, error, warning, info, promise, dismiss, dismissAll],\n );\n\n return (\n <ToastContext.Provider value={contextValue}>\n {children}\n <Toaster\n position={position}\n visibleToasts={maxToasts}\n offset={offset}\n theme={theme}\n closeButton={closeButton}\n duration={duration}\n className={className}\n toastOptions={{ unstyled: true }}\n />\n </ToastContext.Provider>\n );\n },\n);\n\nToastProvider.displayName = \"ToastProvider\";\n\n/**\n * useToast Hook\n */\nexport const useToast = (): ToastContextValue => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n};\n\nexport type * from \"./types\";\n"]}