@craftzbay/ui 0.8.1 → 0.10.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 (172) hide show
  1. package/README.md +72 -6
  2. package/dist-lib/components/ui/Accordion.js +60 -0
  3. package/dist-lib/components/ui/Accordion.js.map +1 -0
  4. package/dist-lib/components/ui/Alert.d.ts +1 -1
  5. package/dist-lib/components/ui/Alert.js +66 -0
  6. package/dist-lib/components/ui/Alert.js.map +1 -0
  7. package/dist-lib/components/ui/Avatar.d.ts +2 -2
  8. package/dist-lib/components/ui/Avatar.js +96 -0
  9. package/dist-lib/components/ui/Avatar.js.map +1 -0
  10. package/dist-lib/components/ui/Badge.d.ts +1 -1
  11. package/dist-lib/components/ui/Badge.js +67 -0
  12. package/dist-lib/components/ui/Badge.js.map +1 -0
  13. package/dist-lib/components/ui/Breadcrumbs.js +34 -0
  14. package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
  15. package/dist-lib/components/ui/Button.d.ts +1 -1
  16. package/dist-lib/components/ui/Button.js +117 -0
  17. package/dist-lib/components/ui/Button.js.map +1 -0
  18. package/dist-lib/components/ui/Calendar.d.ts +7 -1
  19. package/dist-lib/components/ui/Calendar.js +111 -0
  20. package/dist-lib/components/ui/Calendar.js.map +1 -0
  21. package/dist-lib/components/ui/Card.d.ts +1 -1
  22. package/dist-lib/components/ui/Card.js +116 -0
  23. package/dist-lib/components/ui/Card.js.map +1 -0
  24. package/dist-lib/components/ui/Carousel.d.ts +5 -1
  25. package/dist-lib/components/ui/Carousel.js +143 -0
  26. package/dist-lib/components/ui/Carousel.js.map +1 -0
  27. package/dist-lib/components/ui/Chart.d.ts +26 -4
  28. package/dist-lib/components/ui/Chart.js +253 -0
  29. package/dist-lib/components/ui/Chart.js.map +1 -0
  30. package/dist-lib/components/ui/Checkbox.js +56 -0
  31. package/dist-lib/components/ui/Checkbox.js.map +1 -0
  32. package/dist-lib/components/ui/Combobox.d.ts +7 -0
  33. package/dist-lib/components/ui/Combobox.js +164 -0
  34. package/dist-lib/components/ui/Combobox.js.map +1 -0
  35. package/dist-lib/components/ui/CommandPalette.d.ts +3 -3
  36. package/dist-lib/components/ui/CommandPalette.js +174 -0
  37. package/dist-lib/components/ui/CommandPalette.js.map +1 -0
  38. package/dist-lib/components/ui/ContextMenu.js +150 -0
  39. package/dist-lib/components/ui/ContextMenu.js.map +1 -0
  40. package/dist-lib/components/ui/DataGrid.js +84 -0
  41. package/dist-lib/components/ui/DataGrid.js.map +1 -0
  42. package/dist-lib/components/ui/DatePicker.d.ts +16 -13
  43. package/dist-lib/components/ui/DatePicker.js +174 -0
  44. package/dist-lib/components/ui/DatePicker.js.map +1 -0
  45. package/dist-lib/components/ui/DesignSystemProvider.d.ts +8 -1
  46. package/dist-lib/components/ui/DesignSystemProvider.js +79 -0
  47. package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
  48. package/dist-lib/components/ui/Dialog.d.ts +1 -1
  49. package/dist-lib/components/ui/Dialog.js +140 -0
  50. package/dist-lib/components/ui/Dialog.js.map +1 -0
  51. package/dist-lib/components/ui/Drawer.d.ts +6 -0
  52. package/dist-lib/components/ui/Drawer.js +98 -0
  53. package/dist-lib/components/ui/Drawer.js.map +1 -0
  54. package/dist-lib/components/ui/DropdownMenu.js +164 -0
  55. package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
  56. package/dist-lib/components/ui/EmptyState.js +32 -0
  57. package/dist-lib/components/ui/EmptyState.js.map +1 -0
  58. package/dist-lib/components/ui/ErrorState.js +48 -0
  59. package/dist-lib/components/ui/ErrorState.js.map +1 -0
  60. package/dist-lib/components/ui/FileUpload.d.ts +3 -0
  61. package/dist-lib/components/ui/FileUpload.js +108 -0
  62. package/dist-lib/components/ui/FileUpload.js.map +1 -0
  63. package/dist-lib/components/ui/Form.d.ts +1 -0
  64. package/dist-lib/components/ui/Form.js +105 -0
  65. package/dist-lib/components/ui/Form.js.map +1 -0
  66. package/dist-lib/components/ui/Icon.d.ts +34 -0
  67. package/dist-lib/components/ui/Icon.js +26 -0
  68. package/dist-lib/components/ui/Icon.js.map +1 -0
  69. package/dist-lib/components/ui/IconButton.d.ts +1 -1
  70. package/dist-lib/components/ui/IconButton.js +56 -0
  71. package/dist-lib/components/ui/IconButton.js.map +1 -0
  72. package/dist-lib/components/ui/Input.d.ts +6 -3
  73. package/dist-lib/components/ui/Input.js +135 -0
  74. package/dist-lib/components/ui/Input.js.map +1 -0
  75. package/dist-lib/components/ui/Kbd.js +24 -0
  76. package/dist-lib/components/ui/Kbd.js.map +1 -0
  77. package/dist-lib/components/ui/MultiSelect.d.ts +3 -1
  78. package/dist-lib/components/ui/MultiSelect.js +196 -0
  79. package/dist-lib/components/ui/MultiSelect.js.map +1 -0
  80. package/dist-lib/components/ui/Pagination.d.ts +23 -0
  81. package/dist-lib/components/ui/Pagination.js +148 -0
  82. package/dist-lib/components/ui/Pagination.js.map +1 -0
  83. package/dist-lib/components/ui/Popover.js +35 -0
  84. package/dist-lib/components/ui/Popover.js.map +1 -0
  85. package/dist-lib/components/ui/Progress.js +95 -0
  86. package/dist-lib/components/ui/Progress.js.map +1 -0
  87. package/dist-lib/components/ui/RadioGroup.js +64 -0
  88. package/dist-lib/components/ui/RadioGroup.js.map +1 -0
  89. package/dist-lib/components/ui/ScrollArea.js +44 -0
  90. package/dist-lib/components/ui/ScrollArea.js.map +1 -0
  91. package/dist-lib/components/ui/Select.js +131 -0
  92. package/dist-lib/components/ui/Select.js.map +1 -0
  93. package/dist-lib/components/ui/Separator.js +26 -0
  94. package/dist-lib/components/ui/Separator.js.map +1 -0
  95. package/dist-lib/components/ui/Sheet.d.ts +1 -1
  96. package/dist-lib/components/ui/Sheet.js +113 -0
  97. package/dist-lib/components/ui/Sheet.js.map +1 -0
  98. package/dist-lib/components/ui/Sidebar.d.ts +18 -6
  99. package/dist-lib/components/ui/Sidebar.js +169 -0
  100. package/dist-lib/components/ui/Sidebar.js.map +1 -0
  101. package/dist-lib/components/ui/Skeleton.js +28 -0
  102. package/dist-lib/components/ui/Skeleton.js.map +1 -0
  103. package/dist-lib/components/ui/Slider.js +52 -0
  104. package/dist-lib/components/ui/Slider.js.map +1 -0
  105. package/dist-lib/components/ui/Snackbar.d.ts +1 -1
  106. package/dist-lib/components/ui/Snackbar.js +56 -0
  107. package/dist-lib/components/ui/Snackbar.js.map +1 -0
  108. package/dist-lib/components/ui/Spinner.js +42 -0
  109. package/dist-lib/components/ui/Spinner.js.map +1 -0
  110. package/dist-lib/components/ui/Stepper.js +88 -0
  111. package/dist-lib/components/ui/Stepper.js.map +1 -0
  112. package/dist-lib/components/ui/Switch.js +77 -0
  113. package/dist-lib/components/ui/Switch.js.map +1 -0
  114. package/dist-lib/components/ui/Table.d.ts +9 -1
  115. package/dist-lib/components/ui/Table.js +157 -0
  116. package/dist-lib/components/ui/Table.js.map +1 -0
  117. package/dist-lib/components/ui/Tabs.d.ts +1 -1
  118. package/dist-lib/components/ui/Tabs.js +89 -0
  119. package/dist-lib/components/ui/Tabs.js.map +1 -0
  120. package/dist-lib/components/ui/TagInput.d.ts +17 -2
  121. package/dist-lib/components/ui/TagInput.js +111 -0
  122. package/dist-lib/components/ui/TagInput.js.map +1 -0
  123. package/dist-lib/components/ui/Textarea.js +77 -0
  124. package/dist-lib/components/ui/Textarea.js.map +1 -0
  125. package/dist-lib/components/ui/Timeline.d.ts +16 -6
  126. package/dist-lib/components/ui/Timeline.js +52 -0
  127. package/dist-lib/components/ui/Timeline.js.map +1 -0
  128. package/dist-lib/components/ui/Toast.d.ts +1 -1
  129. package/dist-lib/components/ui/Toast.js +171 -0
  130. package/dist-lib/components/ui/Toast.js.map +1 -0
  131. package/dist-lib/components/ui/Tooltip.js +58 -0
  132. package/dist-lib/components/ui/Tooltip.js.map +1 -0
  133. package/dist-lib/components/ui/TopNav.js +52 -0
  134. package/dist-lib/components/ui/TopNav.js.map +1 -0
  135. package/dist-lib/components/ui/Tree.d.ts +27 -5
  136. package/dist-lib/components/ui/Tree.js +167 -0
  137. package/dist-lib/components/ui/Tree.js.map +1 -0
  138. package/dist-lib/hooks/use-field-ids.d.ts +29 -0
  139. package/dist-lib/hooks/use-field-ids.js +18 -0
  140. package/dist-lib/hooks/use-field-ids.js.map +1 -0
  141. package/dist-lib/hooks/use-media-query.js +18 -0
  142. package/dist-lib/hooks/use-media-query.js.map +1 -0
  143. package/dist-lib/hooks/use-strings.d.ts +5 -0
  144. package/dist-lib/hooks/use-strings.js +12 -0
  145. package/dist-lib/hooks/use-strings.js.map +1 -0
  146. package/dist-lib/hooks/use-toast.js +36 -0
  147. package/dist-lib/hooks/use-toast.js.map +1 -0
  148. package/dist-lib/icon.d.ts +8 -0
  149. package/dist-lib/icon.js +7 -0
  150. package/dist-lib/icon.js.map +1 -0
  151. package/dist-lib/icons/index.d.ts +71 -11
  152. package/dist-lib/icons/index.js +145 -0
  153. package/dist-lib/icons/index.js.map +1 -0
  154. package/dist-lib/illustrations/index.js +105 -0
  155. package/dist-lib/illustrations/index.js.map +1 -0
  156. package/dist-lib/index.d.ts +62 -58
  157. package/dist-lib/index.js +268 -4386
  158. package/dist-lib/index.js.map +1 -1
  159. package/dist-lib/lib/strings.d.ts +129 -0
  160. package/dist-lib/lib/strings.js +85 -0
  161. package/dist-lib/lib/strings.js.map +1 -0
  162. package/dist-lib/lib/strings.mn.d.ts +3 -0
  163. package/dist-lib/lib/strings.mn.js +70 -0
  164. package/dist-lib/lib/strings.mn.js.map +1 -0
  165. package/dist-lib/lib/utils.d.ts +0 -1
  166. package/dist-lib/lib/utils.js +10 -0
  167. package/dist-lib/lib/utils.js.map +1 -0
  168. package/dist-lib/styles.css +1 -1
  169. package/dist-lib/theme.css +777 -0
  170. package/package.json +31 -8
  171. package/dist-lib/index.cjs +0 -8
  172. package/dist-lib/index.cjs.map +0 -1
