@akira-io/ui 1.3.0 → 2.0.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 (76) 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-IE6VWUSB.js → chunk-2V6HUWST.js} +19 -6
  6. package/dist/chunk-2V6HUWST.js.map +1 -0
  7. package/dist/{chunk-UTSTTTH5.js → chunk-3Z2VGVPI.js} +18 -8
  8. package/dist/chunk-3Z2VGVPI.js.map +1 -0
  9. package/dist/{chunk-PSJGAZIS.js → chunk-B3L6PRLX.js} +208 -100
  10. package/dist/chunk-B3L6PRLX.js.map +1 -0
  11. package/dist/chunk-DE2AJ54R.js +458 -0
  12. package/dist/chunk-DE2AJ54R.js.map +1 -0
  13. package/dist/{chunk-QNF4LJVT.js → chunk-E26KKMGS.js} +8 -6
  14. package/dist/chunk-E26KKMGS.js.map +1 -0
  15. package/dist/{chunk-O5DZTX7D.js → chunk-EYPM6IMS.js} +30 -34
  16. package/dist/chunk-EYPM6IMS.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-I5UZAJB4.js → chunk-KHOA4TEI.js} +85 -30
  20. package/dist/chunk-KHOA4TEI.js.map +1 -0
  21. package/dist/chunk-L2H5GIF7.js +5 -4
  22. package/dist/chunk-L2H5GIF7.js.map +1 -1
  23. package/dist/{chunk-NA33PNQO.js → chunk-SZUXATOF.js} +170 -76
  24. package/dist/chunk-SZUXATOF.js.map +1 -0
  25. package/dist/chunk-TM5MN3MI.js +29 -0
  26. package/dist/chunk-TM5MN3MI.js.map +1 -0
  27. package/dist/{chunk-7LBWPBVE.js → chunk-UCJTM3UM.js} +259 -248
  28. package/dist/chunk-UCJTM3UM.js.map +1 -0
  29. package/dist/{chunk-MCMBS2SB.js → chunk-UXVI326F.js} +15 -8
  30. package/dist/chunk-UXVI326F.js.map +1 -0
  31. package/dist/chunk-VA6A4HZ2.js +394 -0
  32. package/dist/chunk-VA6A4HZ2.js.map +1 -0
  33. package/dist/{chunk-SBLZ6T3D.js → chunk-YBXRJSR3.js} +15 -7
  34. package/dist/chunk-YBXRJSR3.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-Soro3B1I.d.ts} +5 -4
  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 +14 -11
  44. package/dist/index.js +1107 -635
  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/pt.d.ts +9 -8
  52. package/dist/locales/pt.js +40 -3
  53. package/dist/locales/pt.js.map +1 -1
  54. package/dist/shells.d.ts +46 -5
  55. package/dist/shells.js +211 -71
  56. package/dist/shells.js.map +1 -1
  57. package/dist/{sidebar-Bp6Q46j-.d.ts → sidebar-BLL2tgTt.d.ts} +2 -2
  58. package/dist/types-1LUmNJf_.d.ts +41 -0
  59. package/dist/{types-cmBL8zOc.d.ts → types-CMZRvMV5.d.ts} +1 -1
  60. package/dist/{types-B-eGPoFD.d.ts → types-CfAUvz--.d.ts} +1 -1
  61. package/package.json +4 -2
  62. package/theme.css +3 -0
  63. package/themes/nosferry.css +2 -2
  64. package/dist/chunk-7LBWPBVE.js.map +0 -1
  65. package/dist/chunk-I5UZAJB4.js.map +0 -1
  66. package/dist/chunk-IE6VWUSB.js.map +0 -1
  67. package/dist/chunk-MCMBS2SB.js.map +0 -1
  68. package/dist/chunk-NA33PNQO.js.map +0 -1
  69. package/dist/chunk-NGMG2UWX.js +0 -172
  70. package/dist/chunk-NGMG2UWX.js.map +0 -1
  71. package/dist/chunk-O5DZTX7D.js.map +0 -1
  72. package/dist/chunk-PSJGAZIS.js.map +0 -1
  73. package/dist/chunk-QNF4LJVT.js.map +0 -1
  74. package/dist/chunk-SBLZ6T3D.js.map +0 -1
  75. package/dist/chunk-UTSTTTH5.js.map +0 -1
  76. package/dist/types-u1qfmJQi.d.ts +0 -28
@@ -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":"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","names":["jsx","jsx","jsxs","createContext","useContext","jsx","createContext","useContext"]}
@@ -1,7 +1,6 @@
1
- import { createContext, useContext } from 'react';
2
- import { jsx } from 'react/jsx-runtime';
3
-
4
1
  // src/locales/context.tsx
2
+ import { createContext, useContext } from "react";
3
+ import { jsx } from "react/jsx-runtime";
5
4
  var EMPTY = {};
6
5
  var UiLocaleContext = createContext(EMPTY);
