@fulgurite/tailwind-ui 0.0.1

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 (63) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +352 -0
  3. package/dist/daisy/dark-mode-switcher/index.d.ts +4 -0
  4. package/dist/daisy/dark-mode-switcher/index.d.ts.map +1 -0
  5. package/dist/daisy/dark-mode-switcher/index.js +22 -0
  6. package/dist/daisy/dark-mode-switcher/index.js.map +1 -0
  7. package/dist/daisy/date-picker/index.d.ts +4 -0
  8. package/dist/daisy/date-picker/index.d.ts.map +1 -0
  9. package/dist/daisy/date-picker/index.js +196 -0
  10. package/dist/daisy/date-picker/index.js.map +1 -0
  11. package/dist/daisy/locale-switcher/index.d.ts +4 -0
  12. package/dist/daisy/locale-switcher/index.d.ts.map +1 -0
  13. package/dist/daisy/locale-switcher/index.js +62 -0
  14. package/dist/daisy/locale-switcher/index.js.map +1 -0
  15. package/dist/internal/cx.d.ts +2 -0
  16. package/dist/internal/cx.d.ts.map +1 -0
  17. package/dist/internal/cx.js +4 -0
  18. package/dist/internal/cx.js.map +1 -0
  19. package/dist/internal/date-picker-icons.d.ts +8 -0
  20. package/dist/internal/date-picker-icons.d.ts.map +1 -0
  21. package/dist/internal/date-picker-icons.js +18 -0
  22. package/dist/internal/date-picker-icons.js.map +1 -0
  23. package/dist/internal/globe-icon.d.ts +4 -0
  24. package/dist/internal/globe-icon.d.ts.map +1 -0
  25. package/dist/internal/globe-icon.js +6 -0
  26. package/dist/internal/globe-icon.js.map +1 -0
  27. package/dist/internal/index.d.ts +6 -0
  28. package/dist/internal/index.d.ts.map +1 -0
  29. package/dist/internal/index.js +4 -0
  30. package/dist/internal/index.js.map +1 -0
  31. package/dist/internal/theme-icons.d.ts +9 -0
  32. package/dist/internal/theme-icons.d.ts.map +1 -0
  33. package/dist/internal/theme-icons.js +13 -0
  34. package/dist/internal/theme-icons.js.map +1 -0
  35. package/dist/shared/date-picker.d.ts +24 -0
  36. package/dist/shared/date-picker.d.ts.map +1 -0
  37. package/dist/shared/date-picker.js +2 -0
  38. package/dist/shared/date-picker.js.map +1 -0
  39. package/dist/shared/index.d.ts +4 -0
  40. package/dist/shared/index.d.ts.map +1 -0
  41. package/dist/shared/index.js +2 -0
  42. package/dist/shared/index.js.map +1 -0
  43. package/dist/shared/locale.d.ts +21 -0
  44. package/dist/shared/locale.d.ts.map +1 -0
  45. package/dist/shared/locale.js +2 -0
  46. package/dist/shared/locale.js.map +1 -0
  47. package/dist/shared/theme.d.ts +17 -0
  48. package/dist/shared/theme.d.ts.map +1 -0
  49. package/dist/shared/theme.js +2 -0
  50. package/dist/shared/theme.js.map +1 -0
  51. package/dist/vanilla/dark-mode-switcher/index.d.ts +4 -0
  52. package/dist/vanilla/dark-mode-switcher/index.d.ts.map +1 -0
  53. package/dist/vanilla/dark-mode-switcher/index.js +25 -0
  54. package/dist/vanilla/dark-mode-switcher/index.js.map +1 -0
  55. package/dist/vanilla/date-picker/index.d.ts +4 -0
  56. package/dist/vanilla/date-picker/index.d.ts.map +1 -0
  57. package/dist/vanilla/date-picker/index.js +197 -0
  58. package/dist/vanilla/date-picker/index.js.map +1 -0
  59. package/dist/vanilla/locale-switcher/index.d.ts +4 -0
  60. package/dist/vanilla/locale-switcher/index.d.ts.map +1 -0
  61. package/dist/vanilla/locale-switcher/index.js +70 -0
  62. package/dist/vanilla/locale-switcher/index.js.map +1 -0
  63. package/package.json +102 -0
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useRef, useState } from "react";
4
+ import { cx } from "../../internal/cx.js";
5
+ import { GlobeIcon } from "../../internal/globe-icon.js";
6
+ const fallbackLabel = "Change language";
7
+ const fallbackEmptyLabel = "No languages available";
8
+ export function DaisyLocaleSwitcher({ value, options, onChange, label, emptyLabel, disabled = false, className, triggerClassName, menuClassName, optionClassName, triggerIcon, }) {
9
+ const [isOpen, setIsOpen] = useState(false);
10
+ const dropdownRef = useRef(null);
11
+ const triggerRef = useRef(null);
12
+ const labelId = useId();
13
+ const menuId = useId();
14
+ const stringLabel = typeof label === "string" ? label : undefined;
15
+ const hasNodeLabel = label !== undefined && label !== null && stringLabel === undefined;
16
+ const fallbackAccessibleLabel = hasNodeLabel ? undefined : fallbackLabel;
17
+ const title = stringLabel;
18
+ useEffect(() => {
19
+ if (!disabled)
20
+ return;
21
+ setIsOpen(false);
22
+ }, [disabled]);
23
+ useEffect(() => {
24
+ if (!isOpen)
25
+ return;
26
+ const handleClickOutside = (event) => {
27
+ const target = event.target;
28
+ if (!target || dropdownRef.current?.contains(target))
29
+ return;
30
+ setIsOpen(false);
31
+ };
32
+ document.addEventListener("mousedown", handleClickOutside);
33
+ return () => {
34
+ document.removeEventListener("mousedown", handleClickOutside);
35
+ };
36
+ }, [isOpen]);
37
+ const handleTriggerClick = () => {
38
+ if (disabled)
39
+ return;
40
+ setIsOpen((currentIsOpen) => !currentIsOpen);
41
+ };
42
+ const handleOptionChange = (option) => {
43
+ if (disabled || option.disabled)
44
+ return;
45
+ onChange(option.value, option);
46
+ setIsOpen(false);
47
+ };
48
+ const handleKeyDown = (event) => {
49
+ if (event.key !== "Escape")
50
+ return;
51
+ setIsOpen(false);
52
+ triggerRef.current?.focus();
53
+ };
54
+ return (_jsxs("div", { ref: dropdownRef, className: cx("dropdown dropdown-end", isOpen && !disabled && "dropdown-open", disabled && "opacity-60", className), children: [hasNodeLabel ? (_jsx("span", { className: "sr-only", id: labelId, children: label })) : null, _jsx("button", { ref: triggerRef, type: "button", "aria-controls": isOpen ? menuId : undefined, "aria-disabled": disabled || undefined, "aria-expanded": isOpen, "aria-haspopup": "menu", "aria-label": stringLabel ?? fallbackAccessibleLabel, "aria-labelledby": hasNodeLabel ? labelId : undefined, className: cx("btn btn-circle btn-ghost btn-sm border border-base-300 bg-base-100 text-base-content/70 shadow-sm transition-colors hover:bg-base-200 hover:text-base-content focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-base-300/70", disabled && "btn-disabled", triggerClassName), disabled: disabled, onKeyDown: handleKeyDown, onClick: handleTriggerClick, title: title, children: _jsx("span", { className: "inline-flex items-center justify-center", children: triggerIcon ?? _jsx(GlobeIcon, { "aria-hidden": "true" }) }) }), isOpen ? (_jsx("div", { "aria-label": stringLabel ?? fallbackAccessibleLabel, "aria-labelledby": hasNodeLabel ? labelId : undefined, className: cx("dropdown-content menu z-10 mt-2 w-48 rounded-box bg-base-200 p-1 shadow-lg", menuClassName), id: menuId, onKeyDown: handleKeyDown, role: "menu", children: options.length === 0 ? (_jsx("div", { className: "menu-disabled", role: "none", children: _jsx("span", { className: "px-3 py-2 text-sm text-base-content/50", children: emptyLabel ?? fallbackEmptyLabel }) })) : (options.map((option) => {
55
+ const isSelected = option.value === value;
56
+ const isOptionDisabled = disabled || Boolean(option.disabled);
57
+ return (_jsx("div", { role: "none", children: _jsxs("button", { type: "button", "aria-checked": isSelected, "aria-disabled": isOptionDisabled || undefined, className: cx("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm transition-colors", isSelected
58
+ ? "bg-primary/10 font-bold text-primary"
59
+ : "text-base-content hover:bg-base-300", isOptionDisabled && "btn-disabled cursor-not-allowed opacity-50", optionClassName), disabled: isOptionDisabled, onClick: () => handleOptionChange(option), role: "menuitemradio", children: [option.flag ? _jsx("span", { className: "shrink-0", children: option.flag }) : null, _jsx("span", { className: "min-w-0 flex-1 text-left", children: option.label }), isSelected ? (_jsx("span", { "aria-hidden": "true", className: "ml-auto text-primary", children: "\u2713" })) : null] }) }, option.value));
60
+ })) })) : null] }));
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/daisy/locale-switcher/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE/E,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAKzD,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,WAAW,GACS;IACpB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,CAAC;IACxF,MAAM,uBAAuB,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;IACzE,MAAM,KAAK,GAAG,WAAW,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;YAE3C,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO;YAE7D,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAE3D,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,IAAI,QAAQ;YAAE,OAAO;QAErB,SAAS,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,MAAoB,EAAE,EAAE;QAClD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO;QAExC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAiC,EAAE,EAAE;QAC1D,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO;QAEnC,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,eACE,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,MAAM,IAAI,CAAC,QAAQ,IAAI,eAAe,EACtC,QAAQ,IAAI,YAAY,EACxB,SAAS,CACV,aAEA,YAAY,CAAC,CAAC,CAAC,CACd,eAAM,SAAS,EAAC,SAAS,EAAC,EAAE,EAAE,OAAO,YAClC,KAAK,GACD,CACR,CAAC,CAAC,CAAC,IAAI,EAER,iBACE,GAAG,EAAE,UAAU,EACf,IAAI,EAAC,QAAQ,mBACE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,mBAC3B,QAAQ,IAAI,SAAS,mBACrB,MAAM,mBACP,MAAM,gBACR,WAAW,IAAI,uBAAuB,qBACjC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACnD,SAAS,EAAE,EAAE,CACX,8OAA8O,EAC9O,QAAQ,IAAI,cAAc,EAC1B,gBAAgB,CACjB,EACD,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,KAAK,YAEZ,eAAM,SAAS,EAAC,yCAAyC,YACtD,WAAW,IAAI,KAAC,SAAS,mBAAa,MAAM,GAAG,GAC3C,GACA,EAER,MAAM,CAAC,CAAC,CAAC,CACR,4BACc,WAAW,IAAI,uBAAuB,qBACjC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACnD,SAAS,EAAE,EAAE,CACX,4EAA4E,EAC5E,aAAa,CACd,EACD,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,aAAa,EACxB,IAAI,EAAC,MAAM,YAEV,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,cAAK,SAAS,EAAC,eAAe,EAAC,IAAI,EAAC,MAAM,YACxC,eAAM,SAAS,EAAC,wCAAwC,YACrD,UAAU,IAAI,kBAAkB,GAC5B,GACH,CACP,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBACrB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;oBAC1C,MAAM,gBAAgB,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAE9D,OAAO,CACL,cAAwB,IAAI,EAAC,MAAM,YACjC,kBACE,IAAI,EAAC,QAAQ,kBACC,UAAU,mBACT,gBAAgB,IAAI,SAAS,EAC5C,SAAS,EAAE,EAAE,CACX,+EAA+E,EAC/E,UAAU;gCACR,CAAC,CAAC,sCAAsC;gCACxC,CAAC,CAAC,qCAAqC,EACzC,gBAAgB,IAAI,4CAA4C,EAChE,eAAe,CAChB,EACD,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EACzC,IAAI,EAAC,eAAe,aAEnB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,UAAU,YAAE,MAAM,CAAC,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,EACrE,eAAM,SAAS,EAAC,0BAA0B,YAAE,MAAM,CAAC,KAAK,GAAQ,EAC/D,UAAU,CAAC,CAAC,CAAC,CACZ,8BAAkB,MAAM,EAAC,SAAS,EAAC,sBAAsB,uBAElD,CACR,CAAC,CAAC,CAAC,IAAI,IACD,IAxBD,MAAM,CAAC,KAAK,CAyBhB,CACP,CAAC;gBACJ,CAAC,CAAC,CACH,GACG,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cx(...parts: Array<string | false | null | undefined>): string;
2
+ //# sourceMappingURL=cx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cx.d.ts","sourceRoot":"","sources":["../../src/internal/cx.ts"],"names":[],"mappings":"AAAA,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,4 @@
1
+ export function cx(...parts) {
2
+ return parts.filter(Boolean).join(" ");
3
+ }
4
+ //# sourceMappingURL=cx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cx.js","sourceRoot":"","sources":["../../src/internal/cx.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,EAAE,CAAC,GAAG,KAA+C;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SVGProps } from "react";
2
+ type DatePickerIconProps = SVGProps<SVGSVGElement>;
3
+ export declare function DatePickerCalendarIcon(props: DatePickerIconProps): import("react/jsx-runtime").JSX.Element;
4
+ export declare function DatePickerChevronLeftIcon(props: DatePickerIconProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function DatePickerChevronRightIcon(props: DatePickerIconProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function DatePickerXIcon(props: DatePickerIconProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=date-picker-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-icons.d.ts","sourceRoot":"","sources":["../../src/internal/date-picker-icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAItC,KAAK,mBAAmB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AA2BnD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,2CAchE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,2CAMnE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,2CAMpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAOzD"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from "./cx.js";
3
+ function DatePickerIcon({ children, className, "aria-hidden": ariaHidden = true, ...props }) {
4
+ return (_jsxs("svg", { ...props, "aria-hidden": ariaHidden, className: cx("size-4 shrink-0", className), fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.85", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("title", { children: "Date picker icon" }), children] }));
5
+ }
6
+ export function DatePickerCalendarIcon(props) {
7
+ return (_jsxs(DatePickerIcon, { ...props, children: [_jsx("path", { d: "M7 3v3" }), _jsx("path", { d: "M17 3v3" }), _jsx("path", { d: "M4 9h16" }), _jsx("rect", { height: "17", rx: "2.5", width: "16", x: "4", y: "5" }), _jsx("path", { d: "M8 13h.01" }), _jsx("path", { d: "M12 13h.01" }), _jsx("path", { d: "M16 13h.01" }), _jsx("path", { d: "M8 17h.01" }), _jsx("path", { d: "M12 17h.01" })] }));
8
+ }
9
+ export function DatePickerChevronLeftIcon(props) {
10
+ return (_jsx(DatePickerIcon, { ...props, children: _jsx("path", { d: "m15 18-6-6 6-6" }) }));
11
+ }
12
+ export function DatePickerChevronRightIcon(props) {
13
+ return (_jsx(DatePickerIcon, { ...props, children: _jsx("path", { d: "m9 18 6-6-6-6" }) }));
14
+ }
15
+ export function DatePickerXIcon(props) {
16
+ return (_jsxs(DatePickerIcon, { ...props, children: [_jsx("path", { d: "M18 6 6 18" }), _jsx("path", { d: "m6 6 12 12" })] }));
17
+ }
18
+ //# sourceMappingURL=date-picker-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-icons.js","sourceRoot":"","sources":["../../src/internal/date-picker-icons.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAI7B,SAAS,cAAc,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,aAAa,EAAE,UAAU,GAAG,IAAI,EAChC,GAAG,KAAK,EACY;IACpB,OAAO,CACL,kBACM,KAAK,iBACI,UAAU,EACvB,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAC3C,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAC,MAAM,EAClB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,aAElC,+CAA+B,EAC9B,QAAQ,IACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAA0B;IAC/D,OAAO,CACL,MAAC,cAAc,OAAK,KAAK,aACvB,eAAM,CAAC,EAAC,QAAQ,GAAG,EACnB,eAAM,CAAC,EAAC,SAAS,GAAG,EACpB,eAAM,CAAC,EAAC,SAAS,GAAG,EACpB,eAAM,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,GAAG,EACpD,eAAM,CAAC,EAAC,WAAW,GAAG,EACtB,eAAM,CAAC,EAAC,YAAY,GAAG,EACvB,eAAM,CAAC,EAAC,YAAY,GAAG,EACvB,eAAM,CAAC,EAAC,WAAW,GAAG,EACtB,eAAM,CAAC,EAAC,YAAY,GAAG,IACR,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAA0B;IAClE,OAAO,CACL,KAAC,cAAc,OAAK,KAAK,YACvB,eAAM,CAAC,EAAC,gBAAgB,GAAG,GACZ,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAA0B;IACnE,OAAO,CACL,KAAC,cAAc,OAAK,KAAK,YACvB,eAAM,CAAC,EAAC,eAAe,GAAG,GACX,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAA0B;IACxD,OAAO,CACL,MAAC,cAAc,OAAK,KAAK,aACvB,eAAM,CAAC,EAAC,YAAY,GAAG,EACvB,eAAM,CAAC,EAAC,YAAY,GAAG,IACR,CAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from "react";
2
+ export type GlobeIconProps = SVGProps<SVGSVGElement>;
3
+ export declare function GlobeIcon({ className, "aria-hidden": ariaHidden, ...props }: GlobeIconProps): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=globe-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globe-icon.d.ts","sourceRoot":"","sources":["../../src/internal/globe-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAItC,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AAErD,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,aAAa,EAAE,UAAiB,EAChC,GAAG,KAAK,EACT,EAAE,cAAc,2CAqBhB"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from "./cx.js";
3
+ export function GlobeIcon({ className, "aria-hidden": ariaHidden = true, ...props }) {
4
+ return (_jsxs("svg", { ...props, "aria-hidden": ariaHidden, className: cx("size-4 shrink-0", className), fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.75", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("title", { children: "Globe" }), _jsx("circle", { cx: "12", cy: "12", r: "9" }), _jsx("path", { d: "M3 12h18" }), _jsx("path", { d: "M12 3a13.8 13.8 0 0 1 0 18" }), _jsx("path", { d: "M12 3a13.8 13.8 0 0 0 0 18" })] }));
5
+ }
6
+ //# sourceMappingURL=globe-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globe-icon.js","sourceRoot":"","sources":["../../src/internal/globe-icon.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAI7B,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,EACT,aAAa,EAAE,UAAU,GAAG,IAAI,EAChC,GAAG,KAAK,EACO;IACf,OAAO,CACL,kBACM,KAAK,iBACI,UAAU,EACvB,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAC3C,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAC,MAAM,EAClB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,aAElC,oCAAoB,EACpB,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAChC,eAAM,CAAC,EAAC,UAAU,GAAG,EACrB,eAAM,CAAC,EAAC,4BAA4B,GAAG,EACvC,eAAM,CAAC,EAAC,4BAA4B,GAAG,IACnC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { cx } from "./cx.js";
2
+ export type { GlobeIconProps } from "./globe-icon.js";
3
+ export { GlobeIcon } from "./globe-icon.js";
4
+ export type { ThemeStoryIconKind, ThemeStoryIconProps } from "./theme-icons.js";
5
+ export { createThemeStoryIcon, ThemeStoryIcon } from "./theme-icons.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/internal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { cx } from "./cx.js";
2
+ export { GlobeIcon } from "./globe-icon.js";
3
+ export { createThemeStoryIcon, ThemeStoryIcon } from "./theme-icons.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/internal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SVGProps } from "react";
2
+ export type ThemeStoryIconKind = "sun" | "moon" | "contrast";
3
+ export interface ThemeStoryIconProps extends SVGProps<SVGSVGElement> {
4
+ kind: ThemeStoryIconKind;
5
+ title: string;
6
+ }
7
+ export declare function ThemeStoryIcon({ className, kind, title, ...props }: ThemeStoryIconProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function createThemeStoryIcon(kind: ThemeStoryIconKind, title: string): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=theme-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-icons.d.ts","sourceRoot":"","sources":["../../src/internal/theme-icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CAAC,aAAa,CAAC;IAClE,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,mBAAmB,2CAkBvF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,2CAE3E"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const iconPathByKind = {
3
+ sun: "M12 3v2.5M12 18.5V21M4.7 4.7l1.8 1.8M17.5 17.5l1.8 1.8M3 12h2.5M18.5 12H21M4.7 19.3l1.8-1.8M17.5 6.5l1.8-1.8M8 12a4 4 0 1 0 8 0 4 4 0 0 0-8 0Z",
4
+ moon: "M20 15.3A8.5 8.5 0 0 1 8.7 4 7 7 0 1 0 20 15.3Z",
5
+ contrast: "M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18ZM12 3v18",
6
+ };
7
+ export function ThemeStoryIcon({ className, kind, title, ...props }) {
8
+ return (_jsx("svg", { ...props, "aria-label": title, className: className, fill: "none", role: "img", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.75", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: iconPathByKind[kind] }) }));
9
+ }
10
+ export function createThemeStoryIcon(kind, title) {
11
+ return _jsx(ThemeStoryIcon, { kind: kind, title: title });
12
+ }
13
+ //# sourceMappingURL=theme-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-icons.js","sourceRoot":"","sources":["../../src/internal/theme-icons.tsx"],"names":[],"mappings":";AASA,MAAM,cAAc,GAAG;IACrB,GAAG,EAAE,gJAAgJ;IACrJ,IAAI,EAAE,iDAAiD;IACvD,QAAQ,EAAE,8CAA8C;CACH,CAAC;AAExD,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,EAAuB;IACtF,OAAO,CACL,iBACM,KAAK,gBACG,KAAK,EACjB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,KAAK,EACV,MAAM,EAAC,cAAc,EACrB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAC,MAAM,EAClB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,YAElC,eAAM,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,GAAI,GAC7B,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAwB,EAAE,KAAa;IAC1E,OAAO,KAAC,cAAc,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;AACtD,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type * as React from "react";
2
+ export type DatePickerWeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;
3
+ export interface DatePickerProps {
4
+ value: string;
5
+ onChange: (nextValue: string) => void;
6
+ label?: React.ReactNode;
7
+ emptyLabel?: React.ReactNode;
8
+ openCalendarLabel?: string;
9
+ clearLabel?: string;
10
+ previousMonthLabel?: string;
11
+ nextMonthLabel?: string;
12
+ dateInputLabel?: string;
13
+ disabled?: boolean;
14
+ allowClear?: boolean;
15
+ locale?: string;
16
+ weekStartsOn?: DatePickerWeekStart;
17
+ className?: string;
18
+ triggerClassName?: string;
19
+ panelClassName?: string;
20
+ calendarClassName?: string;
21
+ dayClassName?: string;
22
+ clearButtonClassName?: string;
23
+ }
24
+ //# sourceMappingURL=date-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/shared/date-picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../src/shared/date-picker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export type { DatePickerProps, DatePickerWeekStart } from "./date-picker.js";
2
+ export type { LocaleOption, LocaleSwitcherProps } from "./locale.js";
3
+ export type { DarkModeSwitcherProps, ThemeSwitcherOption } from "./theme.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type * as React from "react";
2
+ export interface LocaleOption {
3
+ value: string;
4
+ label: React.ReactNode;
5
+ flag?: React.ReactNode;
6
+ disabled?: boolean;
7
+ }
8
+ export interface LocaleSwitcherProps {
9
+ value: string;
10
+ options: readonly LocaleOption[];
11
+ onChange: (value: string, option: LocaleOption) => void;
12
+ label?: React.ReactNode;
13
+ emptyLabel?: React.ReactNode;
14
+ disabled?: boolean;
15
+ className?: string;
16
+ triggerClassName?: string;
17
+ menuClassName?: string;
18
+ optionClassName?: string;
19
+ triggerIcon?: React.ReactNode;
20
+ }
21
+ //# sourceMappingURL=locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../src/shared/locale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sourceRoot":"","sources":["../../src/shared/locale.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type * as React from "react";
2
+ export interface ThemeSwitcherOption {
3
+ value: string;
4
+ label: React.ReactNode;
5
+ icon?: React.ReactNode;
6
+ disabled?: boolean;
7
+ }
8
+ export interface DarkModeSwitcherProps {
9
+ value: string;
10
+ options: readonly ThemeSwitcherOption[];
11
+ onChange: (value: string, option: ThemeSwitcherOption) => void;
12
+ label?: React.ReactNode;
13
+ disabled?: boolean;
14
+ className?: string;
15
+ optionClassName?: string;
16
+ }
17
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/shared/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/shared/theme.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { DarkModeSwitcherProps } from "../../shared/index.js";
2
+ export type { DarkModeSwitcherProps, ThemeSwitcherOption } from "../../shared/index.js";
3
+ export declare function VanillaDarkModeSwitcher({ value, options, onChange, label, disabled, className, optionClassName, }: DarkModeSwitcherProps): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vanilla/dark-mode-switcher/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAuB,MAAM,uBAAuB,CAAC;AAExF,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAUxF,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAgB,EAChB,SAAS,EACT,eAAe,GAChB,EAAE,qBAAqB,2CAwDvB"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cx } from "../../internal/cx.js";
4
+ function getStringLabel(label) {
5
+ if (typeof label === "string" || typeof label === "number") {
6
+ return String(label);
7
+ }
8
+ return undefined;
9
+ }
10
+ export function VanillaDarkModeSwitcher({ value, options, onChange, label, disabled = false, className, optionClassName, }) {
11
+ return (_jsxs("fieldset", { "aria-disabled": disabled ? true : undefined, className: cx("inline-flex min-w-0 flex-col", disabled && "opacity-70", className), disabled: disabled, children: [label !== undefined ? _jsx("legend", { className: "sr-only", children: label }) : null, _jsx("div", { className: "inline-flex items-center gap-1 rounded-full border border-slate-200 bg-white/90 p-1 shadow-sm ring-1 ring-slate-950/5 dark:border-slate-700 dark:bg-slate-950/80 dark:ring-white/10", children: options.map((option) => {
12
+ const isSelected = option.value === value;
13
+ const isOptionDisabled = disabled || option.disabled === true;
14
+ const stringLabel = getStringLabel(option.label);
15
+ const hasIcon = Boolean(option.icon);
16
+ return (_jsx("button", { "aria-disabled": isOptionDisabled ? true : undefined, "aria-pressed": isSelected, className: cx("inline-flex h-9 min-w-9 items-center justify-center gap-2 rounded-full text-sm font-medium transition duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-amber-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-40 dark:focus-visible:ring-offset-slate-950", hasIcon ? "w-9 px-0" : "px-3", isSelected
17
+ ? "bg-slate-950 text-white shadow-sm dark:bg-white dark:text-slate-950"
18
+ : "text-slate-600 hover:bg-slate-100 hover:text-slate-950 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white", optionClassName), disabled: isOptionDisabled, onClick: () => {
19
+ if (!isOptionDisabled) {
20
+ onChange(option.value, option);
21
+ }
22
+ }, title: stringLabel, type: "button", children: hasIcon ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", className: "inline-flex size-4 items-center justify-center", children: option.icon }), _jsx("span", { className: "sr-only", children: option.label })] })) : (_jsx("span", { className: "truncate", children: option.label })) }, option.value));
23
+ }) })] }));
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/vanilla/dark-mode-switcher/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAK1C,SAAS,cAAc,CAAC,KAAmC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EACtC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,eAAe,GACO;IACtB,OAAO,CACL,qCACiB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC1C,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,QAAQ,IAAI,YAAY,EAAE,SAAS,CAAC,EAClF,QAAQ,EAAE,QAAQ,aAEjB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAQ,SAAS,EAAC,SAAS,YAAE,KAAK,GAAU,CAAC,CAAC,CAAC,IAAI,EAC1E,cAAK,SAAS,EAAC,qLAAqL,YACjM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBACtB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;oBAC1C,MAAM,gBAAgB,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;oBAC9D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACjD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAErC,OAAO,CACL,kCACiB,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBACpC,UAAU,EACxB,SAAS,EAAE,EAAE,CACX,sVAAsV,EACtV,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAC7B,UAAU;4BACR,CAAC,CAAC,qEAAqE;4BACvE,CAAC,CAAC,yHAAyH,EAC7H,eAAe,CAChB,EACD,QAAQ,EAAE,gBAAgB,EAE1B,OAAO,EAAE,GAAG,EAAE;4BACZ,IAAI,CAAC,gBAAgB,EAAE,CAAC;gCACtB,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;4BACjC,CAAC;wBACH,CAAC,EACD,KAAK,EAAE,WAAW,EAClB,IAAI,EAAC,QAAQ,YAEZ,OAAO,CAAC,CAAC,CAAC,CACT,8BACE,8BACc,MAAM,EAClB,SAAS,EAAC,gDAAgD,YAEzD,MAAM,CAAC,IAAI,GACP,EACP,eAAM,SAAS,EAAC,SAAS,YAAE,MAAM,CAAC,KAAK,GAAQ,IAC9C,CACJ,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,UAAU,YAAE,MAAM,CAAC,KAAK,GAAQ,CACjD,IArBI,MAAM,CAAC,KAAK,CAsBV,CACV,CAAC;gBACJ,CAAC,CAAC,GACE,IACG,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DatePickerProps } from "../../shared/date-picker.js";
2
+ export type { DatePickerProps, DatePickerWeekStart } from "../../shared/date-picker.js";
3
+ export declare function VanillaDatePicker({ value, onChange, label, emptyLabel, openCalendarLabel, clearLabel, previousMonthLabel, nextMonthLabel, dateInputLabel, disabled, allowClear, locale, weekStartsOn, className, triggerClassName, panelClassName, calendarClassName, dayClassName, clearButtonClassName, }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vanilla/date-picker/index.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,6BAA6B,CAAC;AAExF,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAwLxF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,KAAK,EACL,UAA8B,EAC9B,iBAA4C,EAC5C,UAA8B,EAC9B,kBAA8C,EAC9C,cAAsC,EACtC,cAAsC,EACtC,QAAgB,EAChB,UAAkB,EAClB,MAAsB,EACtB,YAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,GACrB,EAAE,eAAe,2CA6NjB"}
@@ -0,0 +1,197 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useMemo, useRef, useState } from "react";
4
+ import { cx } from "../../internal/cx.js";
5
+ import { DatePickerCalendarIcon, DatePickerChevronLeftIcon, DatePickerChevronRightIcon, DatePickerXIcon, } from "../../internal/date-picker-icons.js";
6
+ const defaultEmptyLabel = "Select date";
7
+ const defaultOpenCalendarLabel = "Open calendar";
8
+ const defaultClearLabel = "Clear date";
9
+ const defaultPreviousMonthLabel = "Show previous month";
10
+ const defaultNextMonthLabel = "Show next month";
11
+ const defaultDateInputLabel = "Selected date";
12
+ const defaultLocale = "en-US";
13
+ const rootClassName = "grid w-full max-w-sm gap-2 text-sm text-slate-900 dark:text-slate-100";
14
+ const labelClassName = "text-sm font-medium text-slate-700 dark:text-slate-200";
15
+ const wrapClassName = "relative grid gap-2";
16
+ const rowClassName = "flex items-center gap-2";
17
+ const triggerBaseClassName = "inline-flex min-h-10 flex-1 items-center justify-start gap-2 rounded-full border border-slate-300 bg-white px-3 py-2 text-left text-sm font-medium text-slate-900 shadow-sm ring-1 ring-slate-950/5 transition duration-150 ease-out hover:-translate-y-0.5 hover:border-slate-400 hover:bg-slate-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:translate-y-0 disabled:cursor-not-allowed disabled:border-slate-200 disabled:bg-slate-100 disabled:text-slate-400 disabled:shadow-none dark:border-slate-700 dark:bg-slate-950/80 dark:text-slate-100 dark:ring-white/10 dark:hover:bg-slate-900 dark:focus-visible:ring-offset-slate-950 dark:disabled:border-slate-800 dark:disabled:bg-slate-900 dark:disabled:text-slate-600";
18
+ const triggerIconClassName = "grid size-7 shrink-0 place-items-center rounded-full bg-slate-950 text-white shadow-inner dark:bg-white dark:text-slate-950";
19
+ const triggerValueClassName = "min-w-0 flex-1 truncate text-left";
20
+ const triggerCaretClassName = "text-slate-500 dark:text-slate-400";
21
+ const clearBaseClassName = "inline-flex size-10 shrink-0 items-center justify-center rounded-full border border-slate-300 bg-white text-slate-500 shadow-sm ring-1 ring-slate-950/5 transition duration-150 ease-out hover:-translate-y-0.5 hover:border-slate-400 hover:bg-slate-50 hover:text-slate-950 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:translate-y-0 disabled:cursor-not-allowed disabled:border-slate-200 disabled:bg-slate-100 disabled:text-slate-400 disabled:shadow-none dark:border-slate-700 dark:bg-slate-950/80 dark:text-slate-300 dark:ring-white/10 dark:hover:bg-slate-900 dark:hover:text-white dark:focus-visible:ring-offset-slate-950 dark:disabled:border-slate-800 dark:disabled:bg-slate-900 dark:disabled:text-slate-600";
22
+ const hiddenInputClassName = "absolute -m-px h-px w-px overflow-hidden whitespace-nowrap border-0 p-0 [clip-path:inset(50%)] [clip:rect(0,0,0,0)]";
23
+ const panelBaseClassName = "absolute left-0 top-full z-50 mt-2 max-h-[min(28rem,calc(100dvh-5rem))] w-full min-w-80 overflow-y-auto rounded-3xl border border-slate-200 bg-white p-3 text-slate-900 shadow-2xl shadow-slate-900/15 ring-1 ring-slate-950/5 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100 dark:shadow-black/30 dark:ring-white/10";
24
+ const calendarBaseClassName = "grid gap-3";
25
+ const calendarHeaderClassName = "grid grid-cols-[auto_1fr_auto] items-center gap-2";
26
+ const calendarTitleClassName = "text-center text-sm font-semibold text-slate-900 dark:text-slate-100";
27
+ const navButtonClassName = "inline-flex size-9 items-center justify-center rounded-full text-slate-500 transition duration-150 ease-out hover:bg-slate-100 hover:text-slate-950 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-400 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-40 dark:text-slate-400 dark:hover:bg-white/10 dark:hover:text-white";
28
+ const calendarGridClassName = "grid grid-cols-7 gap-1";
29
+ const weekdayClassName = "text-center text-xs font-bold uppercase tracking-wide text-slate-400 dark:text-slate-500";
30
+ const dayButtonClassName = "inline-flex h-9 min-h-9 items-center justify-center rounded-xl border border-transparent p-0 text-sm font-medium transition duration-150 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-400 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-45";
31
+ const dayCurrentMonthClassName = "text-slate-800 hover:bg-slate-100 hover:text-slate-950 dark:text-slate-200 dark:hover:bg-white/10 dark:hover:text-white";
32
+ const dayAdjacentMonthClassName = "text-slate-400 hover:bg-slate-100 hover:text-slate-600 dark:text-slate-600 dark:hover:bg-white/10 dark:hover:text-slate-300";
33
+ const dayTodayClassName = "border-amber-400 text-amber-700 dark:border-amber-300 dark:text-amber-300";
34
+ const daySelectedClassName = "border-slate-950 bg-slate-950 text-white shadow-sm dark:border-white dark:bg-white dark:text-slate-950";
35
+ function formatLocalDateInput(date) {
36
+ const year = date.getFullYear();
37
+ const month = String(date.getMonth() + 1).padStart(2, "0");
38
+ const day = String(date.getDate()).padStart(2, "0");
39
+ return `${year}-${month}-${day}`;
40
+ }
41
+ function parseLocalDateInput(value) {
42
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
43
+ return null;
44
+ }
45
+ const [yearRaw, monthRaw, dayRaw] = value.split("-");
46
+ const year = Number(yearRaw);
47
+ const month = Number(monthRaw);
48
+ const day = Number(dayRaw);
49
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {
50
+ return null;
51
+ }
52
+ const parsed = new Date(year, month - 1, day);
53
+ if (parsed.getFullYear() !== year ||
54
+ parsed.getMonth() !== month - 1 ||
55
+ parsed.getDate() !== day) {
56
+ return null;
57
+ }
58
+ return parsed;
59
+ }
60
+ function addLocalDays(baseDate, days) {
61
+ const nextDate = new Date(baseDate);
62
+ nextDate.setDate(nextDate.getDate() + days);
63
+ return nextDate;
64
+ }
65
+ function addCalendarMonths(baseDate, months) {
66
+ const nextDate = new Date(baseDate.getFullYear(), baseDate.getMonth(), 1);
67
+ nextDate.setMonth(nextDate.getMonth() + months);
68
+ return nextDate;
69
+ }
70
+ function getInitialViewMonth(value, fallback) {
71
+ const parsed = parseLocalDateInput(value);
72
+ const sourceDate = parsed ?? fallback;
73
+ return new Date(sourceDate.getFullYear(), sourceDate.getMonth(), 1);
74
+ }
75
+ function formatDisplayValue(value, emptyLabel, locale) {
76
+ if (!value) {
77
+ return emptyLabel;
78
+ }
79
+ const parsed = parseLocalDateInput(value);
80
+ if (!parsed) {
81
+ return value;
82
+ }
83
+ return parsed.toLocaleDateString(locale, {
84
+ year: "numeric",
85
+ month: "short",
86
+ day: "numeric",
87
+ });
88
+ }
89
+ function buildWeekdayLabels(locale, weekStartsOn) {
90
+ const sunday = new Date(2025, 0, 5);
91
+ return Array.from({ length: 7 }, (_, index) => {
92
+ const weekdayDate = addLocalDays(sunday, weekStartsOn + index);
93
+ return weekdayDate.toLocaleDateString(locale, { weekday: "short" });
94
+ });
95
+ }
96
+ function buildCalendarCells({ locale, todayValue, value, viewMonth, weekStartsOn, }) {
97
+ const firstOfMonth = new Date(viewMonth.getFullYear(), viewMonth.getMonth(), 1);
98
+ const startOffset = (firstOfMonth.getDay() - weekStartsOn + 7) % 7;
99
+ const gridStart = addLocalDays(firstOfMonth, -startOffset);
100
+ return Array.from({ length: 42 }, (_, index) => {
101
+ const cellDate = addLocalDays(gridStart, index);
102
+ const cellValue = formatLocalDateInput(cellDate);
103
+ return {
104
+ dayNumber: cellDate.getDate(),
105
+ label: cellDate.toLocaleDateString(locale, {
106
+ weekday: "long",
107
+ month: "long",
108
+ day: "numeric",
109
+ year: "numeric",
110
+ }),
111
+ value: cellValue,
112
+ isCurrentMonth: cellDate.getMonth() === viewMonth.getMonth(),
113
+ isSelected: cellValue === value,
114
+ isToday: cellValue === todayValue,
115
+ };
116
+ });
117
+ }
118
+ function getDialogLabel(label, openCalendarLabel) {
119
+ if (typeof label === "string" || typeof label === "number") {
120
+ return String(label);
121
+ }
122
+ return openCalendarLabel;
123
+ }
124
+ export function VanillaDatePicker({ value, onChange, label, emptyLabel = defaultEmptyLabel, openCalendarLabel = defaultOpenCalendarLabel, clearLabel = defaultClearLabel, previousMonthLabel = defaultPreviousMonthLabel, nextMonthLabel = defaultNextMonthLabel, dateInputLabel = defaultDateInputLabel, disabled = false, allowClear = false, locale = defaultLocale, weekStartsOn = 0, className, triggerClassName, panelClassName, calendarClassName, dayClassName, clearButtonClassName, }) {
125
+ const panelId = useId();
126
+ const inputId = useId();
127
+ const rootRef = useRef(null);
128
+ const triggerRef = useRef(null);
129
+ const today = useMemo(() => new Date(), []);
130
+ const todayValue = useMemo(() => formatLocalDateInput(today), [today]);
131
+ const [isOpen, setIsOpen] = useState(false);
132
+ const [viewMonth, setViewMonth] = useState(() => getInitialViewMonth(value, today));
133
+ const displayValue = useMemo(() => formatDisplayValue(value, emptyLabel, locale), [emptyLabel, locale, value]);
134
+ const monthHeading = useMemo(() => viewMonth.toLocaleDateString(locale, { month: "long", year: "numeric" }), [locale, viewMonth]);
135
+ const weekdayLabels = useMemo(() => buildWeekdayLabels(locale, weekStartsOn), [locale, weekStartsOn]);
136
+ const calendarCells = useMemo(() => buildCalendarCells({ locale, todayValue, value, viewMonth, weekStartsOn }), [locale, todayValue, value, viewMonth, weekStartsOn]);
137
+ const hiddenInputValue = parseLocalDateInput(value) ? value : "";
138
+ const dialogLabel = getDialogLabel(label, openCalendarLabel);
139
+ useEffect(() => {
140
+ if (!disabled)
141
+ return;
142
+ setIsOpen(false);
143
+ }, [disabled]);
144
+ useEffect(() => {
145
+ if (!isOpen)
146
+ return;
147
+ function handlePointerDown(event) {
148
+ const target = event.target;
149
+ if (!(target instanceof Node) || rootRef.current?.contains(target))
150
+ return;
151
+ setIsOpen(false);
152
+ }
153
+ function handleKeyDown(event) {
154
+ if (event.key !== "Escape")
155
+ return;
156
+ setIsOpen(false);
157
+ triggerRef.current?.focus();
158
+ }
159
+ document.addEventListener("mousedown", handlePointerDown);
160
+ window.addEventListener("keydown", handleKeyDown);
161
+ return () => {
162
+ document.removeEventListener("mousedown", handlePointerDown);
163
+ window.removeEventListener("keydown", handleKeyDown);
164
+ };
165
+ }, [isOpen]);
166
+ useEffect(() => {
167
+ if (!isOpen)
168
+ return;
169
+ setViewMonth(getInitialViewMonth(value, today));
170
+ }, [isOpen, today, value]);
171
+ function closeAndReturnFocus() {
172
+ setIsOpen(false);
173
+ triggerRef.current?.focus();
174
+ }
175
+ function handleTriggerClick() {
176
+ if (disabled)
177
+ return;
178
+ setIsOpen((currentIsOpen) => !currentIsOpen);
179
+ }
180
+ function handleMonthChange(months) {
181
+ if (disabled)
182
+ return;
183
+ setViewMonth((currentMonth) => addCalendarMonths(currentMonth, months));
184
+ }
185
+ function handleSelect(nextValue) {
186
+ if (disabled)
187
+ return;
188
+ onChange(nextValue);
189
+ closeAndReturnFocus();
190
+ }
191
+ return (_jsxs("div", { className: cx(rootClassName, className), ref: rootRef, children: [label !== undefined && label !== null ? (_jsx("span", { className: labelClassName, children: label })) : null, _jsxs("div", { className: wrapClassName, children: [_jsxs("div", { className: rowClassName, children: [_jsxs("button", { "aria-controls": isOpen ? panelId : undefined, "aria-expanded": isOpen, "aria-haspopup": "dialog", "aria-label": openCalendarLabel, className: cx(triggerBaseClassName, triggerClassName), disabled: disabled, onClick: handleTriggerClick, ref: triggerRef, title: openCalendarLabel, type: "button", children: [_jsx("span", { className: triggerIconClassName, children: _jsx(DatePickerCalendarIcon, { "aria-hidden": "true" }) }), _jsx("span", { "aria-hidden": "true", className: triggerValueClassName, children: displayValue }), _jsx("span", { "aria-hidden": "true", className: triggerCaretClassName, children: isOpen ? "▲" : "▼" })] }), allowClear && value ? (_jsx("button", { "aria-label": clearLabel, className: cx(clearBaseClassName, clearButtonClassName), disabled: disabled, onClick: () => handleSelect(""), title: clearLabel, type: "button", children: _jsx(DatePickerXIcon, { "aria-hidden": "true", className: "size-3.5" }) })) : null] }), _jsx("input", { "aria-label": dateInputLabel, className: hiddenInputClassName, disabled: disabled, id: inputId, readOnly: true, tabIndex: -1, type: "date", value: hiddenInputValue }), isOpen ? (_jsx("div", { "aria-label": dialogLabel, className: cx(panelBaseClassName, panelClassName), id: panelId, role: "dialog", children: _jsxs("div", { className: cx(calendarBaseClassName, calendarClassName), children: [_jsxs("div", { className: calendarHeaderClassName, children: [_jsx("button", { "aria-label": previousMonthLabel, className: navButtonClassName, disabled: disabled, onClick: () => handleMonthChange(-1), type: "button", children: _jsx(DatePickerChevronLeftIcon, { "aria-hidden": "true" }) }), _jsx("p", { "aria-live": "polite", className: calendarTitleClassName, children: monthHeading }), _jsx("button", { "aria-label": nextMonthLabel, className: navButtonClassName, disabled: disabled, onClick: () => handleMonthChange(1), type: "button", children: _jsx(DatePickerChevronRightIcon, { "aria-hidden": "true" }) })] }), _jsx("div", { "aria-hidden": "true", className: calendarGridClassName, children: weekdayLabels.map((weekdayLabel) => (_jsx("span", { className: weekdayClassName, children: weekdayLabel }, weekdayLabel))) }), _jsx("div", { className: calendarGridClassName, children: calendarCells.map((cell) => (_jsx("button", { "aria-current": cell.isToday ? "date" : undefined, "aria-label": cell.label, "aria-pressed": cell.isSelected, className: cx(dayButtonClassName, cell.isSelected
192
+ ? daySelectedClassName
193
+ : cell.isCurrentMonth
194
+ ? dayCurrentMonthClassName
195
+ : dayAdjacentMonthClassName, !cell.isSelected && cell.isToday && dayTodayClassName, dayClassName), disabled: disabled, onClick: () => handleSelect(cell.value), type: "button", children: cell.dayNumber }, cell.value))) })] }) })) : null] })] }));
196
+ }
197
+ //# sourceMappingURL=index.js.map