{"version":3,"file":"i18n-DMeQ9Nak.cjs","names":[],"sources":["../src/i18n/en.ts","../src/i18n/index.ts"],"sourcesContent":["/**\r\n * English (default) locale strings for @bquery/ui\r\n */\r\nexport const en = {\r\n  common: {\r\n    close: 'Close',\r\n    open: 'Open',\r\n    loading: 'Loading',\r\n    error: 'Error',\r\n    success: 'Success',\r\n    warning: 'Warning',\r\n    info: 'Information',\r\n    required: 'Required',\r\n    optional: 'Optional',\r\n    clear: 'Clear',\r\n    search: 'Search',\r\n    noResults: 'No results found',\r\n  },\r\n  dialog: {\r\n    close: 'Close dialog',\r\n    confirm: 'Confirm',\r\n    cancel: 'Cancel',\r\n    ariaLabel: 'Dialog',\r\n  },\r\n  drawer: {\r\n    close: 'Close drawer',\r\n  },\r\n  toast: {\r\n    close: 'Dismiss notification',\r\n    success: 'Success',\r\n    error: 'Error',\r\n    warning: 'Warning',\r\n    info: 'Information',\r\n  },\r\n  pagination: {\r\n    prev: 'Previous page',\r\n    next: 'Next page',\r\n    page: 'Page',\r\n    of: 'of',\r\n    nav: 'Pagination',\r\n    goToPage: 'Go to page',\r\n    firstPage: 'First page',\r\n    lastPage: 'Last page',\r\n  },\r\n  input: {\r\n    showPassword: 'Show password',\r\n    hidePassword: 'Hide password',\r\n    clearValue: 'Clear value',\r\n    characterCount: '{count} of {max} characters',\r\n  },\r\n  select: {\r\n    placeholder: 'Select an option',\r\n    noOptions: 'No options available',\r\n    clearSelection: 'Clear selection',\r\n    openMenu: 'Open menu',\r\n  },\r\n  table: {\r\n    sortAscending: 'Sort ascending',\r\n    sortDescending: 'Sort descending',\r\n    noData: 'No data available',\r\n    loading: 'Loading data…',\r\n    rowsPerPage: 'Rows per page',\r\n  },\r\n  progress: {\r\n    ariaLabel: 'Progress',\r\n  },\r\n  accordion: {\r\n    expand: 'Expand',\r\n    collapse: 'Collapse',\r\n  },\r\n  tabs: {\r\n    listLabel: 'Tabs',\r\n  },\r\n  slider: {\r\n    ariaLabel: 'Slider',\r\n    valueText: 'Value: {value}',\r\n  },\r\n  emptyState: {\r\n    title: 'Nothing here yet',\r\n    description: 'There is no content to display.',\r\n  },\r\n  chip: {\r\n    remove: 'Remove',\r\n  },\r\n  breadcrumbs: {\r\n    nav: 'Breadcrumb',\r\n  },\r\n  iconButton: {\r\n    defaultLabel: 'Icon button',\r\n  },\r\n  dropdownMenu: {\r\n    open: 'Open menu',\r\n    close: 'Close menu',\r\n  },\r\n  segmentedControl: {\r\n    defaultLabel: 'Options',\r\n  },\r\n} as const;\r\n\r\nexport type EnLocale = typeof en;\r\n","/**\r\n * i18n / locale system for @bquery/ui\r\n *\r\n * Usage:\r\n *   import { setLocale, t } from '@bquery/ui/i18n';\r\n *   setLocale({ dialog: { close: 'Schließen' } });\r\n *   t('dialog.close'); // → 'Schließen'\r\n */\r\nimport { en } from './en.js';\r\n\r\nexport { en };\r\nexport type { EnLocale } from './en.js';\r\n\r\n/** Deep partial helper for locale overrides */\r\ntype DeepPartial<T> = {\r\n  [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\r\n};\r\n\r\nexport type BqLocale = typeof en;\r\nexport type BqLocaleOverride = DeepPartial<BqLocale>;\r\n\r\nfunction cloneLocale<T>(value: T): T {\r\n  if (Array.isArray(value)) {\r\n    return value.map((item) => cloneLocale(item)) as T;\r\n  }\r\n\r\n  if (value && typeof value === 'object') {\r\n    const entries = Object.entries(value as Record<string, unknown>).map(([key, item]) => [\r\n      key,\r\n      cloneLocale(item),\r\n    ]);\r\n    return Object.fromEntries(entries) as T;\r\n  }\r\n\r\n  return value;\r\n}\r\n\r\nlet _locale: BqLocale = cloneLocale(en);\r\n\r\n/**\r\n * Override locale strings. Merges shallowly at the top level, deeply at the second level.\r\n */\r\nexport function setLocale(overrides: BqLocaleOverride): void {\r\n  _locale = deepMerge(_locale, overrides) as BqLocale;\r\n}\r\n\r\n/** Restores the active locale to the default English locale. */\r\nexport function resetLocale(): void {\r\n  _locale = cloneLocale(en);\r\n}\r\n\r\n/** Returns the currently active locale object. */\r\nexport function getLocale(): BqLocale {\r\n  return _locale;\r\n}\r\n\r\n/**\r\n * Translate a dot-notation key, with optional template variable substitution.\r\n *\r\n * @example\r\n *   t('dialog.close')                        // 'Close dialog'\r\n *   t('input.characterCount', { count: 5, max: 100 })  // '5 of 100 characters'\r\n */\r\nexport function t(\r\n  key: string,\r\n  vars?: Record<string, string | number>,\r\n): string {\r\n  const parts = key.split('.');\r\n  let value: unknown = _locale;\r\n  for (const part of parts) {\r\n    if (value == null || typeof value !== 'object') return key;\r\n    value = (value as Record<string, unknown>)[part];\r\n  }\r\n  if (typeof value !== 'string') return key;\r\n  if (!vars) return value;\r\n  return value.replace(/\\{(\\w+)\\}/g, (_: string, k: string) =>\r\n    vars[k] !== undefined ? String(vars[k]) : `{${k}}`,\r\n  );\r\n}\r\n\r\n// ─── Internal helpers ────────────────────────────────────────────────────────\r\n\r\nfunction deepMerge<T extends object>(base: T, overrides: DeepPartial<T>): T {\r\n  const result = { ...base } as T;\r\n  for (const key in overrides) {\r\n    const k = key as keyof T;\r\n    const ov = overrides[k];\r\n    if (ov !== undefined) {\r\n      if (\r\n        typeof ov === 'object' &&\r\n        !Array.isArray(ov) &&\r\n        typeof base[k] === 'object' &&\r\n        !Array.isArray(base[k])\r\n      ) {\r\n        (result as Record<keyof T, unknown>)[k] = deepMerge(\r\n          base[k] as object,\r\n          ov as DeepPartial<object>,\r\n        );\r\n      } else {\r\n        (result as Record<keyof T, unknown>)[k] = ov as T[keyof T];\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n"],"mappings":";;;;AAGA,IAAa,KAAK;CAChB,QAAQ;EACN,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,MAAM;EACN,UAAU;EACV,UAAU;EACV,OAAO;EACP,QAAQ;EACR,WAAW;EACZ;CACD,QAAQ;EACN,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW;EACZ;CACD,QAAQ,EACN,OAAO,gBACR;CACD,OAAO;EACL,OAAO;EACP,SAAS;EACT,OAAO;EACP,SAAS;EACT,MAAM;EACP;CACD,YAAY;EACV,MAAM;EACN,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,WAAW;EACX,UAAU;EACX;CACD,OAAO;EACL,cAAc;EACd,cAAc;EACd,YAAY;EACZ,gBAAgB;EACjB;CACD,QAAQ;EACN,aAAa;EACb,WAAW;EACX,gBAAgB;EAChB,UAAU;EACX;CACD,OAAO;EACL,eAAe;EACf,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,aAAa;EACd;CACD,UAAU,EACR,WAAW,YACZ;CACD,WAAW;EACT,QAAQ;EACR,UAAU;EACX;CACD,MAAM,EACJ,WAAW,QACZ;CACD,QAAQ;EACN,WAAW;EACX,WAAW;EACZ;CACD,YAAY;EACV,OAAO;EACP,aAAa;EACd;CACD,MAAM,EACJ,QAAQ,UACT;CACD,aAAa,EACX,KAAK,cACN;CACD,YAAY,EACV,cAAc,eACf;CACD,cAAc;EACZ,MAAM;EACN,OAAO;EACR;CACD,kBAAkB,EAChB,cAAc,WACf;CACF;;;;;;;;;;;AC5ED,SAAS,YAAe,OAAa;AACnC,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,YAAY,KAAK,CAAC;AAG/C,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,UAAU,OAAO,QAAQ,MAAiC,CAAC,KAAK,CAAC,KAAK,UAAU,CACpF,KACA,YAAY,KAAK,CAClB,CAAC;AACF,SAAO,OAAO,YAAY,QAAQ;;AAGpC,QAAO;;AAGT,IAAI,UAAoB,YAAY,GAAG;;;;AAKvC,SAAgB,UAAU,WAAmC;AAC3D,WAAU,UAAU,SAAS,UAAU;;;AAIzC,SAAgB,cAAoB;AAClC,WAAU,YAAY,GAAG;;;AAI3B,SAAgB,YAAsB;AACpC,QAAO;;;;;;;;;AAUT,SAAgB,EACd,KACA,MACQ;CACR,MAAM,QAAQ,IAAI,MAAM,IAAI;CAC5B,IAAI,QAAiB;AACrB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,UAAS,MAAkC;;AAE7C,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,MAAM,QAAQ,eAAe,GAAW,MAC7C,KAAK,OAAO,KAAA,IAAY,OAAO,KAAK,GAAG,GAAG,IAAI,EAAE,GACjD;;AAKH,SAAS,UAA4B,MAAS,WAA8B;CAC1E,MAAM,SAAS,EAAE,GAAG,MAAM;AAC1B,MAAK,MAAM,OAAO,WAAW;EAC3B,MAAM,IAAI;EACV,MAAM,KAAK,UAAU;AACrB,MAAI,OAAO,KAAA,EACT,KACE,OAAO,OAAO,YACd,CAAC,MAAM,QAAQ,GAAG,IAClB,OAAO,KAAK,OAAO,YACnB,CAAC,MAAM,QAAQ,KAAK,GAAG,CAEtB,QAAoC,KAAK,UACxC,KAAK,IACL,GACD;MAEA,QAAoC,KAAK;;AAIhD,QAAO"}