@@ -0,0 +1,174 @@
1
+ "use client";
2
+ import { jsx as r, jsxs as b } from "react/jsx-runtime";
3
+ import { forwardRef as R, useId as $, useState as M, useMemo as j } from "react";
4
+ import * as l from "@radix-ui/react-popover";
5
+ import { Calendar as A } from "../../icons/index.js";
6
+ import { Calendar as v } from "./Calendar.js";
7
+ import { cn as O } from "../../lib/utils.js";
8
+ import { useStrings as w } from "../../hooks/use-strings.js";
9
+ function z(t) {
10
+ return t.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
11
+ }
12
+ function S(t, e, o) {
13
+ return j(() => {
14
+ const n = [];
15
+ return t && n.push({ before: t }), e && n.push({ after: e }), o && n.push(...Array.isArray(o) ? o : [o]), n.length ? n : void 0;
16
+ }, [t, e, o]);
17
+ }
18
+ function B({
19
+ label: t,
20
+ placeholder: e,
21
+ hasValue: o,
22
+ children: n,
23
+ error: i,
24
+ fieldId: c,
25
+ disabled: f,
26
+ open: a
27
+ }) {
28
+ const d = `${c}-error`, g = `${c}-calendar`, s = o ? n : e;
29
+ return /* @__PURE__ */ b("div", { className: "flex flex-col gap-1.5", children: [
30
+ t && /* @__PURE__ */ r("label", { htmlFor: c, className: "text-foreground text-sm font-medium", children: t }),
31
+ /* @__PURE__ */ r(l.Trigger, { asChild: !0, children: /* @__PURE__ */ b(
32
+ "button",
33
+ {
34
+ id: c,
35
+ type: "button",
36
+ role: "combobox",
37
+ "aria-expanded": a,
38
+ "aria-controls": g,
39
+ disabled: f,
40
+ "aria-invalid": !!i || void 0,
41
+ "aria-describedby": i ? d : void 0,
42
+ className: O(
43
+ "bg-card inline-flex h-9 w-full items-center justify-start gap-2 rounded-md border px-3 text-left text-sm",
44
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
45
+ "focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
46
+ "disabled:cursor-not-allowed disabled:opacity-50",
47
+ i ? "border-danger focus-visible:border-danger focus-visible:ring-danger" : "border-border focus-visible:border-accent focus-visible:ring-ring",
48
+ !o && "text-foreground-subtle"
49
+ ),
50
+ children: [
51
+ /* @__PURE__ */ r(A, { className: "text-foreground-subtle size-4", "aria-hidden": !0 }),
52
+ /* @__PURE__ */ r("span", { className: "truncate", title: typeof s == "string" ? s : void 0, children: s })
53
+ ]
54
+ }
55
+ ) }),
56
+ i && /* @__PURE__ */ r("p", { id: d, role: "alert", className: "text-danger-text text-xs", children: i })
57
+ ] });
58
+ }
59
+ const F = R(function({
60
+ value: e,
61
+ onChange: o,
62
+ label: n,
63
+ placeholder: i,
64
+ error: c,
65
+ disabled: f,
66
+ fromDate: a,
67
+ toDate: d,
68
+ disabledDays: g,
69
+ formatDate: s = z,
70
+ locale: x,
71
+ className: P
72
+ }, k) {
73
+ const N = w(), y = i ?? N.datePicker.pickDate, p = $(), [m, h] = M(!1), C = S(a, d, g);
74
+ return /* @__PURE__ */ r("div", { ref: k, className: O(P), children: /* @__PURE__ */ b(l.Root, { open: m, onOpenChange: h, children: [
75
+ /* @__PURE__ */ r(
76
+ B,
77
+ {
78
+ label: n,
79
+ placeholder: y,
80
+ hasValue: !!e,
81
+ error: c,
82
+ fieldId: p,
83
+ disabled: f,
84
+ open: m,
85
+ children: e ? s(e) : ""
86
+ }
87
+ ),
88
+ /* @__PURE__ */ r(l.Portal, { children: /* @__PURE__ */ r(
89
+ l.Content,
90
+ {
91
+ id: `${p}-calendar`,
92
+ align: "start",
93
+ sideOffset: 4,
94
+ className: "text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-lg",
95
+ children: /* @__PURE__ */ r(
96
+ v,
97
+ {
98
+ mode: "single",
99
+ selected: e,
100
+ onSelect: (u) => {
101
+ o(u ?? void 0), u && h(!1);
102
+ },
103
+ startMonth: a,
104
+ endMonth: d,
105
+ disabled: C,
106
+ locale: x
107
+ }
108
+ )
109
+ }
110
+ ) })
111
+ ] }) });
112
+ });
113
+ F.displayName = "DatePicker";
114
+ const I = R(
115
+ function({
116
+ value: e,
117
+ onChange: o,
118
+ label: n,
119
+ placeholder: i,
120
+ error: c,
121
+ disabled: f,
122
+ fromDate: a,
123
+ toDate: d,
124
+ disabledDays: g,
125
+ formatDate: s = z,
126
+ locale: x,
127
+ className: P
128
+ }, k) {
129
+ const N = w(), y = i ?? N.datePicker.pickRange, p = $(), [m, h] = M(!1), C = !!(e != null && e.from), u = S(a, d, g);
130
+ return /* @__PURE__ */ r("div", { ref: k, className: O(P), children: /* @__PURE__ */ b(l.Root, { open: m, onOpenChange: h, children: [
131
+ /* @__PURE__ */ r(
132
+ B,
133
+ {
134
+ label: n,
135
+ placeholder: y,
136
+ hasValue: C,
137
+ error: c,
138
+ fieldId: p,
139
+ disabled: f,
140
+ open: m,
141
+ children: e != null && e.from && e.to ? `${s(e.from)} – ${s(e.to)}` : e != null && e.from ? s(e.from) : ""
142
+ }
143
+ ),
144
+ /* @__PURE__ */ r(l.Portal, { children: /* @__PURE__ */ r(
145
+ l.Content,
146
+ {
147
+ id: `${p}-calendar`,
148
+ align: "start",
149
+ sideOffset: 4,
150
+ className: "text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-lg",
151
+ children: /* @__PURE__ */ r(
152
+ v,
153
+ {
154
+ mode: "range",
155
+ selected: e,
156
+ onSelect: o,
157
+ numberOfMonths: 2,
158
+ startMonth: a,
159
+ endMonth: d,
160
+ disabled: u,
161
+ locale: x
162
+ }
163
+ )
164
+ }
165
+ ) })
166
+ ] }) });
167
+ }
168
+ );
169
+ I.displayName = "DateRangePicker";
170
+ export {
171
+ F as DatePicker,
172
+ I as DateRangePicker
173
+ };
174
+ //# sourceMappingURL=DatePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker.js","sources":["../../../src/components/ui/DatePicker.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, useId, useMemo, useState, type ReactNode } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport type { DateRange, DayPickerProps, Matcher } from 'react-day-picker';\nimport { Calendar as CalendarIcon } from '@/icons';\nimport { Calendar } from './Calendar';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\n\n/* -----------------------------------------------------------------------------\n * Two related components share the same trigger shell:\n *\n * <DatePicker value={date} onChange={setDate} /> // single date\n * <DateRangePicker value={range} onChange={setRange} /> // {from,to}\n * --------------------------------------------------------------------------- */\n\ntype CalendarLocale = DayPickerProps['locale'];\n\nfunction defaultFormatDate(d: Date): string {\n return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\n/** Merge the fromDate/toDate bounds with any consumer-supplied RDP matcher. */\nfunction useBounds(fromDate?: Date, toDate?: Date, disabled?: Matcher | Matcher[]) {\n return useMemo<Matcher[] | undefined>(() => {\n const list: Matcher[] = [];\n if (fromDate) list.push({ before: fromDate });\n if (toDate) list.push({ after: toDate });\n if (disabled) list.push(...(Array.isArray(disabled) ? disabled : [disabled]));\n return list.length ? list : undefined;\n }, [fromDate, toDate, disabled]);\n}\n\nfunction PickerTrigger({\n label,\n placeholder,\n hasValue,\n children,\n error,\n fieldId,\n disabled,\n open,\n}: {\n label?: ReactNode;\n placeholder: string;\n hasValue: boolean;\n children: ReactNode;\n error?: ReactNode;\n fieldId: string;\n disabled?: boolean;\n open: boolean;\n}) {\n const errorId = `${fieldId}-error`;\n const calendarId = `${fieldId}-calendar`;\n const text = hasValue ? children : placeholder;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label htmlFor={fieldId} className=\"text-foreground text-sm font-medium\">\n {label}\n </label>\n )}\n <PopoverPrimitive.Trigger asChild>\n <button\n id={fieldId}\n type=\"button\"\n // combobox-with-dialog pattern: lets the field carry aria-invalid like other inputs.\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={calendarId}\n disabled={disabled}\n aria-invalid={Boolean(error) || undefined}\n aria-describedby={error ? errorId : undefined}\n className={cn(\n 'bg-card inline-flex h-9 w-full items-center justify-start gap-2 rounded-md border px-3 text-left text-sm',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error\n ? 'border-danger focus-visible:border-danger focus-visible:ring-danger'\n : 'border-border focus-visible:border-accent focus-visible:ring-ring',\n !hasValue && 'text-foreground-subtle',\n )}\n >\n <CalendarIcon className=\"text-foreground-subtle size-4\" aria-hidden />\n <span className=\"truncate\" title={typeof text === 'string' ? text : undefined}>\n {text}\n </span>\n </button>\n </PopoverPrimitive.Trigger>\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-danger-text text-xs\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\ninterface PickerCommonProps {\n label?: ReactNode;\n placeholder?: string;\n error?: ReactNode;\n disabled?: boolean;\n /** Restrict to a date range. Days outside are not selectable. */\n fromDate?: Date;\n toDate?: Date;\n /** Extra RDP matcher(s) for disabled days, merged with `fromDate`/`toDate`. */\n disabledDays?: Matcher | Matcher[];\n /** Custom display formatter for the trigger text. */\n formatDate?: (d: Date) => string;\n /** date-fns locale object passed through to react-day-picker. */\n locale?: CalendarLocale;\n className?: string;\n}\n\nexport interface DatePickerProps extends PickerCommonProps {\n value?: Date;\n onChange: (date: Date | undefined) => void;\n}\n\n/**\n * Single-date picker.\n *\n * @example\n * <DatePicker label=\"Date of birth\" value={dob} onChange={setDob} />\n *\n * @do Use locale-aware formatting via `formatDate` / `locale`.\n * @dont Roll a custom calendar — Radix Popover + react-day-picker handles a11y.\n */\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(\n {\n value,\n onChange,\n label,\n placeholder: placeholderProp,\n error,\n disabled,\n fromDate,\n toDate,\n disabledDays,\n formatDate = defaultFormatDate,\n locale,\n className,\n },\n ref,\n) {\n const strings = useStrings();\n const placeholder = placeholderProp ?? strings.datePicker.pickDate;\n const fieldId = useId();\n const [open, setOpen] = useState(false);\n const bounds = useBounds(fromDate, toDate, disabledDays);\n\n return (\n <div ref={ref} className={cn(className)}>\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PickerTrigger\n label={label}\n placeholder={placeholder}\n hasValue={Boolean(value)}\n error={error}\n fieldId={fieldId}\n disabled={disabled}\n open={open}\n >\n {value ? formatDate(value) : ''}\n </PickerTrigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n id={`${fieldId}-calendar`}\n align=\"start\"\n sideOffset={4}\n className=\"text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-lg\"\n >\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={(d) => {\n onChange(d ?? undefined);\n if (d) setOpen(false);\n }}\n startMonth={fromDate}\n endMonth={toDate}\n disabled={bounds}\n locale={locale}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </div>\n );\n});\nDatePicker.displayName = 'DatePicker';\n\nexport interface DateRangePickerProps extends PickerCommonProps {\n value?: DateRange;\n onChange: (range: DateRange | undefined) => void;\n}\n\n/**\n * Two-date range picker. `value` is `{from, to}`.\n *\n * @example\n * <DateRangePicker label=\"Reporting period\" value={range} onChange={setRange} />\n */\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(\n function DateRangePicker(\n {\n value,\n onChange,\n label,\n placeholder: placeholderProp,\n error,\n disabled,\n fromDate,\n toDate,\n disabledDays,\n formatDate = defaultFormatDate,\n locale,\n className,\n },\n ref,\n ) {\n const strings = useStrings();\n const placeholder = placeholderProp ?? strings.datePicker.pickRange;\n const fieldId = useId();\n const [open, setOpen] = useState(false);\n const hasValue = Boolean(value?.from);\n const bounds = useBounds(fromDate, toDate, disabledDays);\n\n return (\n <div ref={ref} className={cn(className)}>\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PickerTrigger\n label={label}\n placeholder={placeholder}\n hasValue={hasValue}\n error={error}\n fieldId={fieldId}\n disabled={disabled}\n open={open}\n >\n {value?.from && value.to\n ? `${formatDate(value.from)} – ${formatDate(value.to)}`\n : value?.from\n ? formatDate(value.from)\n : ''}\n </PickerTrigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n id={`${fieldId}-calendar`}\n align=\"start\"\n sideOffset={4}\n className=\"text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-lg\"\n >\n <Calendar\n mode=\"range\"\n selected={value}\n onSelect={onChange}\n numberOfMonths={2}\n startMonth={fromDate}\n endMonth={toDate}\n disabled={bounds}\n locale={locale}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </div>\n );\n },\n);\nDateRangePicker.displayName = 'DateRangePicker';\n"],"names":["defaultFormatDate","d","useBounds","fromDate","toDate","disabled","useMemo","list","PickerTrigger","label","placeholder","hasValue","children","error","fieldId","open","errorId","calendarId","text","jsxs","jsx","PopoverPrimitive","cn","CalendarIcon","DatePicker","forwardRef","value","onChange","placeholderProp","disabledDays","formatDate","locale","className","ref","strings","useStrings","useId","setOpen","useState","bounds","Calendar","DateRangePicker"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { HTMLAttributes, ReactNode } from 'react';
2
+ import { DeepPartial, UiStrings } from '../../lib/strings.js';
2
3
  /**
3
4
  * Per-brand token overrides. Keys are CSS variable names (without the `--`
4
5
  * prefix); values are CSS values. Any unspecified token falls back to the
@@ -18,10 +19,16 @@ export type BrandTokens = Record<string, string>;
18
19
  export interface DesignSystemProviderProps extends HTMLAttributes<HTMLDivElement> {
19
20
  /** Token overrides (CSS variable name → value). */
