@akira-io/ui 1.3.1 → 2.1.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 (78) hide show
  1. package/README.md +2 -2
  2. package/dist/blocks.d.ts +100 -10
  3. package/dist/blocks.js +547 -270
  4. package/dist/blocks.js.map +1 -1
  5. package/dist/{chunk-3Z2VGVPI.js → chunk-53V4J7MC.js} +17 -7
  6. package/dist/chunk-53V4J7MC.js.map +1 -0
  7. package/dist/chunk-BH3B26DK.js +394 -0
  8. package/dist/chunk-BH3B26DK.js.map +1 -0
  9. package/dist/chunk-BP2YDMMI.js +29 -0
  10. package/dist/chunk-BP2YDMMI.js.map +1 -0
  11. package/dist/chunk-BR3JI3KN.js +458 -0
  12. package/dist/chunk-BR3JI3KN.js.map +1 -0
  13. package/dist/{chunk-YBXRJSR3.js → chunk-CAUTXZ4U.js} +15 -7
  14. package/dist/chunk-CAUTXZ4U.js.map +1 -0
  15. package/dist/{chunk-I6VVCFZ2.js → chunk-DPLCEU34.js} +342 -238
  16. package/dist/chunk-DPLCEU34.js.map +1 -0
  17. package/dist/chunk-IQMRJXEO.js +5 -4
  18. package/dist/chunk-IQMRJXEO.js.map +1 -1
  19. package/dist/chunk-L2H5GIF7.js +5 -4
  20. package/dist/chunk-L2H5GIF7.js.map +1 -1
  21. package/dist/{chunk-2V6HUWST.js → chunk-NKPFIA32.js} +19 -6
  22. package/dist/chunk-NKPFIA32.js.map +1 -0
  23. package/dist/{chunk-QNF4LJVT.js → chunk-OS7YY5R4.js} +8 -6
  24. package/dist/chunk-OS7YY5R4.js.map +1 -0
  25. package/dist/{chunk-IDNOI4OK.js → chunk-PCYYU332.js} +15 -8
  26. package/dist/chunk-PCYYU332.js.map +1 -0
  27. package/dist/{chunk-KHOA4TEI.js → chunk-PPWJK5T3.js} +60 -25
  28. package/dist/chunk-PPWJK5T3.js.map +1 -0
  29. package/dist/{chunk-N2KIFFI7.js → chunk-QZRSQVCN.js} +30 -34
  30. package/dist/chunk-QZRSQVCN.js.map +1 -0
  31. package/dist/{chunk-SZUXATOF.js → chunk-XLAOE5MV.js} +170 -76
  32. package/dist/chunk-XLAOE5MV.js.map +1 -0
  33. package/dist/{chunk-B3L6PRLX.js → chunk-ZQXZ4UGE.js} +208 -100
  34. package/dist/chunk-ZQXZ4UGE.js.map +1 -0
  35. package/dist/code.d.ts +2 -2
  36. package/dist/code.js +96 -52
  37. package/dist/code.js.map +1 -1
  38. package/dist/{context-OwSoVEri.d.ts → context-2wTOwxCk.d.ts} +13 -5
  39. package/dist/editor.d.ts +1 -1
  40. package/dist/editor.js +135 -52
  41. package/dist/editor.js.map +1 -1
  42. package/dist/{field-DWm5NXeV.d.ts → field-C1TdmC2t.d.ts} +1 -1
  43. package/dist/index.d.ts +15 -12
  44. package/dist/index.js +1105 -633
  45. package/dist/index.js.map +1 -1
  46. package/dist/inertia.d.ts +11 -3
  47. package/dist/inertia.js +66 -12
  48. package/dist/inertia.js.map +1 -1
  49. package/dist/{input-Dxnsxi-f.d.ts → input-B4uEClxB.d.ts} +1 -1
  50. package/dist/{json-viewer-BARA2RCW.d.ts → json-viewer-Bssv9mTD.d.ts} +1 -1
  51. package/dist/locales/fr.d.ts +44 -0
  52. package/dist/locales/fr.js +248 -0
  53. package/dist/locales/fr.js.map +1 -0
  54. package/dist/locales/pt.d.ts +10 -9
  55. package/dist/locales/pt.js +40 -3
  56. package/dist/locales/pt.js.map +1 -1
  57. package/dist/shells.d.ts +46 -5
  58. package/dist/shells.js +211 -71
  59. package/dist/shells.js.map +1 -1
  60. package/dist/{sidebar-Bp6Q46j-.d.ts → sidebar-BLL2tgTt.d.ts} +2 -2
  61. package/dist/types-1LUmNJf_.d.ts +41 -0
  62. package/dist/{types-cmBL8zOc.d.ts → types-CMZRvMV5.d.ts} +1 -1
  63. package/dist/{types-B-eGPoFD.d.ts → types-CfAUvz--.d.ts} +1 -1
  64. package/package.json +8 -2
  65. package/theme.css +11 -0
  66. package/dist/chunk-2V6HUWST.js.map +0 -1
  67. package/dist/chunk-3Z2VGVPI.js.map +0 -1
  68. package/dist/chunk-B3L6PRLX.js.map +0 -1
  69. package/dist/chunk-I6VVCFZ2.js.map +0 -1
  70. package/dist/chunk-IDNOI4OK.js.map +0 -1
  71. package/dist/chunk-KHOA4TEI.js.map +0 -1
  72. package/dist/chunk-N2KIFFI7.js.map +0 -1
  73. package/dist/chunk-NGMG2UWX.js +0 -172
  74. package/dist/chunk-NGMG2UWX.js.map +0 -1
  75. package/dist/chunk-QNF4LJVT.js.map +0 -1
  76. package/dist/chunk-SZUXATOF.js.map +0 -1
  77. package/dist/chunk-YBXRJSR3.js.map +0 -1
  78. package/dist/types-u1qfmJQi.d.ts +0 -28
