@spacesync/client 0.1.10 → 0.1.12

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 (140) hide show
  1. package/README.md +105 -13
  2. package/dist/analog-clock-picker.js +3 -11
  3. package/dist/analog-clock-picker.js.map +1 -1
  4. package/dist/booking-schedule-calendars.js +82 -19
  5. package/dist/booking-schedule-calendars.js.map +1 -1
  6. package/dist/booking-schedule.js +1 -1
  7. package/dist/booking-space-layout-picker.d.ts +1 -1
  8. package/dist/booking-space-layout-picker.js +8 -11
  9. package/dist/booking-space-layout-picker.js.map +1 -1
  10. package/dist/button-Iem7kbk0.d.ts +16 -0
  11. package/dist/chat-stick-to-bottom.js +0 -10
  12. package/dist/chat-stick-to-bottom.js.map +1 -1
  13. package/dist/chunk-2IZODKTR.js +116 -0
  14. package/dist/chunk-2IZODKTR.js.map +1 -0
  15. package/dist/chunk-2TT2ZGMT.js +21 -0
  16. package/dist/chunk-2TT2ZGMT.js.map +1 -0
  17. package/dist/chunk-3MAGTCCN.js +192 -0
  18. package/dist/chunk-3MAGTCCN.js.map +1 -0
  19. package/dist/chunk-56H7UFAW.js +237 -0
  20. package/dist/chunk-56H7UFAW.js.map +1 -0
  21. package/dist/{chunk-OTSA5ROL.js → chunk-5CUJZNUC.js} +16 -5
  22. package/dist/chunk-5CUJZNUC.js.map +1 -0
  23. package/dist/chunk-5HOK5JHR.js +60 -0
  24. package/dist/chunk-5HOK5JHR.js.map +1 -0
  25. package/dist/chunk-6VJQIBC3.js +715 -0
  26. package/dist/chunk-6VJQIBC3.js.map +1 -0
  27. package/dist/{chunk-H7EX6B6N.js → chunk-AHFRK6KP.js} +25 -7
  28. package/dist/chunk-AHFRK6KP.js.map +1 -0
  29. package/dist/chunk-BQVMO33N.js +133 -0
  30. package/dist/chunk-BQVMO33N.js.map +1 -0
  31. package/dist/chunk-CXXOKCLJ.js +37 -0
  32. package/dist/chunk-CXXOKCLJ.js.map +1 -0
  33. package/dist/chunk-EQLKSX4E.js +241 -0
  34. package/dist/chunk-EQLKSX4E.js.map +1 -0
  35. package/dist/chunk-FN4BWFDX.js +43 -0
  36. package/dist/chunk-FN4BWFDX.js.map +1 -0
  37. package/dist/chunk-HRHDOLWU.js +62 -0
  38. package/dist/chunk-HRHDOLWU.js.map +1 -0
  39. package/dist/chunk-HZB2EHEH.js +216 -0
  40. package/dist/chunk-HZB2EHEH.js.map +1 -0
  41. package/dist/chunk-IBGGQXTH.js +21 -0
  42. package/dist/chunk-IBGGQXTH.js.map +1 -0
  43. package/dist/chunk-JCEOU7BU.js +128 -0
  44. package/dist/chunk-JCEOU7BU.js.map +1 -0
  45. package/dist/{chunk-CKCXQBHQ.js → chunk-KXTYPZDK.js} +91 -19
  46. package/dist/chunk-KXTYPZDK.js.map +1 -0
  47. package/dist/{chunk-RV5PMZYZ.js → chunk-MBZAYH5D.js} +4 -18
  48. package/dist/chunk-MBZAYH5D.js.map +1 -0
  49. package/dist/chunk-NWVNYKND.js +153 -0
  50. package/dist/chunk-NWVNYKND.js.map +1 -0
  51. package/dist/chunk-PPMJZVR4.js +37 -0
  52. package/dist/chunk-PPMJZVR4.js.map +1 -0
  53. package/dist/chunk-SHMKDGFF.js +75 -0
  54. package/dist/chunk-SHMKDGFF.js.map +1 -0
  55. package/dist/chunk-T3SOBIYA.js +61 -0
  56. package/dist/chunk-T3SOBIYA.js.map +1 -0
  57. package/dist/chunk-TH5RASJS.js +97 -0
  58. package/dist/chunk-TH5RASJS.js.map +1 -0
  59. package/dist/{chunk-LUB7QWGU.js → chunk-VIJ2HWPZ.js} +5 -159
  60. package/dist/chunk-VIJ2HWPZ.js.map +1 -0
  61. package/dist/chunk-VQ63T7CJ.js +22 -0
  62. package/dist/chunk-VQ63T7CJ.js.map +1 -0
  63. package/dist/chunk-XDVGFHK4.js +50 -0
  64. package/dist/chunk-XDVGFHK4.js.map +1 -0
  65. package/dist/chunk-XI4BQY5T.js +188 -0
  66. package/dist/chunk-XI4BQY5T.js.map +1 -0
  67. package/dist/chunk-ZVWUPYSV.js +170 -0
  68. package/dist/chunk-ZVWUPYSV.js.map +1 -0
  69. package/dist/detail-page-header.js +1 -1
  70. package/dist/file-viewer-dialog.js +3 -9
  71. package/dist/file-viewer-dialog.js.map +1 -1
  72. package/dist/floor-switcher.js +5 -9
  73. package/dist/floor-switcher.js.map +1 -1
  74. package/dist/{layout-canvas-view-DOjyUNJH.d.ts → layout-canvas-view-C3u96xu4.d.ts} +5 -1
  75. package/dist/layout-canvas-view.d.ts +1 -1
  76. package/dist/layout-canvas-view.js +8 -11
  77. package/dist/lib/dateDisplay.d.ts +16 -1
  78. package/dist/lib/dateDisplay.js +1 -1
  79. package/dist/notification-sidebar-preview.js +1 -1
  80. package/dist/page-list-chrome.d.ts +3 -1
  81. package/dist/page-list-chrome.js +5 -3
  82. package/dist/page-list-loading.js +5 -3
  83. package/dist/page-list-loading.js.map +1 -1
  84. package/dist/platform-support-message-composer.js +2 -10
  85. package/dist/platform-support-message-composer.js.map +1 -1
  86. package/dist/sidebar-Dzvrjr69.d.ts +85 -0
  87. package/dist/styles/theme.css +52 -2
  88. package/dist/styles/theme.css.map +1 -1
  89. package/dist/support-presence-status.js +1 -1
  90. package/dist/theme-appearance-control.js +2 -1
  91. package/dist/theme-appearance-control.js.map +1 -1
  92. package/dist/ui/accordion.d.ts +9 -0
  93. package/dist/ui/accordion.js +4 -0
  94. package/dist/ui/accordion.js.map +1 -0
  95. package/dist/ui/calendar.d.ts +6 -0
  96. package/dist/ui/calendar.js +4 -0
  97. package/dist/ui/calendar.js.map +1 -0
  98. package/dist/ui/carousel.d.ts +22 -0
  99. package/dist/ui/carousel.js +5 -0
  100. package/dist/ui/carousel.js.map +1 -0
  101. package/dist/ui/chart.d.ts +42 -0
  102. package/dist/ui/chart.js +229 -0
  103. package/dist/ui/chart.js.map +1 -0
  104. package/dist/ui/command.d.ts +19 -0
  105. package/dist/ui/command.js +5 -0
  106. package/dist/ui/command.js.map +1 -0
  107. package/dist/ui/context-menu.d.ts +27 -0
  108. package/dist/ui/context-menu.js +4 -0
  109. package/dist/ui/context-menu.js.map +1 -0
  110. package/dist/ui/form.d.ts +27 -0
  111. package/dist/ui/form.js +5 -0
  112. package/dist/ui/form.js.map +1 -0
  113. package/dist/ui/input-otp.d.ts +13 -0
  114. package/dist/ui/input-otp.js +4 -0
  115. package/dist/ui/input-otp.js.map +1 -0
  116. package/dist/ui/menubar.d.ts +28 -0
  117. package/dist/ui/menubar.js +4 -0
  118. package/dist/ui/menubar.js.map +1 -0
  119. package/dist/ui/navigation-menu.d.ts +17 -0
  120. package/dist/ui/navigation-menu.js +4 -0
  121. package/dist/ui/navigation-menu.js.map +1 -0
  122. package/dist/ui/resizable.d.ts +10 -0
  123. package/dist/ui/resizable.js +4 -0
  124. package/dist/ui/resizable.js.map +1 -0
  125. package/dist/ui/sidebar.d.ts +7 -0
  126. package/dist/ui/sidebar.js +9 -0
  127. package/dist/ui/sidebar.js.map +1 -0
  128. package/dist/ui.d.ts +36 -270
  129. package/dist/ui.js +2471 -6
  130. package/dist/ui.js.map +1 -1
  131. package/package.json +15 -5
  132. package/dist/chunk-CKCXQBHQ.js.map +0 -1
  133. package/dist/chunk-F7MU5T46.js +0 -5146
  134. package/dist/chunk-F7MU5T46.js.map +0 -1
  135. package/dist/chunk-H7EX6B6N.js.map +0 -1
  136. package/dist/chunk-LUB7QWGU.js.map +0 -1
  137. package/dist/chunk-OTSA5ROL.js.map +0 -1
  138. package/dist/chunk-PBNBLCC2.js +0 -84
  139. package/dist/chunk-PBNBLCC2.js.map +0 -1
  140. package/dist/chunk-RV5PMZYZ.js.map +0 -1