20
21
  tokens?: BrandTokens;
22
+ /**
23
+ * Override any of the library's built-in UI strings (aria-labels,
24
+ * placeholders, empty states). Partial — merged over the parent provider /
25
+ * English defaults. Pass `mnStrings` for Mongolian.
26
+ */
27
+ strings?: DeepPartial<UiStrings>;
21
28
  /** Children to scope this brand to. */
22
29
  children: ReactNode;
23
30
  }
24
- export declare function DesignSystemProvider({ tokens, className, children, style, ...props }: DesignSystemProviderProps): import("react/jsx-runtime").JSX.Element;
31
+ export declare function DesignSystemProvider({ tokens, strings, className, children, style, ...props }: DesignSystemProviderProps): import("react/jsx-runtime").JSX.Element;
25
32
  /**
26
33
  * Built-in accent presets — swap the system's single accent colour without
27
34
  * touching anything else.
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import { jsx as r } from "react/jsx-runtime";
3
+ import { useMemo as g } from "react";
4
+ import { cn as m } from "../../lib/utils.js";
5
+ import { useStrings as b, StringsContext as d } from "../../hooks/use-strings.js";
6
+ import { mergeStrings as f } from "../../lib/strings.js";
7
+ function P({
8
+ tokens: o,
9
+ strings: e,
10
+ className: n,
11
+ children: s,
12
+ style: a,
13
+ ...h
14
+ }) {
15
+ const t = b(), k = g(
16
+ () => f(t, e),
17
+ [t, e]
18
+ ), l = { ...a };
19
+ if (o)
20
+ for (const [c, i] of Object.entries(o)) {
21
+ const u = c.startsWith("--") ? c : `--${c}`;
22
+ l[u] = i;
23
+ }
24
+ return /* @__PURE__ */ r(d.Provider, { value: k, children: /* @__PURE__ */ r("div", { "data-brand-scope": !0, className: m("contents", n), style: l, ...h, children: s }) });
25
+ }
26
+ const j = {
27
+ /** The library default — graphite indigo. */
28
+ default: {},
29
+ /** Blue. */
30
+ blue: {
31
+ accent: "oklch(0.55 0.16 250)",
32
+ "color-accent-700": "oklch(0.47 0.16 250)",
33
+ "color-accent-800": "oklch(0.39 0.14 250)",
34
+ "accent-subtle": "oklch(0.95 0.04 250)",
35
+ "accent-subtle-foreground": "oklch(0.45 0.15 250)",
36
+ ring: "oklch(0.62 0.16 250)"
37
+ },
38
+ /** Violet. */
39
+ violet: {
40
+ accent: "oklch(0.53 0.20 295)",
41
+ "color-accent-700": "oklch(0.45 0.18 295)",
42
+ "color-accent-800": "oklch(0.38 0.16 295)",
43
+ "accent-subtle": "oklch(0.95 0.04 295)",
44
+ "accent-subtle-foreground": "oklch(0.45 0.18 295)",
45
+ ring: "oklch(0.60 0.20 295)"
46
+ },
47
+ /** Emerald. */
48
+ emerald: {
49
+ accent: "oklch(0.55 0.13 160)",
50
+ "color-accent-700": "oklch(0.47 0.13 160)",
51
+ "color-accent-800": "oklch(0.39 0.12 160)",
52
+ "accent-subtle": "oklch(0.95 0.04 160)",
53
+ "accent-subtle-foreground": "oklch(0.42 0.12 160)",
54
+ ring: "oklch(0.60 0.13 160)"
55
+ },
56
+ /** Rose. */
57
+ rose: {
58
+ accent: "oklch(0.57 0.19 12)",
59
+ "color-accent-700": "oklch(0.49 0.18 12)",
60
+ "color-accent-800": "oklch(0.41 0.16 12)",
61
+ "accent-subtle": "oklch(0.95 0.035 12)",
62
+ "accent-subtle-foreground": "oklch(0.48 0.18 12)",
63
+ ring: "oklch(0.62 0.19 12)"
64
+ },
65
+ /** Amber. */
66
+ amber: {
67
+ accent: "oklch(0.62 0.14 65)",
68
+ "color-accent-700": "oklch(0.54 0.13 65)",
69
+ "color-accent-800": "oklch(0.46 0.12 65)",
70
+ "accent-subtle": "oklch(0.95 0.05 75)",
71
+ "accent-subtle-foreground": "oklch(0.48 0.12 65)",
72
+ ring: "oklch(0.66 0.14 65)"
73
+ }
74
+ };
75
+ export {
76
+ P as DesignSystemProvider,
77
+ j as brandPresets
78
+ };
79
+ //# sourceMappingURL=DesignSystemProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesignSystemProvider.js","sources":["../../../src/components/ui/DesignSystemProvider.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\nimport { StringsContext, useStrings } from '@/hooks/use-strings';\nimport { mergeStrings, type DeepPartial, type UiStrings } from '@/lib/strings';\n\n/**\n * Per-brand token overrides. Keys are CSS variable names (without the `--`\n * prefix); values are CSS values. Any unspecified token falls back to the\n * design system default.\n *\n * @example\n * <DesignSystemProvider tokens={{ accent: '#ff5555', 'radius-md': '10px' }}>\n * <App />\n * </DesignSystemProvider>\n *\n * @example Swap in one of the built-in accent presets\n * <DesignSystemProvider tokens={brandPresets.violet}>\n * <Card>...</Card>\n * </DesignSystemProvider>\n */\nexport type BrandTokens = Record<string, string>;\n\nexport interface DesignSystemProviderProps extends HTMLAttributes<HTMLDivElement> {\n /** Token overrides (CSS variable name → value). */\n tokens?: BrandTokens;\n /**\n * Override any of the library's built-in UI strings (aria-labels,\n * placeholders, empty states). Partial — merged over the parent provider /\n * English defaults. Pass `mnStrings` for Mongolian.\n */\n strings?: DeepPartial<UiStrings>;\n /** Children to scope this brand to. */\n children: ReactNode;\n}\n\nexport function DesignSystemProvider({\n tokens,\n strings,\n className,\n children,\n style,\n ...props\n}: DesignSystemProviderProps) {\n // Build the inline style from tokens — wrapping every key with `--` so\n // consumers can pass either `accent` or `color-accent` without remembering\n // the prefix dance.\n const parentStrings = useStrings();\n const resolvedStrings = useMemo(\n () => mergeStrings(parentStrings, strings),\n [parentStrings, strings],\n );\n const css: CSSProperties = { ...style };\n if (tokens) {\n for (const [k, v] of Object.entries(tokens)) {\n const key = k.startsWith('--') ? k : `--${k}`;\n (css as Record<string, string>)[key] = v;\n }\n }\n\n return (\n <StringsContext.Provider value={resolvedStrings}>\n <div data-brand-scope className={cn('contents', className)} style={css} {...props}>\n {children}\n </div>\n </StringsContext.Provider>\n );\n}\n\n/**\n * Built-in accent presets — swap the system's single accent colour without\n * touching anything else.\n *\n * These override the *semantic* tokens the utilities resolve to. globals.css\n * maps the accent utilities with `@theme inline` (e.g. `bg-accent` →\n * `var(--accent)`, `bg-accent-soft` → `var(--accent-subtle)`), so the override\n * must target `--accent` / `--accent-subtle` / `--accent-subtle-foreground` /\n * `--ring` — NOT `--color-accent` (which `inline` never emits). The hover/\n * active steps (`--color-accent-700/800`) come from the raw palette and are\n * overridden directly. `default` is the built-in graphite-indigo.\n */\nexport const brandPresets = {\n /** The library default — graphite indigo. */\n default: {} as BrandTokens,\n /** Blue. */\n blue: {\n accent: 'oklch(0.55 0.16 250)',\n 'color-accent-700': 'oklch(0.47 0.16 250)',\n 'color-accent-800': 'oklch(0.39 0.14 250)',\n 'accent-subtle': 'oklch(0.95 0.04 250)',\n 'accent-subtle-foreground': 'oklch(0.45 0.15 250)',\n ring: 'oklch(0.62 0.16 250)',\n },\n /** Violet. */\n violet: {\n accent: 'oklch(0.53 0.20 295)',\n 'color-accent-700': 'oklch(0.45 0.18 295)',\n 'color-accent-800': 'oklch(0.38 0.16 295)',\n 'accent-subtle': 'oklch(0.95 0.04 295)',\n 'accent-subtle-foreground': 'oklch(0.45 0.18 295)',\n ring: 'oklch(0.60 0.20 295)',\n },\n /** Emerald. */\n emerald: {\n accent: 'oklch(0.55 0.13 160)',\n 'color-accent-700': 'oklch(0.47 0.13 160)',\n 'color-accent-800': 'oklch(0.39 0.12 160)',\n 'accent-subtle': 'oklch(0.95 0.04 160)',\n 'accent-subtle-foreground': 'oklch(0.42 0.12 160)',\n ring: 'oklch(0.60 0.13 160)',\n },\n /** Rose. */\n rose: {\n accent: 'oklch(0.57 0.19 12)',\n 'color-accent-700': 'oklch(0.49 0.18 12)',\n 'color-accent-800': 'oklch(0.41 0.16 12)',\n 'accent-subtle': 'oklch(0.95 0.035 12)',\n 'accent-subtle-foreground': 'oklch(0.48 0.18 12)',\n ring: 'oklch(0.62 0.19 12)',\n },\n /** Amber. */\n amber: {\n accent: 'oklch(0.62 0.14 65)',\n 'color-accent-700': 'oklch(0.54 0.13 65)',\n 'color-accent-800': 'oklch(0.46 0.12 65)',\n 'accent-subtle': 'oklch(0.95 0.05 75)',\n 'accent-subtle-foreground': 'oklch(0.48 0.12 65)',\n ring: 'oklch(0.66 0.14 65)',\n },\n} as const;\n\nexport type BrandName = keyof typeof brandPresets;\n"],"names":["DesignSystemProvider","tokens","strings","className","children","style","props","parentStrings","useStrings","resolvedStrings","useMemo","mergeStrings","css","k","v","key","jsx","StringsContext","cn","brandPresets"],"mappings":";;;;;;AAqCO,SAASA,EAAqB;AAAA,EACnC,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GAA8B;AAI5B,QAAMC,IAAgBC,EAAA,GAChBC,IAAkBC;AAAA,IACtB,MAAMC,EAAaJ,GAAeL,CAAO;AAAA,IACzC,CAACK,GAAeL,CAAO;AAAA,EAAA,GAEnBU,IAAqB,EAAE,GAAGP,EAAA;AAChC,MAAIJ;AACF,eAAW,CAACY,GAAGC,CAAC,KAAK,OAAO,QAAQb,CAAM,GAAG;AAC3C,YAAMc,IAAMF,EAAE,WAAW,IAAI,IAAIA,IAAI,KAAKA,CAAC;AAC1C,MAAAD,EAA+BG,CAAG,IAAID;AAAA,IACzC;AAGF,SACE,gBAAAE,EAACC,EAAe,UAAf,EAAwB,OAAOR,GAC9B,UAAA,gBAAAO,EAAC,SAAI,oBAAgB,IAAC,WAAWE,EAAG,YAAYf,CAAS,GAAG,OAAOS,GAAM,GAAGN,GACzE,UAAAF,GACH,GACF;AAEJ;AAcO,MAAMe,IAAe;AAAA;AAAA,EAE1B,SAAS,CAAA;AAAA;AAAA,EAET,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,MAAM;AAAA,EAAA;AAAA;AAAA,EAGR,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,MAAM;AAAA,EAAA;AAAA;AAAA,EAGR,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,MAAM;AAAA,EAAA;AAAA;AAAA,EAGR,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,MAAM;AAAA,EAAA;AAAA;AAAA,EAGR,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,MAAM;AAAA,EAAA;AAEV;"}
@@ -1,5 +1,5 @@
1
1
  import { ComponentPropsWithoutRef, HTMLAttributes, ReactNode } from 'react';
