@akira-io/ui 2.1.0 → 2.2.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.
- package/dist/blocks.d.ts +4 -4
- package/dist/blocks.js +2 -1
- package/dist/blocks.js.map +1 -1
- package/dist/chunk-EXTOGROG.js +42 -0
- package/dist/chunk-EXTOGROG.js.map +1 -0
- package/dist/{chunk-XLAOE5MV.js → chunk-MCHHCLV3.js} +2 -2
- package/dist/{chunk-ZQXZ4UGE.js → chunk-PYXUFFMO.js} +10 -3
- package/dist/chunk-PYXUFFMO.js.map +1 -0
- package/dist/{chunk-DPLCEU34.js → chunk-RE4M2G2Y.js} +76 -85
- package/dist/chunk-RE4M2G2Y.js.map +1 -0
- package/dist/{context-2wTOwxCk.d.ts → context-Dqf-5Qne.d.ts} +2 -1
- package/dist/index.d.ts +22 -9
- package/dist/index.js +147 -114
- package/dist/index.js.map +1 -1
- package/dist/inertia.js +3 -2
- package/dist/inertia.js.map +1 -1
- package/dist/locales/fr.d.ts +1 -1
- package/dist/locales/pt.d.ts +1 -1
- package/dist/shells.d.ts +1 -1
- package/dist/shells.js +3 -2
- package/dist/shells.js.map +1 -1
- package/dist/{sidebar-BLL2tgTt.d.ts → sidebar-_xQ3IehY.d.ts} +3 -1
- package/package.json +1 -1
- package/dist/chunk-DPLCEU34.js.map +0 -1
- package/dist/chunk-ZQXZ4UGE.js.map +0 -1
- /package/dist/{chunk-XLAOE5MV.js.map → chunk-MCHHCLV3.js.map} +0 -0
package/dist/blocks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/blocks/command-palette.tsx","../src/blocks/danger-zone.tsx","../src/blocks/date-filter/context.tsx","../src/blocks/date-filter/date-filter.tsx","../src/blocks/date-filter/fixed-panel.tsx","../src/blocks/date-filter/relative-panel.tsx","../src/blocks/date-filter/range.ts","../src/blocks/date-filter/summarise.ts","../src/blocks/date-filter/types.ts","../src/blocks/date-filter/decode.ts","../src/blocks/date-filter/encode.ts","../src/blocks/form-overlay.tsx","../src/blocks/detail-edit-sheet.tsx","../src/blocks/form-dialog.tsx","../src/blocks/info-field.tsx","../src/blocks/localized-fields.tsx","../src/blocks/section-header.tsx","../src/blocks/settings-card.tsx","../src/blocks/settings-fields.tsx","../src/blocks/settings-page.tsx","../src/blocks/stat-card.tsx","../src/blocks/two-factor/types.ts","../src/blocks/two-factor/verify-form.tsx","../src/blocks/two-factor/challenge.tsx","../src/blocks/two-factor/disable-button.tsx","../src/blocks/two-factor/recovery-codes.tsx","../src/blocks/two-factor/scan-step.tsx","../src/blocks/two-factor/setup-dialog.tsx"],"sourcesContent":["import {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/ui/command';\nimport { useUiLabels } from '@/locales/context';\nimport { type LucideIcon } from 'lucide-react';\nimport { useCallback, useEffect, useState, type ReactNode } from 'react';\n\nexport interface CommandPaletteItem {\n id: string;\n label: string;\n icon?: LucideIcon;\n value?: string;\n hint?: string;\n}\n\nexport interface CommandPaletteGroup {\n heading: string;\n items: CommandPaletteItem[];\n}\n\nexport interface CommandPaletteLabels {\n placeholder: string;\n noResultsLabel: string;\n}\n\nexport const commandPaletteDefaultLabels: CommandPaletteLabels = {\n placeholder: 'Search...',\n noResultsLabel: 'No results found',\n};\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n groups: CommandPaletteGroup[];\n onSelect: (item: CommandPaletteItem) => void;\n query?: string;\n onQueryChange?: (query: string) => void;\n placeholder?: CommandPaletteLabels['placeholder'];\n noResultsLabel?: CommandPaletteLabels['noResultsLabel'];\n emptyState?: ReactNode;\n className?: string;\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n groups,\n onSelect,\n query,\n onQueryChange,\n placeholder,\n noResultsLabel,\n emptyState,\n className,\n}: CommandPaletteProps) {\n const labels = useUiLabels('commandPalette', commandPaletteDefaultLabels, {\n placeholder,\n noResultsLabel,\n });\n const resolvedEmptyState = emptyState ?? labels.noResultsLabel;\n\n return (\n <CommandDialog\n open={open}\n onOpenChange={onOpenChange}\n className={className}\n >\n <CommandInput\n placeholder={labels.placeholder}\n value={query}\n onValueChange={onQueryChange}\n />\n <CommandList className=\"max-h-[360px]\">\n <CommandEmpty>{resolvedEmptyState}</CommandEmpty>\n\n {groups.map((group) => (\n <CommandGroup key={group.heading} heading={group.heading}>\n {group.items.map((item) => (\n <CommandItem\n key={item.id}\n value={item.value ?? item.label}\n onSelect={() => onSelect(item)}\n >\n {item.icon && (\n <item.icon className=\"mr-2 size-4\" />\n )}\n <span className=\"font-medium\">\n {item.label}\n </span>\n {item.hint && (\n <span className=\"text-xs ml-auto text-muted-foreground\">\n {item.hint}\n </span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </CommandDialog>\n );\n}\n\nexport function useCommandPalette(initialOpen = false) {\n const [open, setOpen] = useState(initialOpen);\n\n const toggle = useCallback(() => setOpen((previous) => !previous), []);\n\n useEffect(() => {\n const handler = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggle();\n }\n };\n\n document.addEventListener('keydown', handler);\n\n return () => document.removeEventListener('keydown', handler);\n }, [toggle]);\n\n return { open, setOpen, toggle };\n}\n","import { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { elevatedSurface, nestedSurfaceReset } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { TriangleAlert } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nexport interface DangerZoneLabels {\n title: string;\n description: string;\n actionLabel: string;\n confirmTitle: string;\n confirmDescription: string;\n confirmText: string;\n cancelText: string;\n requiredValueLabel: string;\n}\n\nexport const dangerZoneLabels: DangerZoneLabels = {\n title: 'Danger zone',\n description: 'These actions are permanent and cannot be undone.',\n actionLabel: 'Delete',\n confirmTitle: 'Confirm Action',\n confirmDescription:\n 'Are you sure you want to continue? This action cannot be undone.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n requiredValueLabel: 'Type {{value}} to confirm',\n};\n\nexport interface DangerZoneAction {\n id: string;\n title: string;\n description?: string;\n actionLabel?: string;\n confirmTitle?: string;\n confirmDescription?: string;\n confirmText?: string;\n cancelText?: string;\n requiredValue?: string;\n requiredValueLabel?: string;\n disabled?: boolean;\n onConfirm: () => void;\n}\n\nexport interface DangerZoneProps {\n title?: string;\n description?: string;\n actions: DangerZoneAction[];\n processing?: boolean;\n labels?: Partial<DangerZoneLabels>;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function DangerZone({\n title,\n description,\n actions,\n processing = false,\n labels,\n footer,\n className,\n slotName = 'danger-zone',\n}: DangerZoneProps & SlotNameProps) {\n const copy = { ...dangerZoneLabels, ...labels };\n const [activeId, setActiveId] = useState<string | null>(null);\n const active = actions.find((action) => action.id === activeId) ?? null;\n\n return (\n <section\n className={cn(\n elevatedSurface,\n nestedSurfaceReset,\n 'gap-6 p-6 flex flex-col bg-destructive/5 ring-destructive/30',\n className,\n )}\n data-slot={slotName}\n >\n <div data-slot=\"danger-zone-header\" className=\"gap-3 flex\">\n <span className=\"size-11 rounded-2xl flex shrink-0 items-center justify-center bg-destructive/10 text-destructive\">\n <TriangleAlert className=\"size-5\" />\n </span>\n <div>\n <h2 className=\"text-lg font-bold text-destructive\">\n {title ?? copy.title}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description ?? copy.description}\n </p>\n </div>\n </div>\n\n <ul data-slot=\"danger-zone-actions\" className=\"gap-4 flex flex-col\">\n {actions.map((action) => (\n <li\n key={action.id}\n data-slot=\"danger-zone-action\"\n data-action-id={action.id}\n className=\"gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col\"\n >\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">\n {action.title}\n </p>\n {action.description && (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {action.description}\n </p>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={processing || action.disabled}\n onClick={() => setActiveId(action.id)}\n className=\"sm:w-auto w-full\"\n >\n {action.actionLabel ?? copy.actionLabel}\n </Button>\n </li>\n ))}\n </ul>\n\n {footer}\n\n <ConfirmDialog\n open={active !== null}\n onOpenChange={(open) => {\n if (!open) {\n setActiveId(null);\n }\n }}\n variant=\"destructive\"\n processing={processing}\n title={active?.confirmTitle ?? copy.confirmTitle}\n description={\n active?.confirmDescription ?? copy.confirmDescription\n }\n confirmText={active?.confirmText ?? copy.confirmText}\n cancelText={active?.cancelText ?? copy.cancelText}\n requiredValue={active?.requiredValue}\n requiredValueLabel={\n active?.requiredValueLabel ?? copy.requiredValueLabel\n }\n onConfirm={() => active?.onConfirm()}\n />\n </section>\n );\n}\n","import { createContext, useContext } from 'react';\n\nimport type {\n DateFilterLabels,\n DateFilterOption,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nexport type DateFilterPanel = 'root' | 'fixed' | 'relative';\n\nexport interface DateFilterContextValue {\n value: DateFilterValue;\n draft: DateFilterValue;\n labels: DateFilterLabels;\n presets: DateFilterOption[];\n operators: DateFilterOption[];\n units: DateFilterOption[];\n panel: DateFilterPanel;\n setDraft: (value: DateFilterValue) => void;\n openPanel: (panel: DateFilterPanel, seed: DateFilterValue) => void;\n backToRoot: () => void;\n commit: (value: DateFilterValue) => void;\n}\n\nconst DateFilterContext = createContext<DateFilterContextValue | null>(null);\n\nexport const DateFilterProvider = DateFilterContext.Provider;\n\nexport function useDateFilter(): DateFilterContextValue {\n const context = useContext(DateFilterContext);\n\n if (context === null) {\n throw new Error('DateFilter parts must be used inside <DateFilter>.');\n }\n\n return context;\n}\n","import { CalendarDays } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport {\n DateFilterProvider,\n useDateFilter,\n type DateFilterPanel,\n} from '@/blocks/date-filter/context';\nimport { DateFilterFixedPanel } from '@/blocks/date-filter/fixed-panel';\nimport { DateFilterRelativePanel } from '@/blocks/date-filter/relative-panel';\nimport { summariseDateFilter } from '@/blocks/date-filter/summarise';\nimport {\n DEFAULT_LABELS,\n DEFAULT_OPERATORS,\n DEFAULT_PRESETS,\n DEFAULT_UNITS,\n type DateFilterLabels,\n type DateFilterOption,\n type DateFilterValue,\n} from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/components/ui/popover';\nimport { compactRadius } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels, useUiLocale } from '@/locales/context';\n\nexport interface DateFilterProps {\n value: DateFilterValue;\n onChange: (value: DateFilterValue) => void;\n presets?: DateFilterOption[];\n operators?: DateFilterOption[];\n units?: DateFilterOption[];\n labels?: Partial<DateFilterLabels>;\n children?: ReactNode;\n}\n\nexport function DateFilter({\n value,\n onChange,\n presets,\n operators,\n units,\n labels,\n children,\n}: DateFilterProps) {\n const locale = useUiLocale();\n const resolvedLabels = useUiLabels('dateFilter', DEFAULT_LABELS, labels);\n const [open, setOpen] = useState(false);\n const [panel, setPanel] = useState<DateFilterPanel>('root');\n const [draft, setDraft] = useState<DateFilterValue>(value);\n\n const context = {\n value,\n draft,\n labels: resolvedLabels,\n presets: presets ?? locale.dateFilterPresets ?? DEFAULT_PRESETS,\n operators: operators ?? locale.dateFilterOperators ?? DEFAULT_OPERATORS,\n units: units ?? locale.dateFilterUnits ?? DEFAULT_UNITS,\n panel,\n setDraft,\n openPanel: (next: DateFilterPanel, seed: DateFilterValue) => {\n setDraft(seed);\n setPanel(next);\n },\n backToRoot: () => setPanel('root'),\n commit: (next: DateFilterValue) => {\n onChange(next);\n setOpen(false);\n setPanel('root');\n },\n };\n\n return (\n <DateFilterProvider value={context}>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n\n if (!next) {\n setPanel('root');\n }\n }}\n >\n {children ?? (\n <>\n <DateFilterTrigger />\n <DateFilterContent>\n <DateFilterAll />\n <DateFilterSeparator />\n <DateFilterPresets />\n <DateFilterSeparator />\n <DateFilterFixed />\n <DateFilterRelative />\n </DateFilterContent>\n </>\n )}\n </Popover>\n </DateFilterProvider>\n );\n}\n\nexport function DateFilterTrigger({\n className,\n children,\n}: {\n className?: string;\n children?: ReactNode;\n}) {\n const { value, presets, operators, units, labels } = useDateFilter();\n\n return (\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn('gap-2 justify-start', className)}\n >\n <CalendarDays className=\"size-4\" />\n {children ??\n summariseDateFilter(\n value,\n presets,\n operators,\n units,\n labels,\n )}\n </Button>\n </PopoverTrigger>\n );\n}\n\nexport function DateFilterContent({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n const { panel } = useDateFilter();\n\n return (\n <PopoverContent align=\"start\" className={cn('p-0 w-auto', className)}>\n {panel === 'root' && (\n <div className=\"w-64 py-2 flex flex-col\">{children}</div>\n )}\n {panel === 'fixed' && <DateFilterFixedPanel />}\n {panel === 'relative' && <DateFilterRelativePanel />}\n </PopoverContent>\n );\n}\n\nexport function DateFilterItem({\n active,\n onSelect,\n children,\n}: {\n active: boolean;\n onSelect: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n data-slot=\"date-filter-item\"\n className={cn(\n `mx-1 px-2 py-2 ${compactRadius} text-sm font-medium cursor-pointer text-left transition-colors`,\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent/50',\n )}\n >\n {children}\n </button>\n );\n}\n\nexport function DateFilterSeparator() {\n return (\n <div data-slot=\"date-filter-separator\" className=\"mx-1 my-2 border-t\" />\n );\n}\n\nexport function DateFilterAll({ children }: { children?: ReactNode }) {\n const { value, labels, commit } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'all'}\n onSelect={() => commit({ mode: 'all' })}\n >\n {children ?? labels.all}\n </DateFilterItem>\n );\n}\n\nexport function DateFilterPresets({ only }: { only?: string[] }) {\n const { value, presets, commit } = useDateFilter();\n\n const visible = only\n ? presets.filter((preset) => only.includes(preset.value))\n : presets;\n\n return (\n <>\n {visible.map((preset) => (\n <DateFilterItem\n key={preset.value}\n active={\n value.mode === 'preset' && value.preset === preset.value\n }\n onSelect={() =>\n commit({ mode: 'preset', preset: preset.value })\n }\n >\n {preset.label}\n </DateFilterItem>\n ))}\n </>\n );\n}\n\nexport function DateFilterFixed({ children }: { children?: ReactNode }) {\n const { value, labels, openPanel } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'fixed'}\n onSelect={() =>\n openPanel('fixed', {\n mode: 'fixed',\n operator: value.operator ?? 'between',\n start: value.start,\n end: value.end,\n })\n }\n >\n {children ?? labels.fixed}\n </DateFilterItem>\n );\n}\n\nexport function DateFilterRelative({ children }: { children?: ReactNode }) {\n const { value, labels, openPanel } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'relative'}\n onSelect={() =>\n openPanel('relative', {\n mode: 'relative',\n unit: value.unit ?? 'month',\n amount: value.amount ?? 3,\n include_current: value.include_current ?? false,\n })\n }\n >\n {children ?? labels.relative}\n </DateFilterItem>\n );\n}\n","import { format } from 'date-fns';\nimport { pt } from 'date-fns/locale';\nimport { ChevronLeft } from 'lucide-react';\n\nimport { useDateFilter } from '@/blocks/date-filter/context';\nimport type { DateFilterOperator } from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { cn } from '@/lib/utils';\n\nconst CALENDAR_START = new Date(2020, 0, 1);\n\nconst CALENDAR_END = new Date(new Date().getFullYear() + 1, 11, 31);\n\nconst toDate = (value?: string) =>\n value ? new Date(`${value}T00:00:00`) : undefined;\n\nconst toIso = (value?: Date) =>\n value ? format(value, 'yyyy-MM-dd') : undefined;\n\nexport function DateFilterFixedPanel() {\n const { draft, operators, labels, setDraft, backToRoot, commit } =\n useDateFilter();\n\n const operator = draft.operator ?? 'between';\n const isRange = operator === 'between';\n const canApply = Boolean(draft.start) && (!isRange || Boolean(draft.end));\n\n return (\n <div className=\"w-auto\">\n <div className=\"gap-1 px-2 py-2 flex items-center border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={backToRoot}\n aria-label={labels.back}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {operators.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n onClick={() =>\n setDraft({\n ...draft,\n operator: item.value as DateFilterOperator,\n })\n }\n className={cn(\n 'px-3 py-1.5 text-sm font-medium rounded-xl cursor-pointer transition-colors',\n operator === item.value\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n\n <div className=\"p-3\">\n {isRange ? (\n <Calendar\n mode=\"range\"\n numberOfMonths={2}\n locale={pt}\n captionLayout=\"dropdown\"\n startMonth={CALENDAR_START}\n endMonth={CALENDAR_END}\n defaultMonth={toDate(draft.start)}\n selected={{\n from: toDate(draft.start),\n to: toDate(draft.end),\n }}\n onSelect={(range) =>\n setDraft({\n ...draft,\n start: toIso(range?.from),\n end: toIso(range?.to),\n })\n }\n />\n ) : (\n <Calendar\n mode=\"single\"\n locale={pt}\n captionLayout=\"dropdown\"\n startMonth={CALENDAR_START}\n endMonth={CALENDAR_END}\n defaultMonth={toDate(draft.start)}\n selected={toDate(draft.start)}\n onSelect={(date) =>\n setDraft({ ...draft, start: toIso(date) })\n }\n />\n )}\n </div>\n\n <div className=\"px-3 py-2 flex justify-end border-t\">\n <Button disabled={!canApply} onClick={() => commit(draft)}>\n {labels.apply}\n </Button>\n </div>\n </div>\n );\n}\n","import { ArrowLeftToLine, CalendarDays, ChevronLeft, X } from 'lucide-react';\n\nimport { useDateFilter } from '@/blocks/date-filter/context';\nimport {\n formatRangePreview,\n resolveRelativeRange,\n} from '@/blocks/date-filter/range';\nimport type {\n DateFilterUnit,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Switch } from '@/components/ui/switch';\n\nexport function DateFilterRelativePanel() {\n const { draft, units, labels, setDraft, backToRoot, commit } =\n useDateFilter();\n\n const hasOffset = (draft.offset_amount ?? 0) > 0;\n\n return (\n <div className=\"w-96\">\n <div className=\"gap-2 px-2 py-2 flex items-center border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={backToRoot}\n aria-label={labels.back}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n <span className=\"text-sm font-medium\">\n {labels.relativeTitle}\n </span>\n </div>\n\n <div className=\"gap-3 p-3 flex flex-col\">\n <div className=\"gap-2 flex items-center\">\n <span className=\"text-sm\">{labels.latest}</span>\n <Input\n type=\"number\"\n min={1}\n max={120}\n value={draft.amount ?? 1}\n onChange={(event) =>\n setDraft({\n ...draft,\n amount: Number(event.target.value),\n })\n }\n className=\"w-20\"\n />\n <Select\n value={draft.unit ?? 'month'}\n onValueChange={(unit) =>\n setDraft({ ...draft, unit: unit as DateFilterUnit })\n }\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {units.map((unit) => (\n <SelectItem key={unit.value} value={unit.value}>\n {unit.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {!hasOffset && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.startingAgo}\n title={labels.startingAgo}\n onClick={() =>\n setDraft({\n ...draft,\n offset_amount: 1,\n offset_unit: draft.unit ?? 'month',\n })\n }\n >\n <ArrowLeftToLine className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {hasOffset && (\n <div className=\"gap-2 flex items-center\">\n <span className=\"text-sm\">{labels.startingAgo}</span>\n <Input\n type=\"number\"\n min={1}\n max={120}\n value={draft.offset_amount ?? 1}\n onChange={(event) =>\n setDraft({\n ...draft,\n offset_amount: Number(event.target.value),\n })\n }\n className=\"w-20\"\n />\n <Select\n value={draft.offset_unit ?? draft.unit ?? 'month'}\n onValueChange={(unit) =>\n setDraft({\n ...draft,\n offset_unit: unit as DateFilterUnit,\n })\n }\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {units.map((unit) => (\n <SelectItem\n key={unit.value}\n value={unit.value}\n >\n {unit.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.removeOffset}\n onClick={() =>\n setDraft({\n ...draft,\n offset_amount: undefined,\n offset_unit: undefined,\n })\n }\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )}\n\n <label className=\"text-sm flex items-center justify-between\">\n {labels.includeCurrent}\n <Switch\n checked={draft.include_current ?? false}\n onCheckedChange={(checked) =>\n setDraft({ ...draft, include_current: checked })\n }\n />\n </label>\n </div>\n\n <div className=\"gap-3 px-3 py-2 flex items-center justify-between border-t\">\n <RangePreview draft={draft} />\n <Button\n disabled={!draft.unit || !draft.amount || draft.amount < 1}\n onClick={() => commit(draft)}\n >\n {labels.apply}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction RangePreview({ draft }: { draft: DateFilterValue }) {\n const range = resolveRelativeRange(\n draft.unit ?? 'month',\n draft.amount ?? 0,\n draft.include_current ?? false,\n new Date(),\n draft.offset_amount ?? 0,\n draft.offset_unit,\n );\n\n if (!range) {\n return <span />;\n }\n\n return (\n <span className=\"gap-2 text-sm flex items-center text-muted-foreground\">\n <CalendarDays className=\"size-4\" />\n {formatRangePreview(range)}\n </span>\n );\n}\n","import {\n endOfDay,\n endOfMonth,\n endOfQuarter,\n endOfWeek,\n endOfYear,\n format,\n isSameYear,\n startOfDay,\n startOfMonth,\n startOfQuarter,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subQuarters,\n subWeeks,\n subYears,\n} from 'date-fns';\nimport { pt } from 'date-fns/locale';\n\nimport type { DateFilterUnit } from '@/blocks/date-filter/types';\n\nconst WEEK_OPTIONS = { weekStartsOn: 1 } as const;\n\nconst subtract: Record<DateFilterUnit, (date: Date, amount: number) => Date> = {\n day: subDays,\n week: subWeeks,\n month: subMonths,\n quarter: subQuarters,\n year: subYears,\n};\n\nconst startOf: Record<DateFilterUnit, (date: Date) => Date> = {\n day: startOfDay,\n week: (date) => startOfWeek(date, WEEK_OPTIONS),\n month: startOfMonth,\n quarter: startOfQuarter,\n year: startOfYear,\n};\n\nconst endOf: Record<DateFilterUnit, (date: Date) => Date> = {\n day: endOfDay,\n week: (date) => endOfWeek(date, WEEK_OPTIONS),\n month: endOfMonth,\n quarter: endOfQuarter,\n year: endOfYear,\n};\n\nexport function resolveRelativeRange(\n unit: DateFilterUnit,\n amount: number,\n includeCurrent: boolean,\n now: Date = new Date(),\n offsetAmount = 0,\n offsetUnit?: DateFilterUnit,\n): { start: Date; end: Date } | null {\n if (amount < 1 || offsetAmount < 0) {\n return null;\n }\n\n let anchor = includeCurrent ? now : subtract[unit](now, 1);\n\n if (offsetAmount > 0) {\n anchor = subtract[offsetUnit ?? unit](anchor, offsetAmount);\n }\n\n return {\n start: startOf[unit](subtract[unit](anchor, amount - 1)),\n end: endOf[unit](anchor),\n };\n}\n\nexport function formatRangePreview(range: { start: Date; end: Date }): string {\n const sameYear = isSameYear(range.start, range.end);\n const startPattern = sameYear ? 'd MMM' : 'd MMM yyyy';\n\n return `${format(range.start, startPattern, { locale: pt })} - ${format(range.end, 'd MMM yyyy', { locale: pt })}`;\n}\n","import { format } from 'date-fns';\nimport { pt } from 'date-fns/locale';\n\nimport type {\n DateFilterLabels,\n DateFilterOption,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nconst readable = (value?: string) =>\n value\n ? format(new Date(`${value}T00:00:00`), \"d 'de' MMMM 'de' yyyy\", {\n locale: pt,\n })\n : '';\n\nexport function summariseDateFilter(\n value: DateFilterValue,\n presets: DateFilterOption[],\n operators: DateFilterOption[],\n units: DateFilterOption[],\n labels: DateFilterLabels,\n): string {\n if (value.mode === 'preset') {\n return (\n presets.find((preset) => preset.value === value.preset)?.label ??\n labels.fallback\n );\n }\n\n if (value.mode === 'fixed') {\n const operator =\n operators.find((item) => item.value === value.operator)?.label ??\n '';\n\n return value.operator === 'between'\n ? `${readable(value.start)} - ${readable(value.end)}`\n : `${operator} ${readable(value.start)}`;\n }\n\n if (value.mode === 'relative') {\n const unitLabel = (unit?: string) =>\n units.find((item) => item.value === unit)?.label ?? '';\n\n const base = `${labels.latest} ${value.amount ?? 1} ${unitLabel(value.unit)}`;\n\n return (value.offset_amount ?? 0) > 0\n ? `${base}, ${labels.ago} ${value.offset_amount} ${unitLabel(value.offset_unit ?? value.unit)}`\n : base;\n }\n\n return labels.all;\n}\n","export type DateFilterMode = 'all' | 'preset' | 'fixed' | 'relative';\n\nexport type DateFilterOperator = 'between' | 'before' | 'on' | 'after';\n\nexport type DateFilterUnit = 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateFilterValue {\n mode: DateFilterMode;\n preset?: string;\n operator?: DateFilterOperator;\n start?: string;\n end?: string;\n unit?: DateFilterUnit;\n amount?: number;\n include_current?: boolean;\n offset_amount?: number;\n offset_unit?: DateFilterUnit;\n}\n\nexport interface DateFilterOption {\n value: string;\n label: string;\n}\n\nexport interface DateFilterLabels {\n all: string;\n fixed: string;\n relative: string;\n relativeTitle: string;\n apply: string;\n back: string;\n latest: string;\n ago: string;\n includeCurrent: string;\n startingAgo: string;\n removeOffset: string;\n fallback: string;\n}\n\nexport const DEFAULT_PRESETS: DateFilterOption[] = [\n { value: 'today', label: 'Today' },\n { value: 'yesterday', label: 'Yesterday' },\n { value: 'previous_week', label: 'Previous week' },\n { value: 'previous_7_days', label: 'Last 7 days' },\n { value: 'previous_30_days', label: 'Last 30 days' },\n { value: 'previous_month', label: 'Previous month' },\n { value: 'previous_3_months', label: 'Last 3 months' },\n { value: 'previous_12_months', label: 'Last 12 months' },\n];\n\nexport const DEFAULT_OPERATORS: DateFilterOption[] = [\n { value: 'between', label: 'Between' },\n { value: 'before', label: 'Before' },\n { value: 'on', label: 'On' },\n { value: 'after', label: 'After' },\n];\n\nexport const DEFAULT_UNITS: DateFilterOption[] = [\n { value: 'day', label: 'days' },\n { value: 'week', label: 'weeks' },\n { value: 'month', label: 'months' },\n { value: 'quarter', label: 'quarters' },\n { value: 'year', label: 'years' },\n];\n\nexport const DEFAULT_LABELS: DateFilterLabels = {\n all: 'All time',\n fixed: 'Fixed range...',\n relative: 'Relative range...',\n relativeTitle: 'Relative range',\n apply: 'Apply filter',\n back: 'Back',\n latest: 'Last',\n ago: 'offset',\n includeCurrent: 'Include current period',\n startingAgo: 'Starting',\n removeOffset: 'Remove offset',\n fallback: 'Date',\n};\n","import type {\n DateFilterUnit,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nconst RANGE_SEPARATOR = '~';\n\nconst RELATIVE_PREFIX = 'previous';\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst UNITS: DateFilterUnit[] = ['day', 'week', 'month', 'quarter', 'year'];\n\nconst ALL: DateFilterValue = { mode: 'all' };\n\nexport function decodeDateFilter(\n encoded: string | null | undefined,\n): DateFilterValue {\n if (!encoded) {\n return ALL;\n }\n\n if (encoded.startsWith(`${RELATIVE_PREFIX}:`)) {\n return decodeRelative(encoded);\n }\n\n if (encoded.includes(RANGE_SEPARATOR)) {\n return decodeFixedRange(encoded);\n }\n\n if (ISO_DATE.test(encoded)) {\n return isDate(encoded)\n ? { mode: 'fixed', operator: 'on', start: encoded }\n : ALL;\n }\n\n return { mode: 'preset', preset: encoded };\n}\n\nfunction decodeFixedRange(encoded: string): DateFilterValue {\n const parts = encoded.split(RANGE_SEPARATOR);\n\n if (parts.length !== 2) {\n return ALL;\n }\n\n const [start, end] = parts;\n\n if (start && end) {\n return isDate(start) && isDate(end)\n ? { mode: 'fixed', operator: 'between', start, end }\n : ALL;\n }\n\n if (start) {\n return isDate(start)\n ? { mode: 'fixed', operator: 'after', start }\n : ALL;\n }\n\n if (end) {\n return isDate(end)\n ? { mode: 'fixed', operator: 'before', start: end }\n : ALL;\n }\n\n return ALL;\n}\n\nfunction decodeRelative(encoded: string): DateFilterValue {\n const [, rawAmount, rawUnit, ...rest] = encoded.split(':');\n const amount = Number(rawAmount);\n const unit = toUnit(rawUnit);\n\n if (!unit || !Number.isInteger(amount) || amount < 1) {\n return ALL;\n }\n\n const value: DateFilterValue = { mode: 'relative', amount, unit };\n const tail = [...rest];\n\n if (tail[0] === 'current') {\n value.include_current = true;\n tail.shift();\n }\n\n if (tail.length === 0) {\n return value;\n }\n\n if (tail.length !== 3 || tail[0] !== 'offset') {\n return ALL;\n }\n\n const offsetAmount = Number(tail[1]);\n const offsetUnit = toUnit(tail[2]);\n\n if (!offsetUnit || !Number.isInteger(offsetAmount) || offsetAmount < 1) {\n return ALL;\n }\n\n value.offset_amount = offsetAmount;\n value.offset_unit = offsetUnit;\n\n return value;\n}\n\nfunction toUnit(value: string | undefined): DateFilterUnit | null {\n return UNITS.find((unit) => unit === value) ?? null;\n}\n\nfunction isDate(value: string): boolean {\n if (!ISO_DATE.test(value)) {\n return false;\n }\n\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n\n return (\n date.getUTCFullYear() === year &&\n date.getUTCMonth() === month - 1 &&\n date.getUTCDate() === day\n );\n}\n","import type { DateFilterValue } from '@/blocks/date-filter/types';\n\nconst RANGE_SEPARATOR = '~';\n\nconst RELATIVE_PREFIX = 'previous';\n\nexport function encodeDateFilter(filter: DateFilterValue): string | null {\n if (filter.mode === 'preset') {\n return filter.preset ?? null;\n }\n\n if (filter.mode === 'fixed') {\n return encodeFixed(filter);\n }\n\n if (filter.mode === 'relative') {\n return encodeRelative(filter);\n }\n\n return null;\n}\n\nfunction encodeFixed(filter: DateFilterValue): string | null {\n if (!filter.start) {\n return null;\n }\n\n if (filter.operator === 'before') {\n return `${RANGE_SEPARATOR}${filter.start}`;\n }\n\n if (filter.operator === 'after') {\n return `${filter.start}${RANGE_SEPARATOR}`;\n }\n\n if (filter.operator === 'on') {\n return filter.start;\n }\n\n return filter.end ? `${filter.start}${RANGE_SEPARATOR}${filter.end}` : null;\n}\n\nfunction encodeRelative(filter: DateFilterValue): string | null {\n if (!filter.unit || !filter.amount || filter.amount < 1) {\n return null;\n }\n\n let value = `${RELATIVE_PREFIX}:${filter.amount}:${filter.unit}`;\n\n if (filter.include_current) {\n value += ':current';\n }\n\n if (filter.offset_amount && filter.offset_amount > 0) {\n value += `:offset:${filter.offset_amount}:${filter.offset_unit ?? filter.unit}`;\n }\n\n return value;\n}\n","import { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport interface FormOverlayLabels {\n cancelLabel: string;\n saveLabel: string;\n savingLabel: string;\n}\n\nexport const formOverlayDefaultLabels: FormOverlayLabels = {\n cancelLabel: 'Cancel',\n saveLabel: 'Save',\n savingLabel: 'Saving...',\n};\n\nexport type FormOverlayIntent = 'default' | 'destructive';\n\nexport interface FormOverlayActionsProps {\n labels?: FormOverlayLabels;\n processing?: boolean;\n intent?: FormOverlayIntent;\n submit?: boolean;\n className?: string;\n onCancel: () => void;\n onSave?: () => void;\n}\n\nexport function FormOverlayActions({\n labels = formOverlayDefaultLabels,\n processing = false,\n intent = 'default',\n submit = false,\n className,\n onCancel,\n onSave,\n slotName = 'form-overlay-actions',\n}: FormOverlayActionsProps & SlotNameProps) {\n return (\n <div\n className={cn('gap-2 flex items-center justify-end', className)}\n data-slot={slotName}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={processing}\n onClick={onCancel}\n >\n {labels.cancelLabel}\n </Button>\n\n <Button\n type={submit ? 'submit' : 'button'}\n aria-label={processing ? labels.savingLabel : undefined}\n variant={intent}\n loading={processing}\n loadingLabel={labels.savingLabel}\n onClick={onSave}\n >\n {processing ? labels.savingLabel : labels.saveLabel}\n </Button>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport {\n FormOverlayActions,\n type FormOverlayIntent,\n type FormOverlayLabels,\n} from '@/blocks/form-overlay';\nimport {\n FloatingSheet,\n FloatingSheetBody,\n FloatingSheetFooter,\n} from '@/components/ui/floating-sheet';\nimport { Separator } from '@/components/ui/separator';\nimport type { SlotNameProps } from '@/types';\n\nexport interface DetailEditSheetProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n description?: React.ReactNode;\n processing?: boolean;\n intent?: FormOverlayIntent;\n labels?: FormOverlayLabels;\n className?: string;\n children: React.ReactNode;\n onSave: () => void;\n onCancel?: () => void;\n}\n\nexport function DetailEditSheet({\n open,\n onOpenChange,\n title,\n description,\n processing = false,\n intent,\n labels,\n className,\n children,\n onSave,\n onCancel,\n slotName = 'detail-edit-sheet',\n}: DetailEditSheetProps & SlotNameProps) {\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (processing) {\n return;\n }\n\n onSave();\n };\n\n const handleCancel = () => {\n if (processing) {\n return;\n }\n\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <FloatingSheet\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={description}\n persistent\n className={className}\n >\n <form\n onSubmit={handleSubmit}\n className=\"min-h-0 flex flex-1 flex-col\"\n data-slot={slotName}\n >\n <FloatingSheetBody>{children}</FloatingSheetBody>\n\n <Separator />\n\n <FloatingSheetFooter>\n <FormOverlayActions\n submit\n labels={labels}\n processing={processing}\n intent={intent}\n onCancel={handleCancel}\n />\n </FloatingSheetFooter>\n </form>\n </FloatingSheet>\n );\n}\n","import * as React from 'react';\n\nimport {\n FormOverlayActions,\n type FormOverlayIntent,\n type FormOverlayLabels,\n} from '@/blocks/form-overlay';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport interface FormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n description?: React.ReactNode;\n processing?: boolean;\n intent?: FormOverlayIntent;\n labels?: FormOverlayLabels;\n className?: string;\n children: React.ReactNode;\n onSave: () => void;\n onCancel?: () => void;\n}\n\nexport function FormDialog({\n open,\n onOpenChange,\n title,\n description,\n processing = false,\n intent,\n labels,\n className,\n children,\n onSave,\n onCancel,\n slotName = 'form-dialog',\n}: FormDialogProps & SlotNameProps) {\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (processing) {\n return;\n }\n\n onSave();\n };\n\n const handleCancel = () => {\n if (processing) {\n return;\n }\n\n onCancel?.();\n onOpenChange(false);\n };\n\n const blockWhileProcessing = (event: Event | KeyboardEvent) => {\n if (processing) {\n event.preventDefault();\n }\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (processing && !next) {\n return;\n }\n\n onOpenChange(next);\n }}\n >\n <DialogContent\n {...(description ? {} : { 'aria-describedby': undefined })}\n className={cn('gap-0 p-0', className)}\n onEscapeKeyDown={blockWhileProcessing}\n onInteractOutside={blockWhileProcessing}\n slotName={slotName}\n >\n <form\n data-slot=\"form-dialog-form\"\n onSubmit={handleSubmit}\n className=\"grid max-h-[calc(100dvh-8rem)] grid-rows-[auto_minmax(0,1fr)_auto]\"\n >\n <DialogHeader className=\"text-left\">\n <DialogTitle>{title}</DialogTitle>\n {description ? (\n <DialogDescription>{description}</DialogDescription>\n ) : null}\n </DialogHeader>\n\n <div\n data-slot=\"form-dialog-body\"\n className=\"gap-4 px-6 pb-6 md:px-8 flex flex-col overflow-y-auto\"\n >\n {children}\n </div>\n\n <DialogFooter>\n <FormOverlayActions\n submit\n labels={labels}\n processing={processing}\n intent={intent}\n onCancel={handleCancel}\n className=\"w-full\"\n />\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import { CopyButton, type CopyButtonLabels } from '@/components/ui/copy-button';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { type LucideIcon } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nexport interface InfoFieldProps {\n icon: LucideIcon;\n label: string;\n value: ReactNode;\n copyable?: boolean;\n copyValue?: string;\n copyLabel?: CopyButtonLabels['copyLabel'];\n copiedLabel?: CopyButtonLabels['copiedLabel'];\n iconClassName?: string;\n className?: string;\n}\n\nfunction copyableText(value: ReactNode, copyValue?: string): string {\n if (copyValue !== undefined) {\n return copyValue.trim();\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value).trim();\n }\n\n return '';\n}\n\nexport function InfoField({\n icon: Icon,\n label,\n value,\n copyable = false,\n copyValue,\n copyLabel,\n copiedLabel,\n iconClassName,\n className,\n slotName = 'info-field',\n}: InfoFieldProps & SlotNameProps) {\n const text = copyableText(value, copyValue);\n\n return (\n <div\n className={cn('gap-3 flex items-center', className)}\n data-slot={slotName}\n >\n <div className={cn('p-2 rounded-xl bg-muted', iconClassName)}>\n <Icon className=\"size-5 text-muted-foreground\" />\n </div>\n <div>\n <p\n data-slot=\"info-field-label\"\n className=\"text-xs font-medium tracking-wider text-muted-foreground uppercase\"\n >\n {label}\n </p>\n <p\n data-slot=\"info-field-value\"\n className=\"gap-1 font-semibold flex items-center\"\n >\n {value}\n {copyable && text !== '' && (\n <CopyButton\n value={text}\n copyLabel={copyLabel}\n copiedLabel={copiedLabel}\n />\n )}\n </p>\n </div>\n </div>\n );\n}\n\nexport interface InfoFieldGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function InfoFieldGroup({ children, className }: InfoFieldGroupProps) {\n return <div className={cn('space-y-4', className)}>{children}</div>;\n}\n","import { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Textarea } from '@/components/ui/textarea';\nimport { cn } from '@/lib/utils';\n\nexport interface LocalizedField {\n name: string;\n label: string;\n type?: 'text' | 'textarea';\n rows?: number;\n}\n\nexport interface LocalizedFieldsProps {\n locales: string[];\n localeLabels?: Record<string, string>;\n fields: LocalizedField[];\n values: Record<string, Record<string, string>>;\n onChange: (field: string, locale: string, value: string) => void;\n errors?: Record<string, string>;\n defaultLocale?: string;\n className?: string;\n}\n\nexport function LocalizedFields({\n locales,\n localeLabels,\n fields,\n values,\n onChange,\n errors,\n defaultLocale,\n className,\n}: LocalizedFieldsProps) {\n return (\n <Tabs\n defaultValue={defaultLocale ?? locales[0]}\n className={cn('w-full', className)}\n >\n <TabsList className=\"mb-4 rounded-2xl p-1.5 flex h-auto w-full justify-start overflow-x-auto bg-muted\">\n {locales.map((locale) => (\n <TabsTrigger\n key={locale}\n value={locale}\n className=\"px-4 font-medium h-8 rounded-xl\"\n >\n {localeLabels?.[locale] ?? locale.toUpperCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {locales.map((locale) => (\n <TabsContent key={locale} value={locale} className=\"mt-0\">\n <div className=\"gap-4 lg:grid-cols-2 grid\">\n {fields.map((field) => {\n const fieldId = `${field.name}-${locale}`;\n const error = errors?.[`${field.name}.${locale}`];\n const value = values[field.name]?.[locale] ?? '';\n\n return (\n <div key={field.name} className=\"space-y-2\">\n <Label htmlFor={fieldId}>\n {field.label}\n </Label>\n {field.type === 'textarea' ? (\n <Textarea\n id={fieldId}\n rows={field.rows ?? 4}\n value={value}\n onChange={(event) =>\n onChange(\n field.name,\n locale,\n event.target.value,\n )\n }\n />\n ) : (\n <Input\n id={fieldId}\n value={value}\n onChange={(event) =>\n onChange(\n field.name,\n locale,\n event.target.value,\n )\n }\n />\n )}\n {error && (\n <p className=\"text-xs font-medium text-destructive\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n </div>\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n","import { cn } from '@/lib/utils';\nimport { type ReactNode } from 'react';\n\nexport interface SectionHeaderProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n control?: ReactNode;\n className?: string;\n}\n\nexport function SectionHeader({\n icon,\n title,\n description,\n control,\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={cn(\n 'gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col',\n className,\n )}\n >\n <div className=\"gap-3 flex items-center\">\n {icon}\n <div>\n <h2 className=\"text-lg font-bold text-foreground\">\n {title}\n </h2>\n {description && (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n {control}\n </div>\n );\n}\n","import { Label } from '@/components/ui/label';\nimport { Switch } from '@/components/ui/switch';\nimport {\n elevatedSurface,\n recessedSurface,\n type SurfaceProps,\n} from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { type LucideIcon } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nexport interface SettingsCardProps extends SurfaceProps {\n icon: LucideIcon;\n iconClassName?: string;\n title: string;\n description: string;\n control?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsCard({\n icon: Icon,\n iconClassName,\n title,\n description,\n control,\n children,\n inset = false,\n className,\n slotName = 'settings-card',\n}: SettingsCardProps & SlotNameProps) {\n return (\n <section\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'space-y-5 p-6 bg-card text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n data-slot={slotName}\n >\n <div className=\"gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col\">\n <div className=\"gap-3 flex items-center\">\n <div\n className={cn(\n 'size-11 rounded-2xl flex items-center justify-center',\n iconClassName ?? 'bg-muted text-muted-foreground',\n )}\n >\n <Icon className=\"size-5\" />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-foreground\">\n {title}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </p>\n </div>\n </div>\n {control}\n </div>\n {children}\n </section>\n );\n}\n\nexport interface SettingsPanelProps extends SurfaceProps {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsPanel({\n title,\n description,\n children,\n inset = true,\n className,\n slotName = 'settings-panel',\n}: SettingsPanelProps & SlotNameProps) {\n return (\n <div\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'space-y-4 p-5 bg-card text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n data-slot={slotName}\n >\n {(title || description) && (\n <div>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"mt-1 text-xs font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nexport interface ToggleRowProps {\n id: string;\n label: string;\n description?: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n}\n\nexport function ToggleRow({\n id,\n label,\n description,\n checked,\n onChange,\n disabled,\n}: ToggleRowProps) {\n return (\n <div className=\"gap-4 py-1 flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label\n htmlFor={id}\n className=\"text-sm font-medium text-foreground\"\n >\n {label}\n </Label>\n {description && (\n <p className=\"text-xs font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n}\n","import { FieldError } from '@/components/ui/field-error';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { useId, type ReactNode } from 'react';\n\nexport interface SettingsFieldProps {\n id?: string;\n label: string;\n description?: string;\n error?: string;\n required?: boolean;\n className?: string;\n children: (fieldId: string) => ReactNode;\n}\n\nexport function SettingsField({\n id,\n label,\n description,\n error,\n required,\n className,\n children,\n slotName = 'settings-field',\n}: SettingsFieldProps & SlotNameProps) {\n const generated = useId();\n const fieldId = id ?? generated;\n\n return (\n <div\n data-invalid={error ? true : undefined}\n className={cn('space-y-2 py-1', className)}\n data-slot={slotName}\n >\n <Label htmlFor={fieldId}>\n {label}\n {required && (\n <span\n data-slot=\"settings-field-required\"\n aria-hidden=\"true\"\n className=\"text-destructive\"\n >\n *\n </span>\n )}\n </Label>\n\n {children(fieldId)}\n\n {description && (\n <p\n data-slot=\"settings-field-description\"\n className=\"text-xs font-medium text-muted-foreground\"\n >\n {description}\n </p>\n )}\n\n <FieldError message={error} />\n </div>\n );\n}\n\ninterface ControlProps<T> {\n id?: string;\n label: string;\n description?: string;\n error?: string;\n required?: boolean;\n disabled?: boolean;\n placeholder?: string;\n value: T;\n onChange: (value: T) => void;\n className?: string;\n}\n\nexport type TextFieldProps = ControlProps<string> & {\n type?: 'text' | 'email' | 'url' | 'tel' | 'password';\n};\n\nexport function TextField({\n type = 'text',\n value,\n onChange,\n disabled,\n placeholder,\n slotName = 'text-field',\n ...field\n}: TextFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Input\n id={fieldId}\n type={type}\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n aria-invalid={field.error ? true : undefined}\n slotName={slotName}\n onChange={(event) => onChange(event.target.value)}\n />\n )}\n </SettingsField>\n );\n}\n\nexport type NumberFieldProps = ControlProps<number | ''> & {\n min?: number;\n max?: number;\n step?: number;\n};\n\nexport function NumberField({\n value,\n onChange,\n disabled,\n placeholder,\n min,\n max,\n step,\n slotName = 'number-field',\n ...field\n}: NumberFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Input\n id={fieldId}\n type=\"number\"\n inputMode=\"decimal\"\n value={value === '' ? '' : String(value)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n placeholder={placeholder}\n aria-invalid={field.error ? true : undefined}\n slotName={slotName}\n onChange={(event) =>\n onChange(\n event.target.value === ''\n ? ''\n : event.target.valueAsNumber,\n )\n }\n />\n )}\n </SettingsField>\n );\n}\n\nexport type DateFieldProps = ControlProps<string> & {\n min?: string;\n max?: string;\n};\n\nexport function DateField({\n value,\n onChange,\n disabled,\n min,\n max,\n slotName = 'date-field',\n ...field\n}: DateFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Input\n id={fieldId}\n type=\"date\"\n value={value}\n min={min}\n max={max}\n disabled={disabled}\n aria-invalid={field.error ? true : undefined}\n slotName={slotName}\n onChange={(event) => onChange(event.target.value)}\n />\n )}\n </SettingsField>\n );\n}\n\nexport interface SelectFieldOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport type SelectFieldProps = ControlProps<string> & {\n options: SelectFieldOption[];\n};\n\nexport function SelectField({\n value,\n onChange,\n options,\n disabled,\n placeholder,\n slotName = 'select-field',\n ...field\n}: SelectFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Select\n value={value}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n id={fieldId}\n slotName={slotName}\n aria-invalid={field.error ? true : undefined}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </SettingsField>\n );\n}\n","import { SectionHeader } from '@/blocks/section-header';\nimport { Card } from '@/components/ui/card';\nimport { resolveLink } from '@/lib/href';\nimport { compactRadius, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels } from '@/locales/context';\nimport type { LinkComponent, SlotNameProps, UrlLike } from '@/types';\nimport { ArrowLeft, ChevronRight, type LucideIcon } from 'lucide-react';\nimport { createContext, useContext, type ReactNode } from 'react';\n\nconst SettingsLinkContext = createContext<LinkComponent | undefined>(undefined);\n\nexport interface SettingsPageProps {\n title?: string;\n description?: string;\n control?: ReactNode;\n linkComponent?: LinkComponent;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsPage({\n title,\n description,\n control,\n linkComponent,\n children,\n className,\n slotName = 'settings-page',\n}: SettingsPageProps & SlotNameProps) {\n return (\n <SettingsLinkContext.Provider value={linkComponent}>\n <div\n className={cn(\n 'gap-8 max-w-4xl mx-auto flex w-full flex-col',\n className,\n )}\n data-slot={slotName}\n >\n {title && (\n <SectionHeader\n title={title}\n description={description}\n control={control}\n />\n )}\n {children}\n </div>\n </SettingsLinkContext.Provider>\n );\n}\n\nexport interface SettingsLabels {\n back: string;\n}\n\nexport const settingsLabels: SettingsLabels = {\n back: 'Back',\n};\n\nexport interface SettingsSectionProps {\n title?: string;\n description?: string;\n control?: ReactNode;\n backHref?: UrlLike | null;\n backLabel?: string;\n wide?: boolean;\n linkComponent?: LinkComponent;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsSection({\n title,\n description,\n control,\n backHref = '/settings',\n backLabel,\n wide = false,\n linkComponent,\n children,\n className,\n slotName = 'settings-section',\n}: SettingsSectionProps & SlotNameProps) {\n const labels = useUiLabels('settings', settingsLabels, {\n back: backLabel,\n });\n const contextLink = useContext(SettingsLinkContext);\n const Link = resolveLink(linkComponent ?? contextLink);\n\n return (\n <section\n className={cn(\n 'gap-6 mx-auto flex w-full flex-col',\n wide ? 'max-w-4xl' : 'max-w-2xl',\n className,\n )}\n data-slot={slotName}\n >\n {backHref && (\n <Link\n data-slot=\"settings-section-back\"\n href={backHref}\n className=\"gap-2 text-sm font-medium inline-flex w-fit items-center text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ArrowLeft className=\"size-4\" />\n {labels.back}\n </Link>\n )}\n\n {title && (\n <SectionHeader\n title={title}\n description={description}\n control={control}\n />\n )}\n\n {children}\n </section>\n );\n}\n\nexport interface SettingsGroupProps {\n label?: string;\n columns?: 1 | 2;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsGroup({\n label,\n columns = 2,\n children,\n className,\n slotName = 'settings-group',\n}: SettingsGroupProps & SlotNameProps) {\n return (\n <div\n className={cn('gap-3 flex flex-col', className)}\n data-slot={slotName}\n >\n {label && (\n <p className=\"font-bold tracking-widest text-[11px] text-muted-foreground uppercase\">\n {label}\n </p>\n )}\n <div\n data-slot=\"settings-group-grid\"\n className={cn(\n 'gap-4 grid grid-cols-1',\n columns === 2 && 'md:grid-cols-2',\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport interface SettingsEntryProps {\n icon: LucideIcon;\n iconClassName?: string;\n title: string;\n description?: string;\n href: UrlLike;\n badge?: ReactNode;\n disabled?: boolean;\n linkComponent?: LinkComponent;\n className?: string;\n}\n\nexport function SettingsEntry({\n icon: Icon,\n iconClassName,\n title,\n description,\n href,\n badge,\n disabled = false,\n linkComponent,\n className,\n slotName = 'settings-entry',\n}: SettingsEntryProps & SlotNameProps) {\n const contextLink = useContext(SettingsLinkContext);\n const Link = resolveLink(linkComponent ?? contextLink);\n\n const card = (\n <Card\n interactive={!disabled}\n padding=\"none\"\n data-disabled={disabled || undefined}\n className={cn(\n 'gap-4 p-5 flex h-full flex-row items-center',\n disabled && 'opacity-60',\n className,\n )}\n >\n <span\n className={cn(\n 'size-11 flex shrink-0 items-center justify-center rounded-full',\n iconClassName ?? 'bg-primary/10 text-primary',\n )}\n >\n <Icon className=\"size-5\" />\n </span>\n\n <span className=\"min-w-0 flex flex-1 flex-col\">\n <span className=\"gap-2 flex items-center\">\n <span className=\"font-bold text-foreground\">{title}</span>\n {badge}\n </span>\n {description && (\n <span className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </span>\n )}\n </span>\n\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n </Card>\n );\n\n if (disabled) {\n return (\n <div data-disabled=\"true\" aria-disabled=\"true\" data-slot={slotName}>\n {card}\n </div>\n );\n }\n\n return (\n <Link\n href={href}\n className={cn(compactRadius, focusRing)}\n data-slot={slotName}\n >\n {card}\n </Link>\n );\n}\n","import {\n elevatedSurface,\n recessedSurface,\n type SurfaceProps,\n} from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport {\n ArrowDownRight,\n ArrowRight,\n ArrowUpRight,\n type LucideIcon,\n} from 'lucide-react';\nimport { type ReactNode } from 'react';\n\ntype TrendTone = 'positive' | 'negative' | 'neutral';\n\ninterface TrendDisplay {\n label: string;\n tone: TrendTone;\n icon: LucideIcon;\n}\n\nfunction resolveTrend(trend?: number): TrendDisplay | null {\n if (trend === null || trend === undefined || Number.isNaN(trend)) {\n return null;\n }\n\n const normalized = Math.abs(trend) < 0.05 ? 0 : trend;\n\n if (normalized === 0) {\n return { label: '0%', tone: 'neutral', icon: ArrowRight };\n }\n\n if (normalized > 0) {\n return {\n label: `+${normalized.toFixed(1)}%`,\n tone: 'positive',\n icon: ArrowUpRight,\n };\n }\n\n return {\n label: `${normalized.toFixed(1)}%`,\n tone: 'negative',\n icon: ArrowDownRight,\n };\n}\n\nconst trendToneClass: Record<TrendTone, string> = {\n positive: 'text-success',\n negative: 'text-destructive',\n neutral: 'text-muted-foreground',\n};\n\nexport interface StatCardProps extends SurfaceProps {\n title: string;\n value: ReactNode;\n icon: LucideIcon;\n iconClassName?: string;\n trend?: number;\n comparisonLabel?: string;\n className?: string;\n}\n\nexport function StatCard({\n title,\n value,\n icon: Icon,\n iconClassName = 'bg-muted text-muted-foreground',\n trend,\n comparisonLabel,\n inset = false,\n className,\n slotName = 'stat-card',\n}: StatCardProps & SlotNameProps) {\n const resolvedTrend = resolveTrend(trend);\n\n return (\n <div\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'p-6 min-w-0 flex h-full flex-col justify-between bg-card text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n data-slot={slotName}\n >\n <div className=\"mb-4 gap-4 flex items-start justify-between\">\n <div className={cn('rounded-2xl p-3 shrink-0', iconClassName)}>\n <Icon className=\"size-6\" />\n </div>\n {resolvedTrend && (\n <div className=\"min-w-0 text-right\">\n <span\n className={cn(\n 'text-sm font-semibold inline-flex items-center',\n trendToneClass[resolvedTrend.tone],\n )}\n >\n {resolvedTrend.label}\n <resolvedTrend.icon className=\"ml-1 size-4\" />\n </span>\n {comparisonLabel && (\n <p className=\"mt-1 font-medium tracking-wider text-[10px] whitespace-nowrap text-muted-foreground uppercase\">\n {comparisonLabel}\n </p>\n )}\n </div>\n )}\n </div>\n <div>\n <p className=\"mb-1 text-xs font-medium tracking-wider break-words text-muted-foreground uppercase\">\n {title}\n </p>\n <p className=\"text-3xl font-bold truncate text-foreground tabular-nums\">\n {value}\n </p>\n </div>\n </div>\n );\n}\n\nexport interface StatsGridProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function StatsGrid({ children, className }: StatsGridProps) {\n return (\n <div\n className={cn(\n 'gap-6 [&>*]:min-w-0 grid [grid-template-columns:repeat(auto-fit,minmax(18rem,1fr))]',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport type TwoFactorSetupStep = 'pending' | 'scan' | 'confirm' | 'recovery';\n\nexport type TwoFactorCodeMode = 'code' | 'recovery';\n\nexport interface TwoFactorLabels {\n setupTitle: string;\n setupDescription: string;\n pendingLabel: string;\n scanTitle: string;\n scanDescription: string;\n qrFallbackLabel: string;\n manualKeyLabel: string;\n manualKeyDescription: string;\n manualKeyRevealLabel: string;\n manualKeyHideLabel: string;\n continueLabel: string;\n confirmTitle: string;\n confirmDescription: string;\n codeLabel: string;\n recoveryCodeLabel: string;\n recoveryCodePlaceholder: string;\n useRecoveryCodeLabel: string;\n useCodeLabel: string;\n verifyLabel: string;\n verifyingLabel: string;\n errorFallbackLabel: string;\n cancelLabel: string;\n challengeTitle: string;\n challengeDescription: string;\n recoveryTitle: string;\n recoveryDescription: string;\n recoveryWarning: string;\n revealLabel: string;\n hideLabel: string;\n copyLabel: string;\n copiedLabel: string;\n copyFailedLabel: string;\n regenerateLabel: string;\n doneLabel: string;\n disableLabel: string;\n disableTitle: string;\n disableDescription: string;\n disableConfirmLabel: string;\n disableCancelLabel: string;\n}\n\nexport const twoFactorLabels: TwoFactorLabels = {\n setupTitle: 'Two-factor authentication',\n setupDescription:\n 'Add a second step to your sign in with an authenticator app.',\n pendingLabel: 'Preparing your setup key',\n scanTitle: 'Scan the code',\n scanDescription:\n 'Open your authenticator app and scan the code below to add this account.',\n qrFallbackLabel: 'The QR code is not available yet.',\n manualKeyLabel: 'Setup key',\n manualKeyDescription:\n 'Enter this key by hand if your app cannot scan the code.',\n manualKeyRevealLabel: 'Show setup key',\n manualKeyHideLabel: 'Hide setup key',\n continueLabel: 'Continue',\n confirmTitle: 'Confirm the code',\n confirmDescription:\n 'Enter the six digit code your authenticator app is showing.',\n codeLabel: 'Authentication code',\n recoveryCodeLabel: 'Recovery code',\n recoveryCodePlaceholder: 'Enter a recovery code',\n useRecoveryCodeLabel: 'Use a recovery code',\n useCodeLabel: 'Use an authentication code',\n verifyLabel: 'Verify',\n verifyingLabel: 'Verifying',\n errorFallbackLabel: 'That did not work. Try again.',\n cancelLabel: 'Cancel',\n challengeTitle: 'Two-factor confirmation',\n challengeDescription:\n 'Confirm access to your account with the code from your authenticator app.',\n recoveryTitle: 'Recovery codes',\n recoveryDescription:\n 'Store these codes somewhere safe. Each one signs you in once if you lose your device.',\n recoveryWarning: 'They are shown once and cannot be read again afterwards.',\n revealLabel: 'Show codes',\n hideLabel: 'Hide codes',\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n copyFailedLabel: 'Copying is unavailable here. Select the codes manually.',\n regenerateLabel: 'Regenerate codes',\n doneLabel: 'Done',\n disableLabel: 'Disable two-factor authentication',\n disableTitle: 'Disable two-factor authentication',\n disableDescription:\n 'Your account will be protected by your password alone. Recovery codes stop working.',\n disableConfirmLabel: 'Disable',\n disableCancelLabel: 'Keep it on',\n};\n\nexport interface TwoFactorLabelProps {\n labels?: Partial<TwoFactorLabels>;\n}\n\nexport function resolveLabels(\n labels?: Partial<TwoFactorLabels>,\n): TwoFactorLabels {\n return labels ? { ...twoFactorLabels, ...labels } : twoFactorLabels;\n}\n\nexport function messageList(errors?: string | string[] | null): string[] {\n if (!errors) {\n return [];\n }\n\n return (Array.isArray(errors) ? errors : [errors]).filter(\n (message) => message.length > 0,\n );\n}\n\nexport interface TwoFactorQrProps {\n qrCode?: ReactNode;\n qrCodeSvg?: string;\n}\n","import {\n messageList,\n resolveLabels,\n type TwoFactorCodeMode,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '@/components/ui/input-otp';\nimport { Label } from '@/components/ui/label';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { AlertCircle } from 'lucide-react';\nimport { useId, useState, type FormEvent, type ReactNode } from 'react';\n\nexport interface TwoFactorVerifyFormProps extends TwoFactorLabelProps {\n onSubmit: (code: string, mode: TwoFactorCodeMode) => void | Promise<void>;\n errors?: string | string[] | null;\n allowRecoveryCode?: boolean;\n length?: number;\n autoFocus?: boolean;\n submitLabel?: string;\n footer?: ReactNode;\n className?: string;\n}\n\nfunction errorMessage(reason: unknown, fallback: string): string {\n return reason instanceof Error && reason.message\n ? reason.message\n : fallback;\n}\n\nexport function TwoFactorVerifyForm({\n onSubmit,\n errors,\n allowRecoveryCode = false,\n length = 6,\n autoFocus = false,\n submitLabel,\n footer,\n labels,\n className,\n slotName = 'two-factor-verify-form',\n}: TwoFactorVerifyFormProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const fieldId = useId();\n const [mode, setMode] = useState<TwoFactorCodeMode>('code');\n const [value, setValue] = useState('');\n const [pending, setPending] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n\n const messages = [...messageList(errors), ...messageList(failure)];\n const complete =\n mode === 'code' ? value.length === length : value.length > 0;\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (pending || !complete) {\n return;\n }\n\n setFailure(null);\n setPending(true);\n\n try {\n await onSubmit(value, mode);\n } catch (reason) {\n setFailure(errorMessage(reason, text.errorFallbackLabel));\n } finally {\n setPending(false);\n }\n };\n\n const switchMode = () => {\n setMode(mode === 'code' ? 'recovery' : 'code');\n setValue('');\n setFailure(null);\n };\n\n return (\n <form\n data-mode={mode}\n data-pending={pending || undefined}\n onSubmit={handleSubmit}\n className={cn('gap-5 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n <div className=\"gap-2 flex flex-col\">\n <Label htmlFor={fieldId}>\n {mode === 'code' ? text.codeLabel : text.recoveryCodeLabel}\n </Label>\n\n {mode === 'code' ? (\n <InputOTP\n id={fieldId}\n data-slot=\"two-factor-code-input\"\n maxLength={length}\n value={value}\n autoFocus={autoFocus}\n disabled={pending}\n onChange={setValue}\n aria-label={text.codeLabel}\n >\n <InputOTPGroup>\n {Array.from({ length }, (_, index) => (\n <InputOTPSlot key={index} index={index} />\n ))}\n </InputOTPGroup>\n </InputOTP>\n ) : (\n <Input\n id={fieldId}\n slotName=\"two-factor-recovery-input\"\n value={value}\n autoComplete=\"one-time-code\"\n spellCheck={false}\n disabled={pending}\n placeholder={text.recoveryCodePlaceholder}\n aria-label={text.recoveryCodeLabel}\n onChange={(event) => setValue(event.target.value)}\n />\n )}\n </div>\n\n {messages.length > 0 && (\n <Alert variant=\"destructive\" slotName=\"two-factor-error\">\n <AlertCircle />\n <AlertDescription>\n {messages.map((message) => (\n <p key={message}>{message}</p>\n ))}\n </AlertDescription>\n </Alert>\n )}\n\n <div className=\"gap-3 flex flex-col\">\n <Button\n type=\"submit\"\n loading={pending}\n loadingLabel={text.verifyingLabel}\n disabled={!complete}\n >\n {submitLabel ?? text.verifyLabel}\n </Button>\n\n {allowRecoveryCode && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={pending}\n onClick={switchMode}\n >\n {mode === 'code'\n ? text.useRecoveryCodeLabel\n : text.useCodeLabel}\n </Button>\n )}\n\n {footer}\n </div>\n </form>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorCodeMode,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { TwoFactorVerifyForm } from '@/blocks/two-factor/verify-form';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport type { ReactNode } from 'react';\n\nexport interface TwoFactorChallengeProps extends TwoFactorLabelProps {\n onSubmit: (code: string, mode: TwoFactorCodeMode) => void | Promise<void>;\n errors?: string | string[] | null;\n allowRecoveryCode?: boolean;\n title?: string;\n description?: string;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function TwoFactorChallenge({\n onSubmit,\n errors,\n allowRecoveryCode = true,\n title,\n description,\n footer,\n labels,\n className,\n slotName = 'two-factor-challenge',\n}: TwoFactorChallengeProps & SlotNameProps) {\n const text = resolveLabels(labels);\n\n return (\n <section\n className={cn('gap-6 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n <div className=\"gap-2 flex flex-col\">\n <h2 className=\"text-2xl font-bold tracking-tight text-foreground\">\n {title ?? text.challengeTitle}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description ?? text.challengeDescription}\n </p>\n </div>\n\n <TwoFactorVerifyForm\n autoFocus\n allowRecoveryCode={allowRecoveryCode}\n errors={errors}\n labels={labels}\n footer={footer}\n onSubmit={onSubmit}\n />\n </section>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { ShieldOff } from 'lucide-react';\nimport { useState, type ComponentProps } from 'react';\n\nexport interface TwoFactorDisableButtonProps extends TwoFactorLabelProps {\n onDisable: () => void | Promise<void>;\n disabled?: boolean;\n variant?: ComponentProps<typeof Button>['variant'];\n size?: ComponentProps<typeof Button>['size'];\n className?: string;\n}\n\nexport function TwoFactorDisableButton({\n onDisable,\n disabled = false,\n variant = 'destructive',\n size = 'default',\n labels,\n className,\n slotName = 'two-factor-disable',\n}: TwoFactorDisableButtonProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [open, setOpen] = useState(false);\n const [processing, setProcessing] = useState(false);\n\n const handleConfirm = async () => {\n setProcessing(true);\n\n try {\n await onDisable();\n } finally {\n setProcessing(false);\n }\n };\n\n return (\n <span\n data-open={open || undefined}\n className={cn('inline-flex', className)}\n data-slot={slotName}\n >\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled || processing}\n onClick={() => setOpen(true)}\n >\n <ShieldOff />\n {text.disableLabel}\n </Button>\n\n <ConfirmDialog\n open={open}\n onOpenChange={setOpen}\n title={text.disableTitle}\n description={text.disableDescription}\n confirmText={text.disableConfirmLabel}\n cancelText={text.disableCancelLabel}\n processing={processing}\n onConfirm={handleConfirm}\n />\n </span>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { Button } from '@/components/ui/button';\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { compactRadius, recessedSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { Eye, EyeOff, RefreshCw } from 'lucide-react';\nimport { useState } from 'react';\n\nexport interface TwoFactorRecoveryCodesProps extends TwoFactorLabelProps {\n codes: string[];\n defaultRevealed?: boolean;\n onRegenerate?: () => void | Promise<void>;\n showHeading?: boolean;\n className?: string;\n}\n\nexport function TwoFactorRecoveryCodes({\n codes,\n defaultRevealed = false,\n onRegenerate,\n showHeading = true,\n labels,\n className,\n slotName = 'two-factor-recovery-codes',\n}: TwoFactorRecoveryCodesProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [revealed, setRevealed] = useState(defaultRevealed);\n const [copyFailed, setCopyFailed] = useState(false);\n const [regenerating, setRegenerating] = useState(false);\n\n const handleRegenerate = async () => {\n if (!onRegenerate || regenerating) {\n return;\n }\n\n setRegenerating(true);\n\n try {\n await onRegenerate();\n } finally {\n setRegenerating(false);\n }\n };\n\n return (\n <div\n data-revealed={revealed || undefined}\n className={cn('gap-4 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n {showHeading && (\n <div className=\"gap-1 flex flex-col\">\n <p className=\"text-sm font-semibold text-foreground\">\n {text.recoveryTitle}\n </p>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {text.recoveryDescription} {text.recoveryWarning}\n </p>\n </div>\n )}\n\n {revealed && (\n <ul\n data-slot=\"two-factor-recovery-list\"\n className={cn(\n recessedSurface,\n 'gap-2 p-4 sm:grid-cols-2 grid',\n )}\n >\n {codes.map((code) => (\n <li\n key={code}\n data-slot=\"two-factor-recovery-code\"\n className={cn(\n compactRadius,\n 'px-2 py-1 text-sm font-medium font-mono break-all text-foreground',\n )}\n >\n {code}\n </li>\n ))}\n </ul>\n )}\n\n <div className=\"gap-2 flex flex-wrap items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={revealed}\n onClick={() => setRevealed(!revealed)}\n >\n {revealed ? <EyeOff /> : <Eye />}\n {revealed ? text.hideLabel : text.revealLabel}\n </Button>\n\n <CopyButton\n value={codes.join('\\n')}\n copyLabel={text.copyLabel}\n copiedLabel={text.copiedLabel}\n onCopied={() => setCopyFailed(false)}\n onCopyFailed={() => setCopyFailed(true)}\n />\n\n {onRegenerate && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n loading={regenerating}\n loadingLabel={text.regenerateLabel}\n onClick={handleRegenerate}\n >\n <RefreshCw />\n {text.regenerateLabel}\n </Button>\n )}\n </div>\n\n {copyFailed && (\n <p\n data-slot=\"two-factor-copy-failed\"\n className=\"text-xs font-medium text-muted-foreground\"\n >\n {text.copyFailedLabel}\n </p>\n )}\n </div>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorLabelProps,\n type TwoFactorQrProps,\n} from '@/blocks/two-factor/types';\nimport { Button } from '@/components/ui/button';\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { compactRadius, controlRadius, recessedSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { Eye, EyeOff } from 'lucide-react';\nimport { useState } from 'react';\n\nexport interface TwoFactorScanStepProps\n extends TwoFactorLabelProps, TwoFactorQrProps {\n manualSetupKey?: string | null;\n className?: string;\n}\n\nexport function TwoFactorScanStep({\n qrCode,\n qrCodeSvg,\n manualSetupKey,\n labels,\n className,\n slotName = 'two-factor-scan-step',\n}: TwoFactorScanStepProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [revealed, setRevealed] = useState(false);\n\n return (\n <div\n className={cn('gap-5 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n <div\n data-slot=\"two-factor-qr\"\n className={cn(\n recessedSurface,\n 'p-4 flex items-center justify-center [&_svg]:size-full [&_svg]:h-auto',\n )}\n >\n {qrCode ??\n (qrCodeSvg ? (\n <div\n data-slot=\"two-factor-qr-markup\"\n className={cn(controlRadius, 'p-3 bg-card')}\n dangerouslySetInnerHTML={{ __html: qrCodeSvg }}\n />\n ) : (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {text.qrFallbackLabel}\n </p>\n ))}\n </div>\n\n {manualSetupKey && (\n <div\n data-slot=\"two-factor-setup-key\"\n className=\"gap-2 flex flex-col\"\n >\n <p className=\"text-sm font-semibold text-foreground\">\n {text.manualKeyLabel}\n </p>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {text.manualKeyDescription}\n </p>\n\n <div className=\"gap-2 flex flex-wrap items-center\">\n <code\n data-slot=\"two-factor-setup-key-value\"\n className={cn(\n compactRadius,\n 'px-3 py-2 text-sm font-medium font-mono bg-muted break-all text-foreground',\n )}\n >\n {revealed\n ? manualSetupKey\n : '•'.repeat(manualSetupKey.length)}\n </code>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={revealed}\n onClick={() => setRevealed(!revealed)}\n >\n {revealed ? <EyeOff /> : <Eye />}\n {revealed\n ? text.manualKeyHideLabel\n : text.manualKeyRevealLabel}\n </Button>\n\n <CopyButton\n value={manualSetupKey}\n copyLabel={text.copyLabel}\n copiedLabel={text.copiedLabel}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { TwoFactorRecoveryCodes } from '@/blocks/two-factor/recovery-codes';\nimport { TwoFactorScanStep } from '@/blocks/two-factor/scan-step';\nimport {\n resolveLabels,\n type TwoFactorLabelProps,\n type TwoFactorQrProps,\n type TwoFactorSetupStep,\n} from '@/blocks/two-factor/types';\nimport { TwoFactorVerifyForm } from '@/blocks/two-factor/verify-form';\nimport { Button } from '@/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { useEffect, useRef, useState } from 'react';\n\nexport interface TwoFactorSetupDialogProps\n extends TwoFactorLabelProps, TwoFactorQrProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n enabled?: boolean;\n manualSetupKey?: string | null;\n recoveryCodes?: string[];\n errors?: string | string[] | null;\n onConfirm: (code: string) => void | Promise<void>;\n onRequestSetupData?: () => void | Promise<void>;\n onRegenerateRecoveryCodes?: () => void | Promise<void>;\n onCompleted?: () => void;\n className?: string;\n}\n\nexport function TwoFactorSetupDialog({\n open,\n onOpenChange,\n enabled = false,\n qrCode,\n qrCodeSvg,\n manualSetupKey,\n recoveryCodes,\n errors,\n onConfirm,\n onRequestSetupData,\n onRegenerateRecoveryCodes,\n onCompleted,\n labels,\n className,\n slotName = 'two-factor-setup-dialog',\n}: TwoFactorSetupDialogProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [step, setStep] = useState<TwoFactorSetupStep>(\n enabled ? 'recovery' : 'scan',\n );\n\n const requestSetupData = useRef(onRequestSetupData);\n const openedBefore = useRef(false);\n\n useEffect(() => {\n requestSetupData.current = onRequestSetupData;\n }, [onRequestSetupData]);\n\n useEffect(() => {\n if (!open) {\n openedBefore.current = false;\n\n return;\n }\n\n if (openedBefore.current) {\n return;\n }\n\n openedBefore.current = true;\n setStep(enabled ? 'recovery' : 'scan');\n\n if (!enabled) {\n void requestSetupData.current?.();\n }\n }, [open, enabled]);\n\n const ready = Boolean(qrCode || qrCodeSvg || manualSetupKey);\n const codes = recoveryCodes ?? [];\n\n const handleConfirm = async (code: string) => {\n await onConfirm(code);\n setStep('recovery');\n };\n\n const finish = () => {\n onOpenChange(false);\n onCompleted?.();\n };\n\n const heading = {\n pending: text.setupTitle,\n scan: text.scanTitle,\n confirm: text.confirmTitle,\n recovery: text.recoveryTitle,\n }[step];\n\n const description = {\n pending: text.setupDescription,\n scan: text.scanDescription,\n confirm: text.confirmDescription,\n recovery: `${text.recoveryDescription} ${text.recoveryWarning}`,\n }[step];\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n data-step={step}\n className={cn('max-w-md p-0', className)}\n slotName={slotName}\n >\n <DialogHeader className=\"p-6 md:p-8\">\n <DialogTitle>{heading}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n\n <div className=\"gap-5 p-6 md:p-8 pt-0 md:pt-0 flex flex-col\">\n {step === 'scan' &&\n (ready ? (\n <>\n <TwoFactorScanStep\n qrCode={qrCode}\n qrCodeSvg={qrCodeSvg}\n manualSetupKey={manualSetupKey}\n labels={labels}\n />\n <Button\n type=\"button\"\n onClick={() => setStep('confirm')}\n >\n {text.continueLabel}\n </Button>\n </>\n ) : (\n <div\n data-slot=\"two-factor-pending\"\n className=\"gap-3 py-6 text-sm font-medium flex items-center justify-center text-muted-foreground\"\n >\n <Spinner label={text.pendingLabel} />\n {text.pendingLabel}\n </div>\n ))}\n\n {step === 'confirm' && (\n <TwoFactorVerifyForm\n autoFocus\n errors={errors}\n labels={labels}\n onSubmit={handleConfirm}\n footer={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStep('scan')}\n >\n {text.cancelLabel}\n </Button>\n }\n />\n )}\n\n {step === 'recovery' && (\n <>\n <TwoFactorRecoveryCodes\n codes={codes}\n defaultRevealed\n showHeading={false}\n labels={labels}\n onRegenerate={onRegenerateRecoveryCodes}\n />\n <Button type=\"button\" onClick={finish}>\n {text.doneLabel}\n </Button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","CalendarDays","useState","jsx","jsxs","ChevronLeft","format","pt","jsx","jsxs","ChevronLeft","format","pt","jsx","jsxs","useState","CalendarDays","RANGE_SEPARATOR","RELATIVE_PREFIX","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","createContext","useContext","jsx","jsxs","jsx","jsxs","useId","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","Eye","EyeOff","useState","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/blocks/command-palette.tsx","../src/blocks/danger-zone.tsx","../src/blocks/date-filter/context.tsx","../src/blocks/date-filter/date-filter.tsx","../src/blocks/date-filter/fixed-panel.tsx","../src/blocks/date-filter/relative-panel.tsx","../src/blocks/date-filter/range.ts","../src/blocks/date-filter/summarise.ts","../src/blocks/date-filter/types.ts","../src/blocks/date-filter/decode.ts","../src/blocks/date-filter/encode.ts","../src/blocks/form-overlay.tsx","../src/blocks/detail-edit-sheet.tsx","../src/blocks/form-dialog.tsx","../src/blocks/info-field.tsx","../src/blocks/localized-fields.tsx","../src/blocks/section-header.tsx","../src/blocks/settings-card.tsx","../src/blocks/settings-fields.tsx","../src/blocks/settings-page.tsx","../src/blocks/stat-card.tsx","../src/blocks/two-factor/types.ts","../src/blocks/two-factor/verify-form.tsx","../src/blocks/two-factor/challenge.tsx","../src/blocks/two-factor/disable-button.tsx","../src/blocks/two-factor/recovery-codes.tsx","../src/blocks/two-factor/scan-step.tsx","../src/blocks/two-factor/setup-dialog.tsx"],"sourcesContent":["import {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/ui/command';\nimport { useUiLabels } from '@/locales/context';\nimport { type LucideIcon } from 'lucide-react';\nimport { useCallback, useEffect, useState, type ReactNode } from 'react';\n\nexport interface CommandPaletteItem {\n id: string;\n label: string;\n icon?: LucideIcon;\n value?: string;\n hint?: string;\n}\n\nexport interface CommandPaletteGroup {\n heading: string;\n items: CommandPaletteItem[];\n}\n\nexport interface CommandPaletteLabels {\n placeholder: string;\n noResultsLabel: string;\n}\n\nexport const commandPaletteDefaultLabels: CommandPaletteLabels = {\n placeholder: 'Search...',\n noResultsLabel: 'No results found',\n};\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n groups: CommandPaletteGroup[];\n onSelect: (item: CommandPaletteItem) => void;\n query?: string;\n onQueryChange?: (query: string) => void;\n placeholder?: CommandPaletteLabels['placeholder'];\n noResultsLabel?: CommandPaletteLabels['noResultsLabel'];\n emptyState?: ReactNode;\n className?: string;\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n groups,\n onSelect,\n query,\n onQueryChange,\n placeholder,\n noResultsLabel,\n emptyState,\n className,\n}: CommandPaletteProps) {\n const labels = useUiLabels('commandPalette', commandPaletteDefaultLabels, {\n placeholder,\n noResultsLabel,\n });\n const resolvedEmptyState = emptyState ?? labels.noResultsLabel;\n\n return (\n <CommandDialog\n open={open}\n onOpenChange={onOpenChange}\n className={className}\n >\n <CommandInput\n placeholder={labels.placeholder}\n value={query}\n onValueChange={onQueryChange}\n />\n <CommandList className=\"max-h-[360px]\">\n <CommandEmpty>{resolvedEmptyState}</CommandEmpty>\n\n {groups.map((group) => (\n <CommandGroup key={group.heading} heading={group.heading}>\n {group.items.map((item) => (\n <CommandItem\n key={item.id}\n value={item.value ?? item.label}\n onSelect={() => onSelect(item)}\n >\n {item.icon && (\n <item.icon className=\"mr-2 size-4\" />\n )}\n <span className=\"font-medium\">\n {item.label}\n </span>\n {item.hint && (\n <span className=\"text-xs ml-auto text-muted-foreground\">\n {item.hint}\n </span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </CommandDialog>\n );\n}\n\nexport function useCommandPalette(initialOpen = false) {\n const [open, setOpen] = useState(initialOpen);\n\n const toggle = useCallback(() => setOpen((previous) => !previous), []);\n\n useEffect(() => {\n const handler = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggle();\n }\n };\n\n document.addEventListener('keydown', handler);\n\n return () => document.removeEventListener('keydown', handler);\n }, [toggle]);\n\n return { open, setOpen, toggle };\n}\n","import { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { elevatedSurface, nestedSurfaceReset } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { TriangleAlert } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nexport interface DangerZoneLabels {\n title: string;\n description: string;\n actionLabel: string;\n confirmTitle: string;\n confirmDescription: string;\n confirmText: string;\n cancelText: string;\n requiredValueLabel: string;\n}\n\nexport const dangerZoneLabels: DangerZoneLabels = {\n title: 'Danger zone',\n description: 'These actions are permanent and cannot be undone.',\n actionLabel: 'Delete',\n confirmTitle: 'Confirm Action',\n confirmDescription:\n 'Are you sure you want to continue? This action cannot be undone.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n requiredValueLabel: 'Type {{value}} to confirm',\n};\n\nexport interface DangerZoneAction {\n id: string;\n title: string;\n description?: string;\n actionLabel?: string;\n confirmTitle?: string;\n confirmDescription?: string;\n confirmText?: string;\n cancelText?: string;\n requiredValue?: string;\n requiredValueLabel?: string;\n disabled?: boolean;\n onConfirm: () => void;\n}\n\nexport interface DangerZoneProps {\n title?: string;\n description?: string;\n actions: DangerZoneAction[];\n processing?: boolean;\n labels?: Partial<DangerZoneLabels>;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function DangerZone({\n title,\n description,\n actions,\n processing = false,\n labels,\n footer,\n className,\n slotName = 'danger-zone',\n}: DangerZoneProps & SlotNameProps) {\n const copy = { ...dangerZoneLabels, ...labels };\n const [activeId, setActiveId] = useState<string | null>(null);\n const active = actions.find((action) => action.id === activeId) ?? null;\n\n return (\n <section\n className={cn(\n elevatedSurface,\n nestedSurfaceReset,\n 'gap-6 p-6 flex flex-col bg-destructive/5 ring-destructive/30',\n className,\n )}\n data-slot={slotName}\n >\n <div data-slot=\"danger-zone-header\" className=\"gap-3 flex\">\n <span className=\"size-11 rounded-2xl flex shrink-0 items-center justify-center bg-destructive/10 text-destructive\">\n <TriangleAlert className=\"size-5\" />\n </span>\n <div>\n <h2 className=\"text-lg font-bold text-destructive\">\n {title ?? copy.title}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description ?? copy.description}\n </p>\n </div>\n </div>\n\n <ul data-slot=\"danger-zone-actions\" className=\"gap-4 flex flex-col\">\n {actions.map((action) => (\n <li\n key={action.id}\n data-slot=\"danger-zone-action\"\n data-action-id={action.id}\n className=\"gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col\"\n >\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">\n {action.title}\n </p>\n {action.description && (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {action.description}\n </p>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={processing || action.disabled}\n onClick={() => setActiveId(action.id)}\n className=\"sm:w-auto w-full\"\n >\n {action.actionLabel ?? copy.actionLabel}\n </Button>\n </li>\n ))}\n </ul>\n\n {footer}\n\n <ConfirmDialog\n open={active !== null}\n onOpenChange={(open) => {\n if (!open) {\n setActiveId(null);\n }\n }}\n variant=\"destructive\"\n processing={processing}\n title={active?.confirmTitle ?? copy.confirmTitle}\n description={\n active?.confirmDescription ?? copy.confirmDescription\n }\n confirmText={active?.confirmText ?? copy.confirmText}\n cancelText={active?.cancelText ?? copy.cancelText}\n requiredValue={active?.requiredValue}\n requiredValueLabel={\n active?.requiredValueLabel ?? copy.requiredValueLabel\n }\n onConfirm={() => active?.onConfirm()}\n />\n </section>\n );\n}\n","import { createContext, useContext } from 'react';\n\nimport type {\n DateFilterLabels,\n DateFilterOption,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nexport type DateFilterPanel = 'root' | 'fixed' | 'relative';\n\nexport interface DateFilterContextValue {\n value: DateFilterValue;\n draft: DateFilterValue;\n labels: DateFilterLabels;\n presets: DateFilterOption[];\n operators: DateFilterOption[];\n units: DateFilterOption[];\n panel: DateFilterPanel;\n setDraft: (value: DateFilterValue) => void;\n openPanel: (panel: DateFilterPanel, seed: DateFilterValue) => void;\n backToRoot: () => void;\n commit: (value: DateFilterValue) => void;\n}\n\nconst DateFilterContext = createContext<DateFilterContextValue | null>(null);\n\nexport const DateFilterProvider = DateFilterContext.Provider;\n\nexport function useDateFilter(): DateFilterContextValue {\n const context = useContext(DateFilterContext);\n\n if (context === null) {\n throw new Error('DateFilter parts must be used inside <DateFilter>.');\n }\n\n return context;\n}\n","import { CalendarDays } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport {\n DateFilterProvider,\n useDateFilter,\n type DateFilterPanel,\n} from '@/blocks/date-filter/context';\nimport { DateFilterFixedPanel } from '@/blocks/date-filter/fixed-panel';\nimport { DateFilterRelativePanel } from '@/blocks/date-filter/relative-panel';\nimport { summariseDateFilter } from '@/blocks/date-filter/summarise';\nimport {\n DEFAULT_LABELS,\n DEFAULT_OPERATORS,\n DEFAULT_PRESETS,\n DEFAULT_UNITS,\n type DateFilterLabels,\n type DateFilterOption,\n type DateFilterValue,\n} from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/components/ui/popover';\nimport { compactRadius } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels, useUiLocale } from '@/locales/context';\n\nexport interface DateFilterProps {\n value: DateFilterValue;\n onChange: (value: DateFilterValue) => void;\n presets?: DateFilterOption[];\n operators?: DateFilterOption[];\n units?: DateFilterOption[];\n labels?: Partial<DateFilterLabels>;\n children?: ReactNode;\n}\n\nexport function DateFilter({\n value,\n onChange,\n presets,\n operators,\n units,\n labels,\n children,\n}: DateFilterProps) {\n const locale = useUiLocale();\n const resolvedLabels = useUiLabels('dateFilter', DEFAULT_LABELS, labels);\n const [open, setOpen] = useState(false);\n const [panel, setPanel] = useState<DateFilterPanel>('root');\n const [draft, setDraft] = useState<DateFilterValue>(value);\n\n const context = {\n value,\n draft,\n labels: resolvedLabels,\n presets: presets ?? locale.dateFilterPresets ?? DEFAULT_PRESETS,\n operators: operators ?? locale.dateFilterOperators ?? DEFAULT_OPERATORS,\n units: units ?? locale.dateFilterUnits ?? DEFAULT_UNITS,\n panel,\n setDraft,\n openPanel: (next: DateFilterPanel, seed: DateFilterValue) => {\n setDraft(seed);\n setPanel(next);\n },\n backToRoot: () => setPanel('root'),\n commit: (next: DateFilterValue) => {\n onChange(next);\n setOpen(false);\n setPanel('root');\n },\n };\n\n return (\n <DateFilterProvider value={context}>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n\n if (!next) {\n setPanel('root');\n }\n }}\n >\n {children ?? (\n <>\n <DateFilterTrigger />\n <DateFilterContent>\n <DateFilterAll />\n <DateFilterSeparator />\n <DateFilterPresets />\n <DateFilterSeparator />\n <DateFilterFixed />\n <DateFilterRelative />\n </DateFilterContent>\n </>\n )}\n </Popover>\n </DateFilterProvider>\n );\n}\n\nexport function DateFilterTrigger({\n className,\n children,\n}: {\n className?: string;\n children?: ReactNode;\n}) {\n const { value, presets, operators, units, labels } = useDateFilter();\n\n return (\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn('gap-2 justify-start', className)}\n >\n <CalendarDays className=\"size-4\" />\n {children ??\n summariseDateFilter(\n value,\n presets,\n operators,\n units,\n labels,\n )}\n </Button>\n </PopoverTrigger>\n );\n}\n\nexport function DateFilterContent({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n const { panel } = useDateFilter();\n\n return (\n <PopoverContent align=\"start\" className={cn('p-0 w-auto', className)}>\n {panel === 'root' && (\n <div className=\"w-64 py-2 flex flex-col\">{children}</div>\n )}\n {panel === 'fixed' && <DateFilterFixedPanel />}\n {panel === 'relative' && <DateFilterRelativePanel />}\n </PopoverContent>\n );\n}\n\nexport function DateFilterItem({\n active,\n onSelect,\n children,\n}: {\n active: boolean;\n onSelect: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n data-slot=\"date-filter-item\"\n className={cn(\n `mx-1 px-2 py-2 ${compactRadius} text-sm font-medium cursor-pointer text-left transition-colors`,\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent/50',\n )}\n >\n {children}\n </button>\n );\n}\n\nexport function DateFilterSeparator() {\n return (\n <div data-slot=\"date-filter-separator\" className=\"mx-1 my-2 border-t\" />\n );\n}\n\nexport function DateFilterAll({ children }: { children?: ReactNode }) {\n const { value, labels, commit } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'all'}\n onSelect={() => commit({ mode: 'all' })}\n >\n {children ?? labels.all}\n </DateFilterItem>\n );\n}\n\nexport function DateFilterPresets({ only }: { only?: string[] }) {\n const { value, presets, commit } = useDateFilter();\n\n const visible = only\n ? presets.filter((preset) => only.includes(preset.value))\n : presets;\n\n return (\n <>\n {visible.map((preset) => (\n <DateFilterItem\n key={preset.value}\n active={\n value.mode === 'preset' && value.preset === preset.value\n }\n onSelect={() =>\n commit({ mode: 'preset', preset: preset.value })\n }\n >\n {preset.label}\n </DateFilterItem>\n ))}\n </>\n );\n}\n\nexport function DateFilterFixed({ children }: { children?: ReactNode }) {\n const { value, labels, openPanel } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'fixed'}\n onSelect={() =>\n openPanel('fixed', {\n mode: 'fixed',\n operator: value.operator ?? 'between',\n start: value.start,\n end: value.end,\n })\n }\n >\n {children ?? labels.fixed}\n </DateFilterItem>\n );\n}\n\nexport function DateFilterRelative({ children }: { children?: ReactNode }) {\n const { value, labels, openPanel } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'relative'}\n onSelect={() =>\n openPanel('relative', {\n mode: 'relative',\n unit: value.unit ?? 'month',\n amount: value.amount ?? 3,\n include_current: value.include_current ?? false,\n })\n }\n >\n {children ?? labels.relative}\n </DateFilterItem>\n );\n}\n","import { format } from 'date-fns';\nimport { pt } from 'date-fns/locale';\nimport { ChevronLeft } from 'lucide-react';\n\nimport { useDateFilter } from '@/blocks/date-filter/context';\nimport type { DateFilterOperator } from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { cn } from '@/lib/utils';\n\nconst CALENDAR_START = new Date(2020, 0, 1);\n\nconst CALENDAR_END = new Date(new Date().getFullYear() + 1, 11, 31);\n\nconst toDate = (value?: string) =>\n value ? new Date(`${value}T00:00:00`) : undefined;\n\nconst toIso = (value?: Date) =>\n value ? format(value, 'yyyy-MM-dd') : undefined;\n\nexport function DateFilterFixedPanel() {\n const { draft, operators, labels, setDraft, backToRoot, commit } =\n useDateFilter();\n\n const operator = draft.operator ?? 'between';\n const isRange = operator === 'between';\n const canApply = Boolean(draft.start) && (!isRange || Boolean(draft.end));\n\n return (\n <div className=\"w-auto\">\n <div className=\"gap-1 px-2 py-2 flex items-center border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={backToRoot}\n aria-label={labels.back}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {operators.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n onClick={() =>\n setDraft({\n ...draft,\n operator: item.value as DateFilterOperator,\n })\n }\n className={cn(\n 'px-3 py-1.5 text-sm font-medium rounded-xl cursor-pointer transition-colors',\n operator === item.value\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n\n <div className=\"p-3\">\n {isRange ? (\n <Calendar\n mode=\"range\"\n numberOfMonths={2}\n locale={pt}\n captionLayout=\"dropdown\"\n startMonth={CALENDAR_START}\n endMonth={CALENDAR_END}\n defaultMonth={toDate(draft.start)}\n selected={{\n from: toDate(draft.start),\n to: toDate(draft.end),\n }}\n onSelect={(range) =>\n setDraft({\n ...draft,\n start: toIso(range?.from),\n end: toIso(range?.to),\n })\n }\n />\n ) : (\n <Calendar\n mode=\"single\"\n locale={pt}\n captionLayout=\"dropdown\"\n startMonth={CALENDAR_START}\n endMonth={CALENDAR_END}\n defaultMonth={toDate(draft.start)}\n selected={toDate(draft.start)}\n onSelect={(date) =>\n setDraft({ ...draft, start: toIso(date) })\n }\n />\n )}\n </div>\n\n <div className=\"px-3 py-2 flex justify-end border-t\">\n <Button disabled={!canApply} onClick={() => commit(draft)}>\n {labels.apply}\n </Button>\n </div>\n </div>\n );\n}\n","import { ArrowLeftToLine, CalendarDays, ChevronLeft, X } from 'lucide-react';\n\nimport { useDateFilter } from '@/blocks/date-filter/context';\nimport {\n formatRangePreview,\n resolveRelativeRange,\n} from '@/blocks/date-filter/range';\nimport type {\n DateFilterUnit,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Switch } from '@/components/ui/switch';\n\nexport function DateFilterRelativePanel() {\n const { draft, units, labels, setDraft, backToRoot, commit } =\n useDateFilter();\n\n const hasOffset = (draft.offset_amount ?? 0) > 0;\n\n return (\n <div className=\"w-96\">\n <div className=\"gap-2 px-2 py-2 flex items-center border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={backToRoot}\n aria-label={labels.back}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n <span className=\"text-sm font-medium\">\n {labels.relativeTitle}\n </span>\n </div>\n\n <div className=\"gap-3 p-3 flex flex-col\">\n <div className=\"gap-2 flex items-center\">\n <span className=\"text-sm\">{labels.latest}</span>\n <Input\n type=\"number\"\n min={1}\n max={120}\n value={draft.amount ?? 1}\n onChange={(event) =>\n setDraft({\n ...draft,\n amount: Number(event.target.value),\n })\n }\n className=\"w-20\"\n />\n <Select\n value={draft.unit ?? 'month'}\n onValueChange={(unit) =>\n setDraft({ ...draft, unit: unit as DateFilterUnit })\n }\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {units.map((unit) => (\n <SelectItem key={unit.value} value={unit.value}>\n {unit.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {!hasOffset && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.startingAgo}\n title={labels.startingAgo}\n onClick={() =>\n setDraft({\n ...draft,\n offset_amount: 1,\n offset_unit: draft.unit ?? 'month',\n })\n }\n >\n <ArrowLeftToLine className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {hasOffset && (\n <div className=\"gap-2 flex items-center\">\n <span className=\"text-sm\">{labels.startingAgo}</span>\n <Input\n type=\"number\"\n min={1}\n max={120}\n value={draft.offset_amount ?? 1}\n onChange={(event) =>\n setDraft({\n ...draft,\n offset_amount: Number(event.target.value),\n })\n }\n className=\"w-20\"\n />\n <Select\n value={draft.offset_unit ?? draft.unit ?? 'month'}\n onValueChange={(unit) =>\n setDraft({\n ...draft,\n offset_unit: unit as DateFilterUnit,\n })\n }\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {units.map((unit) => (\n <SelectItem\n key={unit.value}\n value={unit.value}\n >\n {unit.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.removeOffset}\n onClick={() =>\n setDraft({\n ...draft,\n offset_amount: undefined,\n offset_unit: undefined,\n })\n }\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )}\n\n <label className=\"text-sm flex items-center justify-between\">\n {labels.includeCurrent}\n <Switch\n checked={draft.include_current ?? false}\n onCheckedChange={(checked) =>\n setDraft({ ...draft, include_current: checked })\n }\n />\n </label>\n </div>\n\n <div className=\"gap-3 px-3 py-2 flex items-center justify-between border-t\">\n <RangePreview draft={draft} />\n <Button\n disabled={!draft.unit || !draft.amount || draft.amount < 1}\n onClick={() => commit(draft)}\n >\n {labels.apply}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction RangePreview({ draft }: { draft: DateFilterValue }) {\n const range = resolveRelativeRange(\n draft.unit ?? 'month',\n draft.amount ?? 0,\n draft.include_current ?? false,\n new Date(),\n draft.offset_amount ?? 0,\n draft.offset_unit,\n );\n\n if (!range) {\n return <span />;\n }\n\n return (\n <span className=\"gap-2 text-sm flex items-center text-muted-foreground\">\n <CalendarDays className=\"size-4\" />\n {formatRangePreview(range)}\n </span>\n );\n}\n","import {\n endOfDay,\n endOfMonth,\n endOfQuarter,\n endOfWeek,\n endOfYear,\n format,\n isSameYear,\n startOfDay,\n startOfMonth,\n startOfQuarter,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subQuarters,\n subWeeks,\n subYears,\n} from 'date-fns';\nimport { pt } from 'date-fns/locale';\n\nimport type { DateFilterUnit } from '@/blocks/date-filter/types';\n\nconst WEEK_OPTIONS = { weekStartsOn: 1 } as const;\n\nconst subtract: Record<DateFilterUnit, (date: Date, amount: number) => Date> = {\n day: subDays,\n week: subWeeks,\n month: subMonths,\n quarter: subQuarters,\n year: subYears,\n};\n\nconst startOf: Record<DateFilterUnit, (date: Date) => Date> = {\n day: startOfDay,\n week: (date) => startOfWeek(date, WEEK_OPTIONS),\n month: startOfMonth,\n quarter: startOfQuarter,\n year: startOfYear,\n};\n\nconst endOf: Record<DateFilterUnit, (date: Date) => Date> = {\n day: endOfDay,\n week: (date) => endOfWeek(date, WEEK_OPTIONS),\n month: endOfMonth,\n quarter: endOfQuarter,\n year: endOfYear,\n};\n\nexport function resolveRelativeRange(\n unit: DateFilterUnit,\n amount: number,\n includeCurrent: boolean,\n now: Date = new Date(),\n offsetAmount = 0,\n offsetUnit?: DateFilterUnit,\n): { start: Date; end: Date } | null {\n if (amount < 1 || offsetAmount < 0) {\n return null;\n }\n\n let anchor = includeCurrent ? now : subtract[unit](now, 1);\n\n if (offsetAmount > 0) {\n anchor = subtract[offsetUnit ?? unit](anchor, offsetAmount);\n }\n\n return {\n start: startOf[unit](subtract[unit](anchor, amount - 1)),\n end: endOf[unit](anchor),\n };\n}\n\nexport function formatRangePreview(range: { start: Date; end: Date }): string {\n const sameYear = isSameYear(range.start, range.end);\n const startPattern = sameYear ? 'd MMM' : 'd MMM yyyy';\n\n return `${format(range.start, startPattern, { locale: pt })} - ${format(range.end, 'd MMM yyyy', { locale: pt })}`;\n}\n","import { format } from 'date-fns';\nimport { pt } from 'date-fns/locale';\n\nimport type {\n DateFilterLabels,\n DateFilterOption,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nconst readable = (value?: string) =>\n value\n ? format(new Date(`${value}T00:00:00`), \"d 'de' MMMM 'de' yyyy\", {\n locale: pt,\n })\n : '';\n\nexport function summariseDateFilter(\n value: DateFilterValue,\n presets: DateFilterOption[],\n operators: DateFilterOption[],\n units: DateFilterOption[],\n labels: DateFilterLabels,\n): string {\n if (value.mode === 'preset') {\n return (\n presets.find((preset) => preset.value === value.preset)?.label ??\n labels.fallback\n );\n }\n\n if (value.mode === 'fixed') {\n const operator =\n operators.find((item) => item.value === value.operator)?.label ??\n '';\n\n return value.operator === 'between'\n ? `${readable(value.start)} - ${readable(value.end)}`\n : `${operator} ${readable(value.start)}`;\n }\n\n if (value.mode === 'relative') {\n const unitLabel = (unit?: string) =>\n units.find((item) => item.value === unit)?.label ?? '';\n\n const base = `${labels.latest} ${value.amount ?? 1} ${unitLabel(value.unit)}`;\n\n return (value.offset_amount ?? 0) > 0\n ? `${base}, ${labels.ago} ${value.offset_amount} ${unitLabel(value.offset_unit ?? value.unit)}`\n : base;\n }\n\n return labels.all;\n}\n","export type DateFilterMode = 'all' | 'preset' | 'fixed' | 'relative';\n\nexport type DateFilterOperator = 'between' | 'before' | 'on' | 'after';\n\nexport type DateFilterUnit = 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateFilterValue {\n mode: DateFilterMode;\n preset?: string;\n operator?: DateFilterOperator;\n start?: string;\n end?: string;\n unit?: DateFilterUnit;\n amount?: number;\n include_current?: boolean;\n offset_amount?: number;\n offset_unit?: DateFilterUnit;\n}\n\nexport interface DateFilterOption {\n value: string;\n label: string;\n}\n\nexport interface DateFilterLabels {\n all: string;\n fixed: string;\n relative: string;\n relativeTitle: string;\n apply: string;\n back: string;\n latest: string;\n ago: string;\n includeCurrent: string;\n startingAgo: string;\n removeOffset: string;\n fallback: string;\n}\n\nexport const DEFAULT_PRESETS: DateFilterOption[] = [\n { value: 'today', label: 'Today' },\n { value: 'yesterday', label: 'Yesterday' },\n { value: 'previous_week', label: 'Previous week' },\n { value: 'previous_7_days', label: 'Last 7 days' },\n { value: 'previous_30_days', label: 'Last 30 days' },\n { value: 'previous_month', label: 'Previous month' },\n { value: 'previous_3_months', label: 'Last 3 months' },\n { value: 'previous_12_months', label: 'Last 12 months' },\n];\n\nexport const DEFAULT_OPERATORS: DateFilterOption[] = [\n { value: 'between', label: 'Between' },\n { value: 'before', label: 'Before' },\n { value: 'on', label: 'On' },\n { value: 'after', label: 'After' },\n];\n\nexport const DEFAULT_UNITS: DateFilterOption[] = [\n { value: 'day', label: 'days' },\n { value: 'week', label: 'weeks' },\n { value: 'month', label: 'months' },\n { value: 'quarter', label: 'quarters' },\n { value: 'year', label: 'years' },\n];\n\nexport const DEFAULT_LABELS: DateFilterLabels = {\n all: 'All time',\n fixed: 'Fixed range...',\n relative: 'Relative range...',\n relativeTitle: 'Relative range',\n apply: 'Apply filter',\n back: 'Back',\n latest: 'Last',\n ago: 'offset',\n includeCurrent: 'Include current period',\n startingAgo: 'Starting',\n removeOffset: 'Remove offset',\n fallback: 'Date',\n};\n","import type {\n DateFilterUnit,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nconst RANGE_SEPARATOR = '~';\n\nconst RELATIVE_PREFIX = 'previous';\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst UNITS: DateFilterUnit[] = ['day', 'week', 'month', 'quarter', 'year'];\n\nconst ALL: DateFilterValue = { mode: 'all' };\n\nexport function decodeDateFilter(\n encoded: string | null | undefined,\n): DateFilterValue {\n if (!encoded) {\n return ALL;\n }\n\n if (encoded.startsWith(`${RELATIVE_PREFIX}:`)) {\n return decodeRelative(encoded);\n }\n\n if (encoded.includes(RANGE_SEPARATOR)) {\n return decodeFixedRange(encoded);\n }\n\n if (ISO_DATE.test(encoded)) {\n return isDate(encoded)\n ? { mode: 'fixed', operator: 'on', start: encoded }\n : ALL;\n }\n\n return { mode: 'preset', preset: encoded };\n}\n\nfunction decodeFixedRange(encoded: string): DateFilterValue {\n const parts = encoded.split(RANGE_SEPARATOR);\n\n if (parts.length !== 2) {\n return ALL;\n }\n\n const [start, end] = parts;\n\n if (start && end) {\n return isDate(start) && isDate(end)\n ? { mode: 'fixed', operator: 'between', start, end }\n : ALL;\n }\n\n if (start) {\n return isDate(start)\n ? { mode: 'fixed', operator: 'after', start }\n : ALL;\n }\n\n if (end) {\n return isDate(end)\n ? { mode: 'fixed', operator: 'before', start: end }\n : ALL;\n }\n\n return ALL;\n}\n\nfunction decodeRelative(encoded: string): DateFilterValue {\n const [, rawAmount, rawUnit, ...rest] = encoded.split(':');\n const amount = Number(rawAmount);\n const unit = toUnit(rawUnit);\n\n if (!unit || !Number.isInteger(amount) || amount < 1) {\n return ALL;\n }\n\n const value: DateFilterValue = { mode: 'relative', amount, unit };\n const tail = [...rest];\n\n if (tail[0] === 'current') {\n value.include_current = true;\n tail.shift();\n }\n\n if (tail.length === 0) {\n return value;\n }\n\n if (tail.length !== 3 || tail[0] !== 'offset') {\n return ALL;\n }\n\n const offsetAmount = Number(tail[1]);\n const offsetUnit = toUnit(tail[2]);\n\n if (!offsetUnit || !Number.isInteger(offsetAmount) || offsetAmount < 1) {\n return ALL;\n }\n\n value.offset_amount = offsetAmount;\n value.offset_unit = offsetUnit;\n\n return value;\n}\n\nfunction toUnit(value: string | undefined): DateFilterUnit | null {\n return UNITS.find((unit) => unit === value) ?? null;\n}\n\nfunction isDate(value: string): boolean {\n if (!ISO_DATE.test(value)) {\n return false;\n }\n\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n\n return (\n date.getUTCFullYear() === year &&\n date.getUTCMonth() === month - 1 &&\n date.getUTCDate() === day\n );\n}\n","import type { DateFilterValue } from '@/blocks/date-filter/types';\n\nconst RANGE_SEPARATOR = '~';\n\nconst RELATIVE_PREFIX = 'previous';\n\nexport function encodeDateFilter(filter: DateFilterValue): string | null {\n if (filter.mode === 'preset') {\n return filter.preset ?? null;\n }\n\n if (filter.mode === 'fixed') {\n return encodeFixed(filter);\n }\n\n if (filter.mode === 'relative') {\n return encodeRelative(filter);\n }\n\n return null;\n}\n\nfunction encodeFixed(filter: DateFilterValue): string | null {\n if (!filter.start) {\n return null;\n }\n\n if (filter.operator === 'before') {\n return `${RANGE_SEPARATOR}${filter.start}`;\n }\n\n if (filter.operator === 'after') {\n return `${filter.start}${RANGE_SEPARATOR}`;\n }\n\n if (filter.operator === 'on') {\n return filter.start;\n }\n\n return filter.end ? `${filter.start}${RANGE_SEPARATOR}${filter.end}` : null;\n}\n\nfunction encodeRelative(filter: DateFilterValue): string | null {\n if (!filter.unit || !filter.amount || filter.amount < 1) {\n return null;\n }\n\n let value = `${RELATIVE_PREFIX}:${filter.amount}:${filter.unit}`;\n\n if (filter.include_current) {\n value += ':current';\n }\n\n if (filter.offset_amount && filter.offset_amount > 0) {\n value += `:offset:${filter.offset_amount}:${filter.offset_unit ?? filter.unit}`;\n }\n\n return value;\n}\n","import { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport interface FormOverlayLabels {\n cancelLabel: string;\n saveLabel: string;\n savingLabel: string;\n}\n\nexport const formOverlayDefaultLabels: FormOverlayLabels = {\n cancelLabel: 'Cancel',\n saveLabel: 'Save',\n savingLabel: 'Saving...',\n};\n\nexport type FormOverlayIntent = 'default' | 'destructive';\n\nexport interface FormOverlayActionsProps {\n labels?: FormOverlayLabels;\n processing?: boolean;\n intent?: FormOverlayIntent;\n submit?: boolean;\n className?: string;\n onCancel: () => void;\n onSave?: () => void;\n}\n\nexport function FormOverlayActions({\n labels = formOverlayDefaultLabels,\n processing = false,\n intent = 'default',\n submit = false,\n className,\n onCancel,\n onSave,\n slotName = 'form-overlay-actions',\n}: FormOverlayActionsProps & SlotNameProps) {\n return (\n <div\n className={cn('gap-2 flex items-center justify-end', className)}\n data-slot={slotName}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={processing}\n onClick={onCancel}\n >\n {labels.cancelLabel}\n </Button>\n\n <Button\n type={submit ? 'submit' : 'button'}\n aria-label={processing ? labels.savingLabel : undefined}\n variant={intent}\n loading={processing}\n loadingLabel={labels.savingLabel}\n onClick={onSave}\n >\n {processing ? labels.savingLabel : labels.saveLabel}\n </Button>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport {\n FormOverlayActions,\n type FormOverlayIntent,\n type FormOverlayLabels,\n} from '@/blocks/form-overlay';\nimport {\n FloatingSheet,\n FloatingSheetBody,\n FloatingSheetFooter,\n} from '@/components/ui/floating-sheet';\nimport { Separator } from '@/components/ui/separator';\nimport type { SlotNameProps } from '@/types';\n\nexport interface DetailEditSheetProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n description?: React.ReactNode;\n processing?: boolean;\n intent?: FormOverlayIntent;\n labels?: FormOverlayLabels;\n className?: string;\n children: React.ReactNode;\n onSave: () => void;\n onCancel?: () => void;\n}\n\nexport function DetailEditSheet({\n open,\n onOpenChange,\n title,\n description,\n processing = false,\n intent,\n labels,\n className,\n children,\n onSave,\n onCancel,\n slotName = 'detail-edit-sheet',\n}: DetailEditSheetProps & SlotNameProps) {\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (processing) {\n return;\n }\n\n onSave();\n };\n\n const handleCancel = () => {\n if (processing) {\n return;\n }\n\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <FloatingSheet\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={description}\n persistent\n className={className}\n >\n <form\n onSubmit={handleSubmit}\n className=\"min-h-0 flex flex-1 flex-col\"\n data-slot={slotName}\n >\n <FloatingSheetBody>{children}</FloatingSheetBody>\n\n <Separator />\n\n <FloatingSheetFooter>\n <FormOverlayActions\n submit\n labels={labels}\n processing={processing}\n intent={intent}\n onCancel={handleCancel}\n />\n </FloatingSheetFooter>\n </form>\n </FloatingSheet>\n );\n}\n","import * as React from 'react';\n\nimport {\n FormOverlayActions,\n type FormOverlayIntent,\n type FormOverlayLabels,\n} from '@/blocks/form-overlay';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nexport interface FormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n description?: React.ReactNode;\n processing?: boolean;\n intent?: FormOverlayIntent;\n labels?: FormOverlayLabels;\n className?: string;\n children: React.ReactNode;\n onSave: () => void;\n onCancel?: () => void;\n}\n\nexport function FormDialog({\n open,\n onOpenChange,\n title,\n description,\n processing = false,\n intent,\n labels,\n className,\n children,\n onSave,\n onCancel,\n slotName = 'form-dialog',\n}: FormDialogProps & SlotNameProps) {\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (processing) {\n return;\n }\n\n onSave();\n };\n\n const handleCancel = () => {\n if (processing) {\n return;\n }\n\n onCancel?.();\n onOpenChange(false);\n };\n\n const blockWhileProcessing = (event: Event | KeyboardEvent) => {\n if (processing) {\n event.preventDefault();\n }\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (processing && !next) {\n return;\n }\n\n onOpenChange(next);\n }}\n >\n <DialogContent\n {...(description ? {} : { 'aria-describedby': undefined })}\n className={cn('gap-0 p-0', className)}\n onEscapeKeyDown={blockWhileProcessing}\n onInteractOutside={blockWhileProcessing}\n slotName={slotName}\n >\n <form\n data-slot=\"form-dialog-form\"\n onSubmit={handleSubmit}\n className=\"grid max-h-[calc(100dvh-8rem)] grid-rows-[auto_minmax(0,1fr)_auto]\"\n >\n <DialogHeader className=\"text-left\">\n <DialogTitle>{title}</DialogTitle>\n {description ? (\n <DialogDescription>{description}</DialogDescription>\n ) : null}\n </DialogHeader>\n\n <div\n data-slot=\"form-dialog-body\"\n className=\"gap-4 px-6 pb-6 md:px-8 flex flex-col overflow-y-auto\"\n >\n {children}\n </div>\n\n <DialogFooter>\n <FormOverlayActions\n submit\n labels={labels}\n processing={processing}\n intent={intent}\n onCancel={handleCancel}\n className=\"w-full\"\n />\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import { CopyButton, type CopyButtonLabels } from '@/components/ui/copy-button';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { type LucideIcon } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nexport interface InfoFieldProps {\n icon: LucideIcon;\n label: string;\n value: ReactNode;\n copyable?: boolean;\n copyValue?: string;\n copyLabel?: CopyButtonLabels['copyLabel'];\n copiedLabel?: CopyButtonLabels['copiedLabel'];\n iconClassName?: string;\n className?: string;\n}\n\nfunction copyableText(value: ReactNode, copyValue?: string): string {\n if (copyValue !== undefined) {\n return copyValue.trim();\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value).trim();\n }\n\n return '';\n}\n\nexport function InfoField({\n icon: Icon,\n label,\n value,\n copyable = false,\n copyValue,\n copyLabel,\n copiedLabel,\n iconClassName,\n className,\n slotName = 'info-field',\n}: InfoFieldProps & SlotNameProps) {\n const text = copyableText(value, copyValue);\n\n return (\n <div\n className={cn('gap-3 flex items-center', className)}\n data-slot={slotName}\n >\n <div className={cn('p-2 rounded-xl bg-muted', iconClassName)}>\n <Icon className=\"size-5 text-muted-foreground\" />\n </div>\n <div>\n <p\n data-slot=\"info-field-label\"\n className=\"text-xs font-medium tracking-wider text-muted-foreground uppercase\"\n >\n {label}\n </p>\n <p\n data-slot=\"info-field-value\"\n className=\"gap-1 font-semibold flex items-center\"\n >\n {value}\n {copyable && text !== '' && (\n <CopyButton\n value={text}\n copyLabel={copyLabel}\n copiedLabel={copiedLabel}\n />\n )}\n </p>\n </div>\n </div>\n );\n}\n\nexport interface InfoFieldGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function InfoFieldGroup({ children, className }: InfoFieldGroupProps) {\n return <div className={cn('space-y-4', className)}>{children}</div>;\n}\n","import { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Textarea } from '@/components/ui/textarea';\nimport { cn } from '@/lib/utils';\n\nexport interface LocalizedField {\n name: string;\n label: string;\n type?: 'text' | 'textarea';\n rows?: number;\n}\n\nexport interface LocalizedFieldsProps {\n locales: string[];\n localeLabels?: Record<string, string>;\n fields: LocalizedField[];\n values: Record<string, Record<string, string>>;\n onChange: (field: string, locale: string, value: string) => void;\n errors?: Record<string, string>;\n defaultLocale?: string;\n className?: string;\n}\n\nexport function LocalizedFields({\n locales,\n localeLabels,\n fields,\n values,\n onChange,\n errors,\n defaultLocale,\n className,\n}: LocalizedFieldsProps) {\n return (\n <Tabs\n defaultValue={defaultLocale ?? locales[0]}\n className={cn('w-full', className)}\n >\n <TabsList className=\"mb-4 rounded-2xl p-1.5 flex h-auto w-full justify-start overflow-x-auto bg-muted\">\n {locales.map((locale) => (\n <TabsTrigger\n key={locale}\n value={locale}\n className=\"px-4 font-medium h-8 rounded-xl\"\n >\n {localeLabels?.[locale] ?? locale.toUpperCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {locales.map((locale) => (\n <TabsContent key={locale} value={locale} className=\"mt-0\">\n <div className=\"gap-4 lg:grid-cols-2 grid\">\n {fields.map((field) => {\n const fieldId = `${field.name}-${locale}`;\n const error = errors?.[`${field.name}.${locale}`];\n const value = values[field.name]?.[locale] ?? '';\n\n return (\n <div key={field.name} className=\"space-y-2\">\n <Label htmlFor={fieldId}>\n {field.label}\n </Label>\n {field.type === 'textarea' ? (\n <Textarea\n id={fieldId}\n rows={field.rows ?? 4}\n value={value}\n onChange={(event) =>\n onChange(\n field.name,\n locale,\n event.target.value,\n )\n }\n />\n ) : (\n <Input\n id={fieldId}\n value={value}\n onChange={(event) =>\n onChange(\n field.name,\n locale,\n event.target.value,\n )\n }\n />\n )}\n {error && (\n <p className=\"text-xs font-medium text-destructive\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n </div>\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n","import { cn } from '@/lib/utils';\nimport { type ReactNode } from 'react';\n\nexport interface SectionHeaderProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n control?: ReactNode;\n className?: string;\n}\n\nexport function SectionHeader({\n icon,\n title,\n description,\n control,\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={cn(\n 'gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col',\n className,\n )}\n >\n <div className=\"gap-3 flex items-center\">\n {icon}\n <div>\n <h2 className=\"text-lg font-bold text-foreground\">\n {title}\n </h2>\n {description && (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n {control}\n </div>\n );\n}\n","import { Label } from '@/components/ui/label';\nimport { Switch } from '@/components/ui/switch';\nimport {\n elevatedSurface,\n recessedSurface,\n type SurfaceProps,\n} from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { type LucideIcon } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nexport interface SettingsCardProps extends SurfaceProps {\n icon: LucideIcon;\n iconClassName?: string;\n title: string;\n description: string;\n control?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsCard({\n icon: Icon,\n iconClassName,\n title,\n description,\n control,\n children,\n inset = false,\n className,\n slotName = 'settings-card',\n}: SettingsCardProps & SlotNameProps) {\n return (\n <section\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'space-y-5 p-6 bg-card text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n data-slot={slotName}\n >\n <div className=\"gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col\">\n <div className=\"gap-3 flex items-center\">\n <div\n className={cn(\n 'size-11 rounded-2xl flex items-center justify-center',\n iconClassName ?? 'bg-muted text-muted-foreground',\n )}\n >\n <Icon className=\"size-5\" />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-foreground\">\n {title}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </p>\n </div>\n </div>\n {control}\n </div>\n {children}\n </section>\n );\n}\n\nexport interface SettingsPanelProps extends SurfaceProps {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsPanel({\n title,\n description,\n children,\n inset = true,\n className,\n slotName = 'settings-panel',\n}: SettingsPanelProps & SlotNameProps) {\n return (\n <div\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'space-y-4 p-5 bg-card text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n data-slot={slotName}\n >\n {(title || description) && (\n <div>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"mt-1 text-xs font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nexport interface ToggleRowProps {\n id: string;\n label: string;\n description?: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n}\n\nexport function ToggleRow({\n id,\n label,\n description,\n checked,\n onChange,\n disabled,\n}: ToggleRowProps) {\n return (\n <div className=\"gap-4 py-1 flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label\n htmlFor={id}\n className=\"text-sm font-medium text-foreground\"\n >\n {label}\n </Label>\n {description && (\n <p className=\"text-xs font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n}\n","import { FieldError } from '@/components/ui/field-error';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { useId, type ReactNode } from 'react';\n\nexport interface SettingsFieldProps {\n id?: string;\n label: ReactNode;\n description?: string;\n error?: string;\n required?: boolean;\n className?: string;\n children: (fieldId: string) => ReactNode;\n}\n\nexport function SettingsField({\n id,\n label,\n description,\n error,\n required,\n className,\n children,\n slotName = 'settings-field',\n}: SettingsFieldProps & SlotNameProps) {\n const generated = useId();\n const fieldId = id ?? generated;\n\n return (\n <div\n data-invalid={error ? true : undefined}\n className={cn('space-y-2 py-1', className)}\n data-slot={slotName}\n >\n <Label htmlFor={fieldId}>\n {label}\n {required && (\n <span\n data-slot=\"settings-field-required\"\n aria-hidden=\"true\"\n className=\"text-destructive\"\n >\n *\n </span>\n )}\n </Label>\n\n {children(fieldId)}\n\n {description && (\n <p\n data-slot=\"settings-field-description\"\n className=\"text-xs font-medium text-muted-foreground\"\n >\n {description}\n </p>\n )}\n\n <FieldError message={error} />\n </div>\n );\n}\n\ninterface ControlProps<T> {\n id?: string;\n label: ReactNode;\n description?: string;\n error?: string;\n required?: boolean;\n disabled?: boolean;\n placeholder?: string;\n value: T;\n onChange: (value: T) => void;\n className?: string;\n}\n\nexport type TextFieldProps = ControlProps<string> & {\n type?: 'text' | 'email' | 'url' | 'tel' | 'password';\n};\n\nexport function TextField({\n type = 'text',\n value,\n onChange,\n disabled,\n placeholder,\n slotName = 'text-field',\n ...field\n}: TextFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Input\n id={fieldId}\n type={type}\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n aria-invalid={field.error ? true : undefined}\n slotName={slotName}\n onChange={(event) => onChange(event.target.value)}\n />\n )}\n </SettingsField>\n );\n}\n\nexport type NumberFieldProps = ControlProps<number | ''> & {\n min?: number;\n max?: number;\n step?: number;\n};\n\nexport function NumberField({\n value,\n onChange,\n disabled,\n placeholder,\n min,\n max,\n step,\n slotName = 'number-field',\n ...field\n}: NumberFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Input\n id={fieldId}\n type=\"number\"\n inputMode=\"decimal\"\n value={value === '' ? '' : String(value)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n placeholder={placeholder}\n aria-invalid={field.error ? true : undefined}\n slotName={slotName}\n onChange={(event) =>\n onChange(\n event.target.value === ''\n ? ''\n : event.target.valueAsNumber,\n )\n }\n />\n )}\n </SettingsField>\n );\n}\n\nexport type DateFieldProps = ControlProps<string> & {\n min?: string;\n max?: string;\n};\n\nexport function DateField({\n value,\n onChange,\n disabled,\n min,\n max,\n slotName = 'date-field',\n ...field\n}: DateFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Input\n id={fieldId}\n type=\"date\"\n value={value}\n min={min}\n max={max}\n disabled={disabled}\n aria-invalid={field.error ? true : undefined}\n slotName={slotName}\n onChange={(event) => onChange(event.target.value)}\n />\n )}\n </SettingsField>\n );\n}\n\nexport interface SelectFieldOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport type SelectFieldProps = ControlProps<string> & {\n options: SelectFieldOption[];\n};\n\nexport function SelectField({\n value,\n onChange,\n options,\n disabled,\n placeholder,\n slotName = 'select-field',\n ...field\n}: SelectFieldProps & SlotNameProps) {\n return (\n <SettingsField {...field}>\n {(fieldId) => (\n <Select\n value={value}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n id={fieldId}\n slotName={slotName}\n aria-invalid={field.error ? true : undefined}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </SettingsField>\n );\n}\n","import { SectionHeader } from '@/blocks/section-header';\nimport { Card } from '@/components/ui/card';\nimport { resolveLink } from '@/lib/href';\nimport { compactRadius, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels } from '@/locales/context';\nimport type { LinkComponent, SlotNameProps, UrlLike } from '@/types';\nimport { ArrowLeft, ChevronRight, type LucideIcon } from 'lucide-react';\nimport { createContext, useContext, type ReactNode } from 'react';\n\nconst SettingsLinkContext = createContext<LinkComponent | undefined>(undefined);\n\nexport interface SettingsPageProps {\n title?: string;\n description?: string;\n control?: ReactNode;\n linkComponent?: LinkComponent;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsPage({\n title,\n description,\n control,\n linkComponent,\n children,\n className,\n slotName = 'settings-page',\n}: SettingsPageProps & SlotNameProps) {\n return (\n <SettingsLinkContext.Provider value={linkComponent}>\n <div\n className={cn(\n 'gap-8 max-w-4xl mx-auto flex w-full flex-col',\n className,\n )}\n data-slot={slotName}\n >\n {title && (\n <SectionHeader\n title={title}\n description={description}\n control={control}\n />\n )}\n {children}\n </div>\n </SettingsLinkContext.Provider>\n );\n}\n\nexport interface SettingsLabels {\n back: string;\n}\n\nexport const settingsLabels: SettingsLabels = {\n back: 'Back',\n};\n\nexport interface SettingsSectionProps {\n title?: string;\n description?: string;\n control?: ReactNode;\n backHref?: UrlLike | null;\n backLabel?: string;\n wide?: boolean;\n linkComponent?: LinkComponent;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsSection({\n title,\n description,\n control,\n backHref = '/settings',\n backLabel,\n wide = false,\n linkComponent,\n children,\n className,\n slotName = 'settings-section',\n}: SettingsSectionProps & SlotNameProps) {\n const labels = useUiLabels('settings', settingsLabels, {\n back: backLabel,\n });\n const contextLink = useContext(SettingsLinkContext);\n const Link = resolveLink(linkComponent ?? contextLink);\n\n return (\n <section\n className={cn(\n 'gap-6 mx-auto flex w-full flex-col',\n wide ? 'max-w-4xl' : 'max-w-2xl',\n className,\n )}\n data-slot={slotName}\n >\n {backHref && (\n <Link\n data-slot=\"settings-section-back\"\n href={backHref}\n className=\"gap-2 text-sm font-medium inline-flex w-fit items-center text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ArrowLeft className=\"size-4\" />\n {labels.back}\n </Link>\n )}\n\n {title && (\n <SectionHeader\n title={title}\n description={description}\n control={control}\n />\n )}\n\n {children}\n </section>\n );\n}\n\nexport interface SettingsGroupProps {\n label?: string;\n columns?: 1 | 2;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsGroup({\n label,\n columns = 2,\n children,\n className,\n slotName = 'settings-group',\n}: SettingsGroupProps & SlotNameProps) {\n return (\n <div\n className={cn('gap-3 flex flex-col', className)}\n data-slot={slotName}\n >\n {label && (\n <p className=\"font-bold tracking-widest text-[11px] text-muted-foreground uppercase\">\n {label}\n </p>\n )}\n <div\n data-slot=\"settings-group-grid\"\n className={cn(\n 'gap-4 grid grid-cols-1',\n columns === 2 && 'md:grid-cols-2',\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport interface SettingsEntryProps {\n icon: LucideIcon;\n iconClassName?: string;\n title: string;\n description?: string;\n href: UrlLike;\n badge?: ReactNode;\n disabled?: boolean;\n linkComponent?: LinkComponent;\n className?: string;\n}\n\nexport function SettingsEntry({\n icon: Icon,\n iconClassName,\n title,\n description,\n href,\n badge,\n disabled = false,\n linkComponent,\n className,\n slotName = 'settings-entry',\n}: SettingsEntryProps & SlotNameProps) {\n const contextLink = useContext(SettingsLinkContext);\n const Link = resolveLink(linkComponent ?? contextLink);\n\n const card = (\n <Card\n interactive={!disabled}\n padding=\"none\"\n data-disabled={disabled || undefined}\n className={cn(\n 'gap-4 p-5 flex h-full flex-row items-center',\n disabled && 'opacity-60',\n className,\n )}\n >\n <span\n className={cn(\n 'size-11 flex shrink-0 items-center justify-center rounded-full',\n iconClassName ?? 'bg-primary/10 text-primary',\n )}\n >\n <Icon className=\"size-5\" />\n </span>\n\n <span className=\"min-w-0 flex flex-1 flex-col\">\n <span className=\"gap-2 flex items-center\">\n <span className=\"font-bold text-foreground\">{title}</span>\n {badge}\n </span>\n {description && (\n <span className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </span>\n )}\n </span>\n\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n </Card>\n );\n\n if (disabled) {\n return (\n <div data-disabled=\"true\" aria-disabled=\"true\" data-slot={slotName}>\n {card}\n </div>\n );\n }\n\n return (\n <Link\n href={href}\n className={cn(compactRadius, focusRing)}\n data-slot={slotName}\n >\n {card}\n </Link>\n );\n}\n","import {\n elevatedSurface,\n recessedSurface,\n type SurfaceProps,\n} from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport {\n ArrowDownRight,\n ArrowRight,\n ArrowUpRight,\n type LucideIcon,\n} from 'lucide-react';\nimport { type ReactNode } from 'react';\n\ntype TrendTone = 'positive' | 'negative' | 'neutral';\n\ninterface TrendDisplay {\n label: string;\n tone: TrendTone;\n icon: LucideIcon;\n}\n\nfunction resolveTrend(trend?: number): TrendDisplay | null {\n if (trend === null || trend === undefined || Number.isNaN(trend)) {\n return null;\n }\n\n const normalized = Math.abs(trend) < 0.05 ? 0 : trend;\n\n if (normalized === 0) {\n return { label: '0%', tone: 'neutral', icon: ArrowRight };\n }\n\n if (normalized > 0) {\n return {\n label: `+${normalized.toFixed(1)}%`,\n tone: 'positive',\n icon: ArrowUpRight,\n };\n }\n\n return {\n label: `${normalized.toFixed(1)}%`,\n tone: 'negative',\n icon: ArrowDownRight,\n };\n}\n\nconst trendToneClass: Record<TrendTone, string> = {\n positive: 'text-success',\n negative: 'text-destructive',\n neutral: 'text-muted-foreground',\n};\n\nexport interface StatCardProps extends SurfaceProps {\n title: string;\n value: ReactNode;\n icon: LucideIcon;\n iconClassName?: string;\n trend?: number;\n comparisonLabel?: string;\n className?: string;\n}\n\nexport function StatCard({\n title,\n value,\n icon: Icon,\n iconClassName = 'bg-muted text-muted-foreground',\n trend,\n comparisonLabel,\n inset = false,\n className,\n slotName = 'stat-card',\n}: StatCardProps & SlotNameProps) {\n const resolvedTrend = resolveTrend(trend);\n\n return (\n <div\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'p-6 min-w-0 flex h-full flex-col justify-between bg-card text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n data-slot={slotName}\n >\n <div className=\"mb-4 gap-4 flex items-start justify-between\">\n <div className={cn('rounded-2xl p-3 shrink-0', iconClassName)}>\n <Icon className=\"size-6\" />\n </div>\n {resolvedTrend && (\n <div className=\"min-w-0 text-right\">\n <span\n className={cn(\n 'text-sm font-semibold inline-flex items-center',\n trendToneClass[resolvedTrend.tone],\n )}\n >\n {resolvedTrend.label}\n <resolvedTrend.icon className=\"ml-1 size-4\" />\n </span>\n {comparisonLabel && (\n <p className=\"mt-1 font-medium tracking-wider text-[10px] whitespace-nowrap text-muted-foreground uppercase\">\n {comparisonLabel}\n </p>\n )}\n </div>\n )}\n </div>\n <div>\n <p className=\"mb-1 text-xs font-medium tracking-wider break-words text-muted-foreground uppercase\">\n {title}\n </p>\n <p className=\"text-3xl font-bold truncate text-foreground tabular-nums\">\n {value}\n </p>\n </div>\n </div>\n );\n}\n\nexport interface StatsGridProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function StatsGrid({ children, className }: StatsGridProps) {\n return (\n <div\n className={cn(\n 'gap-6 [&>*]:min-w-0 grid [grid-template-columns:repeat(auto-fit,minmax(18rem,1fr))]',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport type TwoFactorSetupStep = 'pending' | 'scan' | 'confirm' | 'recovery';\n\nexport type TwoFactorCodeMode = 'code' | 'recovery';\n\nexport interface TwoFactorLabels {\n setupTitle: string;\n setupDescription: string;\n pendingLabel: string;\n scanTitle: string;\n scanDescription: string;\n qrFallbackLabel: string;\n manualKeyLabel: string;\n manualKeyDescription: string;\n manualKeyRevealLabel: string;\n manualKeyHideLabel: string;\n continueLabel: string;\n confirmTitle: string;\n confirmDescription: string;\n codeLabel: string;\n recoveryCodeLabel: string;\n recoveryCodePlaceholder: string;\n useRecoveryCodeLabel: string;\n useCodeLabel: string;\n verifyLabel: string;\n verifyingLabel: string;\n errorFallbackLabel: string;\n cancelLabel: string;\n challengeTitle: string;\n challengeDescription: string;\n recoveryTitle: string;\n recoveryDescription: string;\n recoveryWarning: string;\n revealLabel: string;\n hideLabel: string;\n copyLabel: string;\n copiedLabel: string;\n copyFailedLabel: string;\n regenerateLabel: string;\n doneLabel: string;\n disableLabel: string;\n disableTitle: string;\n disableDescription: string;\n disableConfirmLabel: string;\n disableCancelLabel: string;\n}\n\nexport const twoFactorLabels: TwoFactorLabels = {\n setupTitle: 'Two-factor authentication',\n setupDescription:\n 'Add a second step to your sign in with an authenticator app.',\n pendingLabel: 'Preparing your setup key',\n scanTitle: 'Scan the code',\n scanDescription:\n 'Open your authenticator app and scan the code below to add this account.',\n qrFallbackLabel: 'The QR code is not available yet.',\n manualKeyLabel: 'Setup key',\n manualKeyDescription:\n 'Enter this key by hand if your app cannot scan the code.',\n manualKeyRevealLabel: 'Show setup key',\n manualKeyHideLabel: 'Hide setup key',\n continueLabel: 'Continue',\n confirmTitle: 'Confirm the code',\n confirmDescription:\n 'Enter the six digit code your authenticator app is showing.',\n codeLabel: 'Authentication code',\n recoveryCodeLabel: 'Recovery code',\n recoveryCodePlaceholder: 'Enter a recovery code',\n useRecoveryCodeLabel: 'Use a recovery code',\n useCodeLabel: 'Use an authentication code',\n verifyLabel: 'Verify',\n verifyingLabel: 'Verifying',\n errorFallbackLabel: 'That did not work. Try again.',\n cancelLabel: 'Cancel',\n challengeTitle: 'Two-factor confirmation',\n challengeDescription:\n 'Confirm access to your account with the code from your authenticator app.',\n recoveryTitle: 'Recovery codes',\n recoveryDescription:\n 'Store these codes somewhere safe. Each one signs you in once if you lose your device.',\n recoveryWarning: 'They are shown once and cannot be read again afterwards.',\n revealLabel: 'Show codes',\n hideLabel: 'Hide codes',\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n copyFailedLabel: 'Copying is unavailable here. Select the codes manually.',\n regenerateLabel: 'Regenerate codes',\n doneLabel: 'Done',\n disableLabel: 'Disable two-factor authentication',\n disableTitle: 'Disable two-factor authentication',\n disableDescription:\n 'Your account will be protected by your password alone. Recovery codes stop working.',\n disableConfirmLabel: 'Disable',\n disableCancelLabel: 'Keep it on',\n};\n\nexport interface TwoFactorLabelProps {\n labels?: Partial<TwoFactorLabels>;\n}\n\nexport function resolveLabels(\n labels?: Partial<TwoFactorLabels>,\n): TwoFactorLabels {\n return labels ? { ...twoFactorLabels, ...labels } : twoFactorLabels;\n}\n\nexport function messageList(errors?: string | string[] | null): string[] {\n if (!errors) {\n return [];\n }\n\n return (Array.isArray(errors) ? errors : [errors]).filter(\n (message) => message.length > 0,\n );\n}\n\nexport interface TwoFactorQrProps {\n qrCode?: ReactNode;\n qrCodeSvg?: string;\n}\n","import {\n messageList,\n resolveLabels,\n type TwoFactorCodeMode,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '@/components/ui/input-otp';\nimport { Label } from '@/components/ui/label';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { AlertCircle } from 'lucide-react';\nimport { useId, useState, type FormEvent, type ReactNode } from 'react';\n\nexport interface TwoFactorVerifyFormProps extends TwoFactorLabelProps {\n onSubmit: (code: string, mode: TwoFactorCodeMode) => void | Promise<void>;\n errors?: string | string[] | null;\n allowRecoveryCode?: boolean;\n length?: number;\n autoFocus?: boolean;\n submitLabel?: string;\n footer?: ReactNode;\n className?: string;\n}\n\nfunction errorMessage(reason: unknown, fallback: string): string {\n return reason instanceof Error && reason.message\n ? reason.message\n : fallback;\n}\n\nexport function TwoFactorVerifyForm({\n onSubmit,\n errors,\n allowRecoveryCode = false,\n length = 6,\n autoFocus = false,\n submitLabel,\n footer,\n labels,\n className,\n slotName = 'two-factor-verify-form',\n}: TwoFactorVerifyFormProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const fieldId = useId();\n const [mode, setMode] = useState<TwoFactorCodeMode>('code');\n const [value, setValue] = useState('');\n const [pending, setPending] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n\n const messages = [...messageList(errors), ...messageList(failure)];\n const complete =\n mode === 'code' ? value.length === length : value.length > 0;\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (pending || !complete) {\n return;\n }\n\n setFailure(null);\n setPending(true);\n\n try {\n await onSubmit(value, mode);\n } catch (reason) {\n setFailure(errorMessage(reason, text.errorFallbackLabel));\n } finally {\n setPending(false);\n }\n };\n\n const switchMode = () => {\n setMode(mode === 'code' ? 'recovery' : 'code');\n setValue('');\n setFailure(null);\n };\n\n return (\n <form\n data-mode={mode}\n data-pending={pending || undefined}\n onSubmit={handleSubmit}\n className={cn('gap-5 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n <div className=\"gap-2 flex flex-col\">\n <Label htmlFor={fieldId}>\n {mode === 'code' ? text.codeLabel : text.recoveryCodeLabel}\n </Label>\n\n {mode === 'code' ? (\n <InputOTP\n id={fieldId}\n data-slot=\"two-factor-code-input\"\n maxLength={length}\n value={value}\n autoFocus={autoFocus}\n disabled={pending}\n onChange={setValue}\n aria-label={text.codeLabel}\n >\n <InputOTPGroup>\n {Array.from({ length }, (_, index) => (\n <InputOTPSlot key={index} index={index} />\n ))}\n </InputOTPGroup>\n </InputOTP>\n ) : (\n <Input\n id={fieldId}\n slotName=\"two-factor-recovery-input\"\n value={value}\n autoComplete=\"one-time-code\"\n spellCheck={false}\n disabled={pending}\n placeholder={text.recoveryCodePlaceholder}\n aria-label={text.recoveryCodeLabel}\n onChange={(event) => setValue(event.target.value)}\n />\n )}\n </div>\n\n {messages.length > 0 && (\n <Alert variant=\"destructive\" slotName=\"two-factor-error\">\n <AlertCircle />\n <AlertDescription>\n {messages.map((message) => (\n <p key={message}>{message}</p>\n ))}\n </AlertDescription>\n </Alert>\n )}\n\n <div className=\"gap-3 flex flex-col\">\n <Button\n type=\"submit\"\n loading={pending}\n loadingLabel={text.verifyingLabel}\n disabled={!complete}\n >\n {submitLabel ?? text.verifyLabel}\n </Button>\n\n {allowRecoveryCode && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={pending}\n onClick={switchMode}\n >\n {mode === 'code'\n ? text.useRecoveryCodeLabel\n : text.useCodeLabel}\n </Button>\n )}\n\n {footer}\n </div>\n </form>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorCodeMode,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { TwoFactorVerifyForm } from '@/blocks/two-factor/verify-form';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport type { ReactNode } from 'react';\n\nexport interface TwoFactorChallengeProps extends TwoFactorLabelProps {\n onSubmit: (code: string, mode: TwoFactorCodeMode) => void | Promise<void>;\n errors?: string | string[] | null;\n allowRecoveryCode?: boolean;\n title?: string;\n description?: string;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function TwoFactorChallenge({\n onSubmit,\n errors,\n allowRecoveryCode = true,\n title,\n description,\n footer,\n labels,\n className,\n slotName = 'two-factor-challenge',\n}: TwoFactorChallengeProps & SlotNameProps) {\n const text = resolveLabels(labels);\n\n return (\n <section\n className={cn('gap-6 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n <div className=\"gap-2 flex flex-col\">\n <h2 className=\"text-2xl font-bold tracking-tight text-foreground\">\n {title ?? text.challengeTitle}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description ?? text.challengeDescription}\n </p>\n </div>\n\n <TwoFactorVerifyForm\n autoFocus\n allowRecoveryCode={allowRecoveryCode}\n errors={errors}\n labels={labels}\n footer={footer}\n onSubmit={onSubmit}\n />\n </section>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { Button } from '@/components/ui/button';\nimport { ConfirmDialog } from '@/components/ui/confirm-dialog';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { ShieldOff } from 'lucide-react';\nimport { useState, type ComponentProps } from 'react';\n\nexport interface TwoFactorDisableButtonProps extends TwoFactorLabelProps {\n onDisable: () => void | Promise<void>;\n disabled?: boolean;\n variant?: ComponentProps<typeof Button>['variant'];\n size?: ComponentProps<typeof Button>['size'];\n className?: string;\n}\n\nexport function TwoFactorDisableButton({\n onDisable,\n disabled = false,\n variant = 'destructive',\n size = 'default',\n labels,\n className,\n slotName = 'two-factor-disable',\n}: TwoFactorDisableButtonProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [open, setOpen] = useState(false);\n const [processing, setProcessing] = useState(false);\n\n const handleConfirm = async () => {\n setProcessing(true);\n\n try {\n await onDisable();\n } finally {\n setProcessing(false);\n }\n };\n\n return (\n <span\n data-open={open || undefined}\n className={cn('inline-flex', className)}\n data-slot={slotName}\n >\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled || processing}\n onClick={() => setOpen(true)}\n >\n <ShieldOff />\n {text.disableLabel}\n </Button>\n\n <ConfirmDialog\n open={open}\n onOpenChange={setOpen}\n title={text.disableTitle}\n description={text.disableDescription}\n confirmText={text.disableConfirmLabel}\n cancelText={text.disableCancelLabel}\n processing={processing}\n onConfirm={handleConfirm}\n />\n </span>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorLabelProps,\n} from '@/blocks/two-factor/types';\nimport { Button } from '@/components/ui/button';\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { compactRadius, recessedSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { Eye, EyeOff, RefreshCw } from 'lucide-react';\nimport { useState } from 'react';\n\nexport interface TwoFactorRecoveryCodesProps extends TwoFactorLabelProps {\n codes: string[];\n defaultRevealed?: boolean;\n onRegenerate?: () => void | Promise<void>;\n showHeading?: boolean;\n className?: string;\n}\n\nexport function TwoFactorRecoveryCodes({\n codes,\n defaultRevealed = false,\n onRegenerate,\n showHeading = true,\n labels,\n className,\n slotName = 'two-factor-recovery-codes',\n}: TwoFactorRecoveryCodesProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [revealed, setRevealed] = useState(defaultRevealed);\n const [copyFailed, setCopyFailed] = useState(false);\n const [regenerating, setRegenerating] = useState(false);\n\n const handleRegenerate = async () => {\n if (!onRegenerate || regenerating) {\n return;\n }\n\n setRegenerating(true);\n\n try {\n await onRegenerate();\n } finally {\n setRegenerating(false);\n }\n };\n\n return (\n <div\n data-revealed={revealed || undefined}\n className={cn('gap-4 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n {showHeading && (\n <div className=\"gap-1 flex flex-col\">\n <p className=\"text-sm font-semibold text-foreground\">\n {text.recoveryTitle}\n </p>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {text.recoveryDescription} {text.recoveryWarning}\n </p>\n </div>\n )}\n\n {revealed && (\n <ul\n data-slot=\"two-factor-recovery-list\"\n className={cn(\n recessedSurface,\n 'gap-2 p-4 sm:grid-cols-2 grid',\n )}\n >\n {codes.map((code) => (\n <li\n key={code}\n data-slot=\"two-factor-recovery-code\"\n className={cn(\n compactRadius,\n 'px-2 py-1 text-sm font-medium font-mono break-all text-foreground',\n )}\n >\n {code}\n </li>\n ))}\n </ul>\n )}\n\n <div className=\"gap-2 flex flex-wrap items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={revealed}\n onClick={() => setRevealed(!revealed)}\n >\n {revealed ? <EyeOff /> : <Eye />}\n {revealed ? text.hideLabel : text.revealLabel}\n </Button>\n\n <CopyButton\n value={codes.join('\\n')}\n copyLabel={text.copyLabel}\n copiedLabel={text.copiedLabel}\n onCopied={() => setCopyFailed(false)}\n onCopyFailed={() => setCopyFailed(true)}\n />\n\n {onRegenerate && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n loading={regenerating}\n loadingLabel={text.regenerateLabel}\n onClick={handleRegenerate}\n >\n <RefreshCw />\n {text.regenerateLabel}\n </Button>\n )}\n </div>\n\n {copyFailed && (\n <p\n data-slot=\"two-factor-copy-failed\"\n className=\"text-xs font-medium text-muted-foreground\"\n >\n {text.copyFailedLabel}\n </p>\n )}\n </div>\n );\n}\n","import {\n resolveLabels,\n type TwoFactorLabelProps,\n type TwoFactorQrProps,\n} from '@/blocks/two-factor/types';\nimport { Button } from '@/components/ui/button';\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { compactRadius, controlRadius, recessedSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { Eye, EyeOff } from 'lucide-react';\nimport { useState } from 'react';\n\nexport interface TwoFactorScanStepProps\n extends TwoFactorLabelProps, TwoFactorQrProps {\n manualSetupKey?: string | null;\n className?: string;\n}\n\nexport function TwoFactorScanStep({\n qrCode,\n qrCodeSvg,\n manualSetupKey,\n labels,\n className,\n slotName = 'two-factor-scan-step',\n}: TwoFactorScanStepProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [revealed, setRevealed] = useState(false);\n\n return (\n <div\n className={cn('gap-5 flex w-full flex-col', className)}\n data-slot={slotName}\n >\n <div\n data-slot=\"two-factor-qr\"\n className={cn(\n recessedSurface,\n 'p-4 flex items-center justify-center [&_svg]:size-full [&_svg]:h-auto',\n )}\n >\n {qrCode ??\n (qrCodeSvg ? (\n <div\n data-slot=\"two-factor-qr-markup\"\n className={cn(controlRadius, 'p-3 bg-card')}\n dangerouslySetInnerHTML={{ __html: qrCodeSvg }}\n />\n ) : (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {text.qrFallbackLabel}\n </p>\n ))}\n </div>\n\n {manualSetupKey && (\n <div\n data-slot=\"two-factor-setup-key\"\n className=\"gap-2 flex flex-col\"\n >\n <p className=\"text-sm font-semibold text-foreground\">\n {text.manualKeyLabel}\n </p>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {text.manualKeyDescription}\n </p>\n\n <div className=\"gap-2 flex flex-wrap items-center\">\n <code\n data-slot=\"two-factor-setup-key-value\"\n className={cn(\n compactRadius,\n 'px-3 py-2 text-sm font-medium font-mono bg-muted break-all text-foreground',\n )}\n >\n {revealed\n ? manualSetupKey\n : '•'.repeat(manualSetupKey.length)}\n </code>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={revealed}\n onClick={() => setRevealed(!revealed)}\n >\n {revealed ? <EyeOff /> : <Eye />}\n {revealed\n ? text.manualKeyHideLabel\n : text.manualKeyRevealLabel}\n </Button>\n\n <CopyButton\n value={manualSetupKey}\n copyLabel={text.copyLabel}\n copiedLabel={text.copiedLabel}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { TwoFactorRecoveryCodes } from '@/blocks/two-factor/recovery-codes';\nimport { TwoFactorScanStep } from '@/blocks/two-factor/scan-step';\nimport {\n resolveLabels,\n type TwoFactorLabelProps,\n type TwoFactorQrProps,\n type TwoFactorSetupStep,\n} from '@/blocks/two-factor/types';\nimport { TwoFactorVerifyForm } from '@/blocks/two-factor/verify-form';\nimport { Button } from '@/components/ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\nimport { useEffect, useRef, useState } from 'react';\n\nexport interface TwoFactorSetupDialogProps\n extends TwoFactorLabelProps, TwoFactorQrProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n enabled?: boolean;\n manualSetupKey?: string | null;\n recoveryCodes?: string[];\n errors?: string | string[] | null;\n onConfirm: (code: string) => void | Promise<void>;\n onRequestSetupData?: () => void | Promise<void>;\n onRegenerateRecoveryCodes?: () => void | Promise<void>;\n onCompleted?: () => void;\n className?: string;\n}\n\nexport function TwoFactorSetupDialog({\n open,\n onOpenChange,\n enabled = false,\n qrCode,\n qrCodeSvg,\n manualSetupKey,\n recoveryCodes,\n errors,\n onConfirm,\n onRequestSetupData,\n onRegenerateRecoveryCodes,\n onCompleted,\n labels,\n className,\n slotName = 'two-factor-setup-dialog',\n}: TwoFactorSetupDialogProps & SlotNameProps) {\n const text = resolveLabels(labels);\n const [step, setStep] = useState<TwoFactorSetupStep>(\n enabled ? 'recovery' : 'scan',\n );\n\n const requestSetupData = useRef(onRequestSetupData);\n const openedBefore = useRef(false);\n\n useEffect(() => {\n requestSetupData.current = onRequestSetupData;\n }, [onRequestSetupData]);\n\n useEffect(() => {\n if (!open) {\n openedBefore.current = false;\n\n return;\n }\n\n if (openedBefore.current) {\n return;\n }\n\n openedBefore.current = true;\n setStep(enabled ? 'recovery' : 'scan');\n\n if (!enabled) {\n void requestSetupData.current?.();\n }\n }, [open, enabled]);\n\n const ready = Boolean(qrCode || qrCodeSvg || manualSetupKey);\n const codes = recoveryCodes ?? [];\n\n const handleConfirm = async (code: string) => {\n await onConfirm(code);\n setStep('recovery');\n };\n\n const finish = () => {\n onOpenChange(false);\n onCompleted?.();\n };\n\n const heading = {\n pending: text.setupTitle,\n scan: text.scanTitle,\n confirm: text.confirmTitle,\n recovery: text.recoveryTitle,\n }[step];\n\n const description = {\n pending: text.setupDescription,\n scan: text.scanDescription,\n confirm: text.confirmDescription,\n recovery: `${text.recoveryDescription} ${text.recoveryWarning}`,\n }[step];\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n data-step={step}\n className={cn('max-w-md p-0', className)}\n slotName={slotName}\n >\n <DialogHeader className=\"p-6 md:p-8\">\n <DialogTitle>{heading}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n\n <div className=\"gap-5 p-6 md:p-8 pt-0 md:pt-0 flex flex-col\">\n {step === 'scan' &&\n (ready ? (\n <>\n <TwoFactorScanStep\n qrCode={qrCode}\n qrCodeSvg={qrCodeSvg}\n manualSetupKey={manualSetupKey}\n labels={labels}\n />\n <Button\n type=\"button\"\n onClick={() => setStep('confirm')}\n >\n {text.continueLabel}\n </Button>\n </>\n ) : (\n <div\n data-slot=\"two-factor-pending\"\n className=\"gap-3 py-6 text-sm font-medium flex items-center justify-center text-muted-foreground\"\n >\n <Spinner label={text.pendingLabel} />\n {text.pendingLabel}\n </div>\n ))}\n\n {step === 'confirm' && (\n <TwoFactorVerifyForm\n autoFocus\n errors={errors}\n labels={labels}\n onSubmit={handleConfirm}\n footer={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStep('scan')}\n >\n {text.cancelLabel}\n </Button>\n }\n />\n )}\n\n {step === 'recovery' && (\n <>\n <TwoFactorRecoveryCodes\n codes={codes}\n defaultRevealed\n showHeading={false}\n labels={labels}\n onRegenerate={onRegenerateRecoveryCodes}\n />\n <Button type=\"button\" onClick={finish}>\n {text.doneLabel}\n </Button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","CalendarDays","useState","jsx","jsxs","ChevronLeft","format","pt","jsx","jsxs","ChevronLeft","format","pt","jsx","jsxs","useState","CalendarDays","RANGE_SEPARATOR","RELATIVE_PREFIX","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","createContext","useContext","jsx","jsxs","jsx","jsxs","useId","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","Eye","EyeOff","useState","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs"]}
|