@classytic/fluid 0.4.2 → 0.5.0

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 (51) hide show
  1. package/README.md +21 -1
  2. package/dist/client/calendar.d.mts +1 -2
  3. package/dist/client/calendar.mjs +4 -4
  4. package/dist/client/color-picker.d.mts +41 -25
  5. package/dist/client/color-picker.mjs +121 -73
  6. package/dist/client/core.d.mts +243 -557
  7. package/dist/client/core.mjs +351 -1462
  8. package/dist/client/error.d.mts +41 -41
  9. package/dist/client/error.mjs +35 -35
  10. package/dist/client/gallery.d.mts +33 -33
  11. package/dist/client/gallery.mjs +128 -127
  12. package/dist/client/hooks.d.mts +57 -39
  13. package/dist/client/hooks.mjs +29 -7
  14. package/dist/client/spreadsheet.d.mts +28 -28
  15. package/dist/client/spreadsheet.mjs +77 -77
  16. package/dist/client/table.d.mts +66 -33
  17. package/dist/client/table.mjs +87 -54
  18. package/dist/client/theme.mjs +1 -1
  19. package/dist/command.d.mts +6 -4
  20. package/dist/command.mjs +3 -3
  21. package/dist/compact.d.mts +97 -95
  22. package/dist/compact.mjs +336 -322
  23. package/dist/dashboard.d.mts +614 -422
  24. package/dist/dashboard.mjs +1051 -762
  25. package/dist/{dropdown-wrapper-B86u9Fri.mjs → dropdown-wrapper-B9nRDUlz.mjs} +25 -35
  26. package/dist/forms.d.mts +1037 -972
  27. package/dist/forms.mjs +2849 -2721
  28. package/dist/index.d.mts +218 -152
  29. package/dist/index.mjs +357 -264
  30. package/dist/layouts.d.mts +94 -94
  31. package/dist/layouts.mjs +115 -110
  32. package/dist/phone-input-B9_XPNvv.mjs +429 -0
  33. package/dist/phone-input-CLH_UjQZ.d.mts +31 -0
  34. package/dist/{search-context-DR7DBs7S.mjs → search-context-1g3ZmOvx.mjs} +1 -1
  35. package/dist/search.d.mts +168 -164
  36. package/dist/search.mjs +305 -301
  37. package/dist/{sheet-wrapper-C13Y-Q6w.mjs → sheet-wrapper-B2uxookb.mjs} +1 -1
  38. package/dist/timeline-Bgu1mIe9.d.mts +373 -0
  39. package/dist/timeline-HJtWf4Op.mjs +804 -0
  40. package/dist/{use-base-search-BGgWnWaF.d.mts → use-base-search-DFC4QKYU.d.mts} +1 -1
  41. package/dist/{use-media-query-BnVNIKT4.mjs → use-media-query-ChLfFChU.mjs} +6 -7
  42. package/package.json +2 -2
  43. /package/dist/{api-pagination-CJ0vR_w6.d.mts → api-pagination-C30ser2L.d.mts} +0 -0
  44. /package/dist/{filter-utils-DqMmy_v-.mjs → filter-utils-BGIvtq1R.mjs} +0 -0
  45. /package/dist/{filter-utils-IZ0GtuPo.d.mts → filter-utils-DOFTBWm1.d.mts} +0 -0
  46. /package/dist/{use-debounce-xmZucz5e.mjs → use-debounce-BNoNiEon.mjs} +0 -0
  47. /package/dist/{use-keyboard-shortcut-Bl6YM5Q7.mjs → use-keyboard-shortcut-C_Vk-36P.mjs} +0 -0
  48. /package/dist/{use-keyboard-shortcut-_mRCh3QO.d.mts → use-keyboard-shortcut-Q4CSPzSI.d.mts} +0 -0
  49. /package/dist/{use-mobile-BX3SQVo2.mjs → use-mobile-CnEmFiQx.mjs} +0 -0
  50. /package/dist/{use-scroll-detection-CsgsQYvy.mjs → use-scroll-detection-BKfqkmEC.mjs} +0 -0
  51. /package/dist/{utils-CDue7cEt.d.mts → utils-rqvYP1by.d.mts} +0 -0