2
- import { ButtonProps } from './Button';
2
+ import { ButtonProps } from './Button.js';
3
3
  import * as DialogPrimitive from '@radix-ui/react-dialog';
4
4
  export declare const Dialog: import('react').FC<DialogPrimitive.DialogProps>;
5
5
  export declare const DialogTrigger: import('react').ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & import('react').RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,140 @@
1
+ "use client";
2
+ import { jsx as e, jsxs as s } from "react/jsx-runtime";
3
+ import { forwardRef as d } from "react";
4
+ import * as r from "@radix-ui/react-dialog";
5
+ import { X as C } from "../../icons/index.js";
6
+ import { cn as n } from "../../lib/utils.js";
7
+ import { useStrings as p } from "../../hooks/use-strings.js";
8
+ import { Button as u } from "./Button.js";
9
+ const w = r.Root, B = r.Trigger, z = r.Portal, T = r.Close, D = d(function({ className: o, ...i }, t) {
10
+ return /* @__PURE__ */ e(
11
+ r.Overlay,
12
+ {
13
+ ref: t,
14
+ className: n(
15
+ "fixed inset-0 z-[var(--z-overlay)] bg-overlay",
16
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
17
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
18
+ o
19
+ ),
20
+ ...i
21
+ }
22
+ );
23
+ });
24
+ D.displayName = "DialogOverlay";
25
+ const x = d(function({ className: o, children: i, showClose: t = !0, size: l = "md", ...c }, m) {
26
+ const g = p();
27
+ return /* @__PURE__ */ s(z, { children: [
28
+ /* @__PURE__ */ e(D, {}),
29
+ /* @__PURE__ */ s(
30
+ r.Content,
31
+ {
32
+ ref: m,
33
+ className: n(
34
+ "fixed left-1/2 top-1/2 z-[var(--z-modal)] -translate-x-1/2 -translate-y-1/2",
35
+ "w-[calc(100%-2rem)] rounded-lg border border-border bg-card text-card-foreground shadow-lg",
36
+ "p-6",
37
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
38
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
39
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
40
+ l === "sm" && "max-w-[400px]",
41
+ l === "md" && "max-w-[520px]",
42
+ l === "lg" && "max-w-[720px]",
43
+ o
44
+ ),
45
+ ...c,
46
+ children: [
47
+ i,
48
+ t && /* @__PURE__ */ e(
49
+ r.Close,
50
+ {
51
+ "aria-label": g.dialog.close,
52
+ className: n(
53
+ "absolute right-4 top-4 inline-flex size-8 items-center justify-center rounded-md text-foreground-subtle",
54
+ "hover:bg-background-muted hover:text-foreground",
55
+ "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card",
56
+ "transition-colors duration-[var(--duration-fast)]"
57
+ ),
58
+ children: /* @__PURE__ */ e(C, { className: "size-4", "aria-hidden": !0 })
59
+ }
60
+ )
61
+ ]
62
+ }
63
+ )
64
+ ] });
65
+ });
66
+ x.displayName = "DialogContent";
67
+ function v({ className: a, ...o }) {
68
+ return /* @__PURE__ */ e("div", { className: n("flex flex-col gap-1 pb-4", a), ...o });
69
+ }
70
+ v.displayName = "DialogHeader";
71
+ function h({ className: a, ...o }) {
72
+ return /* @__PURE__ */ e(
73
+ "div",
74
+ {
75
+ className: n("flex flex-col-reverse gap-2 pt-6 sm:flex-row sm:justify-end", a),
76
+ ...o
77
+ }
78
+ );
79
+ }
80
+ h.displayName = "DialogFooter";
81
+ const y = d(function({ className: o, ...i }, t) {
82
+ return /* @__PURE__ */ e(
83
+ r.Title,
84
+ {
85
+ ref: t,
86
+ className: n("text-lg font-semibold text-foreground leading-tight", o),
87
+ ...i
88
+ }
89
+ );
90
+ });
91
+ y.displayName = "DialogTitle";
92
+ const b = d(function({ className: o, ...i }, t) {
93
+ return /* @__PURE__ */ e(
94
+ r.Description,
95
+ {
96
+ ref: t,
97
+ className: n("text-sm text-foreground-muted", o),
98
+ ...i
99
+ }
100
+ );
101
+ });
102
+ b.displayName = "DialogDescription";
103
+ function j({
104
+ open: a,
105
+ onOpenChange: o,
106
+ title: i,
107
+ description: t,
108
+ confirmLabel: l,
109
+ cancelLabel: c,
110
+ confirmVariant: m = "primary",
111
+ onConfirm: g,
112
+ loading: N
113
+ }) {
114
+ const f = p();
115
+ return /* @__PURE__ */ e(w, { open: a, onOpenChange: o, children: /* @__PURE__ */ s(x, { size: "sm", children: [
116
+ /* @__PURE__ */ s(v, { children: [
117
+ /* @__PURE__ */ e(y, { children: i }),
118
+ t && /* @__PURE__ */ e(b, { children: t })
119
+ ] }),
120
+ /* @__PURE__ */ s(h, { children: [
121
+ /* @__PURE__ */ e(T, { asChild: !0, children: /* @__PURE__ */ e(u, { variant: "outline", children: c ?? f.confirmationDialog.cancel }) }),
122
+ /* @__PURE__ */ e(u, { variant: m, loading: N, onClick: g, children: l ?? f.confirmationDialog.confirm })
123
+ ] })
124
+ ] }) });
125
+ }
126
+ j.displayName = "ConfirmationDialog";
127
+ export {
128
+ j as ConfirmationDialog,
129
+ w as Dialog,
130
+ T as DialogClose,
131
+ x as DialogContent,
132
+ b as DialogDescription,
133
+ h as DialogFooter,
134
+ v as DialogHeader,
135
+ D as DialogOverlay,
136
+ z as DialogPortal,
137
+ y as DialogTitle,
138
+ B as DialogTrigger
139
+ };
140
+ //# sourceMappingURL=Dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.js","sources":["../../../src/components/ui/Dialog.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { Button, type ButtonProps } from './Button';\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogPortal = DialogPrimitive.Portal;\nexport const DialogClose = DialogPrimitive.Close;\n\nexport const DialogOverlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(function DialogOverlay({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-[var(--z-overlay)] bg-overlay',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n );\n});\nDialogOverlay.displayName = 'DialogOverlay';\n\nexport interface DialogContentProps\n extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** Show the default close (×) button in the top-right. */\n showClose?: boolean;\n /** Dialog width — `sm` 400 / `md` 520 / `lg` 720. */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const DialogContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(function DialogContent({ className, children, showClose = true, size = 'md', ...props }, ref) {\n const strings = useStrings();\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-[var(--z-modal)] -translate-x-1/2 -translate-y-1/2',\n 'w-[calc(100%-2rem)] rounded-lg border border-border bg-card text-card-foreground shadow-lg',\n 'p-6',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n size === 'sm' && 'max-w-[400px]',\n size === 'md' && 'max-w-[520px]',\n size === 'lg' && 'max-w-[720px]',\n className,\n )}\n {...props}\n >\n {children}\n {showClose && (\n <DialogPrimitive.Close\n aria-label={strings.dialog.close}\n className={cn(\n 'absolute right-4 top-4 inline-flex size-8 items-center justify-center rounded-md text-foreground-subtle',\n 'hover:bg-background-muted hover:text-foreground',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card',\n 'transition-colors duration-[var(--duration-fast)]',\n )}\n >\n <X className=\"size-4\" aria-hidden />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n});\nDialogContent.displayName = 'DialogContent';\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col gap-1 pb-4', className)} {...props} />;\n}\nDialogHeader.displayName = 'DialogHeader';\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col-reverse gap-2 pt-6 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nexport const DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold text-foreground leading-tight', className)}\n {...props}\n />\n );\n});\nDialogTitle.displayName = 'DialogTitle';\n\nexport const DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(function DialogDescription({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-foreground-muted', className)}\n {...props}\n />\n );\n});\nDialogDescription.displayName = 'DialogDescription';\n\n/* -----------------------------------------------------------------------------\n * ConfirmationDialog — pre-composed pattern for destructive/important\n * confirmations. Use this when the body is a single sentence and the only\n * controls are Cancel + Confirm.\n * --------------------------------------------------------------------------- */\n\nexport interface ConfirmationDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description?: ReactNode;\n /** Label of the confirm button. */\n confirmLabel?: string;\n /** Label of the cancel button. */\n cancelLabel?: string;\n /** Variant of the confirm button — typically `primary` or `destructive`. */\n confirmVariant?: ButtonProps['variant'];\n /** Called when the user confirms. Awaited — shows a spinner while pending. */\n onConfirm: () => void | Promise<void>;\n /** Whether the confirm button is currently submitting. */\n loading?: boolean;\n}\n\n/**\n * Confirmation dialog with title, description, cancel + confirm buttons.\n *\n * @example Destructive confirmation\n * <ConfirmationDialog\n * open={open} onOpenChange={setOpen}\n * title=\"Delete project?\"\n * description=\"This permanently deletes the project and all its data.\"\n * confirmLabel=\"Delete project\"\n * confirmVariant=\"destructive\"\n * onConfirm={handleDelete}\n * />\n *\n * @do Lead the title with the action: \"Delete project?\" not \"Are you sure?\".\n * State consequences in the description.\n * @dont Use for low-risk reversible actions — those don't need a dialog.\n */\nexport function ConfirmationDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel,\n cancelLabel,\n confirmVariant = 'primary',\n onConfirm,\n loading,\n}: ConfirmationDialogProps) {\n const strings = useStrings();\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent size=\"sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">{cancelLabel ?? strings.confirmationDialog.cancel}</Button>\n </DialogClose>\n <Button variant={confirmVariant} loading={loading} onClick={onConfirm}>\n {confirmLabel ?? strings.confirmationDialog.confirm}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\nConfirmationDialog.displayName = 'ConfirmationDialog';\n"],"names":["Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","forwardRef","className","props","ref","jsx","cn","DialogContent","children","showClose","size","strings","useStrings","jsxs","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","ConfirmationDialog","open","onOpenChange","title","description","confirmLabel","cancelLabel","confirmVariant","onConfirm","loading","Button"],"mappings":"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"}
@@ -17,7 +17,13 @@ export interface DrawerContentProps extends ComponentPropsWithoutRef<typeof Draw
17
17
  }