@@ -0,0 +1,458 @@
1
+ import {
2
+ Alert,
3
+ AlertDescription,
4
+ Checkbox,
5
+ Field,
6
+ FieldControl,
7
+ FieldLabel,
8
+ PasswordInput
9
+ } from "./chunk-BH3B26DK.js";
10
+ import {
11
+ useUiLabels
12
+ } from "./chunk-OS7YY5R4.js";
13
+ import {
14
+ Label
15
+ } from "./chunk-BP2YDMMI.js";
16
+ import {
17
+ resolveLink
18
+ } from "./chunk-L2H5GIF7.js";
19
+ import {
20
+ Input
21
+ } from "./chunk-53V4J7MC.js";
22
+ import {
23
+ Button,
24
+ cn
25
+ } from "./chunk-PPWJK5T3.js";
26
+
27
+ // src/blocks/login-form/types.ts
28
+ var loginFormLabels = {
29
+ emailLabel: "Email address",
30
+ emailPlaceholder: "email@example.com",
31
+ passwordLabel: "Password",
32
+ passwordPlaceholder: "Password",
33
+ forgotPasswordLabel: "Forgot your password?",
34
+ rememberLabel: "Remember me",
35
+ submitLabel: "Log in",
36
+ submittingLabel: "Signing in"
37
+ };
38
+ function fieldError(errors, field) {
39
+ const value = errors[field];
40
+ if (!value) {
41
+ return void 0;
42
+ }
43
+ const messages = Array.isArray(value) ? value : [value];
44
+ return messages.find(
45
+ (message) => typeof message === "string" && message.length > 0
46
+ );
47
+ }
48
+
49
+ // src/blocks/login-form/context.tsx
50
+ import { createContext, useContext } from "react";
51
+ import { jsx } from "react/jsx-runtime";
52
+ var LoginFormContext = createContext({
53
+ errors: {},
54
+ processing: false
55
+ });
56
+ function useLoginFormContext() {
57
+ const context = useContext(LoginFormContext);
58
+ const labels = useUiLabels("loginForm", loginFormLabels, context.labels);
59
+ return { ...context, labels };
60
+ }
61
+ function LoginFormProvider({
62
+ errors = {},
63
+ processing = false,
64
+ linkComponent,
65
+ labels,
66
+ children
67
+ }) {
68
+ return /* @__PURE__ */ jsx(
69
+ LoginFormContext.Provider,
70
+ {
71
+ value: {
72
+ errors,
73
+ processing,
74
+ linkComponent,
75
+ labels
76
+ },
77
+ children
78
+ }
79
+ );
80
+ }
81
+
82
+ // src/blocks/login-form/parts.tsx
83
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
84
+ function LoginFormRoot({
85
+ errors,
86
+ processing,
87
+ linkComponent,
88
+ labels,
89
+ children,
90
+ className,
91
+ slotName = "login-form"
92
+ }) {
93
+ return /* @__PURE__ */ jsx2(
94
+ LoginFormProvider,
95
+ {
96
+ errors,
97
+ processing,
98
+ linkComponent,
99
+ labels,
100
+ children: /* @__PURE__ */ jsx2("div", { "data-slot": slotName, className: cn("gap-6 grid", className), children })
101
+ }
102
+ );
103
+ }
104
+ function LoginFormStatus({
105
+ message,
106
+ slotName = "login-form-status"
107
+ }) {
108
+ if (!message) {
109
+ return null;
110
+ }
111
+ return /* @__PURE__ */ jsx2(Alert, { slotName, children: /* @__PURE__ */ jsx2(AlertDescription, { children: message }) });
112
+ }
113
+ function LoginFormEmail({
114
+ id = "email",
115
+ name = "email",
116
+ label,
117
+ placeholder,
118
+ error,
119
+ tabIndex,
120
+ autoFocus = true,
121
+ required = true,
122
+ slotName = "login-form-email"
123
+ }) {
124
+ const { errors, labels } = useLoginFormContext();
125
+ const message = error ?? fieldError(errors, name);
126
+ return /* @__PURE__ */ jsxs(Field, { id, error: message, required, slotName, children: [
127
+ /* @__PURE__ */ jsx2(FieldLabel, { children: label ?? labels.emailLabel }),
128
+ /* @__PURE__ */ jsx2(FieldControl, { children: /* @__PURE__ */ jsx2(
129
+ Input,
130
+ {
131
+ name,
132
+ type: "email",
133
+ required,
134
+ autoFocus,
135
+ autoComplete: "email",
136
+ tabIndex,
137
+ placeholder: placeholder ?? labels.emailPlaceholder
138
+ }
139
+ ) })
140
+ ] });
141
+ }
142
+ function LoginFormPassword({
143
+ id = "password",
144
+ name = "password",
145
+ label,
146
+ placeholder,
147
+ error,
148
+ tabIndex,
149
+ autoFocus = false,
150
+ required = true,
151
+ forgotPasswordHref,
152
+ forgotPasswordLabel,
153
+ linkComponent,
154
+ slotName = "login-form-password"
155
+ }) {
156
+ const context = useLoginFormContext();
157
+ const message = error ?? fieldError(context.errors, name);
158
+ const Link = resolveLink(linkComponent ?? context.linkComponent);
159
+ return /* @__PURE__ */ jsxs(Field, { id, error: message, required, slotName, children: [
160
+ /* @__PURE__ */ jsx2(FieldLabel, { children: label ?? context.labels.passwordLabel }),
161
+ /* @__PURE__ */ jsx2(FieldControl, { children: /* @__PURE__ */ jsx2(
162
+ PasswordInput,
163
+ {
164
+ name,
165
+ required,
166
+ autoFocus,
167
+ autoComplete: "current-password",
168
+ tabIndex,
169
+ placeholder: placeholder ?? context.labels.passwordPlaceholder
170
+ }
171
+ ) }),
172
+ forgotPasswordHref && /* @__PURE__ */ jsx2(
173
+ Link,
174
+ {
175
+ href: forgotPasswordHref,
176
+ className: "mr-1 text-xs font-medium self-end text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline",
177
+ children: forgotPasswordLabel ?? context.labels.forgotPasswordLabel
178
+ }
179
+ )
180
+ ] });
181
+ }
182
+ function LoginFormRemember({
183
+ id = "remember",
184
+ name = "remember",
185
+ label,
186
+ tabIndex,
187
+ slotName = "login-form-remember"
188
+ }) {
189
+ const { labels } = useLoginFormContext();
190
+ return /* @__PURE__ */ jsxs("div", { "data-slot": slotName, className: "gap-3 flex items-center", children: [
191
+ /* @__PURE__ */ jsx2(Checkbox, { id, name, tabIndex }),
192
+ /* @__PURE__ */ jsx2(Label, { htmlFor: id, children: label ?? labels.rememberLabel })
193
+ ] });
194
+ }
195
+ function LoginFormSubmit({
196
+ label,
197
+ submittingLabel,
198
+ processing,
199
+ tabIndex,
200
+ slotName = "login-form-submit"
201
+ }) {
202
+ const context = useLoginFormContext();
203
+ const pending = processing ?? context.processing;
204
+ const pendingLabel = submittingLabel ?? context.labels.submittingLabel;
205
+ return /* @__PURE__ */ jsx2(
206
+ Button,
207
+ {
208
+ slotName,
209
+ type: "submit",
210
+ className: "w-full",
211
+ tabIndex,
212
+ "aria-label": pending ? pendingLabel : void 0,
213
+ loading: pending,
214
+ loadingLabel: pendingLabel,
215
+ children: pending ? pendingLabel : label ?? context.labels.submitLabel
216
+ }
217
+ );
218
+ }
219
+
220
+ // src/blocks/login-form/preset.tsx
221
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
222
+ function LoginFormPreset({
223
+ errors,
224
+ processing,
225
+ linkComponent,
226
+ labels,
227
+ status,
228
+ forgotPasswordHref,
229
+ className,
230
+ slotName = "login-form"
231
+ }) {
232
+ return /* @__PURE__ */ jsxs2(
233
+ LoginFormRoot,
234
+ {
235
+ errors,
236
+ processing,
237
+ linkComponent,
238
+ labels,
239
+ className,
240
+ slotName,
241
+ children: [
242
+ /* @__PURE__ */ jsx3(LoginFormStatus, { message: status }),
243
+ /* @__PURE__ */ jsx3(LoginFormEmail, {}),
244
+ /* @__PURE__ */ jsx3(LoginFormPassword, { forgotPasswordHref }),
245
+ /* @__PURE__ */ jsx3(LoginFormRemember, {}),
246
+ /* @__PURE__ */ jsx3(LoginFormSubmit, {})
247
+ ]
248
+ }
249
+ );
250
+ }
251
+
252
+ // src/blocks/login-form/index.ts
253
+ var LoginForm = {
254
+ Root: LoginFormRoot,
255
+ Status: LoginFormStatus,
256
+ Email: LoginFormEmail,
257
+ Password: LoginFormPassword,
258
+ Remember: LoginFormRemember,
259
+ Submit: LoginFormSubmit
260
+ };
261
+
262
+ // src/blocks/tour/gate.ts
263
+ function stepsForBreakpoint(steps, breakpoint) {
264
+ return steps.filter(
265
+ (step) => !step.breakpoints || step.breakpoints.includes(breakpoint)
266
+ );
267
+ }
268
+ function resolveSteps(steps, isPresent) {
269
+ return steps.filter((step) => isPresent(step.target));
270
+ }
271
+ function shouldStartTour(input) {
272
+ if (input.resolvedStepCount === 0) {
273
+ return false;
274
+ }
275
+ if (input.force) {
276
+ return true;
277
+ }
278
+ return input.definition.version > (input.seen[input.definition.id] ?? 0);
279
+ }
280
+
281
+ // src/blocks/tour/types.ts
282
+ var DEFAULT_TOUR_LABELS = {
283
+ next: "Next",
284
+ previous: "Previous",
285
+ done: "Done",
286
+ progress: "{{current}} of {{total}}"
287
+ };
288
+
289
+ // src/blocks/tour/tour.tsx
290
+ import { driver } from "driver.js";
291
+ import {
292
+ createContext as createContext2,
293
+ useCallback,
294
+ useContext as useContext2,
295
+ useEffect,
296
+ useMemo,
297
+ useRef
298
+ } from "react";
299
+ import "driver.js/dist/driver.css";
300
+ import { jsx as jsx4 } from "react/jsx-runtime";
301
+ var TourContext = createContext2(null);
302
+ var MOBILE_BREAKPOINT = 768;
303
+ var WAIT_FOR_TARGET = 4e3;
304
+ function currentBreakpoint() {
305
+ return window.innerWidth < MOBILE_BREAKPOINT ? "mobile" : "desktop";
306
+ }
307
+ function outcomeOf(instance, highlighted) {
308
+ if (!highlighted) {
309
+ return "dismissed";
310
+ }
311
+ return instance.hasNextStep() ? "skipped" : "completed";
312
+ }
313
+ function TourProvider({
314
+ children,
315
+ seen,
316
+ onProgress,
317
+ labels
318
+ }) {
319
+ const seenRef = useRef(seen);
320
+ seenRef.current = seen;
321
+ const onProgressRef = useRef(onProgress);
322
+ onProgressRef.current = onProgress;
323
+ const driverRef = useRef(null);
324
+ const activeRef = useRef(null);
325
+ const { next, previous, done, progress } = useUiLabels(
326
+ "tour",
327
+ DEFAULT_TOUR_LABELS,
328
+ labels
329
+ );
330
+ const report = useCallback((outcome) => {
331
+ const active = activeRef.current;
332
+ if (!active) {
333
+ return;
334
+ }
335
+ activeRef.current = null;
336
+ onProgressRef.current({
337
+ tour: active.definition.id,
338
+ version: active.definition.version,
339
+ lastStep: active.lastStep,
340
+ outcome
341
+ });
342
+ }, []);
343
+ const startTour = useCallback(
344
+ (definition, options) => {
345
+ const alreadyRunning = activeRef.current?.definition.id === definition.id;
346
+ if (alreadyRunning && !options?.force) {
347
+ return;
348
+ }
349
+ const steps = stepsForBreakpoint(
350
+ definition.steps,
351
+ currentBreakpoint()
352
+ );
353
+ const allowed = shouldStartTour({
354
+ definition,
355
+ seen: seenRef.current,
356
+ resolvedStepCount: steps.length,
357
+ force: options?.force
358
+ });
359
+ if (!allowed) {
360
+ return;
361
+ }
362
+ driverRef.current?.destroy();
363
+ activeRef.current = { definition, lastStep: 0, highlighted: false };
364
+ const instance = driver({
365
+ showProgress: true,
366
+ progressText: progress,
367
+ nextBtnText: next,
368
+ prevBtnText: previous,
369
+ doneBtnText: done,
370
+ popoverClass: "akira-tour",
371
+ waitForElement: WAIT_FOR_TARGET,
372
+ skipMissingElement: true,
373
+ steps: steps.map((step) => ({
374
+ element: step.target,
375
+ popover: {
376
+ title: step.title,
377
+ description: step.description
378
+ }
379
+ })),
380
+ onHighlightStarted: () => {
381
+ if (activeRef.current) {
382
+ activeRef.current.lastStep = instance.getActiveIndex() ?? 0;
383
+ activeRef.current.highlighted = true;
384
+ }
385
+ },
386
+ onDestroyStarted: () => {
387
+ report(
388
+ outcomeOf(
389
+ instance,
390
+ activeRef.current?.highlighted ?? false
391
+ )
392
+ );
393
+ instance.destroy();
394
+ }
395
+ });
396
+ driverRef.current = instance;
397
+ instance.drive();
398
+ },
399
+ [report, next, previous, done, progress]
400
+ );
401
+ useEffect(
402
+ () => () => {
403
+ report("dismissed");
404
+ driverRef.current?.destroy();
405
+ driverRef.current = null;
406
+ },
407
+ [report]
408
+ );
409
+ const value = useMemo(() => ({ startTour }), [startTour]);
410
+ return /* @__PURE__ */ jsx4(TourContext.Provider, { value, children });
411
+ }
412
+ function useTourController() {
413
+ const context = useContext2(TourContext);
414
+ if (!context) {
415
+ throw new Error(
416
+ "useTourController must be used inside a TourProvider."
417
+ );
418
+ }
419
+ return context;
420
+ }
421
+ function useTour(definition, options) {
422
+ const { startTour } = useTourController();
423
+ const enabled = options?.enabled ?? true;
424
+ const definitionRef = useRef(definition);
425
+ definitionRef.current = definition;
426
+ useEffect(() => {
427
+ if (!enabled) {
428
+ return;
429
+ }
430
+ const frame = window.requestAnimationFrame(
431
+ () => startTour(definitionRef.current)
432
+ );
433
+ return () => window.cancelAnimationFrame(frame);
434
+ }, [definition.id, definition.version, enabled, startTour]);
435
+ return { restart: () => startTour(definitionRef.current, { force: true }) };
436
+ }
437
+
438
+ export {
439
+ loginFormLabels,
440
+ useLoginFormContext,
441
+ LoginFormProvider,
442
+ LoginFormRoot,
443
+ LoginFormStatus,
444
+ LoginFormEmail,
445
+ LoginFormPassword,
446
+ LoginFormRemember,
447
+ LoginFormSubmit,
448
+ LoginFormPreset,
449
+ LoginForm,
450
+ stepsForBreakpoint,
451
+ resolveSteps,
452
+ shouldStartTour,
453
+ DEFAULT_TOUR_LABELS,
454
+ TourProvider,
455
+ useTourController,
456
+ useTour
457
+ };
458
+ //# sourceMappingURL=chunk-BR3JI3KN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blocks/login-form/types.ts","../src/blocks/login-form/context.tsx","../src/blocks/login-form/parts.tsx","../src/blocks/login-form/preset.tsx","../src/blocks/login-form/index.ts","../src/blocks/tour/gate.ts","../src/blocks/tour/types.ts","../src/blocks/tour/tour.tsx"],"sourcesContent":["export interface LoginFormLabels {\n emailLabel: string;\n emailPlaceholder: string;\n passwordLabel: string;\n passwordPlaceholder: string;\n forgotPasswordLabel: string;\n rememberLabel: string;\n submitLabel: string;\n submittingLabel: string;\n}\n\nexport const loginFormLabels: LoginFormLabels = {\n emailLabel: 'Email address',\n emailPlaceholder: 'email@example.com',\n passwordLabel: 'Password',\n passwordPlaceholder: 'Password',\n forgotPasswordLabel: 'Forgot your password?',\n rememberLabel: 'Remember me',\n submitLabel: 'Log in',\n submittingLabel: 'Signing in',\n};\n\nexport type LoginFormErrors = Record<string, string | string[] | undefined>;\n\nexport function fieldError(\n errors: LoginFormErrors,\n field: string,\n): string | undefined {\n const value = errors[field];\n\n if (!value) {\n return undefined;\n }\n\n const messages = Array.isArray(value) ? value : [value];\n\n return messages.find(\n (message) => typeof message === 'string' && message.length > 0,\n );\n}\n","import {\n loginFormLabels,\n type LoginFormErrors,\n type LoginFormLabels,\n} from '@/blocks/login-form/types';\nimport { useUiLabels } from '@/locales/context';\nimport type { LinkComponent } from '@/types';\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport interface LoginFormContextValue {\n errors: LoginFormErrors;\n processing: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n}\n\nconst LoginFormContext = createContext<LoginFormContextValue>({\n errors: {},\n processing: false,\n});\n\nexport function useLoginFormContext(): LoginFormContextValue & {\n labels: LoginFormLabels;\n} {\n const context = useContext(LoginFormContext);\n const labels = useUiLabels('loginForm', loginFormLabels, context.labels);\n\n return { ...context, labels };\n}\n\nexport function LoginFormProvider({\n errors = {},\n processing = false,\n linkComponent,\n labels,\n children,\n}: {\n errors?: LoginFormErrors;\n processing?: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n children: ReactNode;\n}) {\n return (\n <LoginFormContext.Provider\n value={{\n errors,\n processing,\n linkComponent,\n labels,\n }}\n >\n {children}\n </LoginFormContext.Provider>\n );\n}\n","import {\n LoginFormProvider,\n useLoginFormContext,\n} from '@/blocks/login-form/context';\nimport {\n fieldError,\n type LoginFormErrors,\n type LoginFormLabels,\n} from '@/blocks/login-form/types';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldControl, FieldLabel } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { PasswordInput } from '@/components/ui/password-input';\nimport { resolveLink } from '@/lib/href';\nimport { cn } from '@/lib/utils';\nimport type { LinkComponent, SlotNameProps, UrlLike } from '@/types';\nimport type { ReactNode } from 'react';\n\nexport interface LoginFormRootProps {\n errors?: LoginFormErrors;\n processing?: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n children: ReactNode;\n className?: string;\n}\n\nexport function LoginFormRoot({\n errors,\n processing,\n linkComponent,\n labels,\n children,\n className,\n slotName = 'login-form',\n}: LoginFormRootProps & SlotNameProps) {\n return (\n <LoginFormProvider\n errors={errors}\n processing={processing}\n linkComponent={linkComponent}\n labels={labels}\n >\n <div data-slot={slotName} className={cn('gap-6 grid', className)}>\n {children}\n </div>\n </LoginFormProvider>\n );\n}\n\nexport interface LoginFormStatusProps {\n message?: string;\n}\n\nexport function LoginFormStatus({\n message,\n slotName = 'login-form-status',\n}: LoginFormStatusProps & SlotNameProps) {\n if (!message) {\n return null;\n }\n\n return (\n <Alert slotName={slotName}>\n <AlertDescription>{message}</AlertDescription>\n </Alert>\n );\n}\n\nexport interface LoginFormEmailProps {\n id?: string;\n name?: string;\n label?: string;\n placeholder?: string;\n error?: string;\n tabIndex?: number;\n autoFocus?: boolean;\n required?: boolean;\n}\n\nexport function LoginFormEmail({\n id = 'email',\n name = 'email',\n label,\n placeholder,\n error,\n tabIndex,\n autoFocus = true,\n required = true,\n slotName = 'login-form-email',\n}: LoginFormEmailProps & SlotNameProps) {\n const { errors, labels } = useLoginFormContext();\n const message = error ?? fieldError(errors, name);\n\n return (\n <Field id={id} error={message} required={required} slotName={slotName}>\n <FieldLabel>{label ?? labels.emailLabel}</FieldLabel>\n <FieldControl>\n <Input\n name={name}\n type=\"email\"\n required={required}\n autoFocus={autoFocus}\n autoComplete=\"email\"\n tabIndex={tabIndex}\n placeholder={placeholder ?? labels.emailPlaceholder}\n />\n </FieldControl>\n </Field>\n );\n}\n\nexport interface LoginFormPasswordProps {\n id?: string;\n name?: string;\n label?: string;\n placeholder?: string;\n error?: string;\n tabIndex?: number;\n autoFocus?: boolean;\n required?: boolean;\n forgotPasswordHref?: UrlLike;\n forgotPasswordLabel?: string;\n linkComponent?: LinkComponent;\n}\n\nexport function LoginFormPassword({\n id = 'password',\n name = 'password',\n label,\n placeholder,\n error,\n tabIndex,\n autoFocus = false,\n required = true,\n forgotPasswordHref,\n forgotPasswordLabel,\n linkComponent,\n slotName = 'login-form-password',\n}: LoginFormPasswordProps & SlotNameProps) {\n const context = useLoginFormContext();\n const message = error ?? fieldError(context.errors, name);\n const Link = resolveLink(linkComponent ?? context.linkComponent);\n\n return (\n <Field id={id} error={message} required={required} slotName={slotName}>\n <FieldLabel>{label ?? context.labels.passwordLabel}</FieldLabel>\n <FieldControl>\n <PasswordInput\n name={name}\n required={required}\n autoFocus={autoFocus}\n autoComplete=\"current-password\"\n tabIndex={tabIndex}\n placeholder={\n placeholder ?? context.labels.passwordPlaceholder\n }\n />\n </FieldControl>\n {forgotPasswordHref && (\n <Link\n href={forgotPasswordHref}\n className=\"mr-1 text-xs font-medium self-end text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline\"\n >\n {forgotPasswordLabel ?? context.labels.forgotPasswordLabel}\n </Link>\n )}\n </Field>\n );\n}\n\nexport interface LoginFormRememberProps {\n id?: string;\n name?: string;\n label?: string;\n tabIndex?: number;\n}\n\nexport function LoginFormRemember({\n id = 'remember',\n name = 'remember',\n label,\n tabIndex,\n slotName = 'login-form-remember',\n}: LoginFormRememberProps & SlotNameProps) {\n const { labels } = useLoginFormContext();\n\n return (\n <div data-slot={slotName} className=\"gap-3 flex items-center\">\n <Checkbox id={id} name={name} tabIndex={tabIndex} />\n <Label htmlFor={id}>{label ?? labels.rememberLabel}</Label>\n </div>\n );\n}\n\nexport interface LoginFormSubmitProps {\n label?: string;\n submittingLabel?: string;\n processing?: boolean;\n tabIndex?: number;\n}\n\nexport function LoginFormSubmit({\n label,\n submittingLabel,\n processing,\n tabIndex,\n slotName = 'login-form-submit',\n}: LoginFormSubmitProps & SlotNameProps) {\n const context = useLoginFormContext();\n const pending = processing ?? context.processing;\n const pendingLabel = submittingLabel ?? context.labels.submittingLabel;\n\n return (\n <Button\n slotName={slotName}\n type=\"submit\"\n className=\"w-full\"\n tabIndex={tabIndex}\n aria-label={pending ? pendingLabel : undefined}\n loading={pending}\n loadingLabel={pendingLabel}\n >\n {pending ? pendingLabel : (label ?? context.labels.submitLabel)}\n </Button>\n );\n}\n","import {\n LoginFormEmail,\n LoginFormPassword,\n LoginFormRemember,\n LoginFormRoot,\n LoginFormStatus,\n LoginFormSubmit,\n} from '@/blocks/login-form/parts';\nimport type {\n LoginFormErrors,\n LoginFormLabels,\n} from '@/blocks/login-form/types';\nimport type { LinkComponent, SlotNameProps, UrlLike } from '@/types';\n\nexport interface LoginFormPresetProps {\n errors?: LoginFormErrors;\n processing?: boolean;\n linkComponent?: LinkComponent;\n labels?: Partial<LoginFormLabels>;\n status?: string;\n forgotPasswordHref?: UrlLike;\n className?: string;\n}\n\nexport function LoginFormPreset({\n errors,\n processing,\n linkComponent,\n labels,\n status,\n forgotPasswordHref,\n className,\n slotName = 'login-form',\n}: LoginFormPresetProps & SlotNameProps) {\n return (\n <LoginFormRoot\n errors={errors}\n processing={processing}\n linkComponent={linkComponent}\n labels={labels}\n className={className}\n slotName={slotName}\n >\n <LoginFormStatus message={status} />\n <LoginFormEmail />\n <LoginFormPassword forgotPasswordHref={forgotPasswordHref} />\n <LoginFormRemember />\n <LoginFormSubmit />\n </LoginFormRoot>\n );\n}\n","import {\n LoginFormEmail,\n LoginFormPassword,\n LoginFormRemember,\n LoginFormRoot,\n LoginFormStatus,\n LoginFormSubmit,\n} from '@/blocks/login-form/parts';\n\nexport const LoginForm = {\n Root: LoginFormRoot,\n Status: LoginFormStatus,\n Email: LoginFormEmail,\n Password: LoginFormPassword,\n Remember: LoginFormRemember,\n Submit: LoginFormSubmit,\n};\n\nexport {\n LoginFormProvider,\n useLoginFormContext,\n type LoginFormContextValue,\n} from '@/blocks/login-form/context';\nexport {\n LoginFormEmail,\n LoginFormPassword,\n LoginFormRemember,\n LoginFormRoot,\n LoginFormStatus,\n LoginFormSubmit,\n type LoginFormEmailProps,\n type LoginFormPasswordProps,\n type LoginFormRememberProps,\n type LoginFormRootProps,\n type LoginFormStatusProps,\n type LoginFormSubmitProps,\n} from '@/blocks/login-form/parts';\nexport {\n LoginFormPreset,\n type LoginFormPresetProps,\n} from '@/blocks/login-form/preset';\nexport {\n loginFormLabels,\n type LoginFormErrors,\n type LoginFormLabels,\n} from '@/blocks/login-form/types';\n","import type {\n TourBreakpoint,\n TourDefinition,\n TourStep,\n} from '@/blocks/tour/types';\n\nexport function stepsForBreakpoint(\n steps: TourStep[],\n breakpoint: TourBreakpoint,\n): TourStep[] {\n return steps.filter(\n (step) => !step.breakpoints || step.breakpoints.includes(breakpoint),\n );\n}\n\nexport function resolveSteps(\n steps: TourStep[],\n isPresent: (target: string) => boolean,\n): TourStep[] {\n return steps.filter((step) => isPresent(step.target));\n}\n\nexport function shouldStartTour(input: {\n definition: TourDefinition;\n seen: Record<string, number>;\n resolvedStepCount: number;\n force?: boolean;\n}): boolean {\n if (input.resolvedStepCount === 0) {\n return false;\n }\n\n if (input.force) {\n return true;\n }\n\n return input.definition.version > (input.seen[input.definition.id] ?? 0);\n}\n","export type TourBreakpoint = 'mobile' | 'desktop';\n\nexport type TourOutcome = 'completed' | 'skipped' | 'dismissed';\n\nexport interface TourStep {\n target: string;\n title: string;\n description: string;\n breakpoints?: TourBreakpoint[];\n}\n\nexport interface TourDefinition {\n id: string;\n version: number;\n steps: TourStep[];\n}\n\nexport interface TourProgress {\n tour: string;\n version: number;\n lastStep: number;\n outcome: TourOutcome;\n}\n\nexport interface TourLabels {\n next: string;\n previous: string;\n done: string;\n progress: string;\n}\n\nexport const DEFAULT_TOUR_LABELS: TourLabels = {\n next: 'Next',\n previous: 'Previous',\n done: 'Done',\n progress: '{{current}} of {{total}}',\n};\n","import { driver, type Driver } from 'driver.js';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type PropsWithChildren,\n type ReactElement,\n} from 'react';\n\nimport 'driver.js/dist/driver.css';\n\nimport { shouldStartTour, stepsForBreakpoint } from '@/blocks/tour/gate';\nimport {\n DEFAULT_TOUR_LABELS,\n type TourBreakpoint,\n type TourDefinition,\n type TourLabels,\n type TourOutcome,\n type TourProgress,\n} from '@/blocks/tour/types';\nimport { useUiLabels } from '@/locales/context';\n\ninterface TourControllerValue {\n startTour: (\n definition: TourDefinition,\n options?: { force?: boolean },\n ) => void;\n}\n\nconst TourContext = createContext<TourControllerValue | null>(null);\n\nconst MOBILE_BREAKPOINT = 768;\n\nconst WAIT_FOR_TARGET = 4000;\n\nfunction currentBreakpoint(): TourBreakpoint {\n return window.innerWidth < MOBILE_BREAKPOINT ? 'mobile' : 'desktop';\n}\n\nfunction outcomeOf(instance: Driver, highlighted: boolean): TourOutcome {\n if (!highlighted) {\n return 'dismissed';\n }\n\n return instance.hasNextStep() ? 'skipped' : 'completed';\n}\n\nexport function TourProvider({\n children,\n seen,\n onProgress,\n labels,\n}: PropsWithChildren<{\n seen: Record<string, number>;\n onProgress: (progress: TourProgress) => void;\n labels?: Partial<TourLabels>;\n}>): ReactElement {\n const seenRef = useRef(seen);\n seenRef.current = seen;\n\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n\n const driverRef = useRef<Driver | null>(null);\n const activeRef = useRef<{\n definition: TourDefinition;\n lastStep: number;\n highlighted: boolean;\n } | null>(null);\n\n const { next, previous, done, progress } = useUiLabels(\n 'tour',\n DEFAULT_TOUR_LABELS,\n labels,\n );\n\n const report = useCallback((outcome: TourOutcome): void => {\n const active = activeRef.current;\n\n if (!active) {\n return;\n }\n\n activeRef.current = null;\n\n onProgressRef.current({\n tour: active.definition.id,\n version: active.definition.version,\n lastStep: active.lastStep,\n outcome,\n });\n }, []);\n\n const startTour = useCallback(\n (definition: TourDefinition, options?: { force?: boolean }): void => {\n const alreadyRunning =\n activeRef.current?.definition.id === definition.id;\n\n if (alreadyRunning && !options?.force) {\n return;\n }\n\n const steps = stepsForBreakpoint(\n definition.steps,\n currentBreakpoint(),\n );\n\n const allowed = shouldStartTour({\n definition,\n seen: seenRef.current,\n resolvedStepCount: steps.length,\n force: options?.force,\n });\n\n if (!allowed) {\n return;\n }\n\n driverRef.current?.destroy();\n activeRef.current = { definition, lastStep: 0, highlighted: false };\n\n const instance = driver({\n showProgress: true,\n progressText: progress,\n nextBtnText: next,\n prevBtnText: previous,\n doneBtnText: done,\n popoverClass: 'akira-tour',\n waitForElement: WAIT_FOR_TARGET,\n skipMissingElement: true,\n steps: steps.map((step) => ({\n element: step.target,\n popover: {\n title: step.title,\n description: step.description,\n },\n })),\n onHighlightStarted: () => {\n if (activeRef.current) {\n activeRef.current.lastStep =\n instance.getActiveIndex() ?? 0;\n activeRef.current.highlighted = true;\n }\n },\n onDestroyStarted: () => {\n report(\n outcomeOf(\n instance,\n activeRef.current?.highlighted ?? false,\n ),\n );\n instance.destroy();\n },\n });\n\n driverRef.current = instance;\n instance.drive();\n },\n [report, next, previous, done, progress],\n );\n\n useEffect(\n () => () => {\n report('dismissed');\n driverRef.current?.destroy();\n driverRef.current = null;\n },\n [report],\n );\n\n const value = useMemo(() => ({ startTour }), [startTour]);\n\n return (\n <TourContext.Provider value={value}>{children}</TourContext.Provider>\n );\n}\n\nexport function useTourController(): TourControllerValue {\n const context = useContext(TourContext);\n\n if (!context) {\n throw new Error(\n 'useTourController must be used inside a TourProvider.',\n );\n }\n\n return context;\n}\n\nexport function useTour(\n definition: TourDefinition,\n options?: { enabled?: boolean },\n): { restart: () => void } {\n const { startTour } = useTourController();\n const enabled = options?.enabled ?? true;\n\n const definitionRef = useRef(definition);\n definitionRef.current = definition;\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const frame = window.requestAnimationFrame(() =>\n startTour(definitionRef.current),\n );\n\n return () => window.cancelAnimationFrame(frame);\n }, [definition.id, definition.version, enabled, startTour]);\n\n return { restart: () => startTour(definitionRef.current, { force: true }) };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,IAAM,kBAAmC;AAAA,EAC5C,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AACrB;AAIO,SAAS,WACZ,QACA,OACkB;AAClB,QAAM,QAAQ,OAAO,KAAK;AAE1B,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAEtD,SAAO,SAAS;AAAA,IACZ,CAAC,YAAY,OAAO,YAAY,YAAY,QAAQ,SAAS;AAAA,EACjE;AACJ;;;AChCA,SAAS,eAAe,kBAAkC;AAqClD;AA5BR,IAAM,mBAAmB,cAAqC;AAAA,EAC1D,QAAQ,CAAC;AAAA,EACT,YAAY;AAChB,CAAC;AAEM,SAAS,sBAEd;AACE,QAAM,UAAU,WAAW,gBAAgB;AAC3C,QAAM,SAAS,YAAY,aAAa,iBAAiB,QAAQ,MAAM;AAEvE,SAAO,EAAE,GAAG,SAAS,OAAO;AAChC;AAEO,SAAS,kBAAkB;AAAA,EAC9B,SAAS,CAAC;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACJ,GAMG;AACC,SACI;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACG,OAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACTY,gBAAAA,MAoDJ,YApDI;AAhBL,SAAS,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAAuC;AACnC,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAA,KAAC,SAAI,aAAW,UAAU,WAAW,GAAG,cAAc,SAAS,GAC1D,UACL;AAAA;AAAA,EACJ;AAER;AAMO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA,WAAW;AACf,GAAyC;AACrC,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AAEA,SACI,gBAAAA,KAAC,SAAM,UACH,0BAAAA,KAAC,oBAAkB,mBAAQ,GAC/B;AAER;AAaO,SAAS,eAAe;AAAA,EAC3B,KAAK;AAAA,EACL,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AACf,GAAwC;AACpC,QAAM,EAAE,QAAQ,OAAO,IAAI,oBAAoB;AAC/C,QAAM,UAAU,SAAS,WAAW,QAAQ,IAAI;AAEhD,SACI,qBAAC,SAAM,IAAQ,OAAO,SAAS,UAAoB,UAC/C;AAAA,oBAAAA,KAAC,cAAY,mBAAS,OAAO,YAAW;AAAA,IACxC,gBAAAA,KAAC,gBACG,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,cAAa;AAAA,QACb;AAAA,QACA,aAAa,eAAe,OAAO;AAAA;AAAA,IACvC,GACJ;AAAA,KACJ;AAER;AAgBO,SAAS,kBAAkB;AAAA,EAC9B,KAAK;AAAA,EACL,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAA2C;AACvC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,SAAS,WAAW,QAAQ,QAAQ,IAAI;AACxD,QAAM,OAAO,YAAY,iBAAiB,QAAQ,aAAa;AAE/D,SACI,qBAAC,SAAM,IAAQ,OAAO,SAAS,UAAoB,UAC/C;AAAA,oBAAAA,KAAC,cAAY,mBAAS,QAAQ,OAAO,eAAc;AAAA,IACnD,gBAAAA,KAAC,gBACG,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAa;AAAA,QACb;AAAA,QACA,aACI,eAAe,QAAQ,OAAO;AAAA;AAAA,IAEtC,GACJ;AAAA,IACC,sBACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,WAAU;AAAA,QAET,iCAAuB,QAAQ,OAAO;AAAA;AAAA,IAC3C;AAAA,KAER;AAER;AASO,SAAS,kBAAkB;AAAA,EAC9B,KAAK;AAAA,EACL,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAA2C;AACvC,QAAM,EAAE,OAAO,IAAI,oBAAoB;AAEvC,SACI,qBAAC,SAAI,aAAW,UAAU,WAAU,2BAChC;AAAA,oBAAAA,KAAC,YAAS,IAAQ,MAAY,UAAoB;AAAA,IAClD,gBAAAA,KAAC,SAAM,SAAS,IAAK,mBAAS,OAAO,eAAc;AAAA,KACvD;AAER;AASO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAAyC;AACrC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,cAAc,QAAQ;AACtC,QAAM,eAAe,mBAAmB,QAAQ,OAAO;AAEvD,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,MAAK;AAAA,MACL,WAAU;AAAA,MACV;AAAA,MACA,cAAY,UAAU,eAAe;AAAA,MACrC,SAAS;AAAA,MACT,cAAc;AAAA,MAEb,oBAAU,eAAgB,SAAS,QAAQ,OAAO;AAAA;AAAA,EACvD;AAER;;;AClMQ,SAQI,OAAAC,MARJ,QAAAC,aAAA;AAXD,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,GAAyC;AACrC,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,wBAAAD,KAAC,mBAAgB,SAAS,QAAQ;AAAA,QAClC,gBAAAA,KAAC,kBAAe;AAAA,QAChB,gBAAAA,KAAC,qBAAkB,oBAAwC;AAAA,QAC3D,gBAAAA,KAAC,qBAAkB;AAAA,QACnB,gBAAAA,KAAC,mBAAgB;AAAA;AAAA;AAAA,EACrB;AAER;;;ACzCO,IAAM,YAAY;AAAA,EACrB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AACZ;;;ACVO,SAAS,mBACZ,OACA,YACU;AACV,SAAO,MAAM;AAAA,IACT,CAAC,SAAS,CAAC,KAAK,eAAe,KAAK,YAAY,SAAS,UAAU;AAAA,EACvE;AACJ;AAEO,SAAS,aACZ,OACA,WACU;AACV,SAAO,MAAM,OAAO,CAAC,SAAS,UAAU,KAAK,MAAM,CAAC;AACxD;AAEO,SAAS,gBAAgB,OAKpB;AACR,MAAI,MAAM,sBAAsB,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,MAAI,MAAM,OAAO;AACb,WAAO;AAAA,EACX;AAEA,SAAO,MAAM,WAAW,WAAW,MAAM,KAAK,MAAM,WAAW,EAAE,KAAK;AAC1E;;;ACNO,IAAM,sBAAkC;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AACd;;;ACpCA,SAAS,cAA2B;AACpC;AAAA,EACI,iBAAAE;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGG;AAEP,OAAO;AAoKC,gBAAAC,YAAA;AAhJR,IAAM,cAAcC,eAA0C,IAAI;AAElE,IAAM,oBAAoB;AAE1B,IAAM,kBAAkB;AAExB,SAAS,oBAAoC;AACzC,SAAO,OAAO,aAAa,oBAAoB,WAAW;AAC9D;AAEA,SAAS,UAAU,UAAkB,aAAmC;AACpE,MAAI,CAAC,aAAa;AACd,WAAO;AAAA,EACX;AAEA,SAAO,SAAS,YAAY,IAAI,YAAY;AAChD;AAEO,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAIkB;AACd,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,QAAM,YAAY,OAAsB,IAAI;AAC5C,QAAM,YAAY,OAIR,IAAI;AAEd,QAAM,EAAE,MAAM,UAAU,MAAM,SAAS,IAAI;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAS,YAAY,CAAC,YAA+B;AACvD,UAAM,SAAS,UAAU;AAEzB,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAEA,cAAU,UAAU;AAEpB,kBAAc,QAAQ;AAAA,MAClB,MAAM,OAAO,WAAW;AAAA,MACxB,SAAS,OAAO,WAAW;AAAA,MAC3B,UAAU,OAAO;AAAA,MACjB;AAAA,IACJ,CAAC;AAAA,EACL,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY;AAAA,IACd,CAAC,YAA4B,YAAwC;AACjE,YAAM,iBACF,UAAU,SAAS,WAAW,OAAO,WAAW;AAEpD,UAAI,kBAAkB,CAAC,SAAS,OAAO;AACnC;AAAA,MACJ;AAEA,YAAM,QAAQ;AAAA,QACV,WAAW;AAAA,QACX,kBAAkB;AAAA,MACtB;AAEA,YAAM,UAAU,gBAAgB;AAAA,QAC5B;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,mBAAmB,MAAM;AAAA,QACzB,OAAO,SAAS;AAAA,MACpB,CAAC;AAED,UAAI,CAAC,SAAS;AACV;AAAA,MACJ;AAEA,gBAAU,SAAS,QAAQ;AAC3B,gBAAU,UAAU,EAAE,YAAY,UAAU,GAAG,aAAa,MAAM;AAElE,YAAM,WAAW,OAAO;AAAA,QACpB,cAAc;AAAA,QACd,cAAc;AAAA,QACd,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UACxB,SAAS,KAAK;AAAA,UACd,SAAS;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,aAAa,KAAK;AAAA,UACtB;AAAA,QACJ,EAAE;AAAA,QACF,oBAAoB,MAAM;AACtB,cAAI,UAAU,SAAS;AACnB,sBAAU,QAAQ,WACd,SAAS,eAAe,KAAK;AACjC,sBAAU,QAAQ,cAAc;AAAA,UACpC;AAAA,QACJ;AAAA,QACA,kBAAkB,MAAM;AACpB;AAAA,YACI;AAAA,cACI;AAAA,cACA,UAAU,SAAS,eAAe;AAAA,YACtC;AAAA,UACJ;AACA,mBAAS,QAAQ;AAAA,QACrB;AAAA,MACJ,CAAC;AAED,gBAAU,UAAU;AACpB,eAAS,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,QAAQ,MAAM,UAAU,MAAM,QAAQ;AAAA,EAC3C;AAEA;AAAA,IACI,MAAM,MAAM;AACR,aAAO,WAAW;AAClB,gBAAU,SAAS,QAAQ;AAC3B,gBAAU,UAAU;AAAA,IACxB;AAAA,IACA,CAAC,MAAM;AAAA,EACX;AAEA,QAAM,QAAQ,QAAQ,OAAO,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC;AAExD,SACI,gBAAAD,KAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AAEtD;AAEO,SAAS,oBAAyC;AACrD,QAAM,UAAUE,YAAW,WAAW;AAEtC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,SAAS,QACZ,YACA,SACuB;AACvB,QAAM,EAAE,UAAU,IAAI,kBAAkB;AACxC,QAAM,UAAU,SAAS,WAAW;AAEpC,QAAM,gBAAgB,OAAO,UAAU;AACvC,gBAAc,UAAU;AAExB,YAAU,MAAM;AACZ,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AAEA,UAAM,QAAQ,OAAO;AAAA,MAAsB,MACvC,UAAU,cAAc,OAAO;AAAA,IACnC;AAEA,WAAO,MAAM,OAAO,qBAAqB,KAAK;AAAA,EAClD,GAAG,CAAC,WAAW,IAAI,WAAW,SAAS,SAAS,SAAS,CAAC;AAE1D,SAAO,EAAE,SAAS,MAAM,UAAU,cAAc,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE;AAC9E;","names":["jsx","jsx","jsxs","createContext","useContext","jsx","createContext","useContext"]}
@@ -1,8 +1,14 @@
1
- import { focusRing, glassControl, controlFill, cn } from './chunk-KHOA4TEI.js';
2
- import * as TogglePrimitive from '@radix-ui/react-toggle';
3
- import { cva } from 'class-variance-authority';
4
- import { jsx } from 'react/jsx-runtime';
1
+ import {
2
+ cn,
3
+ controlFill,
4
+ focusRing,
5
+ glassControl
6
+ } from "./chunk-PPWJK5T3.js";
5
7
 