@@ -0,0 +1,429 @@
1
+ import * as React$1 from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Check, ChevronDown } from "lucide-react";
4
+ import { Button } from "@/components/ui/button";
5
+ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command";
6
+ import { InputGroup, InputGroupAddon, InputGroupInput } from "@/components/ui/input-group";
7
+ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
8
+ import { ScrollArea } from "@/components/ui/scroll-area";
9
+
10
+ //#region src/components/phone-input.tsx
11
+ const DEFAULT_COUNTRIES = [
12
+ {
13
+ code: "GB",
14
+ name: "United Kingdom",
15
+ dialCode: "+44",
16
+ flag: "🇬🇧"
17
+ },
18
+ {
19
+ code: "US",
20
+ name: "United States",
21
+ dialCode: "+1",
22
+ flag: "🇺🇸"
23
+ },
24
+ {
25
+ code: "IE",
26
+ name: "Ireland",
27
+ dialCode: "+353",
28
+ flag: "🇮🇪"
29
+ },
30
+ {
31
+ code: "FR",
32
+ name: "France",
33
+ dialCode: "+33",
34
+ flag: "🇫🇷"
35
+ },
36
+ {
37
+ code: "DE",
38
+ name: "Germany",
39
+ dialCode: "+49",
40
+ flag: "🇩🇪"
41
+ },
42
+ {
43
+ code: "IT",
44
+ name: "Italy",
45
+ dialCode: "+39",
46
+ flag: "🇮🇹"
47
+ },
48
+ {
49
+ code: "ES",
50
+ name: "Spain",
51
+ dialCode: "+34",
52
+ flag: "🇪🇸"
53
+ },
54
+ {
55
+ code: "NL",
56
+ name: "Netherlands",
57
+ dialCode: "+31",
58
+ flag: "🇳🇱"
59
+ },
60
+ {
61
+ code: "BE",
62
+ name: "Belgium",
63
+ dialCode: "+32",
64
+ flag: "🇧🇪"
65
+ },
66
+ {
67
+ code: "PT",
68
+ name: "Portugal",
69
+ dialCode: "+351",
70
+ flag: "🇵🇹"
71
+ },
72
+ {
73
+ code: "CH",
74
+ name: "Switzerland",
75
+ dialCode: "+41",
76
+ flag: "🇨🇭"
77
+ },
78
+ {
79
+ code: "AT",
80
+ name: "Austria",
81
+ dialCode: "+43",
82
+ flag: "🇦🇹"
83
+ },
84
+ {
85
+ code: "SE",
86
+ name: "Sweden",
87
+ dialCode: "+46",
88
+ flag: "🇸🇪"
89
+ },
90
+ {
91
+ code: "NO",
92
+ name: "Norway",
93
+ dialCode: "+47",
94
+ flag: "🇳🇴"
95
+ },
96
+ {
97
+ code: "DK",
98
+ name: "Denmark",
99
+ dialCode: "+45",
100
+ flag: "🇩🇰"
101
+ },
102
+ {
103
+ code: "PL",
104
+ name: "Poland",
105
+ dialCode: "+48",
106
+ flag: "🇵🇱"
107
+ },
108
+ {
109
+ code: "GR",
110
+ name: "Greece",
111
+ dialCode: "+30",
112
+ flag: "🇬🇷"
113
+ },
114
+ {
115
+ code: "CZ",
116
+ name: "Czech Republic",
117
+ dialCode: "+420",
118
+ flag: "🇨🇿"
119
+ },
120
+ {
121
+ code: "RO",
122
+ name: "Romania",
123
+ dialCode: "+40",
124
+ flag: "🇷🇴"
125
+ },
126
+ {
127
+ code: "HU",
128
+ name: "Hungary",
129
+ dialCode: "+36",
130
+ flag: "🇭🇺"
131
+ },
132
+ {
133
+ code: "AU",
134
+ name: "Australia",
135
+ dialCode: "+61",
136
+ flag: "🇦🇺"
137
+ },
138
+ {
139
+ code: "NZ",
140
+ name: "New Zealand",
141
+ dialCode: "+64",
142
+ flag: "🇳🇿"
143
+ },
144
+ {
145
+ code: "CA",
146
+ name: "Canada",
147
+ dialCode: "+1",
148
+ flag: "🇨🇦"
149
+ },
150
+ {
151
+ code: "IN",
152
+ name: "India",
153
+ dialCode: "+91",
154
+ flag: "🇮🇳"
155
+ },
156
+ {
157
+ code: "PK",
158
+ name: "Pakistan",
159
+ dialCode: "+92",
160
+ flag: "🇵🇰"
161
+ },
162
+ {
163
+ code: "BD",
164
+ name: "Bangladesh",
165
+ dialCode: "+880",
166
+ flag: "🇧🇩"
167
+ },
168
+ {
169
+ code: "AE",
170
+ name: "UAE",
171
+ dialCode: "+971",
172
+ flag: "🇦🇪"
173
+ },
174
+ {
175
+ code: "SA",
176
+ name: "Saudi Arabia",
177
+ dialCode: "+966",
178
+ flag: "🇸🇦"
179
+ },
180
+ {
181
+ code: "QA",
182
+ name: "Qatar",
183
+ dialCode: "+974",
184
+ flag: "🇶🇦"
185
+ },
186
+ {
187
+ code: "KW",
188
+ name: "Kuwait",
189
+ dialCode: "+965",
190
+ flag: "🇰🇼"
191
+ },
192
+ {
193
+ code: "SG",
194
+ name: "Singapore",
195
+ dialCode: "+65",
196
+ flag: "🇸🇬"
197
+ },
198
+ {
199
+ code: "MY",
200
+ name: "Malaysia",
201
+ dialCode: "+60",
202
+ flag: "🇲🇾"
203
+ },
204
+ {
205
+ code: "JP",
206
+ name: "Japan",
207
+ dialCode: "+81",
208
+ flag: "🇯🇵"
209
+ },
210
+ {
211
+ code: "KR",
212
+ name: "South Korea",
213
+ dialCode: "+82",
214
+ flag: "🇰🇷"
215
+ },
216
+ {
217
+ code: "CN",
218
+ name: "China",
219
+ dialCode: "+86",
220
+ flag: "🇨🇳"
221
+ },
222
+ {
223
+ code: "HK",
224
+ name: "Hong Kong",
225
+ dialCode: "+852",
226
+ flag: "🇭🇰"
227
+ },
228
+ {
229
+ code: "TW",
230
+ name: "Taiwan",
231
+ dialCode: "+886",
232
+ flag: "🇹🇼"
233
+ },
234
+ {
235
+ code: "TH",
236
+ name: "Thailand",
237
+ dialCode: "+66",
238
+ flag: "🇹🇭"
239
+ },
240
+ {
241
+ code: "PH",
242
+ name: "Philippines",
243
+ dialCode: "+63",
244
+ flag: "🇵🇭"
245
+ },
246
+ {
247
+ code: "VN",
248
+ name: "Vietnam",
249
+ dialCode: "+84",
250
+ flag: "🇻🇳"
251
+ },
252
+ {
253
+ code: "ID",
254
+ name: "Indonesia",
255
+ dialCode: "+62",
256
+ flag: "🇮🇩"
257
+ },
258
+ {
259
+ code: "ZA",
260
+ name: "South Africa",
261
+ dialCode: "+27",
262
+ flag: "🇿🇦"
263
+ },
264
+ {
265
+ code: "NG",
266
+ name: "Nigeria",
267
+ dialCode: "+234",
268
+ flag: "🇳🇬"
269
+ },
270
+ {
271
+ code: "EG",
272
+ name: "Egypt",
273
+ dialCode: "+20",
274
+ flag: "🇪🇬"
275
+ },
276
+ {
277
+ code: "BR",
278
+ name: "Brazil",
279
+ dialCode: "+55",
280
+ flag: "🇧🇷"
281
+ },
282
+ {
283
+ code: "MX",
284
+ name: "Mexico",
285
+ dialCode: "+52",
286
+ flag: "🇲🇽"
287
+ },
288
+ {
289
+ code: "AR",
290
+ name: "Argentina",
291
+ dialCode: "+54",
292
+ flag: "🇦🇷"
293
+ },
294
+ {
295
+ code: "TR",
296
+ name: "Turkey",
297
+ dialCode: "+90",
298
+ flag: "🇹🇷"
299
+ },
300
+ {
301
+ code: "RU",
302
+ name: "Russia",
303
+ dialCode: "+7",
304
+ flag: "🇷🇺"
305
+ },
306
+ {
307
+ code: "IL",
308
+ name: "Israel",
309
+ dialCode: "+972",
310
+ flag: "🇮🇱"
311
+ }
312
+ ];
313
+ function PhoneInput({ className, onChange, value, defaultCountry = "GB", countries = DEFAULT_COUNTRIES, disabled, placeholder = "Phone number", ref, ...props }) {
314
+ const [isOpen, setIsOpen] = React$1.useState(false);
315
+ const [searchValue, setSearchValue] = React$1.useState("");
316
+ const getCountryByCode = React$1.useCallback((code) => countries.find((c) => c.code === code), [countries]);
317
+ const { country: selectedCountry, number } = React$1.useCallback((val) => {
318
+ const valString = val ? String(val) : "";
319
+ if (!valString) return {
320
+ country: getCountryByCode(defaultCountry) || countries[0],
321
+ number: ""
322
+ };
323
+ const cleanVal = valString.replace(/\s/g, "");
324
+ let bestMatch = null;
325
+ for (const country of countries) if (cleanVal.startsWith(country.dialCode)) {
326
+ if (!bestMatch || country.dialCode.length > bestMatch.dialCode.length) bestMatch = country;
327
+ }
328
+ if (bestMatch) return {
329
+ country: bestMatch,
330
+ number: cleanVal.slice(bestMatch.dialCode.length)
331
+ };
332
+ return {
333
+ country: getCountryByCode(defaultCountry) || countries[0],
334
+ number: cleanVal.replace(/^\+/, "")
335
+ };
336
+ }, [
337
+ defaultCountry,
338
+ countries,
339
+ getCountryByCode
340
+ ])(value);
341
+ const handleCountryChange = (newCountry) => {
342
+ setIsOpen(false);
343
+ if (number) onChange?.(newCountry.dialCode + number);
344
+ else onChange?.(newCountry.dialCode);
345
+ };
346
+ const handleNumberChange = (e) => {
347
+ const newNumber = e.target.value.replace(/[^\d]/g, "");
348
+ if (newNumber) onChange?.(selectedCountry.dialCode + newNumber);
349
+ else onChange?.("");
350
+ };
351
+ return /* @__PURE__ */ jsxs(InputGroup, {
352
+ className,
353
+ children: [/* @__PURE__ */ jsx(InputGroupAddon, {
354
+ align: "inline-start",
355
+ className: "p-0 overflow-visible",
356
+ children: /* @__PURE__ */ jsxs(Popover, {
357
+ open: isOpen,
358
+ modal: true,
359
+ onOpenChange: (open) => {
360
+ setIsOpen(open);
361
+ if (open) setSearchValue("");
362
+ },
363
+ children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
364
+ render: /* @__PURE__ */ jsx(Button, {
365
+ type: "button",
366
+ variant: "ghost",
367
+ className: "gap-1.5 rounded-none border-r px-3 focus:z-10 min-w-[90px] h-full",
368
+ disabled,
369
+ "aria-label": `Select country: ${selectedCountry.name} (${selectedCountry.dialCode})`
370
+ }),
371
+ children: [
372
+ /* @__PURE__ */ jsx("span", {
373
+ className: "text-base leading-none",
374
+ children: selectedCountry.flag
375
+ }),
376
+ /* @__PURE__ */ jsx("span", {
377
+ className: "text-xs text-muted-foreground tabular-nums",
378
+ children: selectedCountry.dialCode
379
+ }),
380
+ /* @__PURE__ */ jsx(ChevronDown, { className: "size-3 opacity-50" })
381
+ ]
382
+ }), /* @__PURE__ */ jsx(PopoverContent, {
383
+ className: "w-[280px] p-0",
384
+ align: "start",
385
+ children: /* @__PURE__ */ jsxs(Command, { children: [/* @__PURE__ */ jsx(CommandInput, {
386
+ value: searchValue,
387
+ onValueChange: setSearchValue,
388
+ placeholder: "Search country..."
389
+ }), /* @__PURE__ */ jsx(CommandList, { children: /* @__PURE__ */ jsxs(ScrollArea, {
390
+ className: "h-64",
391
+ children: [/* @__PURE__ */ jsx(CommandEmpty, { children: "No country found." }), /* @__PURE__ */ jsx(CommandGroup, { children: countries.filter((c) => c.name.toLowerCase().includes(searchValue.toLowerCase()) || c.dialCode.includes(searchValue) || c.code.toLowerCase().includes(searchValue.toLowerCase())).map((c) => /* @__PURE__ */ jsxs(CommandItem, {
392
+ className: "gap-2 cursor-pointer",
393
+ onSelect: () => handleCountryChange(c),
394
+ value: `${c.name} ${c.code} ${c.dialCode}`,
395
+ children: [
396
+ /* @__PURE__ */ jsx("span", {
397
+ className: "text-base leading-none",
398
+ children: c.flag
399
+ }),
400
+ /* @__PURE__ */ jsx("span", {
401
+ className: "flex-1 text-sm",
402
+ children: c.name
403
+ }),
404
+ /* @__PURE__ */ jsx("span", {
405
+ className: "text-xs text-muted-foreground tabular-nums",
406
+ children: c.dialCode
407
+ }),
408
+ c.code === selectedCountry.code && /* @__PURE__ */ jsx(Check, { className: "size-3.5 text-primary" })
409
+ ]
410
+ }, c.code)) })]
411
+ }) })] })
412
+ })]
413
+ })
414
+ }), /* @__PURE__ */ jsx(InputGroupInput, {
415
+ ref,
416
+ type: "tel",
417
+ inputMode: "numeric",
418
+ className: "rounded-s-none",
419
+ placeholder,
420
+ value: number,
421
+ onChange: handleNumberChange,
422
+ disabled,
423
+ ...props
424
+ })]
425
+ });
426
+ }
427
+
428
+ //#endregion
429
+ export { PhoneInput as n, DEFAULT_COUNTRIES as t };
@@ -0,0 +1,31 @@
1
+ import * as React$1 from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+
4
+ //#region src/components/phone-input.d.ts
5
+ interface PhoneCountry {
6
+ code: string;
7
+ name: string;
8
+ dialCode: string;
9
+ flag: string;
10
+ }
11
+ declare const DEFAULT_COUNTRIES: PhoneCountry[];
12
+ interface PhoneInputProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "onChange"> {
13
+ onChange?: (value: string) => void;
14
+ defaultCountry?: string;
15
+ /** Custom list of countries to show. Defaults to a built-in list of ~50 countries. */
16
+ countries?: PhoneCountry[];
17
+ ref?: React$1.Ref<HTMLInputElement>;
18
+ }
19
+ declare function PhoneInput({
20
+ className,
21
+ onChange,
22
+ value,
23
+ defaultCountry,
24
+ countries,
25
+ disabled,
26
+ placeholder,
27
+ ref,
28
+ ...props
29
+ }: PhoneInputProps): react_jsx_runtime0.JSX.Element;
30
+ //#endregion
31
+ export { PhoneInputProps as i, PhoneCountry as n, PhoneInput as r, DEFAULT_COUNTRIES as t };
@@ -1,5 +1,5 @@
1
- import { jsx } from "react/jsx-runtime";
2
1
  import { createContext, useContext } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/search/search-context.tsx
5
5
  const SearchContext = createContext(void 0);