18
18
  export declare const DrawerContent: import('react').ForwardRefExoticComponent<DrawerContentProps & import('react').RefAttributes<HTMLDivElement>>;
19
19
  export declare function DrawerHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
20
+ export declare namespace DrawerHeader {
21
+ var displayName: string;
22
+ }
20
23
  export declare function DrawerFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
24
+ export declare namespace DrawerFooter {
25
+ var displayName: string;
26
+ }
21
27
  export declare const DrawerTitle: import('react').ForwardRefExoticComponent<Omit<import('@radix-ui/react-dialog').DialogTitleProps & import('react').RefAttributes<HTMLHeadingElement>, "ref"> & import('react').RefAttributes<HTMLHeadingElement>>;
22
28
  export declare const DrawerDescription: import('react').ForwardRefExoticComponent<Omit<import('@radix-ui/react-dialog').DialogDescriptionProps & import('react').RefAttributes<HTMLParagraphElement>, "ref"> & import('react').RefAttributes<HTMLParagraphElement>>;
23
29
  export {};
@@ -0,0 +1,98 @@
1
+ "use client";
2
+ import { jsx as o, jsxs as i } from "react/jsx-runtime";
3
+ import { forwardRef as s } from "react";
4
+ import { Drawer as a } from "vaul";
5
+ import { cn as n } from "../../lib/utils.js";
6
+ const u = ({
7
+ shouldScaleBackground: t = !0,
8
+ ...r
9
+ }) => /* @__PURE__ */ o(a.Root, { shouldScaleBackground: t, ...r });
10
+ u.displayName = "Drawer";
11
+ const O = a.Trigger, w = a.Portal, H = a.Close, m = s(function({ className: r, ...e }, l) {
12
+ return /* @__PURE__ */ o(
13
+ a.Overlay,
14
+ {
15
+ ref: l,
16
+ className: n("fixed inset-0 z-[var(--z-overlay)] bg-overlay", r),
17
+ ...e
18
+ }
19
+ );
20
+ });
21
+ m.displayName = "DrawerOverlay";
22
+ const b = {
23
+ bottom: "inset-x-0 bottom-0 mt-24 flex h-auto max-h-[90vh] flex-col rounded-t-xl border-t border-border",
24
+ top: "inset-x-0 top-0 mb-24 flex h-auto max-h-[90vh] flex-col rounded-b-xl border-b border-border",
25
+ left: "inset-y-0 left-0 flex h-full w-[420px] max-w-[90vw] flex-col rounded-r-xl border-r border-border",
26
+ right: "inset-y-0 right-0 flex h-full w-[420px] max-w-[90vw] flex-col rounded-l-xl border-l border-border"
27
+ }, D = {
28
+ bottom: "mx-auto mt-3 h-1.5 w-12 rounded-full bg-border",
29
+ top: "mx-auto mb-3 h-1.5 w-12 rounded-full bg-border order-last",
30
+ left: "mx-1.5 my-auto h-12 w-1.5 rounded-full bg-border order-last self-stretch shrink-0",
31
+ right: "mx-1.5 my-auto h-12 w-1.5 rounded-full bg-border shrink-0 self-stretch"
32
+ }, h = s(function({ className: r, direction: e = "bottom", hideHandle: l, children: f, ...c }, x) {
33
+ const d = e === "left" || e === "right";
34
+ return /* @__PURE__ */ i(w, { children: [
35
+ /* @__PURE__ */ o(m, {}),
36
+ /* @__PURE__ */ i(
37
+ a.Content,
38
+ {
39
+ ref: x,
40
+ className: n(
41
+ "bg-card fixed z-[var(--z-modal)]",
42
+ b[e],
43
+ d && "flex-row",
44
+ r
45
+ ),
46
+ ...c,
47
+ children: [
48
+ !l && /* @__PURE__ */ o("div", { "aria-hidden": !0, className: D[e] }),
49
+ /* @__PURE__ */ o("div", { className: n("min-h-0 min-w-0 flex-1", d && "flex flex-col"), children: f })
50
+ ]
51
+ }
52
+ )
53
+ ] });
54
+ });
55
+ h.displayName = "DrawerContent";
56
+ function p({ className: t, ...r }) {
57
+ return /* @__PURE__ */ o("div", { className: n("grid gap-1 p-4 text-center sm:text-left", t), ...r });
58
+ }
59
+ p.displayName = "DrawerHeader";
60
+ function g({ className: t, ...r }) {
61
+ return /* @__PURE__ */ o("div", { className: n("mt-auto flex flex-col gap-2 p-4", t), ...r });
62
+ }
63
+ g.displayName = "DrawerFooter";
64
+ const y = s(function({ className: r, ...e }, l) {
65
+ return /* @__PURE__ */ o(
66
+ a.Title,
67
+ {
68
+ ref: l,
69
+ className: n("text-lg font-semibold", r),
70
+ ...e
71
+ }
72
+ );
73
+ });
74
+ y.displayName = "DrawerTitle";
75
+ const v = s(function({ className: r, ...e }, l) {
76
+ return /* @__PURE__ */ o(
77
+ a.Description,
78
+ {
79
+ ref: l,
80
+ className: n("text-foreground-muted text-sm", r),
81
+ ...e
82
+ }
83
+ );
84
+ });
85
+ v.displayName = "DrawerDescription";
86
+ export {
87
+ u as Drawer,
88
+ H as DrawerClose,
89
+ h as DrawerContent,
90
+ v as DrawerDescription,
91
+ g as DrawerFooter,
92
+ p as DrawerHeader,
93
+ m as DrawerOverlay,
94
+ w as DrawerPortal,
95
+ y as DrawerTitle,
96
+ O as DrawerTrigger
97
+ };
98
+ //# sourceMappingURL=Drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.js","sources":["../../../src/components/ui/Drawer.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n} from 'react';\nimport { Drawer as DrawerPrimitive } from 'vaul';\nimport { cn } from '@/lib/utils';\n\ntype Direction = 'top' | 'right' | 'bottom' | 'left';\n\nexport const Drawer = ({\n shouldScaleBackground = true,\n ...props\n}: ComponentPropsWithoutRef<typeof DrawerPrimitive.Root>) => (\n <DrawerPrimitive.Root shouldScaleBackground={shouldScaleBackground} {...props} />\n);\nDrawer.displayName = 'Drawer';\n\nexport const DrawerTrigger = DrawerPrimitive.Trigger;\nexport const DrawerPortal = DrawerPrimitive.Portal;\nexport const DrawerClose = DrawerPrimitive.Close;\n\nexport const DrawerOverlay = forwardRef<\n ElementRef<typeof DrawerPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>\n>(function DrawerOverlay({ className, ...props }, ref) {\n return (\n <DrawerPrimitive.Overlay\n ref={ref}\n className={cn('fixed inset-0 z-[var(--z-overlay)] bg-overlay', className)}\n {...props}\n />\n );\n});\nDrawerOverlay.displayName = 'DrawerOverlay';\n\nconst directionStyles: Record<Direction, string> = {\n bottom:\n 'inset-x-0 bottom-0 mt-24 flex h-auto max-h-[90vh] flex-col rounded-t-xl border-t border-border',\n top: 'inset-x-0 top-0 mb-24 flex h-auto max-h-[90vh] flex-col rounded-b-xl border-b border-border',\n left: 'inset-y-0 left-0 flex h-full w-[420px] max-w-[90vw] flex-col rounded-r-xl border-r border-border',\n right:\n 'inset-y-0 right-0 flex h-full w-[420px] max-w-[90vw] flex-col rounded-l-xl border-l border-border',\n};\n\nconst handleStyles: Record<Direction, string> = {\n bottom: 'mx-auto mt-3 h-1.5 w-12 rounded-full bg-border',\n top: 'mx-auto mb-3 h-1.5 w-12 rounded-full bg-border order-last',\n left: 'mx-1.5 my-auto h-12 w-1.5 rounded-full bg-border order-last self-stretch shrink-0',\n right: 'mx-1.5 my-auto h-12 w-1.5 rounded-full bg-border shrink-0 self-stretch',\n};\n\nexport interface DrawerContentProps extends ComponentPropsWithoutRef<\n typeof DrawerPrimitive.Content\n> {\n /** Side the drawer slides in from. Default `bottom`. */\n direction?: Direction;\n /** Hide the drag handle. */\n hideHandle?: boolean;\n}\n\nexport const DrawerContent = forwardRef<\n ElementRef<typeof DrawerPrimitive.Content>,\n DrawerContentProps\n>(function DrawerContent({ className, direction = 'bottom', hideHandle, children, ...props }, ref) {\n const isHorizontal = direction === 'left' || direction === 'right';\n return (\n <DrawerPortal>\n <DrawerOverlay />\n <DrawerPrimitive.Content\n ref={ref}\n className={cn(\n 'bg-card fixed z-[var(--z-modal)]',\n directionStyles[direction],\n isHorizontal && 'flex-row',\n className,\n )}\n {...props}\n >\n {!hideHandle && <div aria-hidden className={handleStyles[direction]} />}\n <div className={cn('min-h-0 min-w-0 flex-1', isHorizontal && 'flex flex-col')}>\n {children}\n </div>\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n});\nDrawerContent.displayName = 'DrawerContent';\n\nexport function DrawerHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('grid gap-1 p-4 text-center sm:text-left', className)} {...props} />;\n}\nDrawerHeader.displayName = 'DrawerHeader';\n\nexport function DrawerFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />;\n}\nDrawerFooter.displayName = 'DrawerFooter';\n\nexport const DrawerTitle = forwardRef<\n ElementRef<typeof DrawerPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>\n>(function DrawerTitle({ className, ...props }, ref) {\n return (\n <DrawerPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold', className)}\n {...props}\n />\n );\n});\nDrawerTitle.displayName = 'DrawerTitle';\n\nexport const DrawerDescription = forwardRef<\n ElementRef<typeof DrawerPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>\n>(function DrawerDescription({ className, ...props }, ref) {\n return (\n <DrawerPrimitive.Description\n ref={ref}\n className={cn('text-foreground-muted text-sm', className)}\n {...props}\n />\n );\n});\nDrawerDescription.displayName = 'DrawerDescription';\n"],"names":["Drawer","shouldScaleBackground","props","DrawerPrimitive","DrawerTrigger","DrawerPortal","DrawerClose","DrawerOverlay","forwardRef","className","ref","jsx","cn","directionStyles","handleStyles","DrawerContent","direction","hideHandle","children","isHorizontal","jsxs","DrawerHeader","DrawerFooter","DrawerTitle","DrawerDescription"],"mappings":";;;;;AAaO,MAAMA,IAAS,CAAC;AAAA,EACrB,uBAAAC,IAAwB;AAAA,EACxB,GAAGC;AACL,wBACGC,EAAgB,MAAhB,EAAqB,uBAAAF,GAA+C,GAAGC,EAAA,CAAO;AAEjFF,EAAO,cAAc;AAEd,MAAMI,IAAgBD,EAAgB,SAChCE,IAAeF,EAAgB,QAC/BG,IAAcH,EAAgB,OAE9BI,IAAgBC,EAG3B,SAAuB,EAAE,WAAAC,GAAW,GAAGP,EAAA,GAASQ,GAAK;AACrD,SACE,gBAAAC;AAAA,IAACR,EAAgB;AAAA,IAAhB;AAAA,MACC,KAAAO;AAAA,MACA,WAAWE,EAAG,iDAAiDH,CAAS;AAAA,MACvE,GAAGP;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDK,EAAc,cAAc;AAE5B,MAAMM,IAA6C;AAAA,EACjD,QACE;AAAA,EACF,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OACE;AACJ,GAEMC,IAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT,GAWaC,IAAgBP,EAG3B,SAAuB,EAAE,WAAAC,GAAW,WAAAO,IAAY,UAAU,YAAAC,GAAY,UAAAC,GAAU,GAAGhB,EAAA,GAASQ,GAAK;AACjG,QAAMS,IAAeH,MAAc,UAAUA,MAAc;AAC3D,2BACGX,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAM,EAACJ,GAAA,EAAc;AAAA,IACf,gBAAAa;AAAA,MAACjB,EAAgB;AAAA,MAAhB;AAAA,QACC,KAAAO;AAAA,QACA,WAAWE;AAAA,UACT;AAAA,UACAC,EAAgBG,CAAS;AAAA,UACzBG,KAAgB;AAAA,UAChBV;AAAA,QAAA;AAAA,QAED,GAAGP;AAAA,QAEH,UAAA;AAAA,UAAA,CAACe,uBAAe,OAAA,EAAI,eAAW,IAAC,WAAWH,EAAaE,CAAS,GAAG;AAAA,UACrE,gBAAAL,EAAC,SAAI,WAAWC,EAAG,0BAA0BO,KAAgB,eAAe,GACzE,UAAAD,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ,CAAC;AACDH,EAAc,cAAc;AAErB,SAASM,EAAa,EAAE,WAAAZ,GAAW,GAAGP,KAAyC;AACpF,SAAO,gBAAAS,EAAC,SAAI,WAAWC,EAAG,2CAA2CH,CAAS,GAAI,GAAGP,GAAO;AAC9F;AACAmB,EAAa,cAAc;AAEpB,SAASC,EAAa,EAAE,WAAAb,GAAW,GAAGP,KAAyC;AACpF,SAAO,gBAAAS,EAAC,SAAI,WAAWC,EAAG,mCAAmCH,CAAS,GAAI,GAAGP,GAAO;AACtF;AACAoB,EAAa,cAAc;AAEpB,MAAMC,IAAcf,EAGzB,SAAqB,EAAE,WAAAC,GAAW,GAAGP,EAAA,GAASQ,GAAK;AACnD,SACE,gBAAAC;AAAA,IAACR,EAAgB;AAAA,IAAhB;AAAA,MACC,KAAAO;AAAA,MACA,WAAWE,EAAG,yBAAyBH,CAAS;AAAA,MAC/C,GAAGP;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDqB,EAAY,cAAc;AAEnB,MAAMC,IAAoBhB,EAG/B,SAA2B,EAAE,WAAAC,GAAW,GAAGP,EAAA,GAASQ,GAAK;AACzD,SACE,gBAAAC;AAAA,IAACR,EAAgB;AAAA,IAAhB;AAAA,MACC,KAAAO;AAAA,MACA,WAAWE,EAAG,iCAAiCH,CAAS;AAAA,MACvD,GAAGP;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDsB,EAAkB,cAAc;"}