@@ -0,0 +1,241 @@
1
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-CXXOKCLJ.js';
2
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-VIJ2HWPZ.js';
3
+ import { cn } from './chunk-DMPSQ22Q.js';
4
+ import * as React from 'react';
5
+ import { Clock } from 'lucide-react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var SELECT_CONTENT_Z = "z-[200]";
9
+ var TIME_SELECT_TRIGGER_CLASS = "border-white/20 bg-card/10 text-popover-foreground hover:bg-card/15 hover:border-white/30 focus-visible:border-blue-400/70 focus-visible:ring-blue-400/30 [&_svg:not([class*='text-'])]:text-white/60";
10
+ function parseHm(value) {
11
+ const m = /^([01]\d|2[0-3]):([0-5]\d)$/.exec(value.trim());
12
+ if (!m) return void 0;
13
+ const h = Number(m[1]);
14
+ const min = Number(m[2]);
15
+ if (h > 23 || min > 59) return void 0;
16
+ return { h, m: min };
17
+ }
18
+ function toTimeStr(h, m) {
19
+ return `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")}`;
20
+ }
21
+ function currentTimeHm(now = /* @__PURE__ */ new Date()) {
22
+ return toTimeStr(now.getHours(), now.getMinutes());
23
+ }
24
+ function hmToTotal({ h, m }) {
25
+ return h * 60 + m;
26
+ }
27
+ function clampHmToMin(editor, minParsed) {
28
+ if (!minParsed) return editor;
29
+ if (hmToTotal(editor) >= hmToTotal(minParsed)) return editor;
30
+ return minParsed;
31
+ }
32
+ function hmToMinutes(value) {
33
+ const p = parseHm(value);
34
+ return p ? p.h * 60 + p.m : null;
35
+ }
36
+ function minutesToHm(total) {
37
+ if (!Number.isFinite(total) || total < 0 || total >= 24 * 60) return null;
38
+ const h = Math.floor(total / 60);
39
+ const m = total % 60;
40
+ return toTimeStr(h, m);
41
+ }
42
+ function addMinutesToHm(value, delta) {
43
+ const start = hmToMinutes(value);
44
+ if (start == null) return null;
45
+ return minutesToHm(start + delta);
46
+ }
47
+ function hourlyEndTimes(from) {
48
+ const start = hmToMinutes(from);
49
+ if (start == null) return [];
50
+ const out = [];
51
+ for (let add = 60; start + add < 24 * 60; add += 60) {
52
+ const next = minutesToHm(start + add);
53
+ if (next) out.push(next);
54
+ }
55
+ return out;
56
+ }
57
+ function snapScheduleEndTime(from, to, chargeBy) {
58
+ if (chargeBy === "hours") {
59
+ const allowed = hourlyEndTimes(from);
60
+ if (allowed.includes(to)) return to;
61
+ return allowed[0] ?? "";
62
+ }
63
+ const start = hmToMinutes(from);
64
+ const end = hmToMinutes(to);
65
+ if (start == null) return to;
66
+ if (end != null && end > start) return to;
67
+ return addMinutesToHm(from, 1) ?? "";
68
+ }
69
+ function formatTimeForDisplay(value, timeFormat) {
70
+ const p = parseHm(value);
71
+ if (!p) return value.trim() || "\u2014";
72
+ if (timeFormat === "24h") return toTimeStr(p.h, p.m);
73
+ const ap = p.h >= 12 ? "pm" : "am";
74
+ const h12 = p.h % 12 || 12;
75
+ return `${String(h12).padStart(2, "0")}:${String(p.m).padStart(2, "0")} ${ap}`;
76
+ }
77
+ function split12(h24) {
78
+ return { h12: h24 % 12 || 12, ap: h24 >= 12 ? "pm" : "am" };
79
+ }
80
+ function from12(h12, m, ap) {
81
+ if (ap === "am") {
82
+ return { h: h12 === 12 ? 0 : h12, m };
83
+ }
84
+ return { h: h12 === 12 ? 12 : h12 + 12, m };
85
+ }
86
+ var HOURS_24 = Array.from({ length: 24 }, (_, i) => String(i).padStart(2, "0"));
87
+ var MINUTES = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, "0"));
88
+ var HOURS_12 = Array.from({ length: 12 }, (_, i) => String(i + 1));
89
+ function TimeField({
90
+ value,
91
+ onChange,
92
+ disabled,
93
+ id,
94
+ placeholder = "Select time",
95
+ triggerClassName,
96
+ align = "start",
97
+ timeFormat = "24h",
98
+ minTime,
99
+ allowedTimes
100
+ }) {
101
+ const [open, setOpen] = React.useState(false);
102
+ const parsed = parseHm(value);
103
+ const minParsed = minTime ? parseHm(minTime) : void 0;
104
+ React.useEffect(() => {
105
+ if (!minParsed || !parsed) return;
106
+ if (hmToTotal(parsed) < hmToTotal(minParsed)) {
107
+ onChange(toTimeStr(minParsed.h, minParsed.m));
108
+ }
109
+ }, [value, minTime]);
110
+ const editor = clampHmToMin(parsed ?? minParsed ?? { h: (/* @__PURE__ */ new Date()).getHours(), m: (/* @__PURE__ */ new Date()).getMinutes() }, minParsed);
111
+ const label = parsed ? formatTimeForDisplay(toTimeStr(editor.h, editor.m), timeFormat) : placeholder;
112
+ const { h12, ap } = split12(editor.h);
113
+ const setFrom24 = (h, m) => {
114
+ onChange(toTimeStr(h, m));
115
+ };
116
+ const hours24 = HOURS_24.filter((h) => {
117
+ if (!minParsed) return true;
118
+ return Number(h) >= minParsed.h;
119
+ });
120
+ const minutesForHour = (h) => MINUTES.filter((mi) => {
121
+ if (!minParsed) return true;
122
+ if (h > minParsed.h) return true;
123
+ if (h < minParsed.h) return false;
124
+ return Number(mi) >= minParsed.m;
125
+ });
126
+ const minutes = minutesForHour(editor.h);
127
+ const hours12 = HOURS_12.filter((h) => {
128
+ const as24 = from12(Number(h), 0, ap).h;
129
+ if (!minParsed) return true;
130
+ return as24 >= minParsed.h;
131
+ });
132
+ return /* @__PURE__ */ jsxs(Popover, { modal: false, open, onOpenChange: setOpen, children: [
133
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
134
+ "button",
135
+ {
136
+ type: "button",
137
+ id,
138
+ disabled,
139
+ className: cn(
140
+ "flex w-full min-w-0 items-center gap-2 rounded-md border border-border bg-card px-3 h-9 text-left text-sm text-muted-foreground outline-none transition-colors hover:bg-muted/80 focus-visible:border-blue-400 focus-visible:ring-[3px] focus-visible:ring-blue-500/25 disabled:cursor-not-allowed disabled:opacity-50",
141
+ triggerClassName
142
+ ),
143
+ children: [
144
+ /* @__PURE__ */ jsx(Clock, { size: 13, className: "shrink-0 text-muted-foreground", "aria-hidden": true }),
145
+ /* @__PURE__ */ jsx("span", { className: cn("min-w-0 flex-1 truncate", !parsed && "text-muted-foreground"), children: label })
146
+ ]
147
+ }
148
+ ) }),
149
+ /* @__PURE__ */ jsx(PopoverContent, { className: "z-[100] w-auto p-3", align, children: allowedTimes ? /* @__PURE__ */ jsx("div", { className: "flex max-h-56 flex-col gap-0.5 overflow-y-auto", children: allowedTimes.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-1 py-2 text-xs text-muted-foreground", children: "No later times today" }) : allowedTimes.map((t) => /* @__PURE__ */ jsx(
150
+ "button",
151
+ {
152
+ type: "button",
153
+ onClick: () => {
154
+ onChange(t);
155
+ setOpen(false);
156
+ },
157
+ className: cn(
158
+ "rounded-md px-2.5 py-1.5 text-left text-xs tabular-nums hover:bg-accent",
159
+ t === value && "bg-blue-50 font-medium text-blue-700 dark:bg-blue-950/40 dark:text-blue-300"
160
+ ),
161
+ children: formatTimeForDisplay(t, timeFormat)
162
+ },
163
+ t
164
+ )) }) : timeFormat === "24h" ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
165
+ /* @__PURE__ */ jsxs(
166
+ Select,
167
+ {
168
+ value: String(editor.h).padStart(2, "0"),
169
+ onValueChange: (v) => setFrom24(Number(v), editor.m),
170
+ children: [
171
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className: cn("h-8 w-[4.75rem] text-xs", TIME_SELECT_TRIGGER_CLASS), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
172
+ /* @__PURE__ */ jsx(SelectContent, { position: "popper", className: SELECT_CONTENT_Z, children: hours24.map((h) => /* @__PURE__ */ jsx(SelectItem, { value: h, className: "text-xs", children: h }, h)) })
173
+ ]
174
+ }
175
+ ),
176
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-white/60", children: ":" }),
177
+ /* @__PURE__ */ jsxs(
178
+ Select,
179
+ {
180
+ value: String(editor.m).padStart(2, "0"),
181
+ onValueChange: (v) => setFrom24(editor.h, Number(v)),
182
+ children: [
183
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className: cn("h-8 w-[4.75rem] text-xs", TIME_SELECT_TRIGGER_CLASS), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
184
+ /* @__PURE__ */ jsx(SelectContent, { position: "popper", className: SELECT_CONTENT_Z, children: minutes.map((mi) => /* @__PURE__ */ jsx(SelectItem, { value: mi, className: "text-xs", children: mi }, mi)) })
185
+ ]
186
+ }
187
+ )
188
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
189
+ /* @__PURE__ */ jsxs(
190
+ Select,
191
+ {
192
+ value: String(h12),
193
+ onValueChange: (v) => {
194
+ const next = from12(Number(v), editor.m, ap);
195
+ setFrom24(next.h, next.m);
196
+ },
197
+ children: [
198
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className: cn("h-8 w-[3.75rem] text-xs", TIME_SELECT_TRIGGER_CLASS), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
199
+ /* @__PURE__ */ jsx(SelectContent, { position: "popper", className: SELECT_CONTENT_Z, children: hours12.map((h) => /* @__PURE__ */ jsx(SelectItem, { value: h, className: "text-xs", children: h }, h)) })
200
+ ]
201
+ }
202
+ ),
203
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-white/60", children: ":" }),
204
+ /* @__PURE__ */ jsxs(
205
+ Select,
206
+ {
207
+ value: String(editor.m).padStart(2, "0"),
208
+ onValueChange: (v) => {
209
+ const next = from12(h12, Number(v), ap);
210
+ setFrom24(next.h, next.m);
211
+ },
212
+ children: [
213
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className: cn("h-8 w-[4.75rem] text-xs", TIME_SELECT_TRIGGER_CLASS), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
214
+ /* @__PURE__ */ jsx(SelectContent, { position: "popper", className: SELECT_CONTENT_Z, children: minutes.map((mi) => /* @__PURE__ */ jsx(SelectItem, { value: mi, className: "text-xs", children: mi }, mi)) })
215
+ ]
216
+ }
217
+ ),
218
+ /* @__PURE__ */ jsxs(
219
+ Select,
220
+ {
221
+ value: ap,
222
+ onValueChange: (v) => {
223
+ const next = from12(h12, editor.m, v);
224
+ setFrom24(next.h, next.m);
225
+ },
226
+ children: [
227
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className: cn("h-8 w-[4.25rem] text-xs", TIME_SELECT_TRIGGER_CLASS), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
228
+ /* @__PURE__ */ jsxs(SelectContent, { position: "popper", className: SELECT_CONTENT_Z, children: [
229
+ /* @__PURE__ */ jsx(SelectItem, { value: "am", className: "text-xs", children: "am" }),
230
+ /* @__PURE__ */ jsx(SelectItem, { value: "pm", className: "text-xs", children: "pm" })
231
+ ] })
232
+ ]
233
+ }
234
+ )
235
+ ] }) })
236
+ ] });
237
+ }
238
+
239
+ export { TimeField, addMinutesToHm, currentTimeHm, formatTimeForDisplay, hmToMinutes, hourlyEndTimes, minutesToHm, parseHm, snapScheduleEndTime, toTimeStr };
240
+ //# sourceMappingURL=chunk-EQLKSX4E.js.map
241
+ //# sourceMappingURL=chunk-EQLKSX4E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/time-field.tsx"],"names":[],"mappings":"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","file":"chunk-EQLKSX4E.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select\";\nimport { cn } from \"./utils\";\n\nconst SELECT_CONTENT_Z = \"z-[200]\";\n\nconst TIME_SELECT_TRIGGER_CLASS =\n \"border-white/20 bg-card/10 text-popover-foreground hover:bg-card/15 hover:border-white/30 focus-visible:border-blue-400/70 focus-visible:ring-blue-400/30 [&_svg:not([class*='text-'])]:text-white/60\";\n\nexport function parseHm(value: string): { h: number; m: number } | undefined {\n const m = /^([01]\\d|2[0-3]):([0-5]\\d)$/.exec(value.trim());\n if (!m) return undefined;\n const h = Number(m[1]);\n const min = Number(m[2]);\n if (h > 23 || min > 59) return undefined;\n return { h, m: min };\n}\n\nexport function toTimeStr(h: number, m: number): string {\n return `${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}`;\n}\n\nexport function currentTimeHm(now: Date = new Date()): string {\n return toTimeStr(now.getHours(), now.getMinutes());\n}\n\nfunction hmToTotal({ h, m }: { h: number; m: number }): number {\n return h * 60 + m;\n}\n\nfunction clampHmToMin(\n editor: { h: number; m: number },\n minParsed?: { h: number; m: number },\n): { h: number; m: number } {\n if (!minParsed) return editor;\n if (hmToTotal(editor) >= hmToTotal(minParsed)) return editor;\n return minParsed;\n}\n\nexport function hmToMinutes(value: string): number | null {\n const p = parseHm(value);\n return p ? p.h * 60 + p.m : null;\n}\n\nexport function minutesToHm(total: number): string | null {\n if (!Number.isFinite(total) || total < 0 || total >= 24 * 60) return null;\n const h = Math.floor(total / 60);\n const m = total % 60;\n return toTimeStr(h, m);\n}\n\nexport function addMinutesToHm(value: string, delta: number): string | null {\n const start = hmToMinutes(value);\n if (start == null) return null;\n return minutesToHm(start + delta);\n}\n\n/** Same-day end times at whole hours after `from` (2:10 → 3:10, 4:10, …). */\nexport function hourlyEndTimes(from: string): string[] {\n const start = hmToMinutes(from);\n if (start == null) return [];\n const out: string[] = [];\n for (let add = 60; start + add < 24 * 60; add += 60) {\n const next = minutesToHm(start + add);\n if (next) out.push(next);\n }\n return out;\n}\n\nexport function snapScheduleEndTime(\n from: string,\n to: string,\n chargeBy: \"hours\" | \"minutes\",\n): string {\n if (chargeBy === \"hours\") {\n const allowed = hourlyEndTimes(from);\n if (allowed.includes(to)) return to;\n return allowed[0] ?? \"\";\n }\n const start = hmToMinutes(from);\n const end = hmToMinutes(to);\n if (start == null) return to;\n if (end != null && end > start) return to;\n return addMinutesToHm(from, 1) ?? \"\";\n}\n\nexport function formatTimeForDisplay(value: string, timeFormat: \"12h\" | \"24h\"): string {\n const p = parseHm(value);\n if (!p) return value.trim() || \"—\";\n if (timeFormat === \"24h\") return toTimeStr(p.h, p.m);\n const ap = p.h >= 12 ? \"pm\" : \"am\";\n const h12 = p.h % 12 || 12;\n return `${String(h12).padStart(2, \"0\")}:${String(p.m).padStart(2, \"0\")} ${ap}`;\n}\n\nfunction split12(h24: number): { h12: number; ap: \"am\" | \"pm\" } {\n return { h12: h24 % 12 || 12, ap: h24 >= 12 ? \"pm\" : \"am\" };\n}\n\nfunction from12(h12: number, m: number, ap: \"am\" | \"pm\"): { h: number; m: number } {\n if (ap === \"am\") {\n return { h: h12 === 12 ? 0 : h12, m };\n }\n return { h: h12 === 12 ? 12 : h12 + 12, m };\n}\n\nconst HOURS_24 = Array.from({ length: 24 }, (_, i) => String(i).padStart(2, \"0\"));\nconst MINUTES = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, \"0\"));\nconst HOURS_12 = Array.from({ length: 12 }, (_, i) => String(i + 1));\n\nexport function TimeField({\n value,\n onChange,\n disabled,\n id,\n placeholder = \"Select time\",\n triggerClassName,\n align = \"start\",\n timeFormat = \"24h\",\n minTime,\n allowedTimes,\n}: {\n value: string;\n onChange: (v: string) => void;\n disabled?: boolean;\n id?: string;\n placeholder?: string;\n triggerClassName?: string;\n align?: \"start\" | \"center\" | \"end\";\n timeFormat?: \"12h\" | \"24h\";\n /** Inclusive lower bound (`HH:mm`); earlier times are omitted. */\n minTime?: string;\n /** When set, only these times can be chosen (used for whole-hour ends). */\n allowedTimes?: string[];\n}) {\n const [open, setOpen] = React.useState(false);\n\n const parsed = parseHm(value);\n const minParsed = minTime ? parseHm(minTime) : undefined;\n\n React.useEffect(() => {\n if (!minParsed || !parsed) return;\n if (hmToTotal(parsed) < hmToTotal(minParsed)) {\n onChange(toTimeStr(minParsed.h, minParsed.m));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- clamp once when value falls below minTime\n }, [value, minTime]);\n\n const editor = clampHmToMin(parsed ?? minParsed ?? { h: new Date().getHours(), m: new Date().getMinutes() }, minParsed);\n const label = parsed ? formatTimeForDisplay(toTimeStr(editor.h, editor.m), timeFormat) : placeholder;\n const { h12, ap } = split12(editor.h);\n\n const setFrom24 = (h: number, m: number) => {\n onChange(toTimeStr(h, m));\n };\n\n const hours24 = HOURS_24.filter((h) => {\n if (!minParsed) return true;\n return Number(h) >= minParsed.h;\n });\n const minutesForHour = (h: number) =>\n MINUTES.filter((mi) => {\n if (!minParsed) return true;\n if (h > minParsed.h) return true;\n if (h < minParsed.h) return false;\n return Number(mi) >= minParsed.m;\n });\n const minutes = minutesForHour(editor.h);\n\n const hours12 = HOURS_12.filter((h) => {\n const as24 = from12(Number(h), 0, ap).h;\n if (!minParsed) return true;\n return as24 >= minParsed.h;\n });\n\n return (\n <Popover modal={false} open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n id={id}\n disabled={disabled}\n className={cn(\n \"flex w-full min-w-0 items-center gap-2 rounded-md border border-border bg-card px-3 h-9 text-left text-sm text-muted-foreground outline-none transition-colors hover:bg-muted/80 focus-visible:border-blue-400 focus-visible:ring-[3px] focus-visible:ring-blue-500/25 disabled:cursor-not-allowed disabled:opacity-50\",\n triggerClassName,\n )}\n >\n <Clock size={13} className=\"shrink-0 text-muted-foreground\" aria-hidden />\n <span className={cn(\"min-w-0 flex-1 truncate\", !parsed && \"text-muted-foreground\")}>{label}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"z-[100] w-auto p-3\" align={align}>\n {allowedTimes ? (\n <div className=\"flex max-h-56 flex-col gap-0.5 overflow-y-auto\">\n {allowedTimes.length === 0 ? (\n <p className=\"px-1 py-2 text-xs text-muted-foreground\">No later times today</p>\n ) : (\n allowedTimes.map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => {\n onChange(t);\n setOpen(false);\n }}\n className={cn(\n \"rounded-md px-2.5 py-1.5 text-left text-xs tabular-nums hover:bg-accent\",\n t === value && \"bg-blue-50 font-medium text-blue-700 dark:bg-blue-950/40 dark:text-blue-300\",\n )}\n >\n {formatTimeForDisplay(t, timeFormat)}\n </button>\n ))\n )}\n </div>\n ) : timeFormat === \"24h\" ? (\n <div className=\"flex items-center gap-2\">\n <Select\n value={String(editor.h).padStart(2, \"0\")}\n onValueChange={(v) => setFrom24(Number(v), editor.m)}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-8 w-[4.75rem] text-xs\", TIME_SELECT_TRIGGER_CLASS)}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent position=\"popper\" className={SELECT_CONTENT_Z}>\n {hours24.map((h) => (\n <SelectItem key={h} value={h} className=\"text-xs\">\n {h}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span className=\"text-xs font-medium text-white/60\">:</span>\n <Select\n value={String(editor.m).padStart(2, \"0\")}\n onValueChange={(v) => setFrom24(editor.h, Number(v))}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-8 w-[4.75rem] text-xs\", TIME_SELECT_TRIGGER_CLASS)}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent position=\"popper\" className={SELECT_CONTENT_Z}>\n {minutes.map((mi) => (\n <SelectItem key={mi} value={mi} className=\"text-xs\">\n {mi}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <Select\n value={String(h12)}\n onValueChange={(v) => {\n const next = from12(Number(v), editor.m, ap);\n setFrom24(next.h, next.m);\n }}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-8 w-[3.75rem] text-xs\", TIME_SELECT_TRIGGER_CLASS)}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent position=\"popper\" className={SELECT_CONTENT_Z}>\n {hours12.map((h) => (\n <SelectItem key={h} value={h} className=\"text-xs\">\n {h}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span className=\"text-xs font-medium text-white/60\">:</span>\n <Select\n value={String(editor.m).padStart(2, \"0\")}\n onValueChange={(v) => {\n const next = from12(h12, Number(v), ap);\n setFrom24(next.h, next.m);\n }}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-8 w-[4.75rem] text-xs\", TIME_SELECT_TRIGGER_CLASS)}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent position=\"popper\" className={SELECT_CONTENT_Z}>\n {minutes.map((mi) => (\n <SelectItem key={mi} value={mi} className=\"text-xs\">\n {mi}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={ap}\n onValueChange={(v) => {\n const next = from12(h12, editor.m, v as \"am\" | \"pm\");\n setFrom24(next.h, next.m);\n }}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-8 w-[4.25rem] text-xs\", TIME_SELECT_TRIGGER_CLASS)}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent position=\"popper\" className={SELECT_CONTENT_Z}>\n <SelectItem value=\"am\" className=\"text-xs\">\n am\n </SelectItem>\n <SelectItem value=\"pm\" className=\"text-xs\">\n pm\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { cn } from './chunk-DMPSQ22Q.js';
2
+ import { GripVerticalIcon } from 'lucide-react';
3
+ import * as ResizablePrimitive from 'react-resizable-panels';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function ResizablePanelGroup({
7
+ className,
8
+ ...props
9
+ }) {
10
+ return /* @__PURE__ */ jsx(
11
+ ResizablePrimitive.PanelGroup,
12
+ {
13
+ "data-slot": "resizable-panel-group",
14
+ className: cn("flex h-full w-full data-[panel-group-direction=vertical]:flex-col", className),
15
+ ...props
16
+ }
17
+ );
18
+ }
19
+ function ResizablePanel({ ...props }) {
20
+ return /* @__PURE__ */ jsx(ResizablePrimitive.Panel, { "data-slot": "resizable-panel", ...props });
21
+ }
22
+ function ResizableHandle({
23
+ withHandle,
24
+ className,
25
+ ...props
26
+ }) {
27
+ return /* @__PURE__ */ jsx(
28
+ ResizablePrimitive.PanelResizeHandle,
29
+ {
30
+ "data-slot": "resizable-handle",
31
+ className: cn(
32
+ "bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
33
+ className
34
+ ),
35
+ ...props,
36
+ children: withHandle && /* @__PURE__ */ jsx("div", { className: "bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border", children: /* @__PURE__ */ jsx(GripVerticalIcon, { className: "size-2.5" }) })
37
+ }
38
+ );
39
+ }
40
+
41
+ export { ResizableHandle, ResizablePanel, ResizablePanelGroup };
42
+ //# sourceMappingURL=chunk-FN4BWFDX.js.map
43
+ //# sourceMappingURL=chunk-FN4BWFDX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/resizable.tsx"],"names":[],"mappings":";;;;;AAQA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+D;AAC7D,EAAA,uBACE,GAAA;AAAA,IAAoB,kBAAA,CAAA,UAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,mEAAA,EAAqE,SAAS,CAAA;AAAA,MAC3F,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,GAAG,KAAA,EAAM,EAA0D;AAC3F,EAAA,2BAA2B,kBAAA,CAAA,KAAA,EAAnB,EAAyB,WAAA,EAAU,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAC1E;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,GAAA;AAAA,IAAoB,kBAAA,CAAA,iBAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,2oBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,UAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,6EACb,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,UAAA,EAAW,CAAA,EACzC;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-FN4BWFDX.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { GripVerticalIcon } from \"lucide-react\";\nimport * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"./utils\";\n\nfunction ResizablePanelGroup({\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) {\n return (\n <ResizablePrimitive.PanelGroup\n data-slot=\"resizable-panel-group\"\n className={cn(\"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel({ ...props }: React.ComponentProps<typeof ResizablePrimitive.Panel>) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.PanelResizeHandle\n data-slot=\"resizable-handle\"\n className={cn(\n \"bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border\">\n <GripVerticalIcon className=\"size-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n );\n}\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle };\n"]}
@@ -0,0 +1,62 @@
1
+ import { cn } from './chunk-DMPSQ22Q.js';
2
+ import * as React from 'react';
3
+ import { OTPInput, OTPInputContext } from 'input-otp';
4
+ import { MinusIcon } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ function InputOTP({
8
+ className,
9
+ containerClassName,
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsx(
13
+ OTPInput,
14
+ {
15
+ "data-slot": "input-otp",
16
+ containerClassName: cn("flex items-center gap-2 has-disabled:opacity-50", containerClassName),
17
+ className: cn("disabled:cursor-not-allowed", className),
18
+ ...props
19
+ }
20
+ );
21
+ }
22
+ function InputOTPGroup({ className, ...props }) {
23
+ return /* @__PURE__ */ jsx(
24
+ "div",
25
+ {
26
+ "data-slot": "input-otp-group",
27
+ className: cn("flex items-center gap-1", className),
28
+ ...props
29
+ }
30
+ );
31
+ }
32
+ function InputOTPSlot({
33
+ index,
34
+ className,
35
+ ...props
36
+ }) {
37
+ const inputOTPContext = React.useContext(OTPInputContext);
38
+ const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
39
+ return /* @__PURE__ */ jsxs(
40
+ "div",
41
+ {
42
+ "data-slot": "input-otp-slot",
43
+ "data-active": isActive,
44
+ className: cn(
45
+ "data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm bg-input-background transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]",
46
+ className
47
+ ),
48
+ ...props,
49
+ children: [
50
+ char,
51
+ hasFakeCaret && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "animate-caret-blink bg-foreground h-4 w-px duration-1000" }) })
52
+ ]
53
+ }
54
+ );
55
+ }
56
+ function InputOTPSeparator({ ...props }) {
57
+ return /* @__PURE__ */ jsx("div", { "data-slot": "input-otp-separator", role: "separator", ...props, children: /* @__PURE__ */ jsx(MinusIcon, {}) });
58
+ }
59
+
60
+ export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
61
+ //# sourceMappingURL=chunk-HRHDOLWU.js.map
62
+ //# sourceMappingURL=chunk-HRHDOLWU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/input-otp.tsx"],"names":[],"mappings":";;;;;;AAQA,SAAS,QAAA,CAAS;AAAA,EAChB,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,kBAAA,EAAoB,EAAA,CAAG,iDAAA,EAAmD,kBAAkB,CAAA;AAAA,MAC5F,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACrD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,eAAA,GAAwB,iBAAW,eAAe,CAAA;AACxD,EAAA,MAAM,EAAE,MAAM,YAAA,EAAc,QAAA,KAAa,eAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC;AAE3E,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,ogBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,YAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA2D,CAAA,EAC5E;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,iBAAA,CAAkB,EAAE,GAAG,KAAA,EAAM,EAAgC;AACpE,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,qBAAA,EAAsB,IAAA,EAAK,aAAa,GAAG,KAAA,EACxD,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb,CAAA;AAEJ","file":"chunk-HRHDOLWU.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { OTPInput, OTPInputContext } from \"input-otp\";\nimport { MinusIcon } from \"lucide-react\";\n\nimport { cn } from \"./utils\";\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string;\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\"flex items-center gap-2 has-disabled:opacity-50\", containerClassName)}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number;\n}) {\n const inputOTPContext = React.useContext(OTPInputContext);\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm bg-input-background transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className,\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n );\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };\n"]}
@@ -0,0 +1,216 @@
1
+ import { cn } from './chunk-DMPSQ22Q.js';
2
+ import * as MenubarPrimitive from '@radix-ui/react-menubar';
3
+ import { CheckIcon, CircleIcon, ChevronRightIcon } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function Menubar({ className, ...props }) {
7
+ return /* @__PURE__ */ jsx(
8
+ MenubarPrimitive.Root,
9
+ {
10
+ "data-slot": "menubar",
11
+ className: cn(
12
+ "bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",
13
+ className
14
+ ),
15
+ ...props
16
+ }
17
+ );
18
+ }
19
+ function MenubarMenu({ ...props }) {
20
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Menu, { "data-slot": "menubar-menu", ...props });
21
+ }
22
+ function MenubarGroup({ ...props }) {
23
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Group, { "data-slot": "menubar-group", ...props });
24
+ }
25
+ function MenubarPortal({ ...props }) {
26
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Portal, { "data-slot": "menubar-portal", ...props });
27
+ }
28
+ function MenubarRadioGroup({ ...props }) {
29
+ return /* @__PURE__ */ jsx(MenubarPrimitive.RadioGroup, { "data-slot": "menubar-radio-group", ...props });
30
+ }
31
+ function MenubarTrigger({
32
+ className,
33
+ ...props
34
+ }) {
35
+ return /* @__PURE__ */ jsx(
36
+ MenubarPrimitive.Trigger,
37
+ {
38
+ "data-slot": "menubar-trigger",
39
+ className: cn(
40
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",
41
+ className
42
+ ),
43
+ ...props
44
+ }
45
+ );
46
+ }
47
+ function MenubarContent({
48
+ className,
49
+ align = "start",
50
+ alignOffset = -4,
51
+ sideOffset = 8,
52
+ ...props
53
+ }) {
54
+ return /* @__PURE__ */ jsx(MenubarPortal, { children: /* @__PURE__ */ jsx(
55
+ MenubarPrimitive.Content,
56
+ {
57
+ "data-slot": "menubar-content",
58
+ align,
59
+ alignOffset,
60
+ sideOffset,
61
+ className: cn(
62
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border border-white/10 p-1 shadow-md",
63
+ className
64
+ ),
65
+ ...props
66
+ }
67
+ ) });
68
+ }
69
+ function MenubarItem({
70
+ className,
71
+ inset,
72
+ variant = "default",
73
+ ...props
74
+ }) {
75
+ return /* @__PURE__ */ jsx(
76
+ MenubarPrimitive.Item,
77
+ {
78
+ "data-slot": "menubar-item",
79
+ "data-inset": inset,
80
+ "data-variant": variant,
81
+ className: cn(
82
+ "focus:bg-card/10 focus:text-popover-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
83
+ className
84
+ ),
85
+ ...props
86
+ }
87
+ );
88
+ }
89
+ function MenubarCheckboxItem({
90
+ className,
91
+ children,
92
+ checked,
93
+ ...props
94
+ }) {
95
+ return /* @__PURE__ */ jsxs(
96
+ MenubarPrimitive.CheckboxItem,
97
+ {
98
+ "data-slot": "menubar-checkbox-item",
99
+ className: cn(
100
+ "focus:bg-card/10 focus:text-popover-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
101
+ className
102
+ ),
103
+ checked,
104
+ ...props,
105
+ children: [
106
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) }) }),
107
+ children
108
+ ]
109
+ }
110
+ );
111
+ }
112
+ function MenubarRadioItem({
113
+ className,
114
+ children,
115
+ ...props
116
+ }) {
117
+ return /* @__PURE__ */ jsxs(
118
+ MenubarPrimitive.RadioItem,
119
+ {
120
+ "data-slot": "menubar-radio-item",
121
+ className: cn(
122
+ "focus:bg-card/10 focus:text-popover-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
123
+ className
124
+ ),
125
+ ...props,
126
+ children: [
127
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current" }) }) }),
128
+ children
129
+ ]
130
+ }
131
+ );
132
+ }
133
+ function MenubarLabel({
134
+ className,
135
+ inset,
136
+ ...props
137
+ }) {
138
+ return /* @__PURE__ */ jsx(
139
+ MenubarPrimitive.Label,
140
+ {
141
+ "data-slot": "menubar-label",
142
+ "data-inset": inset,
143
+ className: cn("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8", className),
144
+ ...props
145
+ }
146
+ );
147
+ }
148
+ function MenubarSeparator({
149
+ className,
150
+ ...props
151
+ }) {
152
+ return /* @__PURE__ */ jsx(
153
+ MenubarPrimitive.Separator,
154
+ {
155
+ "data-slot": "menubar-separator",
156
+ className: cn("bg-card/10 -mx-1 my-1 h-px", className),
157
+ ...props
158
+ }
159
+ );
160
+ }
161
+ function MenubarShortcut({ className, ...props }) {
162
+ return /* @__PURE__ */ jsx(
163
+ "span",
164
+ {
165
+ "data-slot": "menubar-shortcut",
166
+ className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className),
167
+ ...props
168
+ }
169
+ );
170
+ }
171
+ function MenubarSub({ ...props }) {
172
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Sub, { "data-slot": "menubar-sub", ...props });
173
+ }
174
+ function MenubarSubTrigger({
175
+ className,
176
+ inset,
177
+ children,
178
+ ...props
179
+ }) {
180
+ return /* @__PURE__ */ jsxs(
181
+ MenubarPrimitive.SubTrigger,
182
+ {
183
+ "data-slot": "menubar-sub-trigger",
184
+ "data-inset": inset,
185
+ className: cn(
186
+ "focus:bg-card/10 focus:text-popover-foreground data-[state=open]:bg-card/10 data-[state=open]:text-popover-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8",
187
+ className
188
+ ),
189
+ ...props,
190
+ children: [
191
+ children,
192
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto h-4 w-4" })
193
+ ]
194
+ }
195
+ );
196
+ }
197
+ function MenubarSubContent({
198
+ className,
199
+ ...props
200
+ }) {
201
+ return /* @__PURE__ */ jsx(
202
+ MenubarPrimitive.SubContent,
203
+ {
204
+ "data-slot": "menubar-sub-content",
205
+ className: cn(
206
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border border-white/10 p-1 shadow-lg",
207
+ className
208
+ ),
209
+ ...props
210
+ }
211
+ );
212
+ }
213
+
214
+ export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger };
215
+ //# sourceMappingURL=chunk-HZB2EHEH.js.map
216
+ //# sourceMappingURL=chunk-HZB2EHEH.js.map