8
+ // src/components/ui/toggle.tsx
9
+ import * as TogglePrimitive from "@radix-ui/react-toggle";
10
+ import { cva } from "class-variance-authority";
11
+ import { jsx } from "react/jsx-runtime";
6
12
  var toggleVariants = cva(
7
13
  `inline-flex items-center justify-center gap-2 rounded-xl text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:font-semibold data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 transition-[color,box-shadow] aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,
8
14
  {
@@ -40,6 +46,8 @@ function Toggle({
40
46
  );
41
47
  }
42
48
 
43
- export { Toggle, toggleVariants };
44
- //# sourceMappingURL=chunk-YBXRJSR3.js.map
45
- //# sourceMappingURL=chunk-YBXRJSR3.js.map
49
+ export {
50
+ toggleVariants,
51
+ Toggle
52
+ };
53
+ //# sourceMappingURL=chunk-CAUTXZ4U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/toggle.tsx"],"sourcesContent":["import * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { controlFill, focusRing, glassControl } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nconst toggleVariants = cva(\n `inline-flex items-center justify-center gap-2 rounded-xl text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:font-semibold data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 transition-[color,box-shadow] aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: `${glassControl} ${controlFill} hover:bg-accent hover:text-accent-foreground`,\n },\n size: {\n default: 'h-11 px-4 min-w-11',\n sm: 'h-9 px-3 min-w-9',\n lg: 'h-12 px-6 min-w-12',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n slotName = 'toggle',\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants> &\n SlotNameProps) {\n return (\n <TogglePrimitive.Root\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport { Toggle, toggleVariants };\n"],"mappings":";;;;;;;;AAAA,YAAY,qBAAqB;AACjC,SAAS,WAA8B;AAsC/B;AA/BR,IAAM,iBAAiB;AAAA,EACnB,4bAA4b,SAAS;AAAA,EACrc;AAAA,IACI,UAAU;AAAA,MACN,SAAS;AAAA,QACL,SAAS;AAAA,QACT,SAAS,GAAG,YAAY,IAAI,WAAW;AAAA,MAC3C;AAAA,MACA,MAAM;AAAA,QACF,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MACR;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACb,SAAS;AAAA,MACT,MAAM;AAAA,IACV;AAAA,EACJ;AACJ;AAEA,SAAS,OAAO;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACP,GAEmB;AACf,SACI;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MACzD,GAAG;AAAA,MACJ,aAAW;AAAA;AAAA,EACf;AAER;","names":[]}