7
6
  function UiLocaleProvider({
@@ -30,6 +29,9 @@ function useUiLabels(section, defaults, overrides) {
30
29
  };
31
30
  }
32
31
 
33
- export { UiLocaleProvider, useUiLabels, useUiLocale };
34
- //# sourceMappingURL=chunk-QNF4LJVT.js.map
35
- //# sourceMappingURL=chunk-QNF4LJVT.js.map
32
+ export {
33
+ UiLocaleProvider,
34
+ useUiLocale,
35
+ useUiLabels
36
+ };
37
+ //# sourceMappingURL=chunk-E26KKMGS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locales/context.tsx"],"sourcesContent":["import type { CommandPaletteLabels } from '@/blocks/command-palette';\nimport type {\n DateFilterLabels,\n DateFilterOption,\n} from '@/blocks/date-filter/types';\nimport type { LoginFormLabels } from '@/blocks/login-form/types';\nimport type { SettingsLabels } from '@/blocks/settings-page';\nimport type { TourLabels } from '@/blocks/tour/types';\nimport type { AlertLabels } from '@/components/ui/alert';\nimport type { AppearanceToggleLabels } from '@/components/ui/appearance-toggle';\nimport type { CodeBlockLabels } from '@/components/ui/code-block';\nimport type { ComboboxLabels } from '@/components/ui/combobox';\nimport type { ConfirmDialogLabels } from '@/components/ui/confirm-dialog';\nimport type { CopyButtonLabels } from '@/components/ui/copy-button';\nimport type { DataTableLabels } from '@/components/ui/data-table';\nimport type { DataTableFacetedFilterLabels } from '@/components/ui/data-table-faceted-filter';\nimport type { DatePickerLabels } from '@/components/ui/date-picker';\nimport type { DateRangeFilterLabels } from '@/components/ui/date-range-filter';\nimport type { FloatingSheetLabels } from '@/components/ui/floating-sheet-context';\nimport type { JsonViewerLabels } from '@/components/ui/json-viewer';\nimport type { PasswordInputLabels } from '@/components/ui/password-input';\nimport type { SaveStatusLabels } from '@/components/ui/save-status';\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport interface UiLabelSections {\n alert: AlertLabels;\n appearanceToggle: AppearanceToggleLabels;\n codeBlock: CodeBlockLabels;\n combobox: ComboboxLabels;\n commandPalette: CommandPaletteLabels;\n confirmDialog: ConfirmDialogLabels;\n copyButton: CopyButtonLabels;\n dataTable: DataTableLabels;\n dataTableFacetedFilter: DataTableFacetedFilterLabels;\n dateFilter: DateFilterLabels;\n datePicker: DatePickerLabels;\n dateRangeFilter: DateRangeFilterLabels;\n floatingSheet: FloatingSheetLabels;\n jsonViewer: JsonViewerLabels;\n loginForm: LoginFormLabels;\n passwordInput: PasswordInputLabels;\n saveStatus: SaveStatusLabels;\n settings: SettingsLabels;\n tour: TourLabels;\n}\n\nexport type UiLabels = {\n [Section in keyof UiLabelSections]?: Partial<UiLabelSections[Section]>;\n} & {\n dateFilterPresets?: DateFilterOption[];\n dateFilterOperators?: DateFilterOption[];\n dateFilterUnits?: DateFilterOption[];\n};\n\nconst EMPTY: UiLabels = {};\n\nconst UiLocaleContext = createContext<UiLabels>(EMPTY);\n\nexport function UiLocaleProvider({\n labels,\n children,\n}: {\n labels: UiLabels;\n children: ReactNode;\n}) {\n return (\n <UiLocaleContext.Provider value={labels}>\n {children}\n </UiLocaleContext.Provider>\n );\n}\n\nexport function useUiLocale(): UiLabels {\n return useContext(UiLocaleContext);\n}\n\nfunction defined(source: object | undefined): Record<string, unknown> {\n if (!source) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([, value]) => value !== undefined),\n );\n}\n\nexport function useUiLabels<Section extends keyof UiLabelSections>(\n section: Section,\n defaults: UiLabelSections[Section],\n overrides?: Partial<UiLabelSections[Section]>,\n): UiLabelSections[Section] {\n const locale = useUiLocale();\n\n return {\n ...defaults,\n ...defined(locale[section]),\n ...defined(overrides),\n } as UiLabelSections[Section];\n}\n"],"mappings":";AAsBA,SAAS,eAAe,kBAAkC;AA4ClD;AAZR,IAAM,QAAkB,CAAC;AAEzB,IAAM,kBAAkB,cAAwB,KAAK;AAE9C,SAAS,iBAAiB;AAAA,EAC7B;AAAA,EACA;AACJ,GAGG;AACC,SACI,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,QAC5B,UACL;AAER;AAEO,SAAS,cAAwB;AACpC,SAAO,WAAW,eAAe;AACrC;AAEA,SAAS,QAAQ,QAAqD;AAClE,MAAI,CAAC,QAAQ;AACT,WAAO,CAAC;AAAA,EACZ;AAEA,SAAO,OAAO;AAAA,IACV,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAAA,EACpE;AACJ;AAEO,SAAS,YACZ,SACA,UACA,WACwB;AACxB,QAAM,SAAS,YAAY;AAE3B,SAAO;AAAA,IACH,GAAG;AAAA,IACH,GAAG,QAAQ,OAAO,OAAO,CAAC;AAAA,IAC1B,GAAG,QAAQ,SAAS;AAAA,EACxB;AACJ;","names":[]}
@@ -1,32 +1,35 @@
1
- import { cn, modalSurface } from './chunk-I5UZAJB4.js';
2
- import { XIcon } from 'lucide-react';
3
- import { Dialog as Dialog$1 } from 'radix-ui';
4
- import { jsx, jsxs } from 'react/jsx-runtime';
5
- import * as LabelPrimitive from '@radix-ui/react-label';
1
+ import {
2
+ cn,
3
+ modalSurface
4
+ } from "./chunk-KHOA4TEI.js";
6
5
 
6
+ // src/components/ui/dialog.tsx
7
+ import { XIcon } from "lucide-react";
8
+ import { Dialog as DialogPrimitive } from "radix-ui";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
7
10
  function Dialog({
8
11
  slotName = "dialog",
9
12
  ...props
10
13
  }) {
11
- return /* @__PURE__ */ jsx(Dialog$1.Root, { ...props, "data-slot": slotName });
14
+ return /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...props, "data-slot": slotName });
12
15
  }
13
16
  function DialogTrigger({
14
17
  slotName = "dialog-trigger",
15
18
  ...props
16
19
  }) {
17
- return /* @__PURE__ */ jsx(Dialog$1.Trigger, { ...props, "data-slot": slotName });
20
+ return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { ...props, "data-slot": slotName });
18
21
  }
19
22
  function DialogPortal({
20
23
  slotName = "dialog-portal",
21
24
  ...props
22
25
  }) {
23
- return /* @__PURE__ */ jsx(Dialog$1.Portal, { ...props, "data-slot": slotName });
26
+ return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { ...props, "data-slot": slotName });
24
27
  }
25
28
  function DialogClose({
26
29
  slotName = "dialog-close",
27
30
  ...props
28
31
  }) {
29
- return /* @__PURE__ */ jsx(Dialog$1.Close, { ...props, "data-slot": slotName });
32
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...props, "data-slot": slotName });
30
33
  }
