@omnifyjp/ui 2.3.0 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/{chunk-ML2VNJ7R.js → chunk-37CQS347.js} +3 -3
  2. package/dist/{chunk-ML2VNJ7R.js.map → chunk-37CQS347.js.map} +1 -1
  3. package/dist/{chunk-2OPOSDEH.js → chunk-CTNIYDQI.js} +3 -3
  4. package/dist/{chunk-2OPOSDEH.js.map → chunk-CTNIYDQI.js.map} +1 -1
  5. package/dist/{chunk-Q5KDFNRD.js → chunk-CTZOQ5BS.js} +4 -4
  6. package/dist/chunk-CTZOQ5BS.js.map +1 -0
  7. package/dist/{chunk-7HHL5OFD.js → chunk-JNLYTMN5.js} +3 -3
  8. package/dist/chunk-JNLYTMN5.js.map +1 -0
  9. package/dist/{chunk-M22SIS5Z.js → chunk-JTVWK3BC.js} +3 -3
  10. package/dist/{chunk-M22SIS5Z.js.map → chunk-JTVWK3BC.js.map} +1 -1
  11. package/dist/{chunk-BBFOFRWT.js → chunk-QHHPWBZM.js} +5 -46
  12. package/dist/chunk-QHHPWBZM.js.map +1 -0
  13. package/dist/chunk-RWMRHEWT.js +8 -0
  14. package/dist/chunk-RWMRHEWT.js.map +1 -0
  15. package/dist/chunk-SWQDP3VC.js +47 -0
  16. package/dist/chunk-SWQDP3VC.js.map +1 -0
  17. package/dist/{chunk-DB42CM3T.js → chunk-TSRLQI2O.js} +4 -4
  18. package/dist/chunk-TSRLQI2O.js.map +1 -0
  19. package/dist/{chunk-YU55YBID.js → chunk-XJSGU5XZ.js} +2 -2
  20. package/dist/chunk-XJSGU5XZ.js.map +1 -0
  21. package/dist/components/domain/calendar/calendar-event-chip.js +2 -1
  22. package/dist/components/domain/calendar/calendar-event-chip.js.map +1 -1
  23. package/dist/components/domain/calendar/calendar-event-sheet.js +2 -1
  24. package/dist/components/domain/calendar/calendar-event-sheet.js.map +1 -1
  25. package/dist/components/domain/calendar/calendar-mini.js +2 -1
  26. package/dist/components/domain/calendar/calendar-mini.js.map +1 -1
  27. package/dist/components/domain/calendar/calendar-toolbar.js +2 -1
  28. package/dist/components/domain/calendar/calendar-toolbar.js.map +1 -1
  29. package/dist/components/inputs/color-picker.js +5 -4
  30. package/dist/components/inputs/date-picker.js +2 -1
  31. package/dist/components/inputs/date-picker.js.map +1 -1
  32. package/dist/components/inputs/input.d.ts +1 -2
  33. package/dist/components/inputs/input.js +4 -3
  34. package/dist/components/inputs/password-input.d.ts +1 -2
  35. package/dist/components/inputs/password-input.js +5 -4
  36. package/dist/components/inputs/slug-input.js +5 -4
  37. package/dist/components/inputs/textarea.d.ts +1 -2
  38. package/dist/components/inputs/textarea.js +4 -3
  39. package/dist/components/inputs/time-picker.js +4 -3
  40. package/dist/components/inputs/time-picker.js.map +1 -1
  41. package/dist/components/inputs/translatable-field.d.ts +1 -1
  42. package/dist/components/inputs/translatable-field.js +1 -1
  43. package/dist/components/navigation/locale-switcher.js +3 -2
  44. package/dist/index.d.ts +45 -1
  45. package/dist/index.js +10 -8
  46. package/dist/providers/ui-provider.d.ts +2 -63
  47. package/dist/providers/ui-provider.js +2 -1
  48. package/dist/ui-context-D0zD0xa5.d.ts +25 -0
  49. package/package.json +2 -2
  50. package/dist/chunk-7HHL5OFD.js.map +0 -1
  51. package/dist/chunk-BBFOFRWT.js.map +0 -1
  52. package/dist/chunk-DB42CM3T.js.map +0 -1
  53. package/dist/chunk-Q5KDFNRD.js.map +0 -1
  54. package/dist/chunk-YU55YBID.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/domain/calendar/calendar-mini.tsx"],"names":[],"mappings":"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","file":"calendar-mini.js","sourcesContent":["import { useMemo } from 'react';\nimport {\n startOfMonth, endOfMonth, startOfWeek, endOfWeek,\n eachDayOfInterval, isSameMonth, isSameDay, format,\n} from 'date-fns';\nimport type { Locale } from 'date-fns';\nimport { cn } from '../../../lib/utils';\nimport { toZonedTime, nowInTimezone } from '../../../lib/timezone';\nimport { useDateFnsLocale, useTimezone } from '../../../providers/ui-provider';\nimport { Checkbox } from '../../inputs/checkbox';\nimport { Separator } from '../../display/separator';\n\n/** A category that can be toggled on/off in the mini calendar's filter section. */\nexport interface CalendarCategory {\n /** Unique key for this category. */\n key: string;\n /** CSS color string used for the category dot. */\n color: string;\n /** Display label for the category. */\n label: string;\n}\n\n/** Localizable labels for the mini calendar. All have English defaults. */\nexport interface CalendarMiniLabels {\n /** Label for Sunday column header. */\n sun?: string;\n /** Label for Monday column header. */\n mon?: string;\n /** Label for Tuesday column header. */\n tue?: string;\n /** Label for Wednesday column header. */\n wed?: string;\n /** Label for Thursday column header. */\n thu?: string;\n /** Label for Friday column header. */\n fri?: string;\n /** Label for Saturday column header. */\n sat?: string;\n /** Heading text for the categories filter section. */\n categories?: string;\n}\n\nconst defaultLabels: Required<CalendarMiniLabels> = {\n sun: 'Sun', mon: 'Mon', tue: 'Tue', wed: 'Wed', thu: 'Thu', fri: 'Fri', sat: 'Sat',\n categories: 'Categories',\n};\n\nexport interface CalendarMiniProps {\n /** The month to display (any date within the target month). */\n currentDate: Date;\n /** The currently selected date, highlighted with primary color. */\n selectedDate: Date;\n /** Callback when a day cell is clicked. */\n onSelectDate: (date: Date) => void;\n /** Optional list of event categories for the filter section. */\n categories?: CalendarCategory[];\n /** Keys of currently enabled categories. */\n enabledCategories?: string[];\n /** Callback when a category checkbox is toggled. */\n onToggleCategory?: (key: string) => void;\n /** Localizable UI labels with English defaults. */\n labels?: CalendarMiniLabels;\n /** date-fns Locale object for formatting the month/year header. Falls back to UIProvider's `dateFnsLocale`. */\n locale?: Locale;\n}\n\n/**\n * Compact month calendar with optional category filters. Designed for sidebar\n * placement in calendar views. Locale-agnostic via the `labels` prop.\n *\n * @example\n * ```tsx\n * <CalendarMini\n * currentDate={new Date()}\n * selectedDate={selectedDate}\n * onSelectDate={setSelectedDate}\n * categories={[{ key: \"meeting\", color: \"#3b82f6\", label: \"Meeting\" }]}\n * enabledCategories={[\"meeting\"]}\n * onToggleCategory={(key) => toggle(key)}\n * />\n * ```\n */\nexport function CalendarMini({\n currentDate,\n selectedDate,\n onSelectDate,\n categories,\n enabledCategories,\n onToggleCategory,\n labels: labelsProp,\n locale: localeProp,\n}: CalendarMiniProps) {\n const labels = { ...defaultLabels, ...labelsProp };\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n const todayInTz = nowInTimezone(timezone);\n\n const days = useMemo(() => {\n const monthStart = startOfMonth(currentDate);\n const monthEnd = endOfMonth(currentDate);\n const calStart = startOfWeek(monthStart, { weekStartsOn: 0 });\n const calEnd = endOfWeek(monthEnd, { weekStartsOn: 0 });\n return eachDayOfInterval({ start: calStart, end: calEnd });\n }, [currentDate]);\n\n const weekDays = [labels.sun, labels.mon, labels.tue, labels.wed, labels.thu, labels.fri, labels.sat];\n\n return (\n <div className=\"space-y-4\">\n {/* Mini calendar */}\n <div>\n <p className=\"text-sm font-semibold mb-2\">{format(toZonedTime(currentDate, timezone), 'MMMM yyyy', locale ? { locale } : undefined)}</p>\n <div className=\"grid grid-cols-7 gap-0\">\n {weekDays.map(day => (\n <div key={day} className=\"text-center text-[10px] font-medium text-muted-foreground py-1\">\n {day}\n </div>\n ))}\n {days.map(day => {\n const inMonth = isSameMonth(day, currentDate);\n const selected = isSameDay(day, selectedDate);\n const today = isSameDay(day, todayInTz);\n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n onClick={() => onSelectDate(day)}\n className={cn(\n 'w-7 h-7 text-[11px] rounded-full flex items-center justify-center transition-colors',\n !inMonth && 'text-muted-foreground/40',\n inMonth && !selected && 'hover:bg-accent',\n selected && 'bg-primary text-primary-foreground',\n today && !selected && 'font-bold text-primary',\n )}\n >\n {format(day, 'd')}\n </button>\n );\n })}\n </div>\n </div>\n\n {categories && categories.length > 0 && (\n <>\n <Separator />\n {/* Category filters */}\n <div>\n <p className=\"text-sm font-semibold mb-2\">{labels.categories}</p>\n <div className=\"space-y-1.5\">\n {categories.map(cat => (\n <label\n key={cat.key}\n className=\"flex items-center gap-2 py-1 px-1 rounded hover:bg-accent transition-colors cursor-pointer\"\n >\n <Checkbox\n checked={enabledCategories?.includes(cat.key) ?? false}\n onCheckedChange={() => onToggleCategory?.(cat.key)}\n />\n <div className=\"w-2.5 h-2.5 rounded-full\" style={{ backgroundColor: cat.color }} />\n <span className=\"text-sm\">{cat.label}</span>\n </label>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/components/domain/calendar/calendar-mini.tsx"],"names":[],"mappings":"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","file":"calendar-mini.js","sourcesContent":["import { useMemo } from 'react';\nimport {\n startOfMonth, endOfMonth, startOfWeek, endOfWeek,\n eachDayOfInterval, isSameMonth, isSameDay, format,\n} from 'date-fns';\nimport type { Locale } from 'date-fns';\nimport { cn } from '../../../lib/utils';\nimport { toZonedTime, nowInTimezone } from '../../../lib/timezone';\nimport { useDateFnsLocale, useTimezone } from '../../../providers/ui-hooks';\nimport { Checkbox } from '../../inputs/checkbox';\nimport { Separator } from '../../display/separator';\n\n/** A category that can be toggled on/off in the mini calendar's filter section. */\nexport interface CalendarCategory {\n /** Unique key for this category. */\n key: string;\n /** CSS color string used for the category dot. */\n color: string;\n /** Display label for the category. */\n label: string;\n}\n\n/** Localizable labels for the mini calendar. All have English defaults. */\nexport interface CalendarMiniLabels {\n /** Label for Sunday column header. */\n sun?: string;\n /** Label for Monday column header. */\n mon?: string;\n /** Label for Tuesday column header. */\n tue?: string;\n /** Label for Wednesday column header. */\n wed?: string;\n /** Label for Thursday column header. */\n thu?: string;\n /** Label for Friday column header. */\n fri?: string;\n /** Label for Saturday column header. */\n sat?: string;\n /** Heading text for the categories filter section. */\n categories?: string;\n}\n\nconst defaultLabels: Required<CalendarMiniLabels> = {\n sun: 'Sun', mon: 'Mon', tue: 'Tue', wed: 'Wed', thu: 'Thu', fri: 'Fri', sat: 'Sat',\n categories: 'Categories',\n};\n\nexport interface CalendarMiniProps {\n /** The month to display (any date within the target month). */\n currentDate: Date;\n /** The currently selected date, highlighted with primary color. */\n selectedDate: Date;\n /** Callback when a day cell is clicked. */\n onSelectDate: (date: Date) => void;\n /** Optional list of event categories for the filter section. */\n categories?: CalendarCategory[];\n /** Keys of currently enabled categories. */\n enabledCategories?: string[];\n /** Callback when a category checkbox is toggled. */\n onToggleCategory?: (key: string) => void;\n /** Localizable UI labels with English defaults. */\n labels?: CalendarMiniLabels;\n /** date-fns Locale object for formatting the month/year header. Falls back to UIProvider's `dateFnsLocale`. */\n locale?: Locale;\n}\n\n/**\n * Compact month calendar with optional category filters. Designed for sidebar\n * placement in calendar views. Locale-agnostic via the `labels` prop.\n *\n * @example\n * ```tsx\n * <CalendarMini\n * currentDate={new Date()}\n * selectedDate={selectedDate}\n * onSelectDate={setSelectedDate}\n * categories={[{ key: \"meeting\", color: \"#3b82f6\", label: \"Meeting\" }]}\n * enabledCategories={[\"meeting\"]}\n * onToggleCategory={(key) => toggle(key)}\n * />\n * ```\n */\nexport function CalendarMini({\n currentDate,\n selectedDate,\n onSelectDate,\n categories,\n enabledCategories,\n onToggleCategory,\n labels: labelsProp,\n locale: localeProp,\n}: CalendarMiniProps) {\n const labels = { ...defaultLabels, ...labelsProp };\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n const todayInTz = nowInTimezone(timezone);\n\n const days = useMemo(() => {\n const monthStart = startOfMonth(currentDate);\n const monthEnd = endOfMonth(currentDate);\n const calStart = startOfWeek(monthStart, { weekStartsOn: 0 });\n const calEnd = endOfWeek(monthEnd, { weekStartsOn: 0 });\n return eachDayOfInterval({ start: calStart, end: calEnd });\n }, [currentDate]);\n\n const weekDays = [labels.sun, labels.mon, labels.tue, labels.wed, labels.thu, labels.fri, labels.sat];\n\n return (\n <div className=\"space-y-4\">\n {/* Mini calendar */}\n <div>\n <p className=\"text-sm font-semibold mb-2\">{format(toZonedTime(currentDate, timezone), 'MMMM yyyy', locale ? { locale } : undefined)}</p>\n <div className=\"grid grid-cols-7 gap-0\">\n {weekDays.map(day => (\n <div key={day} className=\"text-center text-[10px] font-medium text-muted-foreground py-1\">\n {day}\n </div>\n ))}\n {days.map(day => {\n const inMonth = isSameMonth(day, currentDate);\n const selected = isSameDay(day, selectedDate);\n const today = isSameDay(day, todayInTz);\n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n onClick={() => onSelectDate(day)}\n className={cn(\n 'w-7 h-7 text-[11px] rounded-full flex items-center justify-center transition-colors',\n !inMonth && 'text-muted-foreground/40',\n inMonth && !selected && 'hover:bg-accent',\n selected && 'bg-primary text-primary-foreground',\n today && !selected && 'font-bold text-primary',\n )}\n >\n {format(day, 'd')}\n </button>\n );\n })}\n </div>\n </div>\n\n {categories && categories.length > 0 && (\n <>\n <Separator />\n {/* Category filters */}\n <div>\n <p className=\"text-sm font-semibold mb-2\">{labels.categories}</p>\n <div className=\"space-y-1.5\">\n {categories.map(cat => (\n <label\n key={cat.key}\n className=\"flex items-center gap-2 py-1 px-1 rounded hover:bg-accent transition-colors cursor-pointer\"\n >\n <Checkbox\n checked={enabledCategories?.includes(cat.key) ?? false}\n onCheckedChange={() => onToggleCategory?.(cat.key)}\n />\n <div className=\"w-2.5 h-2.5 rounded-full\" style={{ backgroundColor: cat.color }} />\n <span className=\"text-sm\">{cat.label}</span>\n </label>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { toZonedTime } from '../../../chunk-PMNLM6VF.js';
2
- import { useDateFnsLocale, useTimezone } from '../../../chunk-BBFOFRWT.js';
2
+ import { useDateFnsLocale, useTimezone } from '../../../chunk-SWQDP3VC.js';
3
+ import '../../../chunk-RWMRHEWT.js';
3
4
  import { ToggleGroup, ToggleGroupItem } from '../../../chunk-TPBRGO4D.js';
4
5
  import '../../../chunk-ORTPKXBI.js';
5
6
  import { Button } from '../../../chunk-BOV3Q2JH.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/domain/calendar/calendar-toolbar.tsx"],"names":[],"mappings":"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","file":"calendar-toolbar.js","sourcesContent":["import { format } from 'date-fns';\nimport type { Locale } from 'date-fns';\nimport { ChevronLeft, ChevronRight, Plus } from 'lucide-react';\nimport { toZonedTime } from '../../../lib/timezone';\nimport { useDateFnsLocale, useTimezone } from '../../../providers/ui-provider';\nimport { Button } from '../../inputs/button';\nimport { ToggleGroup, ToggleGroupItem } from '../../display/toggle-group';\n\n/** Supported calendar view modes. */\nexport type CalendarView = 'month' | 'week' | 'day';\n\n/** Localizable labels for the calendar toolbar. All have English defaults. */\nexport interface CalendarToolbarLabels {\n /** Label for the \"Today\" button. */\n today?: string;\n /** Label for the \"Month\" view toggle. */\n month?: string;\n /** Label for the \"Week\" view toggle. */\n week?: string;\n /** Label for the \"Day\" view toggle. */\n day?: string;\n /** Label for the \"Create Event\" button. */\n createEvent?: string;\n}\n\nconst defaultLabels: Required<CalendarToolbarLabels> = {\n today: 'Today',\n month: 'Month',\n week: 'Week',\n day: 'Day',\n createEvent: 'Create Event',\n};\n\nexport interface CalendarToolbarProps {\n /** The date currently being viewed. Used for the title display. */\n currentDate: Date;\n /** The active calendar view mode. */\n view: CalendarView;\n /** Callback when the user switches between month/week/day views. */\n onViewChange: (view: CalendarView) => void;\n /** Navigate to the previous period. */\n onPrev: () => void;\n /** Navigate to the next period. */\n onNext: () => void;\n /** Navigate to today. */\n onToday: () => void;\n /** Optional callback for the \"Create Event\" button. Button is hidden when omitted. */\n onCreateEvent?: () => void;\n /** Localizable UI labels with English defaults. */\n labels?: CalendarToolbarLabels;\n /** date-fns format string for the title. Defaults to `\"MMMM yyyy\"` or `\"EEEE, MMMM d, yyyy\"` for day view. */\n titleFormat?: string;\n /** date-fns Locale object for formatting the title. Falls back to UIProvider's `dateFnsLocale`. */\n locale?: Locale;\n}\n\n/**\n * Toolbar for calendar views with navigation controls (prev/next/today),\n * view mode toggle (month/week/day), and an optional \"Create Event\" button.\n * Locale-agnostic via the `labels` prop.\n *\n * @example\n * ```tsx\n * <CalendarToolbar\n * currentDate={currentDate}\n * view=\"month\"\n * onViewChange={setView}\n * onPrev={handlePrev}\n * onNext={handleNext}\n * onToday={handleToday}\n * onCreateEvent={() => setDialogOpen(true)}\n * />\n * ```\n */\nexport function CalendarToolbar({\n currentDate,\n view,\n onViewChange,\n onPrev,\n onNext,\n onToday,\n onCreateEvent,\n labels: labelsProp,\n titleFormat: titleFormatProp,\n locale: localeProp,\n}: CalendarToolbarProps) {\n const labels = { ...defaultLabels, ...labelsProp };\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n\n const titleFormat = titleFormatProp ?? (view === 'day'\n ? 'EEEE, MMMM d, yyyy'\n : 'MMMM yyyy');\n\n return (\n <div className=\"flex items-center justify-between gap-4 flex-wrap\">\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onToday}>\n {labels.today}\n </Button>\n <div className=\"flex items-center\">\n <Button variant=\"ghost\" size=\"icon\" className=\"w-8 h-8\" onClick={onPrev}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"w-8 h-8\" onClick={onNext}>\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n </div>\n <h2 className=\"text-lg font-semibold\">{format(toZonedTime(currentDate, timezone), titleFormat, locale ? { locale } : undefined)}</h2>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <ToggleGroup type=\"single\" value={view} onValueChange={val => val && onViewChange(val as CalendarView)}>\n <ToggleGroupItem value=\"month\" size=\"sm\">{labels.month}</ToggleGroupItem>\n <ToggleGroupItem value=\"week\" size=\"sm\">{labels.week}</ToggleGroupItem>\n <ToggleGroupItem value=\"day\" size=\"sm\">{labels.day}</ToggleGroupItem>\n </ToggleGroup>\n {onCreateEvent && (\n <Button size=\"sm\" onClick={onCreateEvent}>\n <Plus className=\"w-4 h-4\" />\n {labels.createEvent}\n </Button>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/components/domain/calendar/calendar-toolbar.tsx"],"names":[],"mappings":";;;;;;;;;;;AAyBA,IAAM,aAAA,GAAiD;AAAA,EACrD,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,WAAA,EAAa;AACf,CAAA;AA2CO,SAAS,eAAA,CAAgB;AAAA,EAC9B,WAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA,EAAQ,UAAA;AAAA,EACR,WAAA,EAAa,eAAA;AAAA,EACb,MAAA,EAAQ;AACV,CAAA,EAAyB;AACvB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,aAAA,EAAe,GAAG,UAAA,EAAW;AACjD,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AACvC,EAAA,MAAM,SAAS,UAAA,IAAc,aAAA;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,WAAA,EAAY;AAEjC,EAAA,MAAM,WAAA,GAAc,eAAA,KAAoB,IAAA,KAAS,KAAA,GAC7C,oBAAA,GACA,WAAA,CAAA;AAEJ,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAQ,SAAA,EAAU,IAAA,EAAK,MAAK,OAAA,EAAS,OAAA,EAC1C,iBAAO,KAAA,EACV,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,OAAA,EAAQ,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,OAAA,EAAS,MAAA,EAC/D,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,WAAU,CAAA,EACnC,CAAA;AAAA,wBACA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,OAAA,EAAS,MAAA,EAC/D,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,WAAU,CAAA,EACpC;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,iBAAO,WAAA,CAAY,WAAA,EAAa,QAAQ,CAAA,EAAG,aAAa,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,MAAS,CAAA,EAAE;AAAA,KAAA,EAClI,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,QAAA,EAAS,KAAA,EAAO,IAAA,EAAM,eAAe,CAAA,GAAA,KAAO,GAAA,IAAO,YAAA,CAAa,GAAmB,CAAA,EACnG,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,mBAAgB,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAK,IAAA,EAAM,iBAAO,KAAA,EAAM,CAAA;AAAA,4BACtD,eAAA,EAAA,EAAgB,KAAA,EAAM,QAAO,IAAA,EAAK,IAAA,EAAM,iBAAO,IAAA,EAAK,CAAA;AAAA,4BACpD,eAAA,EAAA,EAAgB,KAAA,EAAM,OAAM,IAAA,EAAK,IAAA,EAAM,iBAAO,GAAA,EAAI;AAAA,OAAA,EACrD,CAAA;AAAA,MACC,iCACC,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAS,aAAA,EACzB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,QACzB,MAAA,CAAO;AAAA,OAAA,EACV;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ","file":"calendar-toolbar.js","sourcesContent":["import { format } from 'date-fns';\nimport type { Locale } from 'date-fns';\nimport { ChevronLeft, ChevronRight, Plus } from 'lucide-react';\nimport { toZonedTime } from '../../../lib/timezone';\nimport { useDateFnsLocale, useTimezone } from '../../../providers/ui-hooks';\nimport { Button } from '../../inputs/button';\nimport { ToggleGroup, ToggleGroupItem } from '../../display/toggle-group';\n\n/** Supported calendar view modes. */\nexport type CalendarView = 'month' | 'week' | 'day';\n\n/** Localizable labels for the calendar toolbar. All have English defaults. */\nexport interface CalendarToolbarLabels {\n /** Label for the \"Today\" button. */\n today?: string;\n /** Label for the \"Month\" view toggle. */\n month?: string;\n /** Label for the \"Week\" view toggle. */\n week?: string;\n /** Label for the \"Day\" view toggle. */\n day?: string;\n /** Label for the \"Create Event\" button. */\n createEvent?: string;\n}\n\nconst defaultLabels: Required<CalendarToolbarLabels> = {\n today: 'Today',\n month: 'Month',\n week: 'Week',\n day: 'Day',\n createEvent: 'Create Event',\n};\n\nexport interface CalendarToolbarProps {\n /** The date currently being viewed. Used for the title display. */\n currentDate: Date;\n /** The active calendar view mode. */\n view: CalendarView;\n /** Callback when the user switches between month/week/day views. */\n onViewChange: (view: CalendarView) => void;\n /** Navigate to the previous period. */\n onPrev: () => void;\n /** Navigate to the next period. */\n onNext: () => void;\n /** Navigate to today. */\n onToday: () => void;\n /** Optional callback for the \"Create Event\" button. Button is hidden when omitted. */\n onCreateEvent?: () => void;\n /** Localizable UI labels with English defaults. */\n labels?: CalendarToolbarLabels;\n /** date-fns format string for the title. Defaults to `\"MMMM yyyy\"` or `\"EEEE, MMMM d, yyyy\"` for day view. */\n titleFormat?: string;\n /** date-fns Locale object for formatting the title. Falls back to UIProvider's `dateFnsLocale`. */\n locale?: Locale;\n}\n\n/**\n * Toolbar for calendar views with navigation controls (prev/next/today),\n * view mode toggle (month/week/day), and an optional \"Create Event\" button.\n * Locale-agnostic via the `labels` prop.\n *\n * @example\n * ```tsx\n * <CalendarToolbar\n * currentDate={currentDate}\n * view=\"month\"\n * onViewChange={setView}\n * onPrev={handlePrev}\n * onNext={handleNext}\n * onToday={handleToday}\n * onCreateEvent={() => setDialogOpen(true)}\n * />\n * ```\n */\nexport function CalendarToolbar({\n currentDate,\n view,\n onViewChange,\n onPrev,\n onNext,\n onToday,\n onCreateEvent,\n labels: labelsProp,\n titleFormat: titleFormatProp,\n locale: localeProp,\n}: CalendarToolbarProps) {\n const labels = { ...defaultLabels, ...labelsProp };\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n\n const titleFormat = titleFormatProp ?? (view === 'day'\n ? 'EEEE, MMMM d, yyyy'\n : 'MMMM yyyy');\n\n return (\n <div className=\"flex items-center justify-between gap-4 flex-wrap\">\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onToday}>\n {labels.today}\n </Button>\n <div className=\"flex items-center\">\n <Button variant=\"ghost\" size=\"icon\" className=\"w-8 h-8\" onClick={onPrev}>\n <ChevronLeft className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"w-8 h-8\" onClick={onNext}>\n <ChevronRight className=\"w-4 h-4\" />\n </Button>\n </div>\n <h2 className=\"text-lg font-semibold\">{format(toZonedTime(currentDate, timezone), titleFormat, locale ? { locale } : undefined)}</h2>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <ToggleGroup type=\"single\" value={view} onValueChange={val => val && onViewChange(val as CalendarView)}>\n <ToggleGroupItem value=\"month\" size=\"sm\">{labels.month}</ToggleGroupItem>\n <ToggleGroupItem value=\"week\" size=\"sm\">{labels.week}</ToggleGroupItem>\n <ToggleGroupItem value=\"day\" size=\"sm\">{labels.day}</ToggleGroupItem>\n </ToggleGroup>\n {onCreateEvent && (\n <Button size=\"sm\" onClick={onCreateEvent}>\n <Plus className=\"w-4 h-4\" />\n {labels.createEvent}\n </Button>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1,8 +1,9 @@
1
- export { ColorPicker } from '../../chunk-2OPOSDEH.js';
2
- import '../../chunk-DB42CM3T.js';
3
- import '../../chunk-YU55YBID.js';
1
+ export { ColorPicker } from '../../chunk-CTNIYDQI.js';
2
+ import '../../chunk-TSRLQI2O.js';
3
+ import '../../chunk-XJSGU5XZ.js';
4
4
  import '../../chunk-7NMNLY7F.js';
5
- import '../../chunk-BBFOFRWT.js';
5
+ import '../../chunk-SWQDP3VC.js';
6
+ import '../../chunk-RWMRHEWT.js';
6
7
  import '../../chunk-BOV3Q2JH.js';
7
8
  import '../../chunk-DGPY4WP3.js';
8
9
  //# sourceMappingURL=color-picker.js.map
@@ -1,6 +1,7 @@
1
1
  import { Popover, PopoverTrigger, PopoverContent } from '../../chunk-7NMNLY7F.js';
2
2
  import { toZonedTime } from '../../chunk-PMNLM6VF.js';
3
- import { useDateFnsLocale, useTimezone } from '../../chunk-BBFOFRWT.js';
3
+ import { useDateFnsLocale, useTimezone } from '../../chunk-SWQDP3VC.js';
4
+ import '../../chunk-RWMRHEWT.js';
4
5
  import { Calendar as Calendar$1 } from '../../chunk-KJAXKHJ2.js';
5
6
  import { Button } from '../../chunk-BOV3Q2JH.js';
6
7
  import { cn } from '../../chunk-DGPY4WP3.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/inputs/date-picker.tsx"],"names":["CalendarIcon","Calendar"],"mappings":"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","file":"date-picker.js","sourcesContent":["import { format } from \"date-fns\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport type { Locale } from \"date-fns\";\n\nimport { cn } from \"../../lib/utils\";\nimport { toZonedTime } from \"../../lib/timezone\";\nimport { useDateFnsLocale, useTimezone } from \"../../providers/ui-provider\";\nimport { Button } from \"./button\";\nimport { Calendar } from \"../domain/calendar/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/popover\";\n\ninterface DatePickerProps {\n /** Currently selected date. */\n value?: Date;\n /** Callback fired when a date is selected or cleared. */\n onChange?: (date: Date | undefined) => void;\n /** Placeholder text shown when no date is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the date picker is disabled. */\n disabled?: boolean;\n /** date-fns Locale object for date formatting (e.g., `ja` for Japanese). */\n locale?: Locale;\n}\n\n/**\n * Single date picker with a calendar popover.\n * Displays the selected date formatted with date-fns and opens a calendar on click.\n *\n * @example\n * ```tsx\n * const [date, setDate] = useState<Date>();\n *\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * placeholder=\"Pick a date\"\n * />\n * ```\n */\nexport function DatePicker({\n value,\n onChange,\n placeholder = \"Select date\",\n className,\n disabled,\n locale: localeProp,\n}: DatePickerProps) {\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-left font-normal\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {value ? format(toZonedTime(value, timezone), \"PPP\", locale ? { locale } : undefined) : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n autoFocus\n locale={locale}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface DateRangePickerProps {\n /** Currently selected date range with `from` and optional `to`. */\n value?: { from: Date | undefined; to?: Date | undefined };\n /** Callback fired when the date range changes. */\n onChange?: (range: { from: Date | undefined; to?: Date | undefined } | undefined) => void;\n /** Placeholder text shown when no range is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the date range picker is disabled. */\n disabled?: boolean;\n /** date-fns Locale object for date formatting (e.g., `ja` for Japanese). */\n locale?: Locale;\n}\n\n/**\n * Date range picker with a two-month calendar popover.\n * Allows selecting a start and end date displayed as a range string.\n *\n * @example\n * ```tsx\n * const [range, setRange] = useState<{ from: Date | undefined; to?: Date }>();\n *\n * <DateRangePicker\n * value={range}\n * onChange={setRange}\n * placeholder=\"Select date range\"\n * />\n * ```\n */\nexport function DateRangePicker({\n value,\n onChange,\n placeholder = \"Select date range\",\n className,\n disabled,\n locale: localeProp,\n}: DateRangePickerProps) {\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-left font-normal\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {value?.from ? (\n value.to ? (\n <>\n {format(toZonedTime(value.from, timezone), \"PPP\", locale ? { locale } : undefined)} -{\" \"}\n {format(toZonedTime(value.to, timezone), \"PPP\", locale ? { locale } : undefined)}\n </>\n ) : (\n format(toZonedTime(value.from, timezone), \"PPP\", locale ? { locale } : undefined)\n )\n ) : (\n <span>{placeholder}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"range\"\n selected={value}\n onSelect={onChange}\n numberOfMonths={2}\n autoFocus\n locale={locale}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../src/components/inputs/date-picker.tsx"],"names":["CalendarIcon","Calendar"],"mappings":"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","file":"date-picker.js","sourcesContent":["import { format } from \"date-fns\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport type { Locale } from \"date-fns\";\n\nimport { cn } from \"../../lib/utils\";\nimport { toZonedTime } from \"../../lib/timezone\";\nimport { useDateFnsLocale, useTimezone } from \"../../providers/ui-hooks\";\nimport { Button } from \"./button\";\nimport { Calendar } from \"../domain/calendar/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/popover\";\n\ninterface DatePickerProps {\n /** Currently selected date. */\n value?: Date;\n /** Callback fired when a date is selected or cleared. */\n onChange?: (date: Date | undefined) => void;\n /** Placeholder text shown when no date is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the date picker is disabled. */\n disabled?: boolean;\n /** date-fns Locale object for date formatting (e.g., `ja` for Japanese). */\n locale?: Locale;\n}\n\n/**\n * Single date picker with a calendar popover.\n * Displays the selected date formatted with date-fns and opens a calendar on click.\n *\n * @example\n * ```tsx\n * const [date, setDate] = useState<Date>();\n *\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * placeholder=\"Pick a date\"\n * />\n * ```\n */\nexport function DatePicker({\n value,\n onChange,\n placeholder = \"Select date\",\n className,\n disabled,\n locale: localeProp,\n}: DatePickerProps) {\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-left font-normal\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {value ? format(toZonedTime(value, timezone), \"PPP\", locale ? { locale } : undefined) : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n autoFocus\n locale={locale}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface DateRangePickerProps {\n /** Currently selected date range with `from` and optional `to`. */\n value?: { from: Date | undefined; to?: Date | undefined };\n /** Callback fired when the date range changes. */\n onChange?: (range: { from: Date | undefined; to?: Date | undefined } | undefined) => void;\n /** Placeholder text shown when no range is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the date range picker is disabled. */\n disabled?: boolean;\n /** date-fns Locale object for date formatting (e.g., `ja` for Japanese). */\n locale?: Locale;\n}\n\n/**\n * Date range picker with a two-month calendar popover.\n * Allows selecting a start and end date displayed as a range string.\n *\n * @example\n * ```tsx\n * const [range, setRange] = useState<{ from: Date | undefined; to?: Date }>();\n *\n * <DateRangePicker\n * value={range}\n * onChange={setRange}\n * placeholder=\"Select date range\"\n * />\n * ```\n */\nexport function DateRangePicker({\n value,\n onChange,\n placeholder = \"Select date range\",\n className,\n disabled,\n locale: localeProp,\n}: DateRangePickerProps) {\n const contextLocale = useDateFnsLocale() as Locale | undefined;\n const locale = localeProp ?? contextLocale;\n const { timezone } = useTimezone();\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-left font-normal\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {value?.from ? (\n value.to ? (\n <>\n {format(toZonedTime(value.from, timezone), \"PPP\", locale ? { locale } : undefined)} -{\" \"}\n {format(toZonedTime(value.to, timezone), \"PPP\", locale ? { locale } : undefined)}\n </>\n ) : (\n format(toZonedTime(value.from, timezone), \"PPP\", locale ? { locale } : undefined)\n )\n ) : (\n <span>{placeholder}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"range\"\n selected={value}\n onSelect={onChange}\n numberOfMonths={2}\n autoFocus\n locale={locale}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -1,8 +1,7 @@
1
1
  import * as class_variance_authority_types from 'class-variance-authority/types';
2
2
  import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
- import { TranslatableConfig, TranslatableValue } from '../../providers/ui-provider.js';
5
- import 'react/jsx-runtime';
4
+ import { T as TranslatableConfig, c as TranslatableValue } from '../../ui-context-D0zD0xa5.js';
6
5
 
7
6
  declare const inputVariants: (props?: ({
8
7
  size?: "default" | "xs" | "sm" | "lg" | "xl" | null | undefined;
@@ -1,6 +1,7 @@
1
- export { Input, inputVariants } from '../../chunk-DB42CM3T.js';
2
- import '../../chunk-YU55YBID.js';
3
- import '../../chunk-BBFOFRWT.js';
1
+ export { Input, inputVariants } from '../../chunk-TSRLQI2O.js';
2
+ import '../../chunk-XJSGU5XZ.js';
3
+ import '../../chunk-SWQDP3VC.js';
4
+ import '../../chunk-RWMRHEWT.js';
4
5
  import '../../chunk-DGPY4WP3.js';
5
6
  //# sourceMappingURL=input.js.map
6
7
  //# sourceMappingURL=input.js.map
@@ -2,8 +2,7 @@ import * as React from 'react';
2
2
  import { VariantProps } from 'class-variance-authority';
3
3
  import { inputVariants } from './input.js';
4
4
  import 'class-variance-authority/types';
5
- import '../../providers/ui-provider.js';
6
- import 'react/jsx-runtime';
5
+ import '../../ui-context-D0zD0xa5.js';
7
6
 
8
7
  interface PasswordInputProps extends Omit<React.ComponentProps<"input">, "type" | "size">, VariantProps<typeof inputVariants> {
9
8
  }
@@ -1,7 +1,8 @@
1
- export { PasswordInput } from '../../chunk-ML2VNJ7R.js';
2
- import '../../chunk-DB42CM3T.js';
3
- import '../../chunk-YU55YBID.js';
4
- import '../../chunk-BBFOFRWT.js';
1
+ export { PasswordInput } from '../../chunk-37CQS347.js';
2
+ import '../../chunk-TSRLQI2O.js';
3
+ import '../../chunk-XJSGU5XZ.js';
4
+ import '../../chunk-SWQDP3VC.js';
5
+ import '../../chunk-RWMRHEWT.js';
5
6
  import '../../chunk-DGPY4WP3.js';
6
7
  //# sourceMappingURL=password-input.js.map
7
8
  //# sourceMappingURL=password-input.js.map
@@ -1,8 +1,9 @@
1
- export { SlugInput, generateSlug } from '../../chunk-M22SIS5Z.js';
2
- import '../../chunk-DB42CM3T.js';
3
- import '../../chunk-YU55YBID.js';
1
+ export { SlugInput, generateSlug } from '../../chunk-JTVWK3BC.js';
2
+ import '../../chunk-TSRLQI2O.js';
3
+ import '../../chunk-XJSGU5XZ.js';
4
4
  import '../../chunk-EYJ7TJIX.js';
5
- import '../../chunk-BBFOFRWT.js';
5
+ import '../../chunk-SWQDP3VC.js';
6
+ import '../../chunk-RWMRHEWT.js';
6
7
  import '../../chunk-DGPY4WP3.js';
7
8
  //# sourceMappingURL=slug-input.js.map
8
9
  //# sourceMappingURL=slug-input.js.map
@@ -1,6 +1,5 @@
1
1
  import * as React from 'react';
2
- import { TranslatableConfig, TranslatableValue } from '../../providers/ui-provider.js';
3
- import 'react/jsx-runtime';
2
+ import { T as TranslatableConfig, c as TranslatableValue } from '../../ui-context-D0zD0xa5.js';
4
3
 
5
4
  type NativeTextareaProps = Omit<React.ComponentProps<'textarea'>, 'value' | 'onChange'>;
6
5
  interface StandardTextareaProps extends NativeTextareaProps {
@@ -1,6 +1,7 @@
1
- export { Textarea } from '../../chunk-Q5KDFNRD.js';
2
- import '../../chunk-YU55YBID.js';
3
- import '../../chunk-BBFOFRWT.js';
1
+ export { Textarea } from '../../chunk-CTZOQ5BS.js';
2
+ import '../../chunk-XJSGU5XZ.js';
3
+ import '../../chunk-SWQDP3VC.js';
4
+ import '../../chunk-RWMRHEWT.js';
4
5
  import '../../chunk-DGPY4WP3.js';
5
6
  //# sourceMappingURL=textarea.js.map
6
7
  //# sourceMappingURL=textarea.js.map
@@ -1,7 +1,8 @@
1
- import { Input } from '../../chunk-DB42CM3T.js';
2
- import '../../chunk-YU55YBID.js';
1
+ import { Input } from '../../chunk-TSRLQI2O.js';
2
+ import '../../chunk-XJSGU5XZ.js';
3
3
  import { Popover, PopoverTrigger, PopoverContent } from '../../chunk-7NMNLY7F.js';
4
- import '../../chunk-BBFOFRWT.js';
4
+ import '../../chunk-SWQDP3VC.js';
5
+ import '../../chunk-RWMRHEWT.js';
5
6
  import { ScrollArea } from '../../chunk-LUYTKHGS.js';
6
7
  import { Button } from '../../chunk-BOV3Q2JH.js';
7
8
  import { cn } from '../../chunk-DGPY4WP3.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/inputs/time-picker.tsx"],"names":[],"mappings":";;;;;;;;;;;AAuCO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,oBAAA;AAAA,EACd,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,SAAA,GACV,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,GAClE,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,IAAM,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,GAAI,GAAG,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAE5E,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,EAAA,EAAG;AAAA,IAAG,CAAC,GAAG,CAAA,KAC7C,CAAA,CAAE,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,GAC9B;AAEA,EAAA,MAAM,CAAC,YAAA,EAAc,cAAc,CAAA,GAAI,KAAA,EAAO,MAAM,GAAG,CAAA,IAAK,CAAC,EAAA,EAAI,EAAE,CAAA;AAEnE,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,kBAAkB,IAAI,CAAA,CAAA;AACjD,IAAA,QAAA,GAAW,OAAO,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAmB;AAC7C,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,YAAA,IAAgB,IAAI,IAAI,MAAM,CAAA,CAAA;AACjD,IAAA,QAAA,GAAW,OAAO,CAAA;AAClB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,QAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,sBAAA;AAAA,UACA,CAAC,KAAA,IAAS,uBAAA;AAAA,UACV;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAM,WAAU,cAAA,EAAe,CAAA;AAAA,UAC/B,KAAA,IAAS;AAAA;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,kBAAe,SAAA,EAAU,YAAA,EAAa,OAAM,OAAA,EAC3C,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAEb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,oBAAA,EACpB,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,KAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,UACpC,SAAA,EAAW,EAAA;AAAA,YACT,gFAAA;AAAA,YACA,iBAAiB,IAAA,IAAQ;AAAA,WAC3B;AAAA,UAEC,QAAA,EAAA;AAAA,SAAA;AAAA,QARI;AAAA,OAUR,GACH,CAAA,EACF,CAAA;AAAA,sBAGA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,WAAA,EACpB,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,UACxC,SAAA,EAAW,EAAA;AAAA,YACT,gFAAA;AAAA,YACA,mBAAmB,MAAA,IAAU;AAAA,WAC/B;AAAA,UAEC,QAAA,EAAA;AAAA,SAAA;AAAA,QARI;AAAA,OAUR,GACH,CAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAwBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA,GAAQ,EAAA;AAAA,EACR,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,eAAS,KAAK,CAAA;AAExD,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2C;AAC/D,IAAA,IAAI,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,CAAA;AAE5C,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5C,MAAA,IAAI,QAAQ,EAAA,EAAI,KAAA,GAAQ,IAAA,GAAO,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,UAAU,QAAA,CAAS,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,IAAI,UAAU,EAAA,EAAI,KAAA,GAAQ,MAAM,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA;AAAA,IACpD;AAGA,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,KAAA,GAAQ,KAAA,CAAM,UAAU,CAAA,EAAG,CAAC,IAAI,GAAA,GAAM,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AAEvB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACxE,MAAA,QAAA,GAAW,UAAU,CAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,YAAA;AAAA,QACV,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,QAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,SAAS;AAAA;AAAA,KAClC;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,yEAAA,EAA0E;AAAA,GAAA,EAC7F,CAAA;AAEJ","file":"time-picker.js","sourcesContent":["import * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/popover\";\nimport { ScrollArea } from \"../display/scroll-area\";\n\ninterface TimePickerProps {\n /** Currently selected time in `\"HH:mm\"` format (e.g., `\"14:30\"`). */\n value?: string;\n /** Callback fired when a time is selected. Receives a `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Placeholder text shown when no time is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the time picker is disabled. */\n disabled?: boolean;\n /** Use 24-hour format (0-23). When false, shows 12-hour (1-12). Defaults to `true`. */\n format24h?: boolean;\n}\n\n/**\n * Time picker with a scrollable hour/minute popover.\n * Opens a two-column dropdown for selecting hours and minutes.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState<string>();\n *\n * <TimePicker\n * value={time}\n * onChange={setTime}\n * placeholder=\"Select time\"\n * format24h\n * />\n * ```\n */\nexport function TimePicker({\n value,\n onChange,\n placeholder = \"Chọn giờ\",\n className,\n disabled,\n format24h = true,\n}: TimePickerProps) {\n const [open, setOpen] = React.useState(false);\n\n const hours = format24h\n ? Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, \"0\"))\n : Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, \"0\"));\n\n const minutes = Array.from({ length: 60 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n\n const [selectedHour, selectedMinute] = value?.split(\":\") || [\"\", \"\"];\n\n const handleHourSelect = (hour: string) => {\n const newTime = `${hour}:${selectedMinute || \"00\"}`;\n onChange?.(newTime);\n };\n\n const handleMinuteSelect = (minute: string) => {\n const newTime = `${selectedHour || \"00\"}:${minute}`;\n onChange?.(newTime);\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <Clock className=\"mr-2 h-4 w-4\" />\n {value || placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"flex\">\n {/* Hours */}\n <ScrollArea className=\"h-60 w-20 border-r\">\n <div className=\"p-1\">\n {hours.map((hour) => (\n <button\n key={hour}\n type=\"button\"\n onClick={() => handleHourSelect(hour)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedHour === hour && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {hour}\n </button>\n ))}\n </div>\n </ScrollArea>\n\n {/* Minutes */}\n <ScrollArea className=\"h-60 w-20\">\n <div className=\"p-1\">\n {minutes.map((minute) => (\n <button\n key={minute}\n type=\"button\"\n onClick={() => handleMinuteSelect(minute)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedMinute === minute && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {minute}\n </button>\n ))}\n </div>\n </ScrollArea>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface TimeInputProps {\n /** Current time value in `\"HH:mm\"` format. */\n value?: string;\n /** Callback fired on blur with a valid `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Additional CSS class for the input wrapper. */\n className?: string;\n /** Whether the input is disabled. */\n disabled?: boolean;\n}\n\n/**\n * Inline text input for typing a time value directly.\n * Automatically formats input as `HH:mm` and validates on blur.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState(\"09:00\");\n *\n * <TimeInput value={time} onChange={setTime} />\n * ```\n */\nexport function TimeInput({\n value = \"\",\n onChange,\n className,\n disabled,\n}: TimeInputProps) {\n const [localValue, setLocalValue] = React.useState(value);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let input = e.target.value.replace(/\\D/g, \"\"); // Remove non-digits\n\n if (input.length >= 2) {\n const hours = parseInt(input.substring(0, 2));\n if (hours > 23) input = \"23\" + input.substring(2);\n }\n\n if (input.length >= 4) {\n const minutes = parseInt(input.substring(2, 4));\n if (minutes > 59) input = input.substring(0, 2) + \"59\";\n }\n\n // Format as HH:mm\n if (input.length >= 2) {\n input = input.substring(0, 2) + \":\" + input.substring(2, 4);\n }\n\n setLocalValue(input);\n };\n\n const handleBlur = () => {\n // Validate and format\n const parts = localValue.split(\":\");\n if (parts.length === 2 && parts[0].length === 2 && parts[1].length === 2) {\n onChange?.(localValue);\n } else {\n setLocalValue(value);\n }\n };\n\n return (\n <div className=\"relative\">\n <Input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder=\"00:00\"\n maxLength={5}\n disabled={disabled}\n className={cn(\"pr-10\", className)}\n />\n <Clock className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../src/components/inputs/time-picker.tsx"],"names":[],"mappings":"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","file":"time-picker.js","sourcesContent":["import * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/popover\";\nimport { ScrollArea } from \"../display/scroll-area\";\n\ninterface TimePickerProps {\n /** Currently selected time in `\"HH:mm\"` format (e.g., `\"14:30\"`). */\n value?: string;\n /** Callback fired when a time is selected. Receives a `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Placeholder text shown when no time is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the time picker is disabled. */\n disabled?: boolean;\n /** Use 24-hour format (0-23). When false, shows 12-hour (1-12). Defaults to `true`. */\n format24h?: boolean;\n}\n\n/**\n * Time picker with a scrollable hour/minute popover.\n * Opens a two-column dropdown for selecting hours and minutes.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState<string>();\n *\n * <TimePicker\n * value={time}\n * onChange={setTime}\n * placeholder=\"Select time\"\n * format24h\n * />\n * ```\n */\nexport function TimePicker({\n value,\n onChange,\n placeholder = \"Chọn giờ\",\n className,\n disabled,\n format24h = true,\n}: TimePickerProps) {\n const [open, setOpen] = React.useState(false);\n\n const hours = format24h\n ? Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, \"0\"))\n : Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, \"0\"));\n\n const minutes = Array.from({ length: 60 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n\n const [selectedHour, selectedMinute] = value?.split(\":\") || [\"\", \"\"];\n\n const handleHourSelect = (hour: string) => {\n const newTime = `${hour}:${selectedMinute || \"00\"}`;\n onChange?.(newTime);\n };\n\n const handleMinuteSelect = (minute: string) => {\n const newTime = `${selectedHour || \"00\"}:${minute}`;\n onChange?.(newTime);\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <Clock className=\"mr-2 h-4 w-4\" />\n {value || placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"flex\">\n {/* Hours */}\n <ScrollArea className=\"h-60 w-20 border-r\">\n <div className=\"p-1\">\n {hours.map((hour) => (\n <button\n key={hour}\n type=\"button\"\n onClick={() => handleHourSelect(hour)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedHour === hour && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {hour}\n </button>\n ))}\n </div>\n </ScrollArea>\n\n {/* Minutes */}\n <ScrollArea className=\"h-60 w-20\">\n <div className=\"p-1\">\n {minutes.map((minute) => (\n <button\n key={minute}\n type=\"button\"\n onClick={() => handleMinuteSelect(minute)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedMinute === minute && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {minute}\n </button>\n ))}\n </div>\n </ScrollArea>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface TimeInputProps {\n /** Current time value in `\"HH:mm\"` format. */\n value?: string;\n /** Callback fired on blur with a valid `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Additional CSS class for the input wrapper. */\n className?: string;\n /** Whether the input is disabled. */\n disabled?: boolean;\n}\n\n/**\n * Inline text input for typing a time value directly.\n * Automatically formats input as `HH:mm` and validates on blur.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState(\"09:00\");\n *\n * <TimeInput value={time} onChange={setTime} />\n * ```\n */\nexport function TimeInput({\n value = \"\",\n onChange,\n className,\n disabled,\n}: TimeInputProps) {\n const [localValue, setLocalValue] = React.useState(value);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let input = e.target.value.replace(/\\D/g, \"\"); // Remove non-digits\n\n if (input.length >= 2) {\n const hours = parseInt(input.substring(0, 2));\n if (hours > 23) input = \"23\" + input.substring(2);\n }\n\n if (input.length >= 4) {\n const minutes = parseInt(input.substring(2, 4));\n if (minutes > 59) input = input.substring(0, 2) + \"59\";\n }\n\n // Format as HH:mm\n if (input.length >= 2) {\n input = input.substring(0, 2) + \":\" + input.substring(2, 4);\n }\n\n setLocalValue(input);\n };\n\n const handleBlur = () => {\n // Validate and format\n const parts = localValue.split(\":\");\n if (parts.length === 2 && parts[0].length === 2 && parts[1].length === 2) {\n onChange?.(localValue);\n } else {\n setLocalValue(value);\n }\n };\n\n return (\n <div className=\"relative\">\n <Input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder=\"00:00\"\n maxLength={5}\n disabled={disabled}\n className={cn(\"pr-10\", className)}\n />\n <Clock className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- import { UILocaleConfig, TranslatableValue, LocaleCode } from '../../providers/ui-provider.js';
3
+ import { U as UILocaleConfig, c as TranslatableValue, L as LocaleCode } from '../../ui-context-D0zD0xa5.js';
4
4
 
5
5
  interface TranslatableRenderProps {
6
6
  /** Active locale code, e.g. `'en'` */
@@ -1,4 +1,4 @@
1
- export { TranslatableField } from '../../chunk-YU55YBID.js';
1
+ export { TranslatableField } from '../../chunk-XJSGU5XZ.js';
2
2
  import '../../chunk-DGPY4WP3.js';
3
3
  //# sourceMappingURL=translatable-field.js.map
4
4
  //# sourceMappingURL=translatable-field.js.map
@@ -1,6 +1,7 @@
1
- export { LocaleSwitcher } from '../../chunk-7HHL5OFD.js';
1
+ export { LocaleSwitcher } from '../../chunk-JNLYTMN5.js';
2
2
  import '../../chunk-DXZZURPN.js';
3
- import '../../chunk-BBFOFRWT.js';
3
+ import '../../chunk-SWQDP3VC.js';
4
+ import '../../chunk-RWMRHEWT.js';
4
5
  import '../../chunk-BOV3Q2JH.js';
5
6
  import '../../chunk-DGPY4WP3.js';
6
7
  //# sourceMappingURL=locale-switcher.js.map
package/dist/index.d.ts CHANGED
@@ -59,7 +59,9 @@ export { WorkflowStepper, WorkflowStepperHistoryEntry, WorkflowStepperProps, Wor
59
59
  export { PermissionDefinition, PermissionGrid, PermissionGridLabels, PermissionGridProps, PermissionModule, buildPermissionId } from './components/domain/rbac/permission-grid.js';
60
60
  export { ScopeTree, ScopeTreeBadge, ScopeTreeLabels, ScopeTreeNode, ScopeTreeProps, ScopeTreeSelectedScope } from './components/domain/rbac/scope-tree.js';
61
61
  export { ScopeTypeBadge, ScopeTypeBadgeProps, ScopeTypeBadgeStyles } from './components/domain/rbac/scope-type-badge.js';
62
- export { LocaleCode, LocaleMap, Theme, TranslatableConfig, TranslatableValue, UILocaleConfig, UIProvider, UIProviderProps, resolveTranslatableConfig, useDateFnsLocale, useLocale, useTheme, useTimezone, useUILocales } from './providers/ui-provider.js';
62
+ export { UIProvider, UIProviderProps } from './providers/ui-provider.js';
63
+ import { T as TranslatableConfig, U as UILocaleConfig, L as LocaleCode, a as LocaleMap, b as Theme } from './ui-context-D0zD0xa5.js';
64
+ export { c as TranslatableValue } from './ui-context-D0zD0xa5.js';
63
65
  export { UIColor, UISize, UIVariant } from './lib/types.js';
64
66
  export { cn } from './lib/utils.js';
65
67
  export { nowInTimezone, toZonedTime } from './lib/timezone.js';
@@ -102,3 +104,45 @@ import '@radix-ui/react-progress';
102
104
  import 'react-day-picker';
103
105
  import 'lucide-react';
104
106
  import 'clsx';
107
+
108
+ /** Access theme and setTheme. Must be inside UIProvider. */
109
+ declare function useTheme(): {
110
+ theme: Theme;
111
+ setTheme: (t: Theme) => void;
112
+ };
113
+ /**
114
+ * Returns the locale config from UIProvider.
115
+ * Returns `undefined` when no `locales` prop was passed to UIProvider.
116
+ */
117
+ declare function useUILocales(): UILocaleConfig | undefined;
118
+ /**
119
+ * Returns the active locale state and locale config from UIProvider.
120
+ * Must be used inside UIProvider.
121
+ */
122
+ declare function useLocale(): {
123
+ currentLocale: LocaleCode;
124
+ setLocale: (locale: LocaleCode) => void;
125
+ locales: LocaleMap;
126
+ defaultLocale: LocaleCode;
127
+ fallbackLocale: LocaleCode;
128
+ };
129
+ /**
130
+ * Returns the active timezone and setter from UIProvider.
131
+ * Must be used inside UIProvider.
132
+ */
133
+ declare function useTimezone(): {
134
+ timezone: string;
135
+ setTimezone: (tz: string) => void;
136
+ };
137
+ /**
138
+ * Returns the date-fns `Locale` object from UIProvider.
139
+ * Returns `undefined` when no `dateFnsLocale` prop was passed.
140
+ */
141
+ declare function useDateFnsLocale(): object | undefined;
142
+ /**
143
+ * Resolves the effective UILocaleConfig for a translatable field.
144
+ * Merges inline `TranslatableConfig` with the provider's locale config.
145
+ */
146
+ declare function resolveTranslatableConfig(translatable: TranslatableConfig, providerLocales: UILocaleConfig | undefined): UILocaleConfig | undefined;
147
+
148
+ export { LocaleCode, LocaleMap, Theme, TranslatableConfig, UILocaleConfig, resolveTranslatableConfig, useDateFnsLocale, useLocale, useTheme, useTimezone, useUILocales };
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
+ export { UIProvider } from './chunk-QHHPWBZM.js';
1
2
  export { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './chunk-EBV2XEHD.js';
2
3
  export { HoverCard, HoverCardContent, HoverCardTrigger } from './chunk-CLYBVDEQ.js';
3
4
  export { Toaster } from './chunk-PYB6RRA5.js';
4
5
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './chunk-CSYH7P6N.js';
5
6
  export { useIsMobile } from './chunk-WRCHR4AK.js';
6
7
  export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger } from './chunk-DEKVLLTL.js';
7
- export { LocaleSwitcher } from './chunk-7HHL5OFD.js';
8
+ export { LocaleSwitcher } from './chunk-JNLYTMN5.js';
8
9
  export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './chunk-DXZZURPN.js';
9
10
  export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger } from './chunk-T65EBJUJ.js';
10
11
  export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, navigationMenuTriggerStyle } from './chunk-N5BNNKBR.js';
@@ -13,18 +14,18 @@ export { Tabs, TabsContent, TabsList, TabsTrigger } from './chunk-PJZ7D36X.js';
13
14
  export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from './chunk-XNUFKQYL.js';
14
15
  export { Switch } from './chunk-EAY3QSID.js';
15
16
  export { TagInput } from './chunk-I6PJSYBI.js';
16
- export { Textarea } from './chunk-Q5KDFNRD.js';
17
+ export { Textarea } from './chunk-CTZOQ5BS.js';
17
18
  export { FullWidthPageContainer, PageContainer, SplitPageContainer, StandardPageContainer } from './chunk-YN26HHZ4.js';
18
19
  export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from './chunk-YYJVVYFS.js';
19
- export { PasswordInput } from './chunk-ML2VNJ7R.js';
20
+ export { PasswordInput } from './chunk-37CQS347.js';
20
21
  export { RadioGroup, RadioGroupItem } from './chunk-QGU4BRMO.js';
21
22
  export { Rating } from './chunk-N6OUJIQD.js';
22
23
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from './chunk-LTGCKJX7.js';
23
24
  export { Slider } from './chunk-S73PGQD5.js';
24
- export { SlugInput, generateSlug } from './chunk-M22SIS5Z.js';
25
- export { ColorPicker } from './chunk-2OPOSDEH.js';
26
- export { Input, inputVariants } from './chunk-DB42CM3T.js';
27
- import './chunk-YU55YBID.js';
25
+ export { SlugInput, generateSlug } from './chunk-JTVWK3BC.js';
26
+ export { ColorPicker } from './chunk-CTNIYDQI.js';
27
+ export { Input, inputVariants } from './chunk-TSRLQI2O.js';
28
+ import './chunk-XJSGU5XZ.js';
28
29
  export { Combobox, MultiCombobox } from './chunk-3V6NS4EQ.js';
29
30
  export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from './chunk-MVYSUWSD.js';
30
31
  export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-YVCLIOMM.js';
@@ -42,7 +43,8 @@ export { Progress } from './chunk-NWVMNWOH.js';
42
43
  export { Skeleton } from './chunk-GR7T5QHL.js';
43
44
  export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from './chunk-VOLR236J.js';
44
45
  export { nowInTimezone, toZonedTime } from './chunk-PMNLM6VF.js';
45
- export { UIProvider, resolveTranslatableConfig, useDateFnsLocale, useLocale, useTheme, useTimezone, useUILocales } from './chunk-BBFOFRWT.js';
46
+ export { resolveTranslatableConfig, useDateFnsLocale, useLocale, useTheme, useTimezone, useUILocales } from './chunk-SWQDP3VC.js';
47
+ import './chunk-RWMRHEWT.js';
46
48
  export { Calendar } from './chunk-KJAXKHJ2.js';
47
49
  export { PermissionGrid, buildPermissionId } from './chunk-2BRCVWXR.js';
48
50
  export { Checkbox } from './chunk-W477ZR6B.js';
@@ -1,29 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
+ import { b as Theme, a as LocaleMap, L as LocaleCode } from '../ui-context-D0zD0xa5.js';
3
4
 
4
- type Theme = 'light' | 'dark' | 'system';
5
- type LocaleCode = string;
6
- /**
7
- * Map of locale code → display label.
8
- * @example { en: 'English', vi: 'Tiếng Việt', ja: '日本語' }
9
- */
10
- type LocaleMap = Record<LocaleCode, string>;
11
- /** Value shape for translatable fields: locale code → string content. */
12
- type TranslatableValue = Record<LocaleCode, string>;
13
- /** Locale configuration used by UIProvider and translatable fields. */
14
- interface UILocaleConfig {
15
- /** Available locales. e.g. `{ en: 'English', vi: 'Tiếng Việt' }` */
16
- locales: LocaleMap;
17
- /** Locale shown by default when a translatable field is first rendered. */
18
- defaultLocale: LocaleCode;
19
- /** Locale to fall back to when the active locale has no value. */
20
- fallbackLocale: LocaleCode;
21
- }
22
- /**
23
- * `true` — inherit UIProvider's locale config.
24
- * `object` — override per-field (merged with provider config).
25
- */
26
- type TranslatableConfig = true | Partial<UILocaleConfig>;
27
5
  interface UIProviderProps {
28
6
  children: ReactNode;
29
7
  /**
@@ -87,44 +65,5 @@ interface UIProviderProps {
87
65
  * ```
88
66
  */
89
67
  declare function UIProvider({ children, defaultTheme, locales, defaultLocale, fallbackLocale, dateFnsLocale, onLocaleChange, timezone: timezoneProp, onTimezoneChange, }: UIProviderProps): react_jsx_runtime.JSX.Element;
90
- /** Access theme and setTheme. Must be inside UIProvider. */
91
- declare function useTheme(): {
92
- theme: Theme;
93
- setTheme: (t: Theme) => void;
94
- };
95
- /**
96
- * Returns the locale config from UIProvider.
97
- * Returns `undefined` when no `locales` prop was passed to UIProvider.
98
- */
99
- declare function useUILocales(): UILocaleConfig | undefined;
100
- /**
101
- * Returns the active locale state and locale config from UIProvider.
102
- * Must be used inside UIProvider.
103
- */
104
- declare function useLocale(): {
105
- currentLocale: LocaleCode;
106
- setLocale: (locale: LocaleCode) => void;
107
- locales: LocaleMap;
108
- defaultLocale: LocaleCode;
109
- fallbackLocale: LocaleCode;
110
- };
111
- /**
112
- * Returns the active timezone and setter from UIProvider.
113
- * Must be used inside UIProvider.
114
- */
115
- declare function useTimezone(): {
116
- timezone: string;
117
- setTimezone: (tz: string) => void;
118
- };
119
- /**
120
- * Returns the date-fns `Locale` object from UIProvider.
121
- * Returns `undefined` when no `dateFnsLocale` prop was passed.
122
- */
123
- declare function useDateFnsLocale(): object | undefined;
124
- /**
125
- * Resolves the effective UILocaleConfig for a translatable field.
126
- * Merges inline `TranslatableConfig` with the provider's locale config.
127
- */
128
- declare function resolveTranslatableConfig(translatable: TranslatableConfig, providerLocales: UILocaleConfig | undefined): UILocaleConfig | undefined;
129
68
 
130
- export { type LocaleCode, type LocaleMap, type Theme, type TranslatableConfig, type TranslatableValue, type UILocaleConfig, UIProvider, type UIProviderProps, resolveTranslatableConfig, useDateFnsLocale, useLocale, useTheme, useTimezone, useUILocales };
69
+ export { UIProvider, type UIProviderProps };
@@ -1,3 +1,4 @@
1
- export { UIProvider, resolveTranslatableConfig, useDateFnsLocale, useLocale, useTheme, useTimezone, useUILocales } from '../chunk-BBFOFRWT.js';
1
+ export { UIProvider } from '../chunk-QHHPWBZM.js';
2
+ import '../chunk-RWMRHEWT.js';
2
3
  //# sourceMappingURL=ui-provider.js.map
3
4
  //# sourceMappingURL=ui-provider.js.map
@@ -0,0 +1,25 @@
1
+ type Theme = 'light' | 'dark' | 'system';
2
+ type LocaleCode = string;
3
+ /**
4
+ * Map of locale code → display label.
5
+ * @example { en: 'English', vi: 'Tiếng Việt', ja: '日本語' }
6
+ */
7
+ type LocaleMap = Record<LocaleCode, string>;
8
+ /** Value shape for translatable fields: locale code → string content. */
9
+ type TranslatableValue = Record<LocaleCode, string>;
10
+ /** Locale configuration used by UIProvider and translatable fields. */
11
+ interface UILocaleConfig {
12
+ /** Available locales. e.g. `{ en: 'English', vi: 'Tiếng Việt' }` */
13
+ locales: LocaleMap;
14
+ /** Locale shown by default when a translatable field is first rendered. */
15
+ defaultLocale: LocaleCode;
16
+ /** Locale to fall back to when the active locale has no value. */
17
+ fallbackLocale: LocaleCode;
18
+ }
19
+ /**
20
+ * `true` — inherit UIProvider's locale config.
21
+ * `object` — override per-field (merged with provider config).
22
+ */
23
+ type TranslatableConfig = true | Partial<UILocaleConfig>;
24
+
25
+ export type { LocaleCode as L, TranslatableConfig as T, UILocaleConfig as U, LocaleMap as a, Theme as b, TranslatableValue as c };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnifyjp/ui",
3
- "version": "2.3.0",
3
+ "version": "2.3.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -99,7 +99,7 @@
99
99
  "sonner": "2.0.3",
100
100
  "tailwind-merge": "3.2.0",
101
101
  "vaul": "1.1.2",
102
- "@omnifyjp/ui-mcp": "2.3.0"
102
+ "@omnifyjp/ui-mcp": "2.3.2"
103
103
  },
104
104
  "devDependencies": {
105
105
  "@testing-library/jest-dom": "^6.9.1",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/locale-switcher.tsx"],"names":[],"mappings":";;;;;;;AAgBA,IAAM,cAAA,GAAyC;AAAA,EAC7C,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAQA,SAAS,UAAA,CAAW,MAAkB,WAAA,EAA8C;AAClF,EAAA,IAAI,WAAA,GAAc,IAAI,CAAA,EAAG,OAAO,YAAY,IAAI,CAAA;AAEhD,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,WAAA,EAAY;AAC5C,EAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,eAAe,IAAI,CAAA;AAGpD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,SAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,EAAE,WAAA,EAAY;AACnD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,MAAA,CAAO,aAAA;AAAA,QACZ,GAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,GAAU,CAAA,CAAE,UAAA,CAAW,CAAC,IAAI,EAAE;AAAA,OACjE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;AAmCO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,KAAA;AAAA,EACR,KAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV,IAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,aAAA,EAAe,SAAA,EAAW,OAAA,KAAY,SAAA,EAAU;AAExD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACtC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,aAAa,CAAA,IAAK,aAAA;AAC/C,EAAA,MAAM,UAAU,SAAA,IAAa,QAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY,MAAA,CAAA;AAEpD,EAAA,4BACG,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAkB,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,SAAS,CAAA,EAC3E,QAAA,EAAA;AAAA,MAAA,QAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,UAAA,CAAW,aAAA,EAAe,KAAK,CAAA,EAAE,CAAA,mBAE3E,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAE/B,SAAA,oBAAa,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,MACjC,QAAA,IAAY,CAAC,SAAA,oBACZ,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY,EAAE;AAAA,KAAA,EAErD,CAAA,EACF,CAAA;AAAA,wBACC,mBAAA,EAAA,EAAoB,KAAA,EACnB,8BAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO,eAAe,aAAA,EAAe,SAAA,EAC1D,kBAAQ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,sBACxB,IAAA,CAAC,qBAAA,EAAA,EAAiC,OAAO,IAAA,EACtC,QAAA,EAAA;AAAA,MAAA,QAAA,wBACE,MAAA,EAAA,EAAK,SAAA,EAAU,+BACb,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA,EACzB,CAAA;AAAA,MAED;AAAA,KAAA,EAAA,EANyB,IAO5B,CACD,CAAA,EACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-7HHL5OFD.js","sourcesContent":["import { GlobeIcon } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { useLocale, type LocaleCode } from '../../providers/ui-provider';\nimport { Button } from '../inputs/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuTrigger,\n} from './dropdown-menu';\n\n// ─── Flag helpers ────────────────────────────────────────────────────────────\n\n/** Common locale code → flag emoji map. */\nconst LOCALE_TO_FLAG: Record<string, string> = {\n en: '🇺🇸',\n vi: '🇻🇳',\n ja: '🇯🇵',\n ko: '🇰🇷',\n zh: '🇨🇳',\n fr: '🇫🇷',\n de: '🇩🇪',\n es: '🇪🇸',\n pt: '🇧🇷',\n it: '🇮🇹',\n ru: '🇷🇺',\n ar: '🇸🇦',\n th: '🇹🇭',\n id: '🇮🇩',\n ms: '🇲🇾',\n};\n\n/**\n * Derive flag emoji from a locale code.\n * 1. Check the built-in map using the base language (before `-`).\n * 2. If a region subtag exists (e.g. `en-US`), convert to regional indicator symbols.\n * 3. Fall back to globe emoji.\n */\nfunction deriveFlag(code: LocaleCode, customFlags?: Record<string, string>): string {\n if (customFlags?.[code]) return customFlags[code];\n\n const base = code.split('-')[0].toLowerCase();\n if (LOCALE_TO_FLAG[base]) return LOCALE_TO_FLAG[base];\n\n // Try region subtag → flag emoji (e.g. \"US\" → 🇺🇸)\n const parts = code.split('-');\n if (parts.length > 1) {\n const region = parts[parts.length - 1].toUpperCase();\n if (region.length === 2) {\n return String.fromCodePoint(\n ...Array.from(region).map((c) => 0x1f1e6 + c.charCodeAt(0) - 65),\n );\n }\n }\n\n return '🌐';\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport interface LocaleSwitcherProps {\n /** Show flag emoji. Default: false */\n showFlag?: boolean;\n /** Show locale label (e.g. \"English\"). Default: true */\n showLabel?: boolean;\n /** Show locale code (e.g. \"EN\"). Default: false */\n showCode?: boolean;\n /** Dropdown alignment. Default: \"end\" */\n align?: 'start' | 'center' | 'end';\n /** Custom flag map. Auto-derived from locale code if not provided. */\n flags?: Record<string, string>;\n /** Button variant. Default: \"ghost\" */\n variant?: 'ghost' | 'outline' | 'default';\n /** Button size. Default: inferred (icon when no label/code, default otherwise) */\n size?: 'default' | 'sm' | 'icon';\n /** Additional class names for the trigger button. */\n className?: string;\n}\n\n/**\n * Dropdown locale switcher that reads from UIProvider.\n *\n * Requires `<UIProvider locales={...}>` to be an ancestor.\n *\n * @example\n * ```tsx\n * <LocaleSwitcher />\n * <LocaleSwitcher showFlag showLabel={false} />\n * <LocaleSwitcher showCode variant=\"outline\" />\n * ```\n */\nexport function LocaleSwitcher({\n showFlag = false,\n showLabel = true,\n showCode = false,\n align = 'end',\n flags,\n variant = 'ghost',\n size,\n className,\n}: LocaleSwitcherProps) {\n const { currentLocale, setLocale, locales } = useLocale();\n\n const entries = Object.entries(locales);\n if (entries.length === 0) return null;\n\n const currentLabel = locales[currentLocale] ?? currentLocale;\n const hasText = showLabel || showCode;\n const resolvedSize = size ?? (hasText ? 'default' : 'icon');\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant={variant} size={resolvedSize} className={cn('gap-2', className)}>\n {showFlag ? (\n <span className=\"text-base leading-none\">{deriveFlag(currentLocale, flags)}</span>\n ) : (\n <GlobeIcon className=\"size-4\" />\n )}\n {showLabel && <span>{currentLabel}</span>}\n {showCode && !showLabel && (\n <span>{currentLocale.split('-')[0].toUpperCase()}</span>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align}>\n <DropdownMenuRadioGroup value={currentLocale} onValueChange={setLocale}>\n {entries.map(([code, label]) => (\n <DropdownMenuRadioItem key={code} value={code}>\n {showFlag && (\n <span className=\"mr-2 text-base leading-none\">\n {deriveFlag(code, flags)}\n </span>\n )}\n {label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}