31
34
  function DialogOverlay({
32
35
  className,
@@ -34,7 +37,7 @@ function DialogOverlay({
34
37
  ...props
35
38
  }) {
36
39
  return /* @__PURE__ */ jsx(
37
- Dialog$1.Overlay,
40
+ DialogPrimitive.Overlay,
38
41
  {
39
42
  className: cn(
40
43
  "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 inset-0 bg-black/60 backdrop-blur-sm fixed z-50",
@@ -55,7 +58,7 @@ function DialogContent({
55
58
  return /* @__PURE__ */ jsxs(DialogPortal, { slotName: "dialog-portal", children: [
56
59
  /* @__PURE__ */ jsx(DialogOverlay, {}),
57
60
  /* @__PURE__ */ jsxs(
58
- Dialog$1.Content,
61
+ DialogPrimitive.Content,
59
62
  {
60
63
  className: cn(
61
64
  `${modalSurface} 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 gap-6 p-6 sm:w-full sm:max-w-lg fixed top-[50%] left-[50%] z-50 grid w-[calc(100%-2rem)] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] overflow-hidden duration-200`,
@@ -65,7 +68,7 @@ function DialogContent({
65
68
  "data-slot": slotName,
66
69
  children: [
67
70
  children,
68
- !hideCloseButton && /* @__PURE__ */ jsxs(Dialog$1.Close, { className: "top-6 right-6 h-10 w-10 shadow-xs absolute z-50 flex items-center justify-center rounded-full border border-border bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-foreground", children: [
71
+ !hideCloseButton && /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "top-6 right-6 h-10 w-10 shadow-xs absolute z-50 flex items-center justify-center rounded-full border border-border bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-foreground", children: [
69
72
  /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5" }),
70
73
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
71
74
  ] })
@@ -114,7 +117,7 @@ function DialogTitle({
114
117
  ...props
115
118
  }) {
116
119
  return /* @__PURE__ */ jsx(
117
- Dialog$1.Title,
120
+ DialogPrimitive.Title,
118
121
  {
119
122
  className: cn(
120
123
  "text-2xl font-bold tracking-tight md:text-3xl text-foreground",
@@ -131,7 +134,7 @@ function DialogDescription({
131
134
  ...props
132
135
  }) {
133
136
  return /* @__PURE__ */ jsx(
134
- Dialog$1.Description,
137
+ DialogPrimitive.Description,
135
138
  {
136
139
  className: cn(
137
140
  "text-base font-medium leading-relaxed text-muted-foreground",
@@ -142,24 +145,17 @@ function DialogDescription({
142
145
  }
143
146
  );
144
147
  }
145
- function Label({
146
- className,
147
- slotName = "label",
148
- ...props
149
- }) {
150
- return /* @__PURE__ */ jsx(
151
- LabelPrimitive.Root,
152
- {
153
- className: cn(
154
- "text-sm font-medium text-foreground select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
155
- className
156
- ),
157
- ...props,
158
- "data-slot": slotName
159
- }
160
- );
161
- }
162
148
 
163
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Label };
164
- //# sourceMappingURL=chunk-O5DZTX7D.js.map
165
- //# sourceMappingURL=chunk-O5DZTX7D.js.map
149
+ export {
150
+ Dialog,
151
+ DialogTrigger,
152
+ DialogPortal,
153
+ DialogClose,
154
+ DialogOverlay,
155
+ DialogContent,
156
+ DialogHeader,
157
+ DialogFooter,
158
+ DialogTitle,
159
+ DialogDescription
160
+ };
161
+ //# sourceMappingURL=chunk-EYPM6IMS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/dialog.tsx"],"sourcesContent":["import { XIcon } from 'lucide-react';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { modalSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Dialog({\n slotName = 'dialog',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root> & SlotNameProps) {\n return <DialogPrimitive.Root {...props} data-slot={slotName} />;\n}\n\nfunction DialogTrigger({\n slotName = 'dialog-trigger',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger> & SlotNameProps) {\n return <DialogPrimitive.Trigger {...props} data-slot={slotName} />;\n}\n\nfunction DialogPortal({\n slotName = 'dialog-portal',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal> & SlotNameProps) {\n return <DialogPrimitive.Portal {...props} data-slot={slotName} />;\n}\n\nfunction DialogClose({\n slotName = 'dialog-close',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close> & SlotNameProps) {\n return <DialogPrimitive.Close {...props} data-slot={slotName} />;\n}\n\nfunction DialogOverlay({\n className,\n slotName = 'dialog-overlay',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay> & SlotNameProps) {\n return (\n <DialogPrimitive.Overlay\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 inset-0 bg-black/60 backdrop-blur-sm fixed z-50',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\ninterface DialogContentProps extends React.ComponentProps<\n typeof DialogPrimitive.Content\n> {\n hideCloseButton?: boolean;\n}\n\nfunction DialogContent({\n className,\n children,\n hideCloseButton = false,\n slotName = 'dialog-content',\n ...props\n}: DialogContentProps & SlotNameProps) {\n return (\n <DialogPortal slotName=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n className={cn(\n `${modalSurface} 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 gap-6 p-6 sm:w-full sm:max-w-lg fixed top-[50%] left-[50%] z-50 grid w-[calc(100%-2rem)] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] overflow-hidden duration-200`,\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {children}\n {!hideCloseButton && (\n <DialogPrimitive.Close className=\"top-6 right-6 h-10 w-10 shadow-xs absolute z-50 flex items-center justify-center rounded-full border border-border bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\">\n <XIcon className=\"h-5 w-5\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({\n className,\n slotName = 'dialog-header',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n className={cn(\n 'gap-2 p-6 md:p-8 flex flex-col text-center',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DialogFooter({\n className,\n slotName = 'dialog-footer',\n ...props\n}: React.ComponentProps<'div'> & SlotNameProps) {\n return (\n <div\n className={cn(\n 'gap-3 p-6 md:p-8 sm:flex-row sm:justify-end flex flex-col-reverse border-t border-border',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n slotName = 'dialog-title',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title> & SlotNameProps) {\n return (\n <DialogPrimitive.Title\n className={cn(\n 'text-2xl font-bold tracking-tight md:text-3xl text-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n slotName = 'dialog-description',\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description> & SlotNameProps) {\n return (\n <DialogPrimitive.Description\n className={cn(\n 'text-base font-medium leading-relaxed text-muted-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n"],"mappings":";;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,UAAU,uBAAuB;AAW/B,cAmES,YAnET;AAJX,SAAS,OAAO;AAAA,EACZ,WAAW;AAAA,EACX,GAAG;AACP,GAAsE;AAClE,SAAO,oBAAC,gBAAgB,MAAhB,EAAsB,GAAG,OAAO,aAAW,UAAU;AACjE;AAEA,SAAS,cAAc;AAAA,EACnB,WAAW;AAAA,EACX,GAAG;AACP,GAAyE;AACrE,SAAO,oBAAC,gBAAgB,SAAhB,EAAyB,GAAG,OAAO,aAAW,UAAU;AACpE;AAEA,SAAS,aAAa;AAAA,EAClB,WAAW;AAAA,EACX,GAAG;AACP,GAAwE;AACpE,SAAO,oBAAC,gBAAgB,QAAhB,EAAwB,GAAG,OAAO,aAAW,UAAU;AACnE;AAEA,SAAS,YAAY;AAAA,EACjB,WAAW;AAAA,EACX,GAAG;AACP,GAAuE;AACnE,SAAO,oBAAC,gBAAgB,OAAhB,EAAuB,GAAG,OAAO,aAAW,UAAU;AAClE;AAEA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACP,GAAyE;AACrE,SACI;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MACJ,aAAW;AAAA;AAAA,EACf;AAER;AAQA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,GAAG;AACP,GAAuC;AACnC,SACI,qBAAC,gBAAa,UAAS,iBACnB;AAAA,wBAAC,iBAAc;AAAA,IACf;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACG,WAAW;AAAA,UACP,GAAG,YAAY;AAAA,UACf;AAAA,QACJ;AAAA,QACC,GAAG;AAAA,QACJ,aAAW;AAAA,QAEV;AAAA;AAAA,UACA,CAAC,mBACE,qBAAC,gBAAgB,OAAhB,EAAsB,WAAU,6MAC7B;AAAA,gCAAC,SAAM,WAAU,WAAU;AAAA,YAC3B,oBAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aACnC;AAAA;AAAA;AAAA,IAER;AAAA,KACJ;AAER;AAEA,SAAS,aAAa;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACP,GAAgD;AAC5C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MACJ,aAAW;AAAA;AAAA,EACf;AAER;AAEA,SAAS,aAAa;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACP,GAAgD;AAC5C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MACJ,aAAW;AAAA;AAAA,EACf;AAER;AAEA,SAAS,YAAY;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACP,GAAuE;AACnE,SACI;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MACJ,aAAW;AAAA;AAAA,EACf;AAER;AAEA,SAAS,kBAAkB;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACP,GAA6E;AACzE,SACI;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MACJ,aAAW;AAAA;AAAA,EACf;AAER;","names":[]}
@@ -1,6 +1,5 @@
1
- import { useState, useCallback, useEffect } from 'react';
2
-
3
1
  // src/hooks/use-appearance.tsx
2
+ import { useCallback, useEffect, useState } from "react";
4
3
  var prefersDark = () => {
5
4
  if (typeof window === "undefined") {
6
5
  return false;
@@ -54,6 +53,8 @@ function useAppearance() {
54
53
  return { appearance, updateAppearance };
55
54
  }
56
55
 
57
- export { initializeTheme, useAppearance };
58
- //# sourceMappingURL=chunk-IQMRJXEO.js.map
56
+ export {
57
+ initializeTheme,
58
+ useAppearance
59
+ };
59
60
  //# sourceMappingURL=chunk-IQMRJXEO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/use-appearance.tsx"],"names":[],"mappings":";;;AAIA,IAAM,cAAc,MAAM;AACtB,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,IAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC7D,CAAA;AAEA,IAAM,SAAA,GAAY,CAAC,IAAA,EAAc,KAAA,EAAe,OAAO,GAAA,KAAQ;AAC3D,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACjC,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA;AAChC,EAAA,QAAA,CAAS,SAAS,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,mBAAmB,MAAM,CAAA,aAAA,CAAA;AAC/D,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,UAAA,KAA2B;AAC3C,EAAA,MAAM,MAAA,GACF,UAAA,KAAe,MAAA,IAAW,UAAA,KAAe,YAAY,WAAA,EAAY;AAErE,EAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AACxD,EAAA,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,WAAA,GAAc,MAAA,GAAS,MAAA,GAAS,OAAA;AACnE,CAAA;AAEA,IAAM,aAAa,MAAM;AACrB,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA,CAAO,WAAW,8BAA8B,CAAA;AAC3D,CAAA;AAEA,IAAM,0BAA0B,MAAM;AAClC,EAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AAC3D,EAAA,UAAA,CAAW,qBAAqB,QAAQ,CAAA;AAC5C,CAAA;AAEO,SAAS,eAAA,GAAkB;AAC9B,EAAA,MAAM,eAAA,GACD,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA,IAAoB,QAAA;AAE1D,EAAA,UAAA,CAAW,eAAe,CAAA;AAE1B,EAAA,UAAA,EAAW,EAAG,gBAAA,CAAiB,QAAA,EAAU,uBAAuB,CAAA;AACpE;AAEO,SAAS,aAAA,GAAgB;AAC5B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAqB,QAAQ,CAAA;AAEjE,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,CAAC,IAAA,KAAqB;AACvD,IAAA,aAAA,CAAc,IAAI,CAAA;AAElB,IAAA,YAAA,CAAa,OAAA,CAAQ,cAAc,IAAI,CAAA;AACvC,IAAA,SAAA,CAAU,cAAc,IAAI,CAAA;AAC5B,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,kBAAkB,YAAA,CAAa,OAAA;AAAA,MACjC;AAAA,KACJ;AACA,IAAA,gBAAA,CAAiB,mBAAmB,QAAQ,CAAA;AAE5C,IAAA,MAAM,QAAQ,UAAA,EAAW;AAEzB,IAAA,KAAA,EAAO,gBAAA,CAAiB,UAAU,uBAAuB,CAAA;AAEzD,IAAA,OAAO,MACH,KAAA,EAAO,mBAAA,CAAoB,QAAA,EAAU,uBAAuB,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,OAAO,EAAE,YAAY,gBAAA,EAAiB;AAC1C","file":"chunk-IQMRJXEO.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nexport type Appearance = 'light' | 'dark' | 'system';\n\nconst prefersDark = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n};\n\nconst setCookie = (name: string, value: string, days = 365) => {\n if (typeof document === 'undefined') {\n return;\n }\n\n const maxAge = days * 24 * 60 * 60;\n document.cookie = `${name}=${value};path=/;max-age=${maxAge};SameSite=Lax`;\n};\n\nconst applyTheme = (appearance: Appearance) => {\n const isDark =\n appearance === 'dark' || (appearance === 'system' && prefersDark());\n\n document.documentElement.classList.toggle('dark', isDark);\n document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';\n};\n\nconst mediaQuery = () => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n return window.matchMedia('(prefers-color-scheme: dark)');\n};\n\nconst handleSystemThemeChange = () => {\n const currentAppearance = localStorage.getItem('appearance') as Appearance;\n applyTheme(currentAppearance || 'system');\n};\n\nexport function initializeTheme() {\n const savedAppearance =\n (localStorage.getItem('appearance') as Appearance) || 'system';\n\n applyTheme(savedAppearance);\n\n mediaQuery()?.addEventListener('change', handleSystemThemeChange);\n}\n\nexport function useAppearance() {\n const [appearance, setAppearance] = useState<Appearance>('system');\n\n const updateAppearance = useCallback((mode: Appearance) => {\n setAppearance(mode);\n\n localStorage.setItem('appearance', mode);\n setCookie('appearance', mode);\n applyTheme(mode);\n }, []);\n\n useEffect(() => {\n const savedAppearance = localStorage.getItem(\n 'appearance',\n ) as Appearance | null;\n updateAppearance(savedAppearance || 'system');\n\n const query = mediaQuery();\n\n query?.addEventListener('change', handleSystemThemeChange);\n\n return () =>\n query?.removeEventListener('change', handleSystemThemeChange);\n }, [updateAppearance]);\n\n return { appearance, updateAppearance } as const;\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/use-appearance.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nexport type Appearance = 'light' | 'dark' | 'system';\n\nconst prefersDark = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n};\n\nconst setCookie = (name: string, value: string, days = 365) => {\n if (typeof document === 'undefined') {\n return;\n }\n\n const maxAge = days * 24 * 60 * 60;\n document.cookie = `${name}=${value};path=/;max-age=${maxAge};SameSite=Lax`;\n};\n\nconst applyTheme = (appearance: Appearance) => {\n const isDark =\n appearance === 'dark' || (appearance === 'system' && prefersDark());\n\n document.documentElement.classList.toggle('dark', isDark);\n document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';\n};\n\nconst mediaQuery = () => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n return window.matchMedia('(prefers-color-scheme: dark)');\n};\n\nconst handleSystemThemeChange = () => {\n const currentAppearance = localStorage.getItem('appearance') as Appearance;\n applyTheme(currentAppearance || 'system');\n};\n\nexport function initializeTheme() {\n const savedAppearance =\n (localStorage.getItem('appearance') as Appearance) || 'system';\n\n applyTheme(savedAppearance);\n\n mediaQuery()?.addEventListener('change', handleSystemThemeChange);\n}\n\nexport function useAppearance() {\n const [appearance, setAppearance] = useState<Appearance>('system');\n\n const updateAppearance = useCallback((mode: Appearance) => {\n setAppearance(mode);\n\n localStorage.setItem('appearance', mode);\n setCookie('appearance', mode);\n applyTheme(mode);\n }, []);\n\n useEffect(() => {\n const savedAppearance = localStorage.getItem(\n 'appearance',\n ) as Appearance | null;\n updateAppearance(savedAppearance || 'system');\n\n const query = mediaQuery();\n\n query?.addEventListener('change', handleSystemThemeChange);\n\n return () =>\n query?.removeEventListener('change', handleSystemThemeChange);\n }, [updateAppearance]);\n\n return { appearance, updateAppearance } as const;\n}\n"],"mappings":";AAAA,SAAS,aAAa,WAAW,gBAAgB;AAIjD,IAAM,cAAc,MAAM;AACtB,MAAI,OAAO,WAAW,aAAa;AAC/B,WAAO;AAAA,EACX;AAEA,SAAO,OAAO,WAAW,8BAA8B,EAAE;AAC7D;AAEA,IAAM,YAAY,CAAC,MAAc,OAAe,OAAO,QAAQ;AAC3D,MAAI,OAAO,aAAa,aAAa;AACjC;AAAA,EACJ;AAEA,QAAM,SAAS,OAAO,KAAK,KAAK;AAChC,WAAS,SAAS,GAAG,IAAI,IAAI,KAAK,mBAAmB,MAAM;AAC/D;AAEA,IAAM,aAAa,CAAC,eAA2B;AAC3C,QAAM,SACF,eAAe,UAAW,eAAe,YAAY,YAAY;AAErE,WAAS,gBAAgB,UAAU,OAAO,QAAQ,MAAM;AACxD,WAAS,gBAAgB,MAAM,cAAc,SAAS,SAAS;AACnE;AAEA,IAAM,aAAa,MAAM;AACrB,MAAI,OAAO,WAAW,aAAa;AAC/B,WAAO;AAAA,EACX;AAEA,SAAO,OAAO,WAAW,8BAA8B;AAC3D;AAEA,IAAM,0BAA0B,MAAM;AAClC,QAAM,oBAAoB,aAAa,QAAQ,YAAY;AAC3D,aAAW,qBAAqB,QAAQ;AAC5C;AAEO,SAAS,kBAAkB;AAC9B,QAAM,kBACD,aAAa,QAAQ,YAAY,KAAoB;AAE1D,aAAW,eAAe;AAE1B,aAAW,GAAG,iBAAiB,UAAU,uBAAuB;AACpE;AAEO,SAAS,gBAAgB;AAC5B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAqB,QAAQ;AAEjE,QAAM,mBAAmB,YAAY,CAAC,SAAqB;AACvD,kBAAc,IAAI;AAElB,iBAAa,QAAQ,cAAc,IAAI;AACvC,cAAU,cAAc,IAAI;AAC5B,eAAW,IAAI;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACZ,UAAM,kBAAkB,aAAa;AAAA,MACjC;AAAA,IACJ;AACA,qBAAiB,mBAAmB,QAAQ;AAE5C,UAAM,QAAQ,WAAW;AAEzB,WAAO,iBAAiB,UAAU,uBAAuB;AAEzD,WAAO,MACH,OAAO,oBAAoB,UAAU,uBAAuB;AAAA,EACpE,GAAG,CAAC,gBAAgB,CAAC;AAErB,SAAO,EAAE,YAAY,iBAAiB;AAC1C;","names":[]}
@@ -1,12 +1,6 @@
1
- import { clsx } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
3
- import { cva } from 'class-variance-authority';
4
- import { LoaderCircle } from 'lucide-react';
5
- import { jsxs, jsx } from 'react/jsx-runtime';
6
- import { Slot } from '@radix-ui/react-slot';
7
- import * as React from 'react';
8
-
9
1
  // src/lib/utils.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
10
4
  function cn(...inputs) {
11
5
  return twMerge(clsx(inputs));
12
6
  }
@@ -28,13 +22,19 @@ var nestedSurfaceReset = "nested-surface:border-0 nested-surface:ring-0 nested-s
28
22
  var nestedEdgeToEdge = "nested-surface:rounded-none";
29
23
  var glassControl = "ring-1 ring-surface-ring border-0 shadow-(--glass-shadow) backdrop-blur-md backdrop-saturate-150";
30
24
  var controlFill = "bg-surface-control";
31
- var fieldSurface = `${glassControl} ${controlFill} ${controlRadius} text-foreground`;
25
+ var fieldText = "text-base sm:text-sm";
26
+ var fieldSurface = `${glassControl} ${controlFill} ${controlRadius} ${fieldText} text-foreground`;
32
27
  var focusRing = "focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring";
33
28
  var fieldFocus = `${focusRing} focus-visible:shadow-(--glass-elevation)`;
34
29
  var menuHighlight = "outline-hidden focus:bg-accent focus:text-accent-foreground";
35
30
  function surface(inset) {
36
31
  return inset ? `${elevatedSurface} ${recessedSurface}` : elevatedSurface;
37
32
  }
33
+
34
+ // src/components/ui/spinner.tsx
35
+ import { cva } from "class-variance-authority";
36
+ import { LoaderCircle } from "lucide-react";
37
+ import { jsx, jsxs } from "react/jsx-runtime";
38
38
  var spinnerVariants = cva("inline-flex shrink-0", {
39
39
  variants: {
40
40
  size: {
@@ -75,7 +75,13 @@ function Spinner({
75
75
  }
76
76
  );
77
77
  }
78
- var buttonVariants = cva(
78
+
79
+ // src/components/ui/button.tsx
80
+ import { Slot } from "@radix-ui/react-slot";
81
+ import { cva as cva2 } from "class-variance-authority";
82
+ import * as React from "react";
83
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
84
+ var buttonVariants = cva2(
79
85
  `inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-2xl text-sm font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,
80
86
  {
81
87
  variants: {
@@ -88,9 +94,9 @@ var buttonVariants = cva(
88
94
  link: "text-primary underline-offset-4 hover:underline"
89
95
  },
90
96
  size: {
91
- default: "h-11 px-4 has-[>svg]:px-3",
92
- sm: "h-9 gap-1.5 rounded-xl px-3 has-[>svg]:px-2.5",
93
- lg: "h-12 px-6 has-[>svg]:px-5 text-base",
97
+ default: "h-11 px-4 has-[>svg]:gap-3",
98
+ sm: "h-9 rounded-xl px-3 has-[>svg]:gap-2.5",
99
+ lg: "h-12 px-6 has-[>svg]:gap-4 text-base",
94
100
  icon: "size-11",
95
101
  "icon-sm": "size-9 rounded-xl",
96
102
  "icon-lg": "size-12"
@@ -107,6 +113,27 @@ function spinnerSize(size) {
107
113
  if (size === "lg" || size === "icon-lg") return "lg";
108
114
  return "default";
109
115
  }
116
+ var ICON_PADDING = {
117
+ default: { leading: "pl-3", trailing: "pr-2" },
118
+ sm: { leading: "pl-2.5", trailing: "pr-1.5" },
119
+ lg: { leading: "pl-4", trailing: "pr-3" },
120
+ icon: { leading: "", trailing: "" },
121
+ "icon-sm": { leading: "", trailing: "" },
122
+ "icon-lg": { leading: "", trailing: "" }
123
+ };
124
+ function iconPadding(size, children) {
125
+ const parts = React.Children.toArray(children).filter(
126
+ (part) => typeof part !== "string" || part.trim() !== ""
127
+ );
128
+ if (parts.length < 2) {
129
+ return "";
130
+ }
131
+ const edges = ICON_PADDING[size];
132
+ return cn(
133
+ React.isValidElement(parts[0]) && edges.leading,
134
+ React.isValidElement(parts[parts.length - 1]) && edges.trailing
135
+ );
136
+ }
110
137
  function loadingPadding(size) {
111
138
  if (size === "sm") return "px-2.5";
112
139
  if (size === "lg") return "px-5";
@@ -130,7 +157,11 @@ function Button({
130
157
  const hasLoadingState = loading !== void 0;
131
158
  const resolvedSize = size ?? "default";
132
159
  const baseClasses = buttonVariants({ variant, size: resolvedSize });
133
- const classes = cn(baseClasses, className);
160
+ const classes = cn(
161
+ baseClasses,
162
+ iconPadding(resolvedSize, children),
163
+ className
164
+ );
134
165
  const loadingClasses = cn(
135
166
  baseClasses,
136
167
  loadingPadding(resolvedSize),
@@ -154,13 +185,13 @@ function Button({
154
185
  event.stopPropagation();
155
186
  }
156
187
  } : void 0,
157
- /* @__PURE__ */ jsxs(
188
+ /* @__PURE__ */ jsxs2(
158
189
  "span",
159
190
  {
160
191
  "data-slot": "button-content",
161
192
  className: "inline-flex items-center gap-[inherit]",
162
193
  children: [
163
- /* @__PURE__ */ jsx(
194
+ /* @__PURE__ */ jsx2(
164
195
  "span",
165
196
  {
166
197
  "data-slot": "button-leading",
@@ -168,7 +199,7 @@ function Button({
168
199
  "inline-grid shrink-0 place-items-center",
169
200
  spinnerVariants({ size: mappedSpinnerSize2 })
170
201
  ),
171
- children: isLoading ? /* @__PURE__ */ jsx(
202
+ children: isLoading ? /* @__PURE__ */ jsx2(
172
203
  Spinner,
173
204
  {
174
205
  size: mappedSpinnerSize2,
@@ -178,8 +209,8 @@ function Button({
178
209
  ) : leadingVisual2
179
210
  }
180
211
  ),
181
- /* @__PURE__ */ jsx("span", { "data-slot": "button-label", children: label2 }),
182
- !hasLeadingVisual2 && !iconOnly2 && /* @__PURE__ */ jsx(
212
+ /* @__PURE__ */ jsx2("span", { "data-slot": "button-label", children: label2 }),
213
+ !hasLeadingVisual2 && !iconOnly2 && /* @__PURE__ */ jsx2(
183
214
  "span",
184
215
  {
185
216
  "aria-hidden": "true",
@@ -193,7 +224,7 @@ function Button({
193
224
  }
194
225
  )
195
226
  ) : children;
196
- return /* @__PURE__ */ jsx(
227
+ return /* @__PURE__ */ jsx2(
197
228
  Comp,
198
229
  {
199
230
  ...props,
@@ -211,7 +242,7 @@ function Button({
211
242
  );
212
243
  }
213
244
  if (loading === void 0) {
214
- return /* @__PURE__ */ jsx(
245
+ return /* @__PURE__ */ jsx2(
215
246
  "button",
216
247
  {
217
248
  ...props,
@@ -232,7 +263,7 @@ function Button({
232
263
  const leadingVisual = hasLeadingVisual ? first : void 0;
233
264
  const label = hasLeadingVisual ? items.slice(1) : items;
234
265
  const mappedSpinnerSize = spinnerSize(resolvedSize);
235
- return /* @__PURE__ */ jsx(
266
+ return /* @__PURE__ */ jsx2(
236
267
  "button",
237
268
  {
238
269
  ...props,
@@ -244,13 +275,13 @@ function Button({
244
275
  disabled: disabled || isLoading,
245
276
  "aria-busy": isLoading ? true : props["aria-busy"],
246
277
  onClick,
247
- children: /* @__PURE__ */ jsxs(
278
+ children: /* @__PURE__ */ jsxs2(
248
279
  "span",
249
280
  {
250
281
  "data-slot": "button-content",
251
282
  className: "inline-flex items-center gap-[inherit]",
252
283
  children: [
253
- /* @__PURE__ */ jsx(
284
+ /* @__PURE__ */ jsx2(
254
285
  "span",
255
286
  {
256
287
  "data-slot": "button-leading",
@@ -258,7 +289,7 @@ function Button({
258
289
  "inline-grid shrink-0 place-items-center",
259
290
  spinnerVariants({ size: mappedSpinnerSize })
260
291
  ),
261
- children: isLoading ? /* @__PURE__ */ jsx(
292
+ children: isLoading ? /* @__PURE__ */ jsx2(
262
293
  Spinner,
263
294
  {
264
295
  size: mappedSpinnerSize,
@@ -268,8 +299,8 @@ function Button({
268
299
  ) : leadingVisual
269
300
  }
270
301
  ),
271
- /* @__PURE__ */ jsx("span", { "data-slot": "button-label", children: label }),
272
- !hasLeadingVisual && !iconOnly && /* @__PURE__ */ jsx(
302
+ /* @__PURE__ */ jsx2("span", { "data-slot": "button-label", children: label }),
303
+ !hasLeadingVisual && !iconOnly && /* @__PURE__ */ jsx2(
273
304
  "span",
274
305
  {
275
306
  "aria-hidden": "true",
@@ -286,6 +317,30 @@ function Button({
286
317
  );
287
318
  }
288
319
 
289
- export { Button, Spinner, buttonVariants, cn, compactRadius, controlFill, controlRadius, elevatedSurface, fieldFocus, fieldSurface, flatSurface, floatingSurface, focusRing, glassControl, menuHighlight, menuSurface, modalSurface, nestedEdgeToEdge, nestedRadius, nestedSurfaceReset, panelSurface, recessedSurface, spinnerVariants, surface };
290
- //# sourceMappingURL=chunk-I5UZAJB4.js.map
291
- //# sourceMappingURL=chunk-I5UZAJB4.js.map
320
+ export {
321
+ cn,
322
+ controlRadius,
323
+ compactRadius,
324
+ elevatedSurface,
325
+ floatingSurface,
326
+ modalSurface,
327
+ panelSurface,
328
+ menuSurface,
329
+ flatSurface,
330
+ recessedSurface,
331
+ nestedRadius,
332
+ nestedSurfaceReset,
333
+ nestedEdgeToEdge,
334
+ glassControl,
335
+ controlFill,
336
+ fieldSurface,
337
+ focusRing,
338
+ fieldFocus,
339
+ menuHighlight,
340
+ surface,
341
+ spinnerVariants,
342
+ Spinner,
343
+ buttonVariants,
344
+ Button
345
+ };
346
+ //# sourceMappingURL=chunk-KHOA4TEI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/lib/language.ts","../src/components/ui/spinner.tsx","../src/components/ui/button.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","export const surfaceRadius = 'rounded-3xl';\n\nexport const controlRadius = 'rounded-2xl';\n\nexport const compactRadius = 'rounded-xl';\n\nexport const glassEdge =\n 'ring-1 ring-surface-ring backdrop-blur-2xl backdrop-saturate-150';\n\nexport const elevatedSurface = `${glassEdge} ${surfaceRadius} border-0 shadow-(--glass-elevation)`;\n\nexport const floatingSurface = `${glassEdge} border-0 bg-popover/85 text-popover-foreground shadow-(--glass-elevation)`;\n\nexport const modalSurface = `${floatingSurface} ${surfaceRadius}`;\n\nexport const panelSurface = `${floatingSurface} ${controlRadius}`;\n\nexport const menuSurface = `${panelSurface} bg-popover/80`;\n\nexport const flatSurface = 'shadow-none ring-0';\n\nexport const recessedSurface = `${controlRadius} border-0 bg-surface-recessed/30 text-foreground shadow-none ring-0 backdrop-blur-none`;\n\nexport const nestedRadius = controlRadius;\n\nexport const nestedSurfaceReset =\n 'nested-surface:border-0 nested-surface:ring-0 nested-surface:bg-transparent nested-surface:shadow-none nested-surface:backdrop-blur-none';\n\nexport const nestedEdgeToEdge = 'nested-surface:rounded-none';\n\nexport const glassControl =\n 'ring-1 ring-surface-ring border-0 shadow-(--glass-shadow) backdrop-blur-md backdrop-saturate-150';\n\nexport const controlFill = 'bg-surface-control';\n\nexport const fieldText = 'text-base sm:text-sm';\n\nexport const fieldSurface = `${glassControl} ${controlFill} ${controlRadius} ${fieldText} text-foreground`;\n\nexport const focusRing =\n 'focus-visible:outline-solid focus-visible:outline-1 focus-visible:outline-offset-0 focus-visible:outline-ring';\n\nexport const fieldFocus = `${focusRing} focus-visible:shadow-(--glass-elevation)`;\n\nexport const menuHighlight =\n 'outline-hidden focus:bg-accent focus:text-accent-foreground';\n\nexport interface SurfaceProps {\n inset?: boolean;\n}\n\nexport interface FlatSurfaceProps extends SurfaceProps {\n flat?: boolean;\n}\n\nexport function surface(inset?: boolean | null): string {\n return inset ? `${elevatedSurface} ${recessedSurface}` : elevatedSurface;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { LoaderCircle } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nconst spinnerVariants = cva('inline-flex shrink-0', {\n variants: {\n size: {\n sm: 'size-3.5',\n default: 'size-4',\n lg: 'size-5',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n});\n\ninterface SpinnerProps\n extends React.ComponentProps<'span'>, VariantProps<typeof spinnerVariants> {\n label?: string;\n}\n\nfunction Spinner({\n className,\n label = 'Loading',\n size = 'default',\n slotName = 'spinner',\n ...props\n}: SpinnerProps & SlotNameProps) {\n return (\n <span\n {...props}\n data-size={size}\n role=\"status\"\n className={cn(spinnerVariants({ size }), className)}\n data-slot={slotName}\n >\n <LoaderCircle\n aria-hidden=\"true\"\n className=\"animate-spin size-full text-current motion-reduce:animate-none\"\n />\n <span className=\"sr-only\">{label}</span>\n </span>\n );\n}\n\nexport { Spinner, spinnerVariants, type SpinnerProps };\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport {\n Spinner,\n spinnerVariants,\n type SpinnerProps,\n} from '@/components/ui/spinner';\nimport { controlFill, focusRing, glassControl } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n `inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-2xl text-sm font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground shadow-xl hover:bg-primary/90 hover:scale-[1.02] active:scale-[0.98]',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:outline-destructive',\n outline: `${glassControl} ${controlFill} hover:bg-accent hover:text-accent-foreground`,\n secondary: `${glassControl} bg-secondary/80 text-secondary-foreground hover:bg-secondary`,\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-11 px-4 has-[>svg]:gap-3',\n sm: 'h-9 rounded-xl px-3 has-[>svg]:gap-2.5',\n lg: 'h-12 px-6 has-[>svg]:gap-4 text-base',\n icon: 'size-11',\n 'icon-sm': 'size-9 rounded-xl',\n 'icon-lg': 'size-12',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\ntype ButtonSize = NonNullable<VariantProps<typeof buttonVariants>['size']>;\n\ninterface ButtonProps\n extends\n React.ComponentProps<'button'>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n loadingLabel?: string;\n slotName?: string;\n}\n\nfunction spinnerSize(size: ButtonSize): SpinnerProps['size'] {\n if (size === 'sm' || size === 'icon-sm') return 'sm';\n if (size === 'lg' || size === 'icon-lg') return 'lg';\n return 'default';\n}\n\nconst ICON_PADDING: Record<ButtonSize, { leading: string; trailing: string }> =\n {\n default: { leading: 'pl-3', trailing: 'pr-2' },\n sm: { leading: 'pl-2.5', trailing: 'pr-1.5' },\n lg: { leading: 'pl-4', trailing: 'pr-3' },\n icon: { leading: '', trailing: '' },\n 'icon-sm': { leading: '', trailing: '' },\n 'icon-lg': { leading: '', trailing: '' },\n };\n\nfunction iconPadding(size: ButtonSize, children: React.ReactNode): string {\n const parts = React.Children.toArray(children).filter(\n (part) => typeof part !== 'string' || part.trim() !== '',\n );\n\n if (parts.length < 2) {\n return '';\n }\n\n const edges = ICON_PADDING[size];\n\n return cn(\n React.isValidElement(parts[0]) && edges.leading,\n React.isValidElement(parts[parts.length - 1]) && edges.trailing,\n );\n}\n\nfunction loadingPadding(size: ButtonSize): string | undefined {\n if (size === 'sm') return 'px-2.5';\n if (size === 'lg') return 'px-5';\n if (size === 'default') return 'px-3';\n return undefined;\n}\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n loading,\n loadingLabel = 'Loading',\n slotName = 'button',\n disabled,\n children,\n onClick,\n ...props\n}: ButtonProps) {\n const isLoading = loading === true;\n const hasLoadingState = loading !== undefined;\n const resolvedSize: ButtonSize = size ?? 'default';\n const baseClasses = buttonVariants({ variant, size: resolvedSize });\n const classes = cn(\n baseClasses,\n iconPadding(resolvedSize, children),\n className,\n );\n const loadingClasses = cn(\n baseClasses,\n loadingPadding(resolvedSize),\n className,\n );\n\n if (asChild) {\n const Comp = asChild ? Slot : 'button';\n const mappedSpinnerSize = spinnerSize(resolvedSize);\n const slottedChild = React.isValidElement<\n React.HTMLAttributes<HTMLElement>\n >(children)\n ? children\n : undefined;\n const items = React.Children.toArray(slottedChild?.props.children);\n const first = items[0];\n const iconOnly = resolvedSize.startsWith('icon');\n const hasLeadingVisual =\n React.isValidElement(first) && (items.length > 1 || iconOnly);\n const leadingVisual = hasLeadingVisual ? first : undefined;\n const label = hasLeadingVisual ? items.slice(1) : items;\n const slottedChildren =\n hasLoadingState && slottedChild\n ? React.cloneElement(\n slottedChild,\n isLoading\n ? {\n onClick(event) {\n event.preventDefault();\n event.stopPropagation();\n },\n }\n : undefined,\n <span\n data-slot=\"button-content\"\n className=\"inline-flex items-center gap-[inherit]\"\n >\n <span\n data-slot=\"button-leading\"\n className={cn(\n 'inline-grid shrink-0 place-items-center',\n spinnerVariants({ size: mappedSpinnerSize }),\n )}\n >\n {isLoading ? (\n <Spinner\n size={mappedSpinnerSize}\n label={loadingLabel}\n className=\"size-full\"\n />\n ) : (\n leadingVisual\n )}\n </span>\n <span data-slot=\"button-label\">{label}</span>\n {!hasLeadingVisual && !iconOnly && (\n <span\n aria-hidden=\"true\"\n data-slot=\"button-balance\"\n className={spinnerVariants({\n size: mappedSpinnerSize,\n })}\n />\n )}\n </span>,\n )\n : children;\n\n return (\n <Comp\n {...props}\n data-slot={slotName}\n data-variant={variant}\n data-size={resolvedSize}\n data-loading={isLoading || undefined}\n className={hasLoadingState ? loadingClasses : classes}\n disabled={disabled || isLoading}\n aria-busy={isLoading ? true : props['aria-busy']}\n aria-disabled={isLoading ? true : props['aria-disabled']}\n onClick={isLoading ? undefined : onClick}\n >\n {slottedChildren}\n </Comp>\n );\n }\n\n if (loading === undefined) {\n return (\n <button\n {...props}\n data-slot={slotName}\n data-variant={variant}\n data-size={resolvedSize}\n className={classes}\n disabled={disabled}\n onClick={onClick}\n >\n {children}\n </button>\n );\n }\n\n const items = React.Children.toArray(children);\n const first = items[0];\n const iconOnly = resolvedSize.startsWith('icon');\n const hasLeadingVisual =\n React.isValidElement(first) && (items.length > 1 || iconOnly);\n const leadingVisual = hasLeadingVisual ? first : undefined;\n const label = hasLeadingVisual ? items.slice(1) : items;\n const mappedSpinnerSize = spinnerSize(resolvedSize);\n\n return (\n <button\n {...props}\n data-slot={slotName}\n data-variant={variant}\n data-size={resolvedSize}\n data-loading={isLoading || undefined}\n className={loadingClasses}\n disabled={disabled || isLoading}\n aria-busy={isLoading ? true : props['aria-busy']}\n onClick={onClick}\n >\n <span\n data-slot=\"button-content\"\n className=\"inline-flex items-center gap-[inherit]\"\n >\n <span\n data-slot=\"button-leading\"\n className={cn(\n 'inline-grid shrink-0 place-items-center',\n spinnerVariants({ size: mappedSpinnerSize }),\n )}\n >\n {isLoading ? (\n <Spinner\n size={mappedSpinnerSize}\n label={loadingLabel}\n className=\"size-full\"\n />\n ) : (\n leadingVisual\n )}\n </span>\n <span data-slot=\"button-label\">{label}</span>\n {!hasLeadingVisual && !iconOnly && (\n <span\n aria-hidden=\"true\"\n data-slot=\"button-balance\"\n className={spinnerVariants({\n size: mappedSpinnerSize,\n })}\n />\n )}\n </span>\n </button>\n );\n}\n\nexport { Button, buttonVariants, type ButtonProps };\n"],"mappings":"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","names":["cva","jsx","jsxs","cva","mappedSpinnerSize","items","first","iconOnly","hasLeadingVisual","leadingVisual","label"]}
@@ -1,6 +1,5 @@
1
- import { createElement } from 'react';
2
-
3
1
  // src/lib/href.ts
2
+ import { createElement } from "react";
4
3
  function hrefToString(href) {
5
4
  return typeof href === "string" ? href : href.url;
6
5
  }
@@ -17,6 +16,8 @@ function resolveLink(linkComponent) {
17
16
  return linkComponent ?? DefaultLink;
18
17
  }
19
18
 
20
- export { hrefToString, resolveLink };
21
- //# sourceMappingURL=chunk-L2H5GIF7.js.map
19
+ export {
20
+ hrefToString,
21
+ resolveLink
22
+ };
22
23
  //# sourceMappingURL=chunk-L2H5GIF7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/href.ts"],"names":[],"mappings":";;;AAKO,SAAS,aAAa,IAAA,EAAuB;AAChD,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,GAAA;AAClD;AAEO,IAAM,cAAwC,CAAC;AAAA,EAClD,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,EAAU,SAAA;AAAA,EACV,EAAA,EAAI,GAAA;AAAA,EACJ,GAAG;AACP,CAAA,KAAM;AACF,EAAA,OAAO,aAAA,CAAc,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,CAAa,IAAI,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,QAAQ,CAAA;AAC9E,CAAA;AAEO,SAAS,YAAY,aAAA,EAA8C;AACtE,EAAA,OAAO,aAAA,IAAiB,WAAA;AAC5B","file":"chunk-L2H5GIF7.js","sourcesContent":["import type { ComponentType } from 'react';\nimport { createElement } from 'react';\n\nimport type { LinkComponent, LinkProps, UrlLike } from '@/types';\n\nexport function hrefToString(href: UrlLike): string {\n return typeof href === 'string' ? href : href.url;\n}\n\nexport const DefaultLink: ComponentType<LinkProps> = ({\n href,\n children,\n prefetch: _prefetch,\n as: _as,\n ...props\n}) => {\n return createElement('a', { href: hrefToString(href), ...props }, children);\n};\n\nexport function resolveLink(linkComponent?: LinkComponent): LinkComponent {\n return linkComponent ?? DefaultLink;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/href.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport { createElement } from 'react';\n\nimport type { LinkComponent, LinkProps, UrlLike } from '@/types';\n\nexport function hrefToString(href: UrlLike): string {\n return typeof href === 'string' ? href : href.url;\n}\n\nexport const DefaultLink: ComponentType<LinkProps> = ({\n href,\n children,\n prefetch: _prefetch,\n as: _as,\n ...props\n}) => {\n return createElement('a', { href: hrefToString(href), ...props }, children);\n};\n\nexport function resolveLink(linkComponent?: LinkComponent): LinkComponent {\n return linkComponent ?? DefaultLink;\n}\n"],"mappings":";AACA,SAAS,qBAAqB;AAIvB,SAAS,aAAa,MAAuB;AAChD,SAAO,OAAO,SAAS,WAAW,OAAO,KAAK;AAClD;AAEO,IAAM,cAAwC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,GAAG;AACP,MAAM;AACF,SAAO,cAAc,KAAK,EAAE,MAAM,aAAa,IAAI,GAAG,GAAG,MAAM,GAAG,QAAQ;AAC9E;AAEO,SAAS,YAAY,eAA8C;AACtE,SAAO,iBAAiB;AAC5B;","names":[]}