@questpie/admin 0.0.1 → 1.0.1

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 (250) hide show
  1. package/README.md +439 -424
  2. package/dist/auth-layout-M8K8_q5R.mjs +181 -0
  3. package/dist/auth-layout-M8K8_q5R.mjs.map +1 -0
  4. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +273 -0
  5. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +1 -0
  6. package/dist/{components/ui/card.mjs → card-BKHjBQfw.mjs} +8 -8
  7. package/dist/card-BKHjBQfw.mjs.map +1 -0
  8. package/dist/client/styles/index.css +434 -0
  9. package/dist/client-DbpZKSgH.d.mts +13585 -0
  10. package/dist/client-DbpZKSgH.d.mts.map +1 -0
  11. package/dist/client-njX1rZmi.mjs +22612 -0
  12. package/dist/client-njX1rZmi.mjs.map +1 -0
  13. package/dist/client.d.mts +3 -0
  14. package/dist/client.mjs +13 -0
  15. package/dist/content-locales-provider-BXvuIgfg.mjs +1650 -0
  16. package/dist/content-locales-provider-BXvuIgfg.mjs.map +1 -0
  17. package/dist/dashboard-page-B4PGEdc2.mjs +2500 -0
  18. package/dist/dashboard-page-B4PGEdc2.mjs.map +1 -0
  19. package/dist/dashboard-page-mCY0pgZv.mjs +3 -0
  20. package/dist/dropzone-Do3awXKd.mjs +634 -0
  21. package/dist/dropzone-Do3awXKd.mjs.map +1 -0
  22. package/dist/{views/auth/forgot-password-form.mjs → forgot-password-page-Bcp-An4Y.mjs} +87 -14
  23. package/dist/forgot-password-page-Bcp-An4Y.mjs.map +1 -0
  24. package/dist/forgot-password-page-CEwsdLwn.mjs +3 -0
  25. package/dist/index-B9Xwk4hi.d.mts +2753 -0
  26. package/dist/index-B9Xwk4hi.d.mts.map +1 -0
  27. package/dist/index.d.mts +3 -0
  28. package/dist/index.mjs +13 -0
  29. package/dist/login-page-BUnpCbCa.mjs +3 -0
  30. package/dist/login-page-CP4gA-dl.mjs +298 -0
  31. package/dist/login-page-CP4gA-dl.mjs.map +1 -0
  32. package/dist/preview-utils-BKQ9-TMa.mjs +65 -0
  33. package/dist/preview-utils-BKQ9-TMa.mjs.map +1 -0
  34. package/dist/{views/auth/reset-password-form.mjs → reset-password-page-BqfDmLxA.mjs} +111 -14
  35. package/dist/reset-password-page-BqfDmLxA.mjs.map +1 -0
  36. package/dist/reset-password-page-CufHz3h3.mjs +3 -0
  37. package/dist/runtime-6VZM878K.mjs +69 -0
  38. package/dist/runtime-6VZM878K.mjs.map +1 -0
  39. package/dist/saved-views.types-BMsz5mCy.d.mts +42 -0
  40. package/dist/saved-views.types-BMsz5mCy.d.mts.map +1 -0
  41. package/dist/server.d.mts +250 -0
  42. package/dist/server.d.mts.map +1 -0
  43. package/dist/server.mjs +832 -0
  44. package/dist/server.mjs.map +1 -0
  45. package/dist/setup-page-BNNzt_Z6.mjs +3 -0
  46. package/dist/setup-page-YAP_fzqh.mjs +264 -0
  47. package/dist/setup-page-YAP_fzqh.mjs.map +1 -0
  48. package/dist/shared.d.mts +57 -0
  49. package/dist/shared.d.mts.map +1 -0
  50. package/dist/shared.mjs +3 -0
  51. package/dist/{hooks/use-auth.mjs → use-auth-BoLmWtmU.mjs} +42 -30
  52. package/dist/use-auth-BoLmWtmU.mjs.map +1 -0
  53. package/package.json +48 -198
  54. package/.turbo/turbo-build.log +0 -108
  55. package/CHANGELOG.md +0 -10
  56. package/STATUS.md +0 -917
  57. package/VALIDATION.md +0 -602
  58. package/components.json +0 -24
  59. package/dist/__tests__/setup.mjs +0 -38
  60. package/dist/__tests__/test-utils.mjs +0 -45
  61. package/dist/__tests__/vitest.d.mjs +0 -3
  62. package/dist/components/admin-app.mjs +0 -69
  63. package/dist/components/fields/array-field.mjs +0 -190
  64. package/dist/components/fields/checkbox-field.mjs +0 -34
  65. package/dist/components/fields/custom-field.mjs +0 -32
  66. package/dist/components/fields/date-field.mjs +0 -41
  67. package/dist/components/fields/datetime-field.mjs +0 -42
  68. package/dist/components/fields/email-field.mjs +0 -37
  69. package/dist/components/fields/embedded-collection.mjs +0 -253
  70. package/dist/components/fields/field-types.mjs +0 -1
  71. package/dist/components/fields/field-utils.mjs +0 -10
  72. package/dist/components/fields/field-wrapper.mjs +0 -34
  73. package/dist/components/fields/index.mjs +0 -23
  74. package/dist/components/fields/json-field.mjs +0 -243
  75. package/dist/components/fields/locale-badge.mjs +0 -16
  76. package/dist/components/fields/number-field.mjs +0 -39
  77. package/dist/components/fields/password-field.mjs +0 -37
  78. package/dist/components/fields/relation-field.mjs +0 -104
  79. package/dist/components/fields/relation-picker.mjs +0 -229
  80. package/dist/components/fields/relation-select.mjs +0 -188
  81. package/dist/components/fields/rich-text-editor/index.mjs +0 -897
  82. package/dist/components/fields/select-field.mjs +0 -41
  83. package/dist/components/fields/switch-field.mjs +0 -34
  84. package/dist/components/fields/text-field.mjs +0 -38
  85. package/dist/components/fields/textarea-field.mjs +0 -38
  86. package/dist/components/index.mjs +0 -59
  87. package/dist/components/primitives/checkbox-input.mjs +0 -127
  88. package/dist/components/primitives/date-input.mjs +0 -303
  89. package/dist/components/primitives/index.mjs +0 -12
  90. package/dist/components/primitives/number-input.mjs +0 -104
  91. package/dist/components/primitives/select-input.mjs +0 -177
  92. package/dist/components/primitives/tag-input.mjs +0 -135
  93. package/dist/components/primitives/text-input.mjs +0 -39
  94. package/dist/components/primitives/textarea-input.mjs +0 -37
  95. package/dist/components/primitives/toggle-input.mjs +0 -31
  96. package/dist/components/primitives/types.mjs +0 -12
  97. package/dist/components/ui/accordion.mjs +0 -55
  98. package/dist/components/ui/avatar.mjs +0 -54
  99. package/dist/components/ui/badge.mjs +0 -34
  100. package/dist/components/ui/button.mjs +0 -48
  101. package/dist/components/ui/checkbox.mjs +0 -21
  102. package/dist/components/ui/combobox.mjs +0 -163
  103. package/dist/components/ui/dialog.mjs +0 -95
  104. package/dist/components/ui/dropdown-menu.mjs +0 -138
  105. package/dist/components/ui/field.mjs +0 -113
  106. package/dist/components/ui/input-group.mjs +0 -82
  107. package/dist/components/ui/input.mjs +0 -17
  108. package/dist/components/ui/label.mjs +0 -15
  109. package/dist/components/ui/popover.mjs +0 -56
  110. package/dist/components/ui/scroll-area.mjs +0 -38
  111. package/dist/components/ui/select.mjs +0 -100
  112. package/dist/components/ui/separator.mjs +0 -16
  113. package/dist/components/ui/sheet.mjs +0 -90
  114. package/dist/components/ui/sidebar.mjs +0 -387
  115. package/dist/components/ui/skeleton.mjs +0 -14
  116. package/dist/components/ui/spinner.mjs +0 -16
  117. package/dist/components/ui/switch.mjs +0 -22
  118. package/dist/components/ui/table.mjs +0 -68
  119. package/dist/components/ui/tabs.mjs +0 -48
  120. package/dist/components/ui/textarea.mjs +0 -15
  121. package/dist/components/ui/tooltip.mjs +0 -44
  122. package/dist/config/component-registry.mjs +0 -38
  123. package/dist/config/index.mjs +0 -129
  124. package/dist/hooks/admin-provider.mjs +0 -70
  125. package/dist/hooks/index.mjs +0 -7
  126. package/dist/hooks/store.mjs +0 -178
  127. package/dist/hooks/use-collection-db.mjs +0 -146
  128. package/dist/hooks/use-collection.mjs +0 -112
  129. package/dist/hooks/use-global.mjs +0 -46
  130. package/dist/hooks/use-mobile.mjs +0 -20
  131. package/dist/lib/utils.mjs +0 -10
  132. package/dist/styles/index.css +0 -336
  133. package/dist/styles/index.mjs +0 -1
  134. package/dist/utils/index.mjs +0 -9
  135. package/dist/views/auth/auth-layout.mjs +0 -52
  136. package/dist/views/auth/index.mjs +0 -6
  137. package/dist/views/auth/login-form.mjs +0 -156
  138. package/dist/views/collection/auto-form-fields.mjs +0 -525
  139. package/dist/views/collection/collection-form.mjs +0 -91
  140. package/dist/views/collection/collection-list.mjs +0 -76
  141. package/dist/views/collection/form-field.mjs +0 -42
  142. package/dist/views/collection/index.mjs +0 -6
  143. package/dist/views/common/index.mjs +0 -4
  144. package/dist/views/common/locale-switcher.mjs +0 -39
  145. package/dist/views/common/version-history.mjs +0 -272
  146. package/dist/views/index.mjs +0 -9
  147. package/dist/views/layout/admin-layout.mjs +0 -40
  148. package/dist/views/layout/admin-router.mjs +0 -95
  149. package/dist/views/layout/admin-sidebar.mjs +0 -63
  150. package/dist/views/layout/index.mjs +0 -5
  151. package/src/__tests__/setup.ts +0 -44
  152. package/src/__tests__/test-utils.tsx +0 -49
  153. package/src/__tests__/vitest.d.ts +0 -9
  154. package/src/components/admin-app.tsx +0 -221
  155. package/src/components/fields/array-field.tsx +0 -237
  156. package/src/components/fields/checkbox-field.tsx +0 -47
  157. package/src/components/fields/custom-field.tsx +0 -50
  158. package/src/components/fields/date-field.tsx +0 -65
  159. package/src/components/fields/datetime-field.tsx +0 -67
  160. package/src/components/fields/email-field.tsx +0 -51
  161. package/src/components/fields/embedded-collection.tsx +0 -315
  162. package/src/components/fields/field-types.ts +0 -162
  163. package/src/components/fields/field-utils.ts +0 -6
  164. package/src/components/fields/field-wrapper.tsx +0 -52
  165. package/src/components/fields/index.ts +0 -66
  166. package/src/components/fields/json-field.tsx +0 -440
  167. package/src/components/fields/locale-badge.tsx +0 -15
  168. package/src/components/fields/number-field.tsx +0 -57
  169. package/src/components/fields/password-field.tsx +0 -51
  170. package/src/components/fields/relation-field.tsx +0 -243
  171. package/src/components/fields/relation-picker.tsx +0 -402
  172. package/src/components/fields/relation-select.tsx +0 -327
  173. package/src/components/fields/rich-text-editor/index.tsx +0 -1337
  174. package/src/components/fields/select-field.tsx +0 -61
  175. package/src/components/fields/switch-field.tsx +0 -47
  176. package/src/components/fields/text-field.tsx +0 -55
  177. package/src/components/fields/textarea-field.tsx +0 -55
  178. package/src/components/index.ts +0 -40
  179. package/src/components/primitives/checkbox-input.tsx +0 -193
  180. package/src/components/primitives/date-input.tsx +0 -401
  181. package/src/components/primitives/index.ts +0 -24
  182. package/src/components/primitives/number-input.tsx +0 -132
  183. package/src/components/primitives/select-input.tsx +0 -296
  184. package/src/components/primitives/tag-input.tsx +0 -200
  185. package/src/components/primitives/text-input.tsx +0 -49
  186. package/src/components/primitives/textarea-input.tsx +0 -46
  187. package/src/components/primitives/toggle-input.tsx +0 -36
  188. package/src/components/primitives/types.ts +0 -235
  189. package/src/components/ui/accordion.tsx +0 -72
  190. package/src/components/ui/avatar.tsx +0 -106
  191. package/src/components/ui/badge.tsx +0 -48
  192. package/src/components/ui/button.tsx +0 -53
  193. package/src/components/ui/card.tsx +0 -94
  194. package/src/components/ui/checkbox.tsx +0 -27
  195. package/src/components/ui/combobox.tsx +0 -290
  196. package/src/components/ui/dialog.tsx +0 -151
  197. package/src/components/ui/dropdown-menu.tsx +0 -254
  198. package/src/components/ui/field.tsx +0 -227
  199. package/src/components/ui/input-group.tsx +0 -149
  200. package/src/components/ui/input.tsx +0 -20
  201. package/src/components/ui/label.tsx +0 -18
  202. package/src/components/ui/popover.tsx +0 -88
  203. package/src/components/ui/scroll-area.tsx +0 -53
  204. package/src/components/ui/select.tsx +0 -192
  205. package/src/components/ui/separator.tsx +0 -23
  206. package/src/components/ui/sheet.tsx +0 -127
  207. package/src/components/ui/sidebar.tsx +0 -723
  208. package/src/components/ui/skeleton.tsx +0 -13
  209. package/src/components/ui/spinner.tsx +0 -10
  210. package/src/components/ui/switch.tsx +0 -32
  211. package/src/components/ui/table.tsx +0 -99
  212. package/src/components/ui/tabs.tsx +0 -82
  213. package/src/components/ui/textarea.tsx +0 -18
  214. package/src/components/ui/tooltip.tsx +0 -70
  215. package/src/config/component-registry.ts +0 -190
  216. package/src/config/index.ts +0 -1099
  217. package/src/hooks/README.md +0 -269
  218. package/src/hooks/admin-provider.tsx +0 -110
  219. package/src/hooks/index.ts +0 -41
  220. package/src/hooks/store.ts +0 -248
  221. package/src/hooks/use-auth.ts +0 -168
  222. package/src/hooks/use-collection-db.ts +0 -209
  223. package/src/hooks/use-collection.ts +0 -156
  224. package/src/hooks/use-global.ts +0 -69
  225. package/src/hooks/use-mobile.ts +0 -21
  226. package/src/lib/utils.ts +0 -6
  227. package/src/styles/index.css +0 -340
  228. package/src/utils/index.ts +0 -6
  229. package/src/views/auth/auth-layout.tsx +0 -77
  230. package/src/views/auth/forgot-password-form.tsx +0 -192
  231. package/src/views/auth/index.ts +0 -21
  232. package/src/views/auth/login-form.tsx +0 -229
  233. package/src/views/auth/reset-password-form.tsx +0 -232
  234. package/src/views/collection/auto-form-fields.tsx +0 -982
  235. package/src/views/collection/collection-form.tsx +0 -186
  236. package/src/views/collection/collection-list.tsx +0 -223
  237. package/src/views/collection/form-field.tsx +0 -52
  238. package/src/views/collection/index.ts +0 -15
  239. package/src/views/common/index.ts +0 -8
  240. package/src/views/common/locale-switcher.tsx +0 -45
  241. package/src/views/common/version-history.tsx +0 -406
  242. package/src/views/index.ts +0 -25
  243. package/src/views/layout/admin-layout.tsx +0 -117
  244. package/src/views/layout/admin-router.tsx +0 -206
  245. package/src/views/layout/admin-sidebar.tsx +0 -185
  246. package/src/views/layout/index.ts +0 -12
  247. package/tsconfig.json +0 -13
  248. package/tsconfig.tsbuildinfo +0 -1
  249. package/tsdown.config.ts +0 -13
  250. package/vitest.config.ts +0 -29
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-locales-provider-BXvuIgfg.mjs","names":["React","Button","ButtonPrimitive","state: TState","result: Record<string, any>","adminMessages: SimpleMessages","result: SimpleMessages","allAdminMessages: SimpleMessages","pages: Record<string, PageRoutes>","items: NavigationItem[]","result: NavigationGroup[]","result: Record<string, SimpleMessages>","DEFAULT_LOCALES: ContentLocalesData","value: ContentLocalesContextValue"],"sources":["../src/client/i18n/hooks.tsx","../src/client/lib/utils.ts","../src/client/components/ui/button.tsx","../src/client/builder/admin.ts","../src/client/i18n/messages/en.ts","../src/client/i18n/messages.ts","../src/client/i18n/intl-cache.ts","../src/client/i18n/simple.ts","../src/client/runtime/routes.ts","../src/client/runtime/provider.tsx","../src/client/runtime/content-locales-provider.tsx"],"sourcesContent":["/**\n * I18n React Hooks\n *\n * React context and hooks for i18n in the admin UI.\n */\n\nimport { DEFAULT_LOCALE } from \"questpie/shared\";\nimport * as React from \"react\";\nimport { createContext, useCallback, useContext } from \"react\";\nimport type {\n\tI18nAdapter,\n\tI18nContext as I18nContextType,\n\tI18nProviderProps,\n\tI18nText,\n\tUseTranslationResult,\n} from \"./types\";\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst I18nContext = createContext<I18nAdapter | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * I18n Provider Component\n *\n * Provides i18n to all child components.\n * The adapter is the source of truth for UI locale.\n *\n * @example\n * ```tsx\n * import { I18nProvider, createSimpleI18n } from \"@questpie/admin/i18n\";\n *\n * const i18n = createSimpleI18n({ ... });\n *\n * <I18nProvider adapter={i18n}>\n * <App />\n * </I18nProvider>\n * ```\n */\nexport function I18nProvider({\n\tadapter,\n\tchildren,\n}: I18nProviderProps): React.ReactElement {\n\t// Force re-render when locale changes in adapter\n\tconst [, forceUpdate] = React.useReducer((x) => x + 1, 0);\n\n\t// Subscribe to locale changes from adapter\n\tReact.useEffect(() => {\n\t\treturn adapter.onLocaleChange(() => {\n\t\t\tforceUpdate();\n\t\t});\n\t}, [adapter]);\n\n\t// Context value - adapter is source of truth\n\t// useMemo depends on adapter.locale to create new reference when locale changes\n\tconst contextValue = React.useMemo<I18nAdapter>(\n\t\t() => ({\n\t\t\tlocale: adapter.locale,\n\t\t\tlocales: adapter.locales,\n\t\t\tt: adapter.t.bind(adapter),\n\t\t\tsetLocale: adapter.setLocale.bind(adapter),\n\t\t\tonLocaleChange: adapter.onLocaleChange.bind(adapter),\n\t\t\tformatDate: adapter.formatDate.bind(adapter),\n\t\t\tformatNumber: adapter.formatNumber.bind(adapter),\n\t\t\tformatRelative: adapter.formatRelative?.bind(adapter),\n\t\t\tgetLocaleName: adapter.getLocaleName.bind(adapter),\n\t\t\tisRTL: adapter.isRTL.bind(adapter),\n\t\t}),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[adapter, adapter.locale],\n\t);\n\n\treturn (\n\t\t<I18nContext.Provider value={contextValue}>{children}</I18nContext.Provider>\n\t);\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Get the i18n adapter (throws if not in provider)\n */\nexport function useI18n(): I18nAdapter {\n\tconst adapter = useContext(I18nContext);\n\tif (!adapter) {\n\t\tthrow new Error(\"useI18n must be used within I18nProvider\");\n\t}\n\treturn adapter;\n}\n\n/**\n * Get i18n adapter or null (safe version)\n */\nexport function useSafeI18n(): I18nAdapter | null {\n\treturn useContext(I18nContext);\n}\n\n/**\n * Main translation hook\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { t, locale, formatDate } = useTranslation();\n * return <h1>{t(\"dashboard.title\")}</h1>;\n * }\n * ```\n */\nexport function useTranslation(): UseTranslationResult {\n\tconst adapter = useI18n();\n\n\treturn {\n\t\tlocale: adapter.locale,\n\t\tlocales: adapter.locales,\n\t\tt: adapter.t,\n\t\tsetLocale: adapter.setLocale,\n\t\tformatDate: adapter.formatDate,\n\t\tformatNumber: adapter.formatNumber,\n\t\tgetLocaleName: adapter.getLocaleName,\n\t\tisRTL: adapter.isRTL(),\n\t};\n}\n\n/**\n * Get just the translate function\n */\nexport function useT(): I18nAdapter[\"t\"] {\n\treturn useI18n().t;\n}\n\n/**\n * Get current locale\n */\nexport function useLocale(): string {\n\treturn useI18n().locale;\n}\n\n/**\n * Get locale setter\n */\nexport function useSetLocale(): I18nAdapter[\"setLocale\"] {\n\treturn useI18n().setLocale;\n}\n\n// ============================================================================\n// I18nText Resolver\n// ============================================================================\n\n/**\n * Check if an object is a locale map (has locale codes as keys)\n */\nfunction isLocaleMap(obj: object): obj is Record<string, string> {\n\t// If it has a \"key\" property, it's a translation key lookup\n\tif (\"key\" in obj) return false;\n\t// Check if all values are strings (locale map)\n\treturn Object.values(obj).every((v) => typeof v === \"string\");\n}\n\n/**\n * Resolve locale map to string for given locale\n */\nfunction resolveLocaleMap(\n\tmap: Record<string, string>,\n\tlocale: string,\n\tfallback: string,\n): string {\n\t// Try exact locale match\n\tif (map[locale]) return map[locale];\n\t// Try language code only (e.g., \"en\" from \"en-US\")\n\tconst lang = locale.split(\"-\")[0];\n\tif (lang && map[lang]) return map[lang];\n\t// Try default locale as fallback\n\tif (map[DEFAULT_LOCALE]) return map[DEFAULT_LOCALE];\n\t// Return first available value\n\tconst firstValue = Object.values(map)[0];\n\treturn firstValue ?? fallback;\n}\n\n/**\n * Resolve I18nText to string\n *\n * @example\n * ```tsx\n * function Label({ text }: { text: I18nText }) {\n * const resolve = useResolveText();\n * return <span>{resolve(text)}</span>;\n * }\n * ```\n */\nexport function useResolveText(): (\n\ttext: I18nText | ((values: Record<string, any>) => I18nText) | undefined,\n\tfallback?: string,\n\tcontextValues?: Record<string, any>,\n) => string {\n\tconst adapter = useSafeI18n();\n\n\treturn useCallback(\n\t\t(\n\t\t\ttext: I18nText | ((values: Record<string, any>) => I18nText) | undefined,\n\t\t\tfallback = \"\",\n\t\t\tcontextValues?: Record<string, any>,\n\t\t): string => {\n\t\t\tconst resolveValue = (value: I18nText | undefined): string => {\n\t\t\t\tif (value === undefined || value === null) return fallback;\n\n\t\t\t\t// Plain string\n\t\t\t\tif (typeof value === \"string\") return value;\n\n\t\t\t\t// Function\n\t\t\t\tif (typeof value === \"function\") {\n\t\t\t\t\tif (!adapter && !contextValues) return fallback;\n\t\t\t\t\tconst i18nCtx = adapter\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tlocale: adapter.locale,\n\t\t\t\t\t\t\t\tt: adapter.t,\n\t\t\t\t\t\t\t\tformatDate: adapter.formatDate,\n\t\t\t\t\t\t\t\tformatNumber: adapter.formatNumber,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t...(contextValues ?? {}),\n\t\t\t\t\t\t...(i18nCtx ?? {}),\n\t\t\t\t\t} as I18nContextType & Record<string, any>;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = value(ctx);\n\t\t\t\t\t\treturn resolveValue(result as I18nText);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(\"Failed to resolve dynamic text:\", error);\n\t\t\t\t\t\treturn fallback;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Object with key (translation key lookup)\n\t\t\t\tif (\n\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\t\"key\" in value &&\n\t\t\t\t\ttypeof value.key === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tconst keyObj = value as {\n\t\t\t\t\t\tkey: string;\n\t\t\t\t\t\tfallback?: string;\n\t\t\t\t\t\tparams?: Record<string, unknown>;\n\t\t\t\t\t};\n\t\t\t\t\tif (!adapter) return keyObj.fallback ?? fallback;\n\t\t\t\t\tconst result = adapter.t(keyObj.key, keyObj.params);\n\t\t\t\t\t// If t() returns the key (not found), use fallback\n\t\t\t\t\treturn result === keyObj.key ? (keyObj.fallback ?? result) : result;\n\t\t\t\t}\n\n\t\t\t\t// Locale map (inline translations)\n\t\t\t\tif (typeof value === \"object\" && isLocaleMap(value)) {\n\t\t\t\t\tconst locale = adapter?.locale ?? DEFAULT_LOCALE;\n\t\t\t\t\treturn resolveLocaleMap(value, locale, fallback);\n\t\t\t\t}\n\n\t\t\t\treturn fallback;\n\t\t\t};\n\n\t\t\treturn resolveValue(text as I18nText | undefined);\n\t\t},\n\t\t[adapter],\n\t);\n}\n\n/**\n * Resolve I18nText synchronously (without adapter)\n * Only works with string and object types, not functions\n *\n * @param locale - Optional locale to use for locale maps (defaults to \"en\")\n */\nexport function resolveTextSync(\n\ttext: I18nText | undefined,\n\tfallback = \"\",\n\tlocale = DEFAULT_LOCALE,\n): string {\n\tif (text === undefined || text === null) return fallback;\n\tif (typeof text === \"string\") return text;\n\tif (typeof text === \"function\") return fallback;\n\tif (typeof text === \"object\" && \"key\" in text) {\n\t\treturn text.fallback ?? fallback;\n\t}\n\t// Locale map (inline translations)\n\tif (typeof text === \"object\" && isLocaleMap(text)) {\n\t\treturn resolveLocaleMap(text, locale, fallback);\n\t}\n\treturn fallback;\n}\n\n// ============================================================================\n// Text Component\n// ============================================================================\n\n/**\n * Text component that resolves I18nText to a string\n *\n * Use this when you need to render I18nText in JSX.\n *\n * @example\n * ```tsx\n * <Text text={{ en: \"Hello\", sk: \"Ahoj\" }} />\n * <Text text=\"Static text\" />\n * <Text text={{ key: \"common.save\" }} />\n * ```\n */\nexport function Text({\n\ttext,\n\tfallback = \"\",\n\tas: Component = \"span\",\n\tclassName,\n}: {\n\ttext: I18nText | undefined;\n\tfallback?: string;\n\tas?: React.ElementType;\n\tclassName?: string;\n}): React.ReactElement | null {\n\tconst resolve = useResolveText();\n\tconst resolved = resolve(text, fallback);\n\tif (!resolved) return null;\n\treturn <Component className={className}>{resolved}</Component>;\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Format a collection name for display\n *\n * Converts camelCase/PascalCase to Title Case with spaces.\n *\n * @example\n * formatCollectionName(\"blogPosts\") // \"Blog Posts\"\n * formatCollectionName(\"userSettings\") // \"User Settings\"\n */\nexport function formatCollectionName(name: string): string {\n return name\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring cursor-pointer focus-visible:ring-ring/30 focus-visible:shadow-[0_0_10px_oklch(0.55_0.3_300_/_0.15)] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-[2px] aria-invalid:ring-[2px] [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm hover:shadow-[0_0_15px_oklch(0.55_0.3_300_/_0.2)]\",\n outline:\n \"border-input/80 bg-input/20 backdrop-blur-sm hover:bg-accent hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive:\n \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5 [&_svg:not([class*='size-'])]:size-4\",\n xs: \"h-6 gap-1 px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 px-2.5 text-xs has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-2 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3 [&_svg:not([class*='size-'])]:size-4\",\n icon: \"size-9 [&_svg:not([class*='size-'])]:size-4\",\n \"icon-xs\": \"size-6 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-7 [&_svg:not([class*='size-'])]:size-3.5\",\n \"icon-lg\": \"size-10 [&_svg:not([class*='size-'])]:size-5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","/**\n * Admin Runtime Class\n *\n * Wraps AdminBuilder state with runtime methods for accessing configuration.\n * This is what gets passed to AdminProvider and used throughout the admin UI.\n */\n\nimport { DEFAULT_LOCALE, DEFAULT_LOCALE_CONFIG } from \"questpie/shared\";\nimport type { AdminBuilder } from \"./admin-builder\";\nimport type { AdminBuilderState } from \"./admin-types\";\nimport type {\n\tRegisteredAdmin,\n\tRegisteredCMS,\n\tRegisteredCollectionNames,\n\tRegisteredGlobalNames,\n} from \"./registry\";\n\n// ============================================================================\n// Type Helpers for State Extraction\n// ============================================================================\n\n/**\n * Extract state from a builder or return the value as-is.\n * Builders have a `state` property, plain configs do not.\n */\ntype ExtractBuilderState<T> = T extends { state: infer S } ? S : T;\n\n/**\n * Map over a record and extract state from each builder value.\n */\ntype ExtractBuilderStates<T> = {\n\t[K in keyof T]: ExtractBuilderState<T[K]>;\n};\n\n/**\n * Input type for Admin - accepts either an AdminBuilder or Admin instance\n */\nexport type AdminInput<TState extends AdminBuilderState = AdminBuilderState> =\n\t| AdminBuilder<TState>\n\t| Admin<TState>;\n\n// ============================================================================\n// Admin Class\n// ============================================================================\n\n/**\n * Admin runtime instance\n *\n * Provides methods to access admin configuration at runtime.\n * Can be created from an AdminBuilder directly - no need for Admin.from().\n *\n * @example\n * ```ts\n * import { Admin } from \"@questpie/admin/builder\";\n *\n * // Direct usage - pass builder to AdminLayoutProvider\n * <AdminLayoutProvider admin={admin} ... />\n *\n * // Or create Admin instance explicitly if needed\n * const adminInstance = Admin.from(adminBuilder);\n * ```\n */\nexport class Admin<TState extends AdminBuilderState = AdminBuilderState> {\n\tconstructor(public readonly state: TState) {}\n\n\t/**\n\t * Create Admin from an AdminBuilder or return existing Admin instance.\n\t * This is called internally by AdminLayoutProvider - you don't need to call it manually.\n\t *\n\t * @deprecated Pass the builder directly to AdminLayoutProvider instead\n\t */\n\tstatic from<TBuilder extends AdminBuilder<any> | Admin<any>>(\n\t\tinput: TBuilder,\n\t): TBuilder extends AdminBuilder<infer TState>\n\t\t? Admin<TState>\n\t\t: TBuilder extends Admin<infer TState>\n\t\t\t? Admin<TState>\n\t\t\t: never {\n\t\t// If already an Admin instance, return as-is\n\t\tif (input instanceof Admin) {\n\t\t\treturn input as any;\n\t\t}\n\t\t// Otherwise extract state from builder\n\t\treturn new Admin((input as AdminBuilder<any>).state) as any;\n\t}\n\n\t/**\n\t * Normalize input to Admin instance (internal helper)\n\t */\n\tstatic normalize<TState extends AdminBuilderState>(\n\t\tinput: AdminInput<TState>,\n\t): Admin<TState> {\n\t\tif (input instanceof Admin) {\n\t\t\treturn input;\n\t\t}\n\t\treturn new Admin(input.state);\n\t}\n\n\t// ============================================================================\n\t// Collection Methods\n\t// ============================================================================\n\n\t/**\n\t * Get all collection names\n\t */\n\tgetCollectionNames(): string[] {\n\t\treturn Object.keys(this.state.collections ?? {});\n\t}\n\n\t/**\n\t * Get all collection configurations.\n\t * Automatically extracts `.state` from builders.\n\t */\n\tgetCollections(): ExtractBuilderStates<TState[\"collections\"]> {\n\t\tconst collections = this.state.collections ?? {};\n\t\tconst result: Record<string, any> = {};\n\n\t\tfor (const [name, config] of Object.entries(collections)) {\n\t\t\t// Extract state from builders, pass through plain configs\n\t\t\tresult[name] =\n\t\t\t\tconfig && typeof config === \"object\" && \"state\" in config\n\t\t\t\t\t? (config as any).state\n\t\t\t\t\t: config;\n\t\t}\n\n\t\treturn result as ExtractBuilderStates<TState[\"collections\"]>;\n\t}\n\n\t/**\n\t * Get configuration for a specific collection.\n\t * Automatically extracts `.state` from builder.\n\t */\n\tgetCollectionConfig(\n\t\tname: string,\n\t): ExtractBuilderState<TState[\"collections\"][string]> | undefined {\n\t\tconst config = (this.state.collections as Record<string, any>)?.[name];\n\t\tif (!config) return undefined;\n\n\t\t// Extract state from builder, pass through plain config\n\t\treturn config && typeof config === \"object\" && \"state\" in config\n\t\t\t? config.state\n\t\t\t: config;\n\t}\n\n\t// ============================================================================\n\t// Global Methods\n\t// ============================================================================\n\n\t/**\n\t * Get all global names\n\t */\n\tgetGlobalNames(): string[] {\n\t\treturn Object.keys(this.state.globals ?? {});\n\t}\n\n\t/**\n\t * Get all global configurations.\n\t * Automatically extracts `.state` from builders.\n\t */\n\tgetGlobals(): ExtractBuilderStates<TState[\"globals\"]> {\n\t\tconst globals = this.state.globals ?? {};\n\t\tconst result: Record<string, any> = {};\n\n\t\tfor (const [name, config] of Object.entries(globals)) {\n\t\t\t// Extract state from builders, pass through plain configs\n\t\t\tresult[name] =\n\t\t\t\tconfig && typeof config === \"object\" && \"state\" in config\n\t\t\t\t\t? (config as any).state\n\t\t\t\t\t: config;\n\t\t}\n\n\t\treturn result as ExtractBuilderStates<TState[\"globals\"]>;\n\t}\n\n\t/**\n\t * Get configuration for a specific global.\n\t * Automatically extracts `.state` from builder.\n\t */\n\tgetGlobalConfig(\n\t\tname: string,\n\t): ExtractBuilderState<TState[\"globals\"][string]> | undefined {\n\t\tconst config = (this.state.globals as Record<string, any>)?.[name];\n\t\tif (!config) return undefined;\n\n\t\t// Extract state from builder, pass through plain config\n\t\treturn config && typeof config === \"object\" && \"state\" in config\n\t\t\t? config.state\n\t\t\t: config;\n\t}\n\n\t// ============================================================================\n\t// Page Methods\n\t// ============================================================================\n\n\t/**\n\t * Get all custom page configurations.\n\t * Automatically extracts `.state` from builders.\n\t */\n\tgetPages(): ExtractBuilderStates<TState[\"pages\"]> {\n\t\tconst pages = this.state.pages ?? {};\n\t\tconst result: Record<string, any> = {};\n\n\t\tfor (const [name, config] of Object.entries(pages)) {\n\t\t\t// Extract state from builders, pass through plain configs\n\t\t\tresult[name] =\n\t\t\t\tconfig && typeof config === \"object\" && \"state\" in config\n\t\t\t\t\t? (config as any).state\n\t\t\t\t\t: config;\n\t\t}\n\n\t\treturn result as ExtractBuilderStates<TState[\"pages\"]>;\n\t}\n\n\t/**\n\t * Get configuration for a specific page.\n\t * Automatically extracts `.state` from builder.\n\t */\n\tgetPageConfig(\n\t\tname: string,\n\t): ExtractBuilderState<TState[\"pages\"][string]> | undefined {\n\t\tconst config = (this.state.pages as Record<string, any>)?.[name];\n\t\tif (!config) return undefined;\n\n\t\t// Extract state from builder, pass through plain config\n\t\treturn config && typeof config === \"object\" && \"state\" in config\n\t\t\t? config.state\n\t\t\t: config;\n\t}\n\n\t// ============================================================================\n\t// UI Configuration Methods\n\t// ============================================================================\n\n\t/**\n\t * Get dashboard configuration\n\t */\n\tgetDashboard(): TState[\"dashboard\"] {\n\t\treturn this.state.dashboard ?? ({} as TState[\"dashboard\"]);\n\t}\n\n\t/**\n\t * Get sidebar configuration\n\t */\n\tgetSidebar(): TState[\"sidebar\"] & { groups?: any[] } {\n\t\treturn (this.state.sidebar ?? {}) as TState[\"sidebar\"] & { groups?: any[] };\n\t}\n\n\t/**\n\t * Get branding configuration\n\t */\n\tgetBranding(): TState[\"branding\"] {\n\t\treturn this.state.branding ?? ({} as TState[\"branding\"]);\n\t}\n\n\t/**\n\t * Get default views configuration\n\t */\n\tgetDefaultViews(): TState[\"defaultViews\"] {\n\t\treturn this.state.defaultViews ?? ({} as TState[\"defaultViews\"]);\n\t}\n\n\t// ============================================================================\n\t// Locale Methods\n\t// ============================================================================\n\n\t/**\n\t * Get locale configuration\n\t */\n\tgetLocale(): TState[\"locale\"] {\n\t\treturn this.state.locale ?? DEFAULT_LOCALE_CONFIG;\n\t}\n\n\t/**\n\t * Get available locales\n\t */\n\tgetAvailableLocales(): string[] {\n\t\treturn this.getLocale().supported ?? [DEFAULT_LOCALE];\n\t}\n\n\t/**\n\t * Get default locale\n\t */\n\tgetDefaultLocale(): string {\n\t\treturn this.getLocale().default ?? DEFAULT_LOCALE;\n\t}\n\n\t/**\n\t * Get human-readable label for a locale\n\t */\n\tgetLocaleLabel(locale: string): string {\n\t\t// TODO: Support custom labels from locale config\n\t\tconst labels: Record<string, string> = {\n\t\t\ten: \"English\",\n\t\t\tsk: \"Slovencina\",\n\t\t\tcs: \"Cestina\",\n\t\t\tde: \"Deutsch\",\n\t\t\tfr: \"Francais\",\n\t\t\tes: \"Espanol\",\n\t\t\tit: \"Italiano\",\n\t\t\tpt: \"Portugues\",\n\t\t\tpl: \"Polski\",\n\t\t\tnl: \"Nederlands\",\n\t\t\tru: \"Russkij\",\n\t\t\tuk: \"Ukrainska\",\n\t\t\tja: \"Nihongo\",\n\t\t\tko: \"Hangugeo\",\n\t\t\tzh: \"Zhongwen\",\n\t\t};\n\t\treturn labels[locale] ?? locale.toUpperCase();\n\t}\n\n\t// ============================================================================\n\t// Translations Methods\n\t// ============================================================================\n\n\t/**\n\t * Get translations map from builder state\n\t * Used by AdminProvider to initialize i18n\n\t */\n\tgetTranslations(): TState[\"translations\"] {\n\t\treturn this.state.translations ?? ({} as TState[\"translations\"]);\n\t}\n\n\t// ============================================================================\n\t// Registry Methods (for field/view lookups)\n\t// ============================================================================\n\n\t/**\n\t * Get all registered field definitions\n\t */\n\tgetFields(): TState[\"fields\"] {\n\t\treturn this.state.fields ?? ({} as TState[\"fields\"]);\n\t}\n\n\t/**\n\t * Get a specific field definition\n\t */\n\tgetField(name: string): TState[\"fields\"][string] | undefined {\n\t\treturn (this.state.fields as Record<string, any>)?.[name];\n\t}\n\n\t/**\n\t * Get all registered list view definitions\n\t */\n\tgetListViews(): TState[\"listViews\"] {\n\t\treturn this.state.listViews ?? ({} as TState[\"listViews\"]);\n\t}\n\n\t/**\n\t * Get all registered edit view definitions\n\t */\n\tgetEditViews(): TState[\"editViews\"] {\n\t\treturn this.state.editViews ?? ({} as TState[\"editViews\"]);\n\t}\n\n\t/**\n\t * Get all registered widget definitions\n\t */\n\tgetWidgets(): TState[\"widgets\"] {\n\t\treturn this.state.widgets ?? ({} as TState[\"widgets\"]);\n\t}\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Infer the CMS type from an Admin instance\n */\nexport type InferAdminCMS<TAdmin> =\n\tTAdmin extends Admin<infer TState>\n\t\t? TState extends { \"~app\": infer TApp }\n\t\t\t? TApp\n\t\t\t: unknown\n\t\t: unknown;\n\n/**\n * Get the registered Admin type (from module augmentation)\n */\nexport type AppAdmin =\n\tRegisteredAdmin extends AdminBuilder<infer TState>\n\t\t? Admin<TState>\n\t\t: Admin<AdminBuilderState>;\n","/**\n * English Admin UI Messages (Default)\n */\nexport const adminMessagesEN = {\n\t// Common\n\t\"common.save\": \"Save\",\n\t\"common.cancel\": \"Cancel\",\n\t\"common.delete\": \"Delete\",\n\t\"common.edit\": \"Edit\",\n\t\"common.create\": \"Create\",\n\t\"common.add\": \"Add\",\n\t\"common.remove\": \"Remove\",\n\t\"common.close\": \"Close\",\n\t\"common.form\": \"Form\",\n\t\"common.search\": \"Search\",\n\t\"common.filter\": \"Filter\",\n\t\"common.refresh\": \"Refresh\",\n\t\"common.loading\": \"Loading...\",\n\t\"common.confirm\": \"Confirm\",\n\t\"common.back\": \"Back\",\n\t\"common.next\": \"Next\",\n\t\"common.previous\": \"Previous\",\n\t\"common.actions\": \"Actions\",\n\t\"common.more\": \"More\",\n\t\"common.yes\": \"Yes\",\n\t\"common.no\": \"No\",\n\t\"common.ok\": \"OK\",\n\t\"common.apply\": \"Apply\",\n\t\"common.reset\": \"Reset\",\n\t\"common.clear\": \"Clear\",\n\t\"common.selectAll\": \"Select all\",\n\t\"common.deselectAll\": \"Deselect all\",\n\t\"common.duplicate\": \"Duplicate\",\n\t\"common.copy\": \"Copy\",\n\t\"common.paste\": \"Paste\",\n\t\"common.upload\": \"Upload\",\n\t\"common.download\": \"Download\",\n\t\"common.preview\": \"Preview\",\n\t\"common.view\": \"View\",\n\t\"common.open\": \"Open\",\n\t\"common.retry\": \"Retry\",\n\t\"common.submit\": \"Submit\",\n\n\t// Navigation\n\t\"nav.dashboard\": \"Dashboard\",\n\t\"nav.collections\": \"Collections\",\n\t\"nav.globals\": \"Globals\",\n\t\"nav.media\": \"Media\",\n\t\"nav.settings\": \"Settings\",\n\t\"nav.logout\": \"Log out\",\n\t\"nav.home\": \"Home\",\n\t\"nav.back\": \"Back\",\n\n\t// Dashboard\n\t\"dashboard.title\": \"Dashboard\",\n\t\"dashboard.welcome\": \"Welcome back\",\n\t\"dashboard.recentActivity\": \"Recent Activity\",\n\t\"dashboard.quickActions\": \"Quick Actions\",\n\n\t// Collections\n\t\"collection.create\": \"Create {{name}}\",\n\t\"collection.edit\": \"Edit {{name}}\",\n\t\"collection.delete\": \"Delete {{name}}\",\n\t\"collection.deleteConfirm\": \"Are you sure you want to delete this {{name}}?\",\n\t\"collection.noItems\": \"No {{name}} found\",\n\t\"collection.createFirst\": \"Create your first {{name}}\",\n\t\"collection.itemCount\": { one: \"{{count}} item\", other: \"{{count}} items\" },\n\t\"collection.bulkDelete\": \"Delete selected\",\n\t\"collection.bulkDeleteConfirm\":\n\t\t\"Are you sure you want to delete {{count}} items?\",\n\t\"collection.bulkDeleteSuccess\": {\n\t\tone: \"Successfully deleted {{count}} item\",\n\t\tother: \"Successfully deleted {{count}} items\",\n\t},\n\t\"collection.bulkDeleteError\": \"Failed to delete items\",\n\t\"collection.bulkDeletePartial\": {\n\t\tone: \"Deleted {{success}} item, {{failed}} failed\",\n\t\tother: \"Deleted {{success}} items, {{failed}} failed\",\n\t},\n\t\"collection.bulkActionFailed\": \"Bulk action failed\",\n\t\"collection.selected\": \"{{count}} selected\",\n\t\"collection.selectOnPage\": \"All on this page\",\n\t\"collection.selectAllMatching\": \"All matching filter ({{count}})\",\n\t\"collection.clearSelection\": \"Clear selection\",\n\t\"collection.list\": \"{{name}} list\",\n\t\"collection.new\": \"New {{name}}\",\n\t\"collection.duplicateSuccess\": \"{{name}} duplicated successfully\",\n\t\"collection.duplicateError\": \"Failed to duplicate {{name}}\",\n\n\t// Relations\n\t\"relation.select\": \"Select {{name}}\",\n\t\"relation.clear\": \"Clear selection\",\n\t\"relation.search\": \"Search {{name}}...\",\n\t\"relation.noResults\": \"No {{name}} found\",\n\t\"relation.loading\": \"Loading...\",\n\t\"relation.createNew\": \"Create new {{name}}\",\n\t\"relation.selected\": \"{{count}} selected\",\n\t\"relation.removeItem\": \"Remove {{name}}\",\n\t\"relation.addItem\": \"Add {{name}}\",\n\t\"relation.noneSelected\": \"No {{name}} selected\",\n\t\"relation.noRelated\": \"No related items found\",\n\t\"relation.saveFirst\": \"Save this item first to see related items.\",\n\n\t// Arrays\n\t\"array.empty\": \"No {{name}} added yet\",\n\t\"array.addItem\": \"Add {{name}}\",\n\n\t// Blocks\n\t\"blocks.addAbove\": \"Add above\",\n\t\"blocks.addBelow\": \"Add below\",\n\t\"blocks.addChild\": \"Add child block\",\n\n\t// Forms\n\t\"form.id\": \"ID\",\n\t\"form.created\": \"Created\",\n\t\"form.updated\": \"Updated\",\n\t\"form.required\": \"This field is required\",\n\t\"form.invalid\": \"Invalid value\",\n\t\"form.saveChanges\": \"Save changes\",\n\t\"form.unsavedChanges\": \"You have unsaved changes\",\n\t\"form.discardChanges\": \"Discard changes\",\n\t\"form.discardConfirm\":\n\t\t\"Are you sure you want to discard your changes? This action cannot be undone.\",\n\t\"form.fieldRequired\": \"{{field}} is required\",\n\t\"form.fieldInvalid\": \"{{field}} is invalid\",\n\t\"form.maxLength\": \"Must be at most {{max}} characters\",\n\t\"form.minLength\": \"Must be at least {{min}} characters\",\n\t\"form.maxValue\": \"Must be at most {{max}}\",\n\t\"form.minValue\": \"Must be at least {{min}}\",\n\t\"form.pattern\": \"Invalid format\",\n\t\"form.email\": \"Invalid email address\",\n\t\"form.url\": \"Invalid URL\",\n\t\"form.createSuccess\": \"{{name}} created successfully\",\n\t\"form.createError\": \"Failed to create {{name}}\",\n\t\"form.updateSuccess\": \"{{name}} updated successfully\",\n\t\"form.updateError\": \"Failed to update {{name}}\",\n\t\"form.deleteSuccess\": \"{{name}} deleted successfully\",\n\t\"form.deleteError\": \"Failed to delete {{name}}\",\n\n\t// Auth\n\t\"auth.login\": \"Log in\",\n\t\"auth.logout\": \"Log out\",\n\t\"auth.email\": \"Email\",\n\t\"auth.password\": \"Password\",\n\t\"auth.forgotPassword\": \"Forgot password?\",\n\t\"auth.resetPassword\": \"Reset password\",\n\t\"auth.signIn\": \"Sign in\",\n\t\"auth.signOut\": \"Sign out\",\n\t\"auth.signUp\": \"Sign up\",\n\t\"auth.rememberMe\": \"Remember me\",\n\t\"auth.invalidCredentials\": \"Invalid email or password\",\n\t\"auth.sessionExpired\": \"Your session has expired. Please log in again.\",\n\t\"auth.emailPlaceholder\": \"you@example.com\",\n\t\"auth.passwordPlaceholder\": \"Enter your password\",\n\t\"auth.signingIn\": \"Signing in...\",\n\t\"auth.creatingAdmin\": \"Creating admin...\",\n\t\"auth.name\": \"Name\",\n\t\"auth.namePlaceholder\": \"Your name\",\n\t\"auth.confirmPassword\": \"Confirm password\",\n\t\"auth.confirmPasswordPlaceholder\": \"Confirm your password\",\n\t\"auth.acceptInvite\": \"Accept invite\",\n\t\"auth.acceptingInvite\": \"Accepting invite...\",\n\t\"auth.dontHaveAccount\": \"Don't have an account?\",\n\t\"auth.alreadyHaveAccount\": \"Already have an account?\",\n\t\"auth.emailRequired\": \"Email is required\",\n\t\"auth.passwordRequired\": \"Password is required\",\n\t\"auth.passwordMinLength\": \"Password must be at least {{min}} characters\",\n\t\"auth.nameRequired\": \"Name is required\",\n\t\"auth.nameMinLength\": \"Name must be at least {{min}} characters\",\n\t\"auth.invalidEmail\": \"Invalid email address\",\n\t\"auth.passwordMismatch\": \"Passwords do not match\",\n\t\"auth.newPassword\": \"New password\",\n\t\"auth.newPasswordPlaceholder\": \"Enter new password\",\n\t\"auth.sendResetLink\": \"Send reset link\",\n\t\"auth.sendingResetLink\": \"Sending...\",\n\t\"auth.resetLinkSent\": \"Password reset link sent to your email\",\n\t\"auth.resettingPassword\": \"Resetting password...\",\n\t\"auth.createFirstAdmin\": \"Create first admin\",\n\t\"auth.setupTitle\": \"Setup\",\n\t\"auth.setupDescription\": \"Create your first admin account to get started.\",\n\t\"auth.profile\": \"Profile\",\n\t\"auth.myAccount\": \"My account\",\n\n\t// Errors\n\t\"error.notFound\": \"Not found\",\n\t\"error.serverError\": \"Server error\",\n\t\"error.networkError\": \"Network error. Please check your connection.\",\n\t\"error.unauthorized\": \"You are not authorized to perform this action\",\n\t\"error.forbidden\": \"Access denied\",\n\t\"error.validation\": \"Validation failed\",\n\t\"error.unknown\": \"An unknown error occurred\",\n\t\"error.timeout\": \"Request timed out. Please try again.\",\n\t\"error.conflict\": \"A conflict occurred. Please refresh and try again.\",\n\n\t// Table\n\t\"table.rowsPerPage\": \"Rows per page\",\n\t\"table.of\": \"of\",\n\t\"table.noResults\": \"No results\",\n\t\"table.selectAll\": \"Select all\",\n\t\"table.selectRow\": \"Select row\",\n\t\"table.showing\": \"Showing {{from}} to {{to}} of {{total}}\",\n\t\"table.page\": \"Page {{page}}\",\n\t\"table.firstPage\": \"First page\",\n\t\"table.lastPage\": \"Last page\",\n\t\"table.nextPage\": \"Next page\",\n\t\"table.previousPage\": \"Previous page\",\n\t\"table.sortAsc\": \"Sort ascending\",\n\t\"table.sortDesc\": \"Sort descending\",\n\t\"table.columns\": \"Columns\",\n\t\"table.hideColumn\": \"Hide column\",\n\t\"table.showColumn\": \"Show column\",\n\n\t// Upload\n\t\"upload.dropzone\": \"Drop files here or click to upload\",\n\t\"upload.browse\": \"Browse files\",\n\t\"upload.uploading\": \"Uploading...\",\n\t\"upload.complete\": \"Upload complete\",\n\t\"upload.error\": \"Upload failed\",\n\t\"upload.maxSize\": \"File must be smaller than {{size}}\",\n\t\"upload.invalidType\": \"Invalid file type. Allowed: {{types}}\",\n\t\"upload.remove\": \"Remove file\",\n\t\"upload.replace\": \"Replace file\",\n\t\"upload.preview\": \"Preview\",\n\t\"upload.noFile\": \"No file selected\",\n\t\"upload.dragDrop\": \"Drag and drop files here\",\n\n\t// Editor\n\t\"editor.bold\": \"Bold\",\n\t\"editor.italic\": \"Italic\",\n\t\"editor.underline\": \"Underline\",\n\t\"editor.strikethrough\": \"Strikethrough\",\n\t\"editor.heading\": \"Heading {{level}}\",\n\t\"editor.link\": \"Insert link\",\n\t\"editor.image\": \"Insert image\",\n\t\"editor.list\": \"List\",\n\t\"editor.orderedList\": \"Numbered list\",\n\t\"editor.unorderedList\": \"Bullet list\",\n\t\"editor.quote\": \"Quote\",\n\t\"editor.code\": \"Code\",\n\t\"editor.codeBlock\": \"Code block\",\n\t\"editor.table\": \"Insert table\",\n\t\"editor.undo\": \"Undo\",\n\t\"editor.redo\": \"Redo\",\n\t\"editor.alignLeft\": \"Align left\",\n\t\"editor.alignCenter\": \"Align center\",\n\t\"editor.alignRight\": \"Align right\",\n\t\"editor.alignJustify\": \"Justify\",\n\t\"editor.horizontalRule\": \"Horizontal rule\",\n\t\"editor.addRowBefore\": \"Add row before\",\n\t\"editor.addRowAfter\": \"Add row after\",\n\t\"editor.addColumnBefore\": \"Add column before\",\n\t\"editor.addColumnAfter\": \"Add column after\",\n\t\"editor.deleteRow\": \"Delete row\",\n\t\"editor.deleteColumn\": \"Delete column\",\n\t\"editor.deleteTable\": \"Delete table\",\n\t\"editor.toggleHeaderRow\": \"Toggle header row\",\n\t\"editor.toggleHeaderColumn\": \"Toggle header column\",\n\t\"editor.mergeCells\": \"Merge cells\",\n\t\"editor.splitCell\": \"Split cell\",\n\t\"editor.insertUrl\": \"Insert URL\",\n\t\"editor.altText\": \"Alt text (optional)\",\n\t\"editor.uploadFile\": \"Upload file\",\n\t\"editor.chooseFile\": \"Choose file\",\n\t\"editor.uploading\": \"Uploading...\",\n\t\"editor.browseLibrary\": \"Browse library\",\n\n\t// Toasts\n\t\"toast.success\": \"Success\",\n\t\"toast.error\": \"Error\",\n\t\"toast.warning\": \"Warning\",\n\t\"toast.info\": \"Info\",\n\t\"toast.saving\": \"Saving...\",\n\t\"toast.saveFailed\": \"Failed to save changes\",\n\t\"toast.saveSuccess\": \"Changes saved successfully\",\n\t\"toast.creating\": \"Creating...\",\n\t\"toast.createSuccess\": \"Created successfully\",\n\t\"toast.createFailed\": \"Failed to create\",\n\t\"toast.deleting\": \"Deleting...\",\n\t\"toast.deleteFailed\": \"Failed to delete\",\n\t\"toast.deleteSuccess\": \"Deleted successfully\",\n\t\"toast.loadFailed\": \"Failed to load data\",\n\t\"toast.uploadFailed\": \"Failed to upload file\",\n\t\"toast.uploadSuccess\": \"File uploaded successfully\",\n\t\"toast.copySuccess\": \"Copied to clipboard\",\n\t\"toast.copyFailed\": \"Failed to copy to clipboard\",\n\t\"toast.idCopied\": \"ID copied to clipboard\",\n\t\"toast.validationFailed\": \"Validation failed\",\n\t\"toast.validationDescription\": \"Please check the form for errors\",\n\t\"toast.created\": \"{{name}} created\",\n\t\"toast.updated\": \"{{name}} updated\",\n\t\"toast.resourceSaveFailed\": \"Failed to save {{name}}\",\n\t\"toast.editComingSoon\": \"Edit functionality coming soon\",\n\t\"toast.maxFilesWarning\":\n\t\t\"Only {{remaining}} more file(s) can be added (max {{max}})\",\n\t\"toast.settingsSaveFailed\": \"Failed to save settings\",\n\t\"toast.actionSuccess\": \"Action completed successfully\",\n\t\"toast.actionFailed\": \"Action failed\",\n\t\"toast.localeChangedUnsaved\": \"Content language changed\",\n\t\"toast.localeChangedUnsavedDescription\":\n\t\t\"Your unsaved changes were replaced with content from the new language.\",\n\n\t// Confirm\n\t\"confirm.delete\":\n\t\t\"Are you sure you want to delete this? This action cannot be undone.\",\n\t\"confirm.discard\":\n\t\t\"Are you sure you want to discard your changes? This action cannot be undone.\",\n\t\"confirm.unsavedChanges\":\n\t\t\"You have unsaved changes. Are you sure you want to leave?\",\n\t\"confirm.action\": \"Are you sure you want to continue?\",\n\t\"confirm.irreversible\": \"This action cannot be undone.\",\n\t\"confirm.localeChange\": \"Discard unsaved changes?\",\n\t\"confirm.localeChangeDescription\":\n\t\t\"You have unsaved changes. Switching content language will discard your changes and load the content in the new language.\",\n\t\"confirm.localeChangeStay\": \"Stay\",\n\t\"confirm.localeChangeDiscard\": \"Discard & switch\",\n\n\t// Status\n\t\"status.draft\": \"Draft\",\n\t\"status.published\": \"Published\",\n\t\"status.archived\": \"Archived\",\n\t\"status.pending\": \"Pending\",\n\t\"status.active\": \"Active\",\n\t\"status.inactive\": \"Inactive\",\n\n\t// Dates\n\t\"date.today\": \"Today\",\n\t\"date.yesterday\": \"Yesterday\",\n\t\"date.tomorrow\": \"Tomorrow\",\n\t\"date.selectDate\": \"Select date\",\n\t\"date.selectTime\": \"Select time\",\n\t\"date.clear\": \"Clear date\",\n\n\t// Accessibility\n\t\"a11y.openMenu\": \"Open menu\",\n\t\"a11y.closeMenu\": \"Close menu\",\n\t\"a11y.expand\": \"Expand\",\n\t\"a11y.collapse\": \"Collapse\",\n\t\"a11y.loading\": \"Loading\",\n\t\"a11y.required\": \"Required\",\n\t\"a11y.optional\": \"Optional\",\n\t\"a11y.selected\": \"Selected\",\n\t\"a11y.notSelected\": \"Not selected\",\n\n\t// Locale\n\t\"locale.language\": \"Language\",\n\t\"locale.switchLanguage\": \"Switch language\",\n\t\"locale.contentLanguage\": \"Content language\",\n\t\"locale.uiLanguage\": \"Interface language\",\n\n\t// ===========================================\n\t// Default Collections\n\t// ===========================================\n\n\t// Users Collection\n\t\"defaults.users.label\": \"Users\",\n\t\"defaults.users.description\": \"Manage admin users and their roles\",\n\t\"defaults.users.fields.name.label\": \"Name\",\n\t\"defaults.users.fields.name.placeholder\": \"Enter user name\",\n\t\"defaults.users.fields.email.label\": \"Email\",\n\t\"defaults.users.fields.email.description\": \"Email address (read-only)\",\n\t\"defaults.users.fields.role.label\": \"Role\",\n\t\"defaults.users.fields.role.options.admin\": \"Admin\",\n\t\"defaults.users.fields.role.options.user\": \"User\",\n\t\"defaults.users.fields.emailVerified.label\": \"Email Verified\",\n\t\"defaults.users.fields.emailVerified.description\":\n\t\t\"Whether the user has verified their email address\",\n\t\"defaults.users.fields.banned.label\": \"Banned\",\n\t\"defaults.users.fields.banned.description\":\n\t\t\"Prevent user from accessing the system\",\n\t\"defaults.users.fields.banReason.label\": \"Ban Reason\",\n\t\"defaults.users.fields.banReason.placeholder\": \"Enter reason for banning...\",\n\t\"defaults.users.sections.basicInfo\": \"Basic Information\",\n\t\"defaults.users.sections.permissions\": \"Permissions\",\n\t\"defaults.users.sections.accessControl\": \"Access Control\",\n\t\"defaults.users.actions.createUser.label\": \"Create User\",\n\t\"defaults.users.actions.createUser.title\": \"Create User\",\n\t\"defaults.users.actions.createUser.description\":\n\t\t\"Create a new user account with login credentials.\",\n\t\"defaults.users.actions.createUser.fields.password.label\": \"Password\",\n\t\"defaults.users.actions.createUser.fields.password.placeholder\":\n\t\t\"Enter password\",\n\t\"defaults.users.actions.createUser.submit\": \"Create User\",\n\t\"defaults.users.actions.createUser.success\":\n\t\t\"User {{email}} created successfully. Share the credentials with the user.\",\n\t\"defaults.users.actions.createUser.errorNoAuth\":\n\t\t\"Auth client not configured. Cannot create user.\",\n\t\"defaults.users.actions.resetPassword.label\": \"Reset Password\",\n\t\"defaults.users.actions.resetPassword.title\": \"Reset Password\",\n\t\"defaults.users.actions.resetPassword.description\":\n\t\t\"Set a new password for this user.\",\n\t\"defaults.users.actions.resetPassword.fields.newPassword.label\":\n\t\t\"New Password\",\n\t\"defaults.users.actions.resetPassword.fields.newPassword.placeholder\":\n\t\t\"Enter new password\",\n\t\"defaults.users.actions.resetPassword.fields.confirmPassword.label\":\n\t\t\"Confirm Password\",\n\t\"defaults.users.actions.resetPassword.fields.confirmPassword.placeholder\":\n\t\t\"Confirm new password\",\n\t\"defaults.users.actions.resetPassword.submit\": \"Reset Password\",\n\t\"defaults.users.actions.resetPassword.success\":\n\t\t\"Password reset successfully!\",\n\t\"defaults.users.actions.resetPassword.errorMismatch\":\n\t\t\"Passwords do not match\",\n\t\"defaults.users.actions.delete.label\": \"Delete User\",\n\n\t// Assets Collection\n\t\"defaults.assets.label\": \"Media\",\n\t\"defaults.assets.description\": \"Manage uploaded files and images\",\n\t\"defaults.assets.fields.preview.label\": \"Preview\",\n\t\"defaults.assets.fields.filename.label\": \"Filename\",\n\t\"defaults.assets.fields.filename.description\":\n\t\t\"Original filename of the uploaded file\",\n\t\"defaults.assets.fields.mimeType.label\": \"Type\",\n\t\"defaults.assets.fields.mimeType.description\": \"MIME type of the file\",\n\t\"defaults.assets.fields.size.label\": \"Size (bytes)\",\n\t\"defaults.assets.fields.size.description\": \"File size in bytes\",\n\t\"defaults.assets.fields.alt.label\": \"Alt Text\",\n\t\"defaults.assets.fields.alt.placeholder\":\n\t\t\"Describe the image for accessibility\",\n\t\"defaults.assets.fields.alt.description\":\n\t\t\"Alternative text for screen readers\",\n\t\"defaults.assets.fields.caption.label\": \"Caption\",\n\t\"defaults.assets.fields.caption.placeholder\": \"Add a caption...\",\n\t\"defaults.assets.fields.visibility.label\": \"Visibility\",\n\t\"defaults.assets.fields.visibility.options.public\": \"Public\",\n\t\"defaults.assets.fields.visibility.options.private\": \"Private\",\n\t\"defaults.assets.fields.visibility.description\":\n\t\t\"Public files are accessible without authentication. Private files require a signed URL.\",\n\t\"defaults.assets.sections.fileInfo\": \"File Information\",\n\t\"defaults.assets.sections.metadata\": \"Metadata\",\n\t\"defaults.assets.sections.metadata.description\":\n\t\t\"Add descriptive information for accessibility and SEO\",\n\t\"defaults.assets.actions.upload.label\": \"Upload Files\",\n\n\t// Default Sidebar\n\t\"defaults.sidebar.administration\": \"Administration\",\n\n\t// View Options (Filter Builder)\n\t\"viewOptions.title\": \"View Options\",\n\t\"viewOptions.columns\": \"Columns\",\n\t\"viewOptions.filters\": \"Filters\",\n\t\"viewOptions.savedViews\": \"Saved Views\",\n\t\"viewOptions.apply\": \"Apply\",\n\t\"viewOptions.reset\": \"Reset\",\n\n\t// Saved Views Tab\n\t\"viewOptions.saveCurrentConfig\": \"Save Current Configuration\",\n\t\"viewOptions.viewNamePlaceholder\": \"View Name...\",\n\t\"viewOptions.saveDescription\":\n\t\t\"Saves current columns, filters, and sort order.\",\n\t\"viewOptions.noChangesToSave\": \"No filters or column changes to save.\",\n\t\"viewOptions.noSavedViews\": \"No saved views yet.\",\n\t\"viewOptions.filtersCount\": {\n\t\tone: \"{{count}} filter\",\n\t\tother: \"{{count}} filters\",\n\t},\n\t\"viewOptions.columnsCount\": { one: \"{{count}} col\", other: \"{{count}} cols\" },\n\t\"viewOptions.defaultView\": \"Default\",\n\n\t// Columns Tab\n\t\"viewOptions.columnsDragHint\":\n\t\t\"Drag to reorder, toggle to show/hide columns.\",\n\t\"viewOptions.noFieldsAvailable\": \"No fields available.\",\n\n\t// Filters Tab\n\t\"viewOptions.filtersDescription\":\n\t\t\"Narrow down your results with custom rules.\",\n\t\"viewOptions.filterNumber\": \"Filter #{{number}}\",\n\t\"viewOptions.selectField\": \"Select field\",\n\t\"viewOptions.selectOperator\": \"Select operator\",\n\t\"viewOptions.valuePlaceholder\": \"Value...\",\n\t\"viewOptions.noActiveFilters\": \"No active filters.\",\n\t\"viewOptions.addFilter\": \"Add Filter\",\n\t\"viewOptions.clearAll\": \"Clear All\",\n\t\"viewOptions.activeFilters\": {\n\t\tone: \"{{count}} filter active\",\n\t\tother: \"{{count}} filters active\",\n\t},\n\t\"viewOptions.clearFilters\": \"Clear filters\",\n\n\t// Filter Operators\n\t\"filter.contains\": \"Contains\",\n\t\"filter.notContains\": \"Does not contain\",\n\t\"filter.equals\": \"Equals\",\n\t\"filter.notEquals\": \"Does not equal\",\n\t\"filter.startsWith\": \"Starts with\",\n\t\"filter.endsWith\": \"Ends with\",\n\t\"filter.greaterThan\": \"Greater than\",\n\t\"filter.greaterThanOrEqual\": \"Greater than or equal\",\n\t\"filter.lessThan\": \"Less than\",\n\t\"filter.lessThanOrEqual\": \"Less than or equal\",\n\t\"filter.in\": \"Is any of\",\n\t\"filter.notIn\": \"Is none of\",\n\t\"filter.some\": \"Has any\",\n\t\"filter.every\": \"Has all\",\n\t\"filter.none\": \"Has none\",\n\t\"filter.isEmpty\": \"Is empty\",\n\t\"filter.isNotEmpty\": \"Is not empty\",\n\n\t// Preview\n\t\"preview.show\": \"Preview\",\n\t\"preview.hide\": \"Hide Preview\",\n\t\"preview.title\": \"Preview\",\n\t\"preview.livePreview\": \"Live Preview\",\n\t\"preview.fullscreen\": \"Fullscreen\",\n\t\"preview.close\": \"Close preview\",\n\t\"preview.loading\": \"Loading preview...\",\n\n\t// Autosave\n\t\"autosave.saving\": \"Saving...\",\n\t\"autosave.saved\": \"Saved\",\n\t\"autosave.unsavedChanges\": \"Unsaved changes\",\n\t\"autosave.justNow\": \"just now\",\n\t\"autosave.secondsAgo\": { one: \"{{count}}s ago\", other: \"{{count}}s ago\" },\n\t\"autosave.minutesAgo\": { one: \"{{count}}m ago\", other: \"{{count}}m ago\" },\n\t\"autosave.hoursAgo\": { one: \"{{count}}h ago\", other: \"{{count}}h ago\" },\n\n\t// Global Search\n\t\"globalSearch.placeholder\": \"Search collections, globals, actions, records...\",\n\t\"globalSearch.collections\": \"Collections\",\n\t\"globalSearch.globals\": \"Globals\",\n\t\"globalSearch.quickActions\": \"Quick Actions\",\n\t\"globalSearch.records\": \"Records\",\n\t\"globalSearch.createNew\": \"Create new {{name}}\",\n\t\"globalSearch.noResults\": \"No results found\",\n\t\"globalSearch.searching\": \"Searching...\",\n\t\"globalSearch.navigate\": \"to navigate\",\n\t\"globalSearch.select\": \"to select\",\n\n\t// Collection Search\n\t\"collectionSearch.placeholder\": \"Search records...\",\n\t\"collectionSearch.noResults\": \"No matching records found\",\n\t\"collectionSearch.searching\": \"Searching...\",\n} as const;\n","/**\n * Default Admin UI Messages\n *\n * Re-exports English messages as the default language.\n * For other languages, import from \"@questpie/admin/i18n/messages\".\n *\n * @example\n * ```ts\n * // Default English (always bundled)\n * import { adminMessages } from \"@questpie/admin\";\n *\n * // Add other languages\n * import { adminMessagesSK } from \"@questpie/admin/i18n/messages\";\n *\n * const admin = qa()\n * .translations({ sk: adminMessagesSK })\n * .build();\n * ```\n */\n\nimport { validationMessagesEN } from \"questpie/shared\";\nimport { adminMessagesEN } from \"./messages/en.js\";\nimport type { SimpleMessages } from \"./simple\";\n\n/**\n * Default English messages for admin UI\n * This is re-exported from messages/en.ts for backwards compatibility\n */\nexport const adminMessages: SimpleMessages = adminMessagesEN;\n\n/**\n * Convert validation messages to SimpleMessages format\n */\nfunction flattenValidationMessages(\n\tmessages: Record<string, string | { one: string; other: string }>,\n): SimpleMessages {\n\tconst result: SimpleMessages = {};\n\n\tfor (const [key, value] of Object.entries(messages)) {\n\t\tif (typeof value === \"string\") {\n\t\t\tresult[key] = value;\n\t\t} else {\n\t\t\t// Convert plural to SimpleMessages format\n\t\t\tresult[key] = { one: value.one, other: value.other };\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * All admin messages including shared validation messages\n */\nexport const allAdminMessages: SimpleMessages = {\n\t// Shared validation messages (from questpie/shared)\n\t...flattenValidationMessages(\n\t\tvalidationMessagesEN as Record<\n\t\t\tstring,\n\t\t\tstring | { one: string; other: string }\n\t\t>,\n\t),\n\t// Admin UI messages (can override validation messages if needed)\n\t...adminMessages,\n};\n\n/**\n * Get admin messages for a locale\n *\n * Returns English as fallback if locale not found.\n * Users should provide their own translations.\n */\nexport function getAdminMessages(locale: string): SimpleMessages {\n\t// For now, only English is bundled\n\t// Users can add translations via the i18n config\n\tif (locale === \"en\") {\n\t\treturn allAdminMessages;\n\t}\n\treturn allAdminMessages; // Fallback to English\n}\n\n// Re-export shared validation messages for convenience\nexport { validationMessagesEN } from \"questpie/shared\";\n","/**\n * Intl Formatters Cache\n *\n * Caches Intl formatter instances to avoid creating new ones on every call.\n * Intl formatters are expensive to create but cheap to reuse.\n */\n\n// Cache key generator - serializes locale + options\nfunction getCacheKey(locale: string, options?: object): string {\n if (!options || Object.keys(options).length === 0) {\n return locale;\n }\n return `${locale}:${JSON.stringify(options)}`;\n}\n\n// DateTimeFormat cache\nconst dateTimeFormatCache = new Map<string, Intl.DateTimeFormat>();\n\nexport function getDateTimeFormat(\n locale: string,\n options?: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat {\n const key = getCacheKey(locale, options);\n let formatter = dateTimeFormatCache.get(key);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(locale, options);\n dateTimeFormatCache.set(key, formatter);\n }\n return formatter;\n}\n\n// NumberFormat cache\nconst numberFormatCache = new Map<string, Intl.NumberFormat>();\n\nexport function getNumberFormat(\n locale: string,\n options?: Intl.NumberFormatOptions,\n): Intl.NumberFormat {\n const key = getCacheKey(locale, options);\n let formatter = numberFormatCache.get(key);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n numberFormatCache.set(key, formatter);\n }\n return formatter;\n}\n\n// PluralRules cache\nconst pluralRulesCache = new Map<string, Intl.PluralRules>();\n\nexport function getPluralRules(\n locale: string,\n options?: Intl.PluralRulesOptions,\n): Intl.PluralRules {\n const key = getCacheKey(locale, options);\n let rules = pluralRulesCache.get(key);\n if (!rules) {\n rules = new Intl.PluralRules(locale, options);\n pluralRulesCache.set(key, rules);\n }\n return rules;\n}\n\n// RelativeTimeFormat cache\nconst relativeTimeFormatCache = new Map<string, Intl.RelativeTimeFormat>();\n\nexport function getRelativeTimeFormat(\n locale: string,\n options?: Intl.RelativeTimeFormatOptions,\n): Intl.RelativeTimeFormat {\n const key = getCacheKey(locale, options);\n let formatter = relativeTimeFormatCache.get(key);\n if (!formatter) {\n formatter = new Intl.RelativeTimeFormat(locale, options);\n relativeTimeFormatCache.set(key, formatter);\n }\n return formatter;\n}\n\n// DisplayNames cache\nconst displayNamesCache = new Map<string, Intl.DisplayNames>();\n\nexport function getDisplayNames(\n locale: string,\n options: Intl.DisplayNamesOptions,\n): Intl.DisplayNames {\n const key = getCacheKey(locale, options);\n let displayNames = displayNamesCache.get(key);\n if (!displayNames) {\n displayNames = new Intl.DisplayNames([locale], options);\n displayNamesCache.set(key, displayNames);\n }\n return displayNames;\n}\n\n/**\n * Clear all caches - useful for testing or when locale changes significantly\n */\nexport function clearIntlCache(): void {\n dateTimeFormatCache.clear();\n numberFormatCache.clear();\n pluralRulesCache.clear();\n relativeTimeFormatCache.clear();\n displayNamesCache.clear();\n}\n","/**\n * Simple I18n Implementation\n *\n * A minimal i18n implementation for basic use cases.\n * For full i18n features (pluralization, ICU, etc.), use i18next or react-intl.\n *\n * Features:\n * - Basic key-value translation\n * - Simple interpolation ({{key}})\n * - Uses Intl APIs for formatting\n * - Basic pluralization via Intl.PluralRules\n */\n\nimport {\n\tgetDateTimeFormat,\n\tgetDisplayNames,\n\tgetNumberFormat,\n\tgetPluralRules,\n\tgetRelativeTimeFormat,\n} from \"./intl-cache\";\nimport type { I18nAdapter } from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Simple messages format\n */\nexport type SimpleMessages = Record<string, string | PluralMessages>;\n\n/**\n * Plural messages (using Intl.PluralRules categories)\n */\nexport type PluralMessages = {\n\tzero?: string;\n\tone: string;\n\ttwo?: string;\n\tfew?: string;\n\tmany?: string;\n\tother: string;\n};\n\n/**\n * Options for createSimpleI18n\n */\nexport interface SimpleI18nOptions {\n\t/** Initial locale */\n\tlocale: string;\n\n\t/** Available locales */\n\tlocales: string[];\n\n\t/** Messages per locale */\n\tmessages: Record<string, SimpleMessages>;\n\n\t/** Fallback locale (defaults to first in locales) */\n\tfallbackLocale?: string;\n\n\t/** Callback when locale changes */\n\tonLocaleChange?: (locale: string) => void;\n}\n\n// ============================================================================\n// RTL Detection\n// ============================================================================\n\nconst RTL_LOCALES = new Set([\"ar\", \"he\", \"fa\", \"ur\", \"ps\", \"sd\", \"yi\"]);\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Create a simple i18n adapter\n *\n * @example\n * ```ts\n * const i18n = createSimpleI18n({\n * locale: \"en\",\n * locales: [\"en\", \"de\"],\n * messages: {\n * en: {\n * \"common.save\": \"Save\",\n * \"items.count\": { one: \"{{count}} item\", other: \"{{count}} items\" }\n * },\n * de: {\n * \"common.save\": \"Speichern\",\n * \"items.count\": { one: \"{{count}} Artikel\", other: \"{{count}} Artikel\" }\n * }\n * }\n * });\n * ```\n */\nexport function createSimpleI18n(options: SimpleI18nOptions): I18nAdapter {\n\tlet currentLocale = options.locale;\n\tconst {\n\t\tlocales,\n\t\tmessages,\n\t\tfallbackLocale = locales[0],\n\t\tonLocaleChange: onLocaleChangeCallback,\n\t} = options;\n\n\t// Event listeners for locale changes\n\tconst listeners = new Set<(locale: string) => void>();\n\n\t/**\n\t * Notify all listeners about locale change\n\t */\n\tfunction notifyListeners(locale: string): void {\n\t\t// Call the initial callback if provided\n\t\tonLocaleChangeCallback?.(locale);\n\t\t// Notify all subscribed listeners\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(locale);\n\t\t}\n\t}\n\n\t/**\n\t * Get message for key in locale\n\t */\n\tfunction getMessage(\n\t\tkey: string,\n\t\tlocale: string,\n\t): string | PluralMessages | undefined {\n\t\treturn messages[locale]?.[key];\n\t}\n\n\t/**\n\t * Interpolate values into string\n\t */\n\tfunction interpolate(str: string, params?: Record<string, unknown>): string {\n\t\tif (!params) return str;\n\t\treturn str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n\t\t\tconst value = params[key];\n\t\t\treturn value !== undefined ? String(value) : `{{${key}}}`;\n\t\t});\n\t}\n\n\t/**\n\t * Check if value is plural messages\n\t */\n\tfunction isPluralMessages(value: unknown): value is PluralMessages {\n\t\treturn (\n\t\t\ttypeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t\"one\" in value &&\n\t\t\t\"other\" in value\n\t\t);\n\t}\n\n\t/**\n\t * Get plural form\n\t */\n\tfunction getPluralForm(\n\t\tforms: PluralMessages,\n\t\tcount: number,\n\t\tlocale: string,\n\t): string {\n\t\tconst rules = getPluralRules(locale);\n\t\tconst category = rules.select(count);\n\n\t\tswitch (category) {\n\t\t\tcase \"zero\":\n\t\t\t\treturn forms.zero ?? forms.other;\n\t\t\tcase \"one\":\n\t\t\t\treturn forms.one;\n\t\t\tcase \"two\":\n\t\t\t\treturn forms.two ?? forms.other;\n\t\t\tcase \"few\":\n\t\t\t\treturn forms.few ?? forms.other;\n\t\t\tcase \"many\":\n\t\t\t\treturn forms.many ?? forms.other;\n\t\t\tdefault:\n\t\t\t\treturn forms.other;\n\t\t}\n\t}\n\n\treturn {\n\t\tget locale() {\n\t\t\treturn currentLocale;\n\t\t},\n\n\t\tget locales() {\n\t\t\treturn locales;\n\t\t},\n\n\t\tt(key: string, params?: Record<string, unknown>): string {\n\t\t\t// Try current locale\n\t\t\tlet value = getMessage(key, currentLocale);\n\n\t\t\t// Fallback to fallback locale\n\t\t\tif (value === undefined && currentLocale !== fallbackLocale) {\n\t\t\t\tvalue = getMessage(key, fallbackLocale);\n\t\t\t}\n\n\t\t\t// Return key if not found\n\t\t\tif (value === undefined) {\n\t\t\t\treturn key;\n\t\t\t}\n\n\t\t\t// Handle plural forms\n\t\t\tif (isPluralMessages(value)) {\n\t\t\t\tconst count = typeof params?.count === \"number\" ? params.count : 1;\n\t\t\t\tconst form = getPluralForm(value, count, currentLocale);\n\t\t\t\treturn interpolate(form, params);\n\t\t\t}\n\n\t\t\t// Regular string\n\t\t\treturn interpolate(value, params);\n\t\t},\n\n\t\tsetLocale(locale: string): void {\n\t\t\tif (locales.includes(locale) && locale !== currentLocale) {\n\t\t\t\tcurrentLocale = locale;\n\t\t\t\tnotifyListeners(locale);\n\t\t\t}\n\t\t},\n\n\t\tonLocaleChange(callback: (locale: string) => void): () => void {\n\t\t\tlisteners.add(callback);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t};\n\t\t},\n\n\t\tformatDate(date: Date | number, opts?: Intl.DateTimeFormatOptions): string {\n\t\t\tconst d = typeof date === \"number\" ? new Date(date) : date;\n\t\t\treturn getDateTimeFormat(currentLocale, opts).format(d);\n\t\t},\n\n\t\tformatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n\t\t\treturn getNumberFormat(currentLocale, opts).format(value);\n\t\t},\n\n\t\tformatRelative(date: Date | number): string {\n\t\t\tconst d = typeof date === \"number\" ? new Date(date) : date;\n\t\t\tconst now = Date.now();\n\t\t\tconst diff = d.getTime() - now;\n\t\t\tconst diffSeconds = Math.round(diff / 1000);\n\t\t\tconst diffMinutes = Math.round(diff / 60000);\n\t\t\tconst diffHours = Math.round(diff / 3600000);\n\t\t\tconst diffDays = Math.round(diff / 86400000);\n\n\t\t\tconst rtf = getRelativeTimeFormat(currentLocale, {\n\t\t\t\tnumeric: \"auto\",\n\t\t\t});\n\n\t\t\tif (Math.abs(diffSeconds) < 60) {\n\t\t\t\treturn rtf.format(diffSeconds, \"second\");\n\t\t\t}\n\t\t\tif (Math.abs(diffMinutes) < 60) {\n\t\t\t\treturn rtf.format(diffMinutes, \"minute\");\n\t\t\t}\n\t\t\tif (Math.abs(diffHours) < 24) {\n\t\t\t\treturn rtf.format(diffHours, \"hour\");\n\t\t\t}\n\t\t\treturn rtf.format(diffDays, \"day\");\n\t\t},\n\n\t\tgetLocaleName(locale: string): string {\n\t\t\ttry {\n\t\t\t\treturn (\n\t\t\t\t\tgetDisplayNames(currentLocale, { type: \"language\" }).of(locale) ??\n\t\t\t\t\tlocale\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\treturn locale;\n\t\t\t}\n\t\t},\n\n\t\tisRTL(): boolean {\n\t\t\treturn RTL_LOCALES.has(currentLocale);\n\t\t},\n\t};\n}\n","/**\n * Type-Safe Route Builder\n *\n * Generates type-safe route helpers from admin configuration\n */\n\nimport type { Questpie } from \"questpie\";\nimport type { CollectionNames, GlobalNames, IconComponent } from \"../builder\";\nimport type { Admin } from \"../builder/admin\";\nimport type { I18nText } from \"../i18n/types\";\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\n/**\n * Collection route helpers\n */\nexport type CollectionRoutes<TName extends string> = {\n\tlist: () => string;\n\tcreate: () => string;\n\tedit: (id: string) => string;\n\tview: (id: string) => string;\n};\n\n/**\n * Global route helpers\n */\nexport type GlobalRoutes = {\n\tedit: () => string;\n};\n\n/**\n * Page route helpers\n */\nexport type PageRoutes = {\n\tview: () => string;\n};\n\n/**\n * All routes for an admin instance\n */\nexport type AdminRoutes<TApp extends Questpie<any>> = {\n\tdashboard: () => string;\n\tcollections: {\n\t\t[K in CollectionNames<TApp> & string]: CollectionRoutes<K>;\n\t};\n\tglobals: {\n\t\t[K in GlobalNames<TApp> & string]: GlobalRoutes;\n\t};\n\tpages: Record<string, PageRoutes>;\n\tauth: {\n\t\tlogin: () => string;\n\t\tlogout: () => string;\n\t\tforgotPassword: () => string;\n\t\tresetPassword: (token: string) => string;\n\t};\n};\n\n// ============================================================================\n// Route Builder\n// ============================================================================\n\n/**\n * Options for building routes\n */\nexport type BuildRoutesOptions = {\n\t/**\n\t * Base path for admin routes (default: \"/admin\")\n\t */\n\tbasePath?: string;\n};\n\n/**\n * Build type-safe routes from admin configuration\n *\n * @example\n * ```ts\n * import { buildRoutes } from \"@questpie/admin/runtime\";\n * import { appAdmin } from \"./admin\";\n *\n * const routes = buildRoutes(appAdmin);\n *\n * // Type-safe route generation\n * routes.dashboard(); // \"/admin\"\n * routes.collections.posts.list(); // \"/admin/collections/posts\"\n * routes.collections.posts.edit(\"123\"); // \"/admin/collections/posts/123/edit\"\n * routes.globals.settings.edit(); // \"/admin/globals/settings\"\n * ```\n */\nexport function buildRoutes<TApp extends Questpie<any>>(\n\tadmin: Admin,\n\toptions: BuildRoutesOptions = {},\n): AdminRoutes<TApp> {\n\tconst { basePath = \"/admin\" } = options;\n\n\t// Helper to build path\n\tconst path = (...segments: string[]) =>\n\t\t[basePath, ...segments].filter(Boolean).join(\"/\");\n\n\t// Build collection routes\n\tconst collectionNames = admin.getCollectionNames();\n\tconst collections = {} as AdminRoutes<TApp>[\"collections\"];\n\n\tfor (const name of collectionNames) {\n\t\t(collections as Record<string, CollectionRoutes<string>>)[name] = {\n\t\t\tlist: () => path(\"collections\", name),\n\t\t\tcreate: () => path(\"collections\", name, \"create\"),\n\t\t\tedit: (id: string) => path(\"collections\", name, id, \"edit\"),\n\t\t\tview: (id: string) => path(\"collections\", name, id),\n\t\t};\n\t}\n\n\t// Build global routes\n\tconst globalNames = admin.getGlobalNames();\n\tconst globals = {} as AdminRoutes<TApp>[\"globals\"];\n\n\tfor (const name of globalNames) {\n\t\t(globals as Record<string, GlobalRoutes>)[name] = {\n\t\t\tedit: () => path(\"globals\", name),\n\t\t};\n\t}\n\n\t// Build page routes\n\tconst pageConfigs = admin.getPages();\n\tconst pages: Record<string, PageRoutes> = {};\n\n\tfor (const [name, config] of Object.entries(pageConfigs)) {\n\t\tconst pagePath = (config as any).path ?? name;\n\t\tpages[name] = {\n\t\t\tview: () =>\n\t\t\t\tpagePath.startsWith(\"/\") ? pagePath : path(\"pages\", pagePath),\n\t\t};\n\t}\n\n\treturn {\n\t\tdashboard: () => basePath,\n\t\tcollections,\n\t\tglobals,\n\t\tpages,\n\t\tauth: {\n\t\t\tlogin: () => path(\"auth\", \"login\"),\n\t\t\tlogout: () => path(\"auth\", \"logout\"),\n\t\t\tforgotPassword: () => path(\"auth\", \"forgot-password\"),\n\t\t\tresetPassword: (token: string) => path(\"auth\", \"reset-password\", token),\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Navigation Builder\n// ============================================================================\n\n/**\n * Navigation item (clickable link)\n */\nexport type NavigationItem = {\n\tid: string;\n\tlabel: I18nText;\n\thref: string;\n\ticon?: IconComponent;\n\tgroup?: string;\n\torder?: number;\n\ttype: \"collection\" | \"global\" | \"page\" | \"dashboard\" | \"link\";\n};\n\n/**\n * Navigation divider (visual separator)\n */\nexport type NavigationDivider = {\n\ttype: \"divider\";\n};\n\n/**\n * Any navigation element (item or divider)\n */\nexport type NavigationElement = NavigationItem | NavigationDivider;\n\n/**\n * Navigation group/section\n */\nexport type NavigationGroup = {\n\tid?: string;\n\tlabel?: I18nText;\n\ticon?: IconComponent;\n\tcollapsed?: boolean;\n\titems: NavigationElement[];\n};\n\n/**\n * Build navigation structure from admin configuration\n *\n * @example\n * ```ts\n * import { buildNavigation } from \"@questpie/admin/runtime\";\n * import { appAdmin } from \"./admin\";\n *\n * const navigation = buildNavigation(appAdmin);\n * // Returns grouped navigation items for sidebar rendering\n * ```\n */\nexport function buildNavigation<TApp extends Questpie<any>>(\n\tadmin: Admin,\n\toptions: BuildRoutesOptions = {},\n): NavigationGroup[] {\n\tconst routes = buildRoutes(admin, options);\n\tconst items: NavigationItem[] = [];\n\n\t// Add dashboard\n\titems.push({\n\t\tid: \"dashboard\",\n\t\tlabel: \"Dashboard\",\n\t\thref: routes.dashboard(),\n\t\ticon: undefined, // Icon should be provided via sidebar config\n\t\ttype: \"dashboard\",\n\t\torder: -1000,\n\t});\n\n\t// Add collections\n\tfor (const [name, config] of Object.entries(admin.getCollections())) {\n\t\t// Access meta for new builder state structure\n\t\tconst meta = config.meta ?? config;\n\t\tif ((meta as any).hidden) continue;\n\n\t\tconst collectionRoutes = (\n\t\t\troutes.collections as Record<string, CollectionRoutes<string>>\n\t\t)[name];\n\t\tif (!collectionRoutes) continue;\n\n\t\titems.push({\n\t\t\tid: `collection:${name}`,\n\t\t\tlabel: resolveLabel((meta as any).label, name),\n\t\t\thref: collectionRoutes.list(),\n\t\t\ticon: resolveIcon((meta as any).icon),\n\t\t\tgroup: (meta as any).group,\n\t\t\torder: (meta as any).order ?? 0,\n\t\t\ttype: \"collection\",\n\t\t});\n\t}\n\n\t// Add globals\n\tfor (const [name, config] of Object.entries(admin.getGlobals())) {\n\t\t// Access meta for new builder state structure\n\t\tconst meta = config.meta ?? config;\n\t\tif ((meta as any).hidden) continue;\n\n\t\tconst globalRoutes = (routes.globals as Record<string, GlobalRoutes>)[name];\n\t\tif (!globalRoutes) continue;\n\n\t\titems.push({\n\t\t\tid: `global:${name}`,\n\t\t\tlabel: resolveLabel((meta as any).label, name),\n\t\t\thref: globalRoutes.edit(),\n\t\t\ticon: resolveIcon((meta as any).icon),\n\t\t\tgroup: (meta as any).group,\n\t\t\torder: (meta as any).order ?? 0,\n\t\t\ttype: \"global\",\n\t\t});\n\t}\n\n\t// Add pages\n\tfor (const [name, config] of Object.entries(admin.getPages())) {\n\t\tif ((config as any).showInNav === false) continue;\n\n\t\titems.push({\n\t\t\tid: `page:${name}`,\n\t\t\tlabel: resolveLabel((config as any).label, name),\n\t\t\thref: routes.pages[name].view(),\n\t\t\ticon: resolveIcon((config as any).icon),\n\t\t\tgroup: (config as any).group,\n\t\t\torder: (config as any).order ?? 0,\n\t\t\ttype: \"page\",\n\t\t});\n\t}\n\n\t// Group items\n\treturn groupNavigationItems(items, admin);\n}\n\n/**\n * Resolve label - passes through I18nText for runtime resolution\n */\nfunction resolveLabel(label: unknown, fallback: string): I18nText {\n\t// Plain string\n\tif (typeof label === \"string\") return label;\n\n\t// I18nText object (locale map or translation key) - pass through for runtime resolution\n\tif (typeof label === \"object\" && label !== null) {\n\t\treturn label as I18nText;\n\t}\n\n\t// Capitalize and format fallback\n\treturn fallback\n\t\t.replace(/([A-Z])/g, \" $1\")\n\t\t.replace(/^./, (s) => s.toUpperCase())\n\t\t.trim();\n}\n\n/**\n * Resolve icon to IconComponent\n * Only accepts React components, not strings\n */\nfunction resolveIcon(icon: unknown): IconComponent | undefined {\n\t// IconComponent is a React component type, not a string\n\tif (\n\t\ttypeof icon === \"function\" ||\n\t\t(typeof icon === \"object\" && icon !== null)\n\t) {\n\t\treturn icon as IconComponent;\n\t}\n\treturn undefined;\n}\n\n/**\n * Group navigation items based on sidebar configuration\n */\nfunction groupNavigationItems<TApp extends Questpie<any>>(\n\titems: NavigationItem[],\n\tadmin: Admin,\n): NavigationGroup[] {\n\tconst sidebarConfig = admin.getSidebar();\n\n\t// New format: sections with typed items\n\tif (sidebarConfig.sections?.length) {\n\t\treturn sidebarConfig.sections.map((section: any) => ({\n\t\t\tid: section.id,\n\t\t\tlabel: resolveLabel(section.title, \"\"),\n\t\t\ticon: resolveIcon(section.icon),\n\t\t\tcollapsed: section.collapsed,\n\t\t\titems: section.items\n\t\t\t\t.map((item: any): NavigationElement | undefined => {\n\t\t\t\t\t// Handle different item types\n\t\t\t\t\tswitch (item.type) {\n\t\t\t\t\t\tcase \"collection\": {\n\t\t\t\t\t\t\tconst found = items.find(\n\t\t\t\t\t\t\t\t(i) => i.id === `collection:${item.collection}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!found) return undefined;\n\t\t\t\t\t\t\t// Apply overrides from sidebar config\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...found,\n\t\t\t\t\t\t\t\tlabel: item.label ?? found.label,\n\t\t\t\t\t\t\t\ticon: resolveIcon(item.icon) ?? found.icon,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"global\": {\n\t\t\t\t\t\t\tconst found = items.find((i) => i.id === `global:${item.global}`);\n\t\t\t\t\t\t\tif (!found) return undefined;\n\t\t\t\t\t\t\t// Apply overrides from sidebar config\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...found,\n\t\t\t\t\t\t\t\tlabel: item.label ?? found.label,\n\t\t\t\t\t\t\t\ticon: resolveIcon(item.icon) ?? found.icon,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"page\": {\n\t\t\t\t\t\t\tconst found = items.find((i) => i.id === `page:${item.pageId}`);\n\t\t\t\t\t\t\tif (!found) return undefined;\n\t\t\t\t\t\t\t// Apply overrides from sidebar config\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...found,\n\t\t\t\t\t\t\t\tlabel: item.label ?? found.label,\n\t\t\t\t\t\t\t\ticon: resolveIcon(item.icon) ?? found.icon,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"link\":\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: `link:${item.href}`,\n\t\t\t\t\t\t\t\tlabel: resolveLabel(item.label, \"\"),\n\t\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\t\ticon: resolveIcon(item.icon),\n\t\t\t\t\t\t\t\ttype: \"link\" as const,\n\t\t\t\t\t\t\t\torder: 0,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\tcase \"divider\":\n\t\t\t\t\t\t\treturn { type: \"divider\" } as NavigationDivider;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.filter(\n\t\t\t\t\t(i: NavigationElement | undefined): i is NavigationElement =>\n\t\t\t\t\t\ti !== undefined,\n\t\t\t\t),\n\t\t}));\n\t}\n\n\t// Legacy format: groups (backward compatibility)\n\tif ((sidebarConfig as any).groups?.length) {\n\t\treturn (sidebarConfig as any).groups.map((group: any) => ({\n\t\t\tlabel: resolveLabel(group.label, \"\"),\n\t\t\titems: group.items\n\t\t\t\t.map((item: any): NavigationElement | undefined => {\n\t\t\t\t\tif (typeof item === \"string\") {\n\t\t\t\t\t\t// Find by collection/global/page name\n\t\t\t\t\t\treturn items.find(\n\t\t\t\t\t\t\t(i) =>\n\t\t\t\t\t\t\t\ti.id === `collection:${item}` ||\n\t\t\t\t\t\t\t\ti.id === `global:${item}` ||\n\t\t\t\t\t\t\t\ti.id === `page:${item}` ||\n\t\t\t\t\t\t\t\ti.id === item,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Custom item\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: item.id,\n\t\t\t\t\t\tlabel: resolveLabel(item.label, item.id),\n\t\t\t\t\t\thref: item.href ?? \"#\",\n\t\t\t\t\t\ticon: resolveIcon(item.icon),\n\t\t\t\t\t\ttype: \"link\" as const,\n\t\t\t\t\t\torder: (item as any).order ?? 0,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.filter(\n\t\t\t\t\t(i: NavigationElement | undefined): i is NavigationElement =>\n\t\t\t\t\t\ti !== undefined,\n\t\t\t\t),\n\t\t}));\n\t}\n\n\t// Auto-group by group property (fallback)\n\tconst groups = new Map<string | undefined, NavigationItem[]>();\n\n\t// Sort items by order\n\tconst sortedItems = [...items].sort(\n\t\t(a, b) => (a.order ?? 0) - (b.order ?? 0),\n\t);\n\n\tfor (const item of sortedItems) {\n\t\tconst groupKey = item.group;\n\t\tif (!groups.has(groupKey)) {\n\t\t\tgroups.set(groupKey, []);\n\t\t}\n\t\tgroups.get(groupKey)!.push(item);\n\t}\n\n\t// Convert to array, ungrouped items first\n\tconst result: NavigationGroup[] = [];\n\n\t// Add ungrouped items first\n\tconst ungrouped = groups.get(undefined);\n\tif (ungrouped?.length) {\n\t\tresult.push({ items: ungrouped });\n\t}\n\n\t// Add grouped items\n\tfor (const [label, groupItems] of groups) {\n\t\tif (label === undefined) continue;\n\t\tresult.push({ label, items: groupItems });\n\t}\n\n\treturn result;\n}\n","/**\n * Admin Provider\n *\n * React context provider for the admin UI using Zustand store from props pattern.\n * This enables optimized re-renders through selectors.\n */\n\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport type { QuestpieClient } from \"questpie/client\";\nimport { DEFAULT_LOCALE } from \"questpie/shared\";\nimport {\n\tcreateContext,\n\ttype ReactElement,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n} from \"react\";\nimport { createStore, useStore } from \"zustand\";\nimport type { adminModule } from \"#questpie/admin/server/index.js\";\nimport { Admin, type AdminInput } from \"../builder/admin\";\nimport { I18nProvider, resolveTextSync } from \"../i18n/hooks\";\nimport { adminMessages } from \"../i18n/messages\";\nimport { createSimpleI18n, type SimpleMessages } from \"../i18n/simple\";\nimport type { I18nAdapter } from \"../i18n/types\";\nimport { ContentLocalesProvider } from \"./content-locales-provider\";\nimport { buildNavigation, type NavigationGroup } from \"./routes\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Cookie for UI locale (admin interface language) */\nconst UI_LOCALE_COOKIE = \"questpie_ui_locale\";\n/** Cookie for content locale (CMS content language) */\nconst CONTENT_LOCALE_COOKIE = \"questpie_content_locale\";\n/** Cookie max age (1 year) */\nconst LOCALE_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\n\n// Legacy cookie name for backwards compatibility\nconst LEGACY_LOCALE_COOKIE = \"questpie_locale\";\n\n// ============================================================================\n// Cookie Helpers\n// ============================================================================\n\nfunction getCookie(name: string): string | null {\n\tif (typeof document === \"undefined\") return null;\n\tconst match = document.cookie.match(new RegExp(`${name}=([^;]+)`));\n\treturn match ? match[1] : null;\n}\n\nfunction setCookie(name: string, value: string): void {\n\tif (typeof document === \"undefined\") return;\n\t// biome-ignore lint/suspicious/noDocumentCookie: this string is ok\n\tdocument.cookie = `${name}=${value}; path=/; max-age=${LOCALE_COOKIE_MAX_AGE}; SameSite=Lax`;\n}\n\nfunction getUiLocaleFromCookie(): string | null {\n\t// Try new cookie first, fall back to legacy\n\treturn getCookie(UI_LOCALE_COOKIE) ?? getCookie(LEGACY_LOCALE_COOKIE);\n}\n\nfunction getContentLocaleFromCookie(): string | null {\n\t// Try new cookie first, fall back to legacy\n\treturn getCookie(CONTENT_LOCALE_COOKIE) ?? getCookie(LEGACY_LOCALE_COOKIE);\n}\n\nfunction setUiLocaleCookie(locale: string): void {\n\tsetCookie(UI_LOCALE_COOKIE, locale);\n}\n\nfunction setContentLocaleCookie(locale: string): void {\n\tsetCookie(CONTENT_LOCALE_COOKIE, locale);\n}\n\n// ============================================================================\n// Store Types\n// ============================================================================\n\nexport interface AdminState {\n\t// Core values (from props)\n\tadmin: Admin;\n\tclient: QuestpieClient<(typeof adminModule)[\"$inferCms\"]>;\n\tauthClient: any | null;\n\tbasePath: string;\n\tnavigate: (path: string) => void;\n\n\t// Content locale state (CMS content language)\n\t// Note: UI locale is managed by I18n adapter, not the store\n\tcontentLocale: string;\n\tsetContentLocale: (locale: string) => void;\n\n\t// Derived/cached values\n\tnavigation: NavigationGroup[];\n\tbrandName: string;\n}\n\nexport type AdminStore = ReturnType<typeof createAdminStore>;\n\n// ============================================================================\n// Store Factory\n// ============================================================================\n\ninterface CreateAdminStoreProps {\n\tadmin: Admin;\n\tclient: QuestpieClient<any>;\n\tauthClient: any | null;\n\tbasePath: string;\n\tnavigate: (path: string) => void;\n\tinitialContentLocale: string;\n}\n\nfunction createAdminStore({\n\tadmin,\n\tclient,\n\tauthClient,\n\tbasePath,\n\tnavigate,\n\tinitialContentLocale,\n}: CreateAdminStoreProps) {\n\tif (client && initialContentLocale && \"setLocale\" in client) {\n\t\t(client as any).setLocale(initialContentLocale);\n\t}\n\n\treturn createStore<AdminState>((set) => ({\n\t\t// Core values\n\t\tadmin,\n\t\tclient,\n\t\tauthClient,\n\t\tbasePath,\n\t\tnavigate,\n\n\t\t// Content Locale (CMS content language)\n\t\t// Note: UI locale is managed by I18n adapter, not the store\n\t\tcontentLocale: initialContentLocale,\n\t\tsetContentLocale: (newLocale: string) => {\n\t\t\tsetContentLocaleCookie(newLocale);\n\t\t\tset({ contentLocale: newLocale });\n\t\t},\n\n\t\t// Derived values (computed once, updated when needed)\n\t\tnavigation: buildNavigation(admin, { basePath }),\n\t\tbrandName: resolveTextSync(admin.getBranding().name, \"Admin\"),\n\t}));\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst AdminStoreContext = createContext<AdminStore | null>(null);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface AdminProviderProps {\n\t/**\n\t * Admin configuration - pass your AdminBuilder directly.\n\t * Can also accept an Admin instance for backward compatibility.\n\t */\n\tadmin: AdminInput<any>;\n\n\t/**\n\t * The API client for data fetching\n\t */\n\tclient: QuestpieClient<any>;\n\n\t/**\n\t * The auth client for authentication (created via createAdminAuthClient)\n\t */\n\tauthClient?: any;\n\n\t/**\n\t * Base path for admin routes (default: \"/admin\")\n\t */\n\tbasePath?: string;\n\n\t/**\n\t * Navigate function for routing\n\t */\n\tnavigate?: (path: string) => void;\n\n\t/**\n\t * Initial UI locale (admin interface language)\n\t * If not provided, reads from cookie or uses default from admin config\n\t */\n\tinitialUiLocale?: string;\n\n\t/**\n\t * Initial content locale (CMS content language)\n\t * If not provided, reads from cookie or uses default from admin config\n\t */\n\tinitialContentLocale?: string;\n\n\t/**\n\t * Optional query client (if not provided, uses the nearest QueryClientProvider)\n\t */\n\tqueryClient?: QueryClient;\n\n\t/**\n\t * Optional custom i18n adapter\n\t * If not provided, uses the built-in simple i18n with admin messages\n\t */\n\ti18nAdapter?: I18nAdapter;\n\n\t/**\n\t * Children to render\n\t */\n\tchildren: ReactNode;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Merge admin messages with custom translations\n */\nfunction mergeMessages(\n\tbaseMessages: SimpleMessages,\n\tcustomTranslations: Record<string, SimpleMessages> | undefined,\n): Record<string, SimpleMessages> {\n\t// Start with base English messages\n\tconst result: Record<string, SimpleMessages> = {\n\t\ten: { ...baseMessages },\n\t};\n\n\tif (!customTranslations) return result;\n\n\t// Merge custom translations\n\tfor (const [locale, messages] of Object.entries(customTranslations)) {\n\t\tresult[locale] = {\n\t\t\t...(result[locale] ?? {}),\n\t\t\t...messages,\n\t\t};\n\t}\n\n\treturn result;\n}\n\n/**\n * Admin provider component\n *\n * Creates a scoped Zustand store for admin state management.\n * Use `useAdminStore(selector)` to access state with optimized re-renders.\n *\n * @example\n * ```tsx\n * import { AdminProvider, useAdminStore } from \"@questpie/admin/runtime\";\n *\n * function App() {\n * return (\n * <AdminProvider admin={admin} client={client}>\n * <MyComponent />\n * </AdminProvider>\n * );\n * }\n *\n * function MyComponent() {\n * // Only re-renders when locale changes\n * const locale = useAdminStore((s) => s.locale);\n * const setLocale = useAdminStore((s) => s.setLocale);\n * // ...\n * }\n * ```\n */\nexport function AdminProvider({\n\tadmin: adminInput,\n\tclient,\n\tauthClient,\n\tbasePath = \"/admin\",\n\tnavigate: navigateProp,\n\tinitialUiLocale,\n\tinitialContentLocale,\n\ti18nAdapter: customI18nAdapter,\n\tchildren,\n}: AdminProviderProps): ReactElement {\n\t// Normalize admin input - accepts both AdminBuilder and Admin instance\n\tconst admin = Admin.normalize(adminInput);\n\n\t// Default navigate function\n\tconst navigate =\n\t\tnavigateProp ??\n\t\t((path: string) => {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\twindow.location.href = path;\n\t\t\t}\n\t\t});\n\n\t// Get initial locales\n\tconst localeConfig = admin.getLocale();\n\tconst defaultLocale = localeConfig.default ?? DEFAULT_LOCALE;\n\n\t// Resolve UI locale (admin interface language)\n\tconst resolvedUiLocale =\n\t\tinitialUiLocale ?? getUiLocaleFromCookie() ?? defaultLocale;\n\n\t// Resolve content locale (CMS content language)\n\tconst resolvedContentLocale =\n\t\tinitialContentLocale ?? getContentLocaleFromCookie() ?? defaultLocale;\n\n\t// Create store (once per provider instance)\n\tconst storeRef = useRef<AdminStore | null>(null);\n\tif (!storeRef.current) {\n\t\tstoreRef.current = createAdminStore({\n\t\t\tadmin,\n\t\t\tclient,\n\t\t\tauthClient: authClient ?? null,\n\t\t\tbasePath,\n\t\t\tnavigate,\n\t\t\tinitialContentLocale: resolvedContentLocale,\n\t\t});\n\t}\n\n\tuseEffect(() => {\n\t\tif (storeRef.current) {\n\t\t\tstoreRef.current.setState({\n\t\t\t\tadmin,\n\t\t\t\tnavigation: buildNavigation(admin, { basePath }),\n\t\t\t\tbrandName: resolveTextSync(admin.getBranding().name, \"Admin\"),\n\t\t\t});\n\t\t}\n\t}, [admin, basePath]);\n\n\t// Create i18n adapter (once per provider instance)\n\t// Note: i18n adapter uses UI locale for admin interface translations\n\tconst i18nAdapterRef = useRef<I18nAdapter | null>(null);\n\tif (!i18nAdapterRef.current) {\n\t\tif (customI18nAdapter) {\n\t\t\ti18nAdapterRef.current = customI18nAdapter;\n\t\t} else {\n\t\t\t// Get translations from admin builder state\n\t\t\tconst translations = admin.getTranslations() as\n\t\t\t\t| Record<string, SimpleMessages>\n\t\t\t\t| undefined;\n\t\t\tconst messages = mergeMessages(adminMessages, translations);\n\n\t\t\ti18nAdapterRef.current = createSimpleI18n({\n\t\t\t\tlocale: resolvedUiLocale,\n\t\t\t\tlocales: localeConfig.supported ?? [DEFAULT_LOCALE],\n\t\t\t\tmessages,\n\t\t\t\tfallbackLocale: defaultLocale,\n\t\t\t\t// Persist UI locale to cookie when it changes\n\t\t\t\tonLocaleChange: setUiLocaleCookie,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Get content locale from store for reactive updates\n\tconst contentLocale = useStore(storeRef.current, (s) => s.contentLocale);\n\n\t// Sync content locale changes to API client\n\t// This sets Accept-Language header for all API requests\n\tuseEffect(() => {\n\t\tif (client && contentLocale && \"setLocale\" in client) {\n\t\t\t(client as any).setLocale(contentLocale);\n\t\t}\n\t}, [client, contentLocale]);\n\n\treturn (\n\t\t<AdminStoreContext.Provider value={storeRef.current}>\n\t\t\t<I18nProvider adapter={i18nAdapterRef.current}>\n\t\t\t\t<ContentLocalesProvider>{children}</ContentLocalesProvider>\n\t\t\t</I18nProvider>\n\t\t</AdminStoreContext.Provider>\n\t);\n}\n\n// ============================================================================\n// Store Hooks\n// ============================================================================\n\n/**\n * Access admin store with a selector for optimized re-renders.\n *\n * @example\n * ```tsx\n * // Only re-renders when locale changes\n * const locale = useAdminStore((s) => s.locale);\n *\n * // Get multiple values (re-renders when any changes)\n * const { admin, client } = useAdminStore((s) => ({\n * admin: s.admin,\n * client: s.client,\n * }));\n *\n * // Get navigation (computed once)\n * const navigation = useAdminStore((s) => s.navigation);\n * ```\n */\nexport function useAdminStore<T>(selector: (state: AdminState) => T): T {\n\tconst store = useContext(AdminStoreContext);\n\tif (!store) {\n\t\tthrow new Error(\n\t\t\t\"useAdminStore must be used within AdminProvider. \" +\n\t\t\t\t\"Wrap your app with <AdminProvider admin={admin} client={client}>\",\n\t\t);\n\t}\n\treturn useStore(store, selector);\n}\n\n/**\n * Check if currently inside AdminProvider.\n * Useful for components that can work both with and without context.\n *\n * @example\n * ```tsx\n * const hasProvider = useHasAdminProvider();\n * ```\n */\nexport function useHasAdminProvider(): boolean {\n\tconst store = useContext(AdminStoreContext);\n\treturn store !== null;\n}\n\n/**\n * Get the raw store from context (or null if outside provider).\n * For advanced use cases where you need conditional store access.\n */\nexport function useAdminStoreRaw(): AdminStore | null {\n\treturn useContext(AdminStoreContext);\n}\n\n// ============================================================================\n// Convenience Selectors\n// ============================================================================\n\n/** Select admin instance */\nexport const selectAdmin = (s: AdminState) => s.admin;\n\n/** Select client instance */\nexport const selectClient = (s: AdminState) => s.client;\n\n/** Select auth client instance */\nexport const selectAuthClient = (s: AdminState) => s.authClient;\n\n/** Select base path */\nexport const selectBasePath = (s: AdminState) => s.basePath;\n\n/** Select navigate function */\nexport const selectNavigate = (s: AdminState) => s.navigate;\n\n/** Select current content locale (CMS content language) */\nexport const selectContentLocale = (s: AdminState) => s.contentLocale;\n\n/** Select setContentLocale function */\nexport const selectSetContentLocale = (s: AdminState) => s.setContentLocale;\n\n/** Select navigation groups */\nexport const selectNavigation = (s: AdminState) => s.navigation;\n\n/** Select brand name */\nexport const selectBrandName = (s: AdminState) => s.brandName;\n","/**\n * Content Locales Provider\n *\n * Fetches and provides content locales from the backend CMS configuration.\n * Content locales are different from UI locales - they define which languages\n * are available for content translation.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { DEFAULT_LOCALE } from \"questpie/shared\";\nimport {\n\tcreateContext,\n\ttype ReactElement,\n\ttype ReactNode,\n\tuseContext,\n} from \"react\";\nimport { selectClient, useAdminStore } from \"./provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContentLocale {\n\t/** Locale code (e.g. \"en\", \"sk\", \"en-US\") */\n\tcode: string;\n\t/** Human-readable label (e.g. \"English\", \"Slovenčina\") */\n\tlabel?: string;\n\t/** Is this the fallback locale? */\n\tfallback?: boolean;\n\t/** Custom country code for flag display (e.g. \"us\" for \"en\") */\n\tflagCountryCode?: string;\n}\n\nexport interface ContentLocalesData {\n\t/** Available content locales */\n\tlocales: ContentLocale[];\n\t/** Default locale code */\n\tdefaultLocale: string;\n\t/** Fallback locale mappings (e.g. { \"en-GB\": \"en\" }) */\n\tfallbacks?: Record<string, string>;\n}\n\nexport interface ContentLocalesContextValue extends ContentLocalesData {\n\t/** Check if localization is enabled (more than one locale) */\n\tisLocalized: boolean;\n\t/** Get the human-readable label for a locale code */\n\tgetLocaleLabel: (code: string) => string;\n\t/** Check if a locale code is valid */\n\tisValidLocale: (code: string) => boolean;\n\t/** Get fallback locale for a given locale */\n\tgetFallbackLocale: (code: string) => string;\n\t/** Loading state */\n\tisLoading: boolean;\n\t/** Error state */\n\terror: Error | null;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ContentLocalesContext = createContext<ContentLocalesContextValue | null>(\n\tnull,\n);\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\nconst DEFAULT_LOCALES: ContentLocalesData = {\n\tlocales: [{ code: DEFAULT_LOCALE, label: \"English\", fallback: true }],\n\tdefaultLocale: DEFAULT_LOCALE,\n};\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport interface ContentLocalesProviderProps {\n\tchildren: ReactNode;\n}\n\n/**\n * Content Locales Provider\n *\n * Fetches content locales from the backend and provides them to the UI.\n * Must be used inside AdminProvider to access the client.\n *\n * @example\n * ```tsx\n * <AdminProvider admin={admin} client={client}>\n * <ContentLocalesProvider>\n * <App />\n * </ContentLocalesProvider>\n * </AdminProvider>\n * ```\n */\nexport function ContentLocalesProvider({\n\tchildren,\n}: ContentLocalesProviderProps): ReactElement {\n\tconst client = useAdminStore(selectClient);\n\n\tconst { data, isLoading, error } = useQuery({\n\t\tqueryKey: [\"cms\", \"contentLocales\"],\n\t\tqueryFn: async () => {\n\t\t\ttry {\n\t\t\t\t// Use type assertion since the client type may not include getContentLocales\n\t\t\t\t// depending on which modules are used\n\t\t\t\tconst result = await (client as any).functions.getContentLocales({});\n\t\t\t\treturn result as ContentLocalesData;\n\t\t\t} catch {\n\t\t\t\t// If the function doesn't exist, return default locales\n\t\t\t\treturn DEFAULT_LOCALES;\n\t\t\t}\n\t\t},\n\t\tstaleTime: 5 * 60 * 1000, // Cache for 5 minutes\n\t\tgcTime: 10 * 60 * 1000, // Keep in cache for 10 minutes\n\t});\n\n\tconst localesData = data ?? DEFAULT_LOCALES;\n\n\tconst value: ContentLocalesContextValue = {\n\t\t...localesData,\n\t\tisLocalized: localesData.locales.length > 1,\n\t\tisLoading,\n\t\terror: error as Error | null,\n\n\t\tgetLocaleLabel: (code: string): string => {\n\t\t\tconst locale = localesData.locales.find((l) => l.code === code);\n\t\t\treturn locale?.label ?? code.toUpperCase();\n\t\t},\n\n\t\tisValidLocale: (code: string): boolean => {\n\t\t\treturn localesData.locales.some((l) => l.code === code);\n\t\t},\n\n\t\tgetFallbackLocale: (code: string): string => {\n\t\t\t// Check explicit fallbacks first\n\t\t\tif (localesData.fallbacks?.[code]) {\n\t\t\t\treturn localesData.fallbacks[code];\n\t\t\t}\n\t\t\t// Return default locale\n\t\t\treturn localesData.defaultLocale;\n\t\t},\n\t};\n\n\treturn (\n\t\t<ContentLocalesContext.Provider value={value}>\n\t\t\t{children}\n\t\t</ContentLocalesContext.Provider>\n\t);\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Get content locales from context.\n *\n * Must be used inside ContentLocalesProvider.\n * Returns locale data, helper functions, and loading state.\n *\n * @example\n * ```tsx\n * function LocaleSwitcher() {\n * const {\n * locales,\n * defaultLocale,\n * isLocalized,\n * getLocaleLabel,\n * } = useContentLocales();\n *\n * if (!isLocalized) return null;\n *\n * return (\n * <select>\n * {locales.map(l => (\n * <option key={l.code} value={l.code}>\n * {getLocaleLabel(l.code)}\n * </option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */\nexport function useContentLocales(): ContentLocalesContextValue {\n\tconst context = useContext(ContentLocalesContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useContentLocales must be used within ContentLocalesProvider. \" +\n\t\t\t\t\"Wrap your app with <ContentLocalesProvider> inside <AdminProvider>.\",\n\t\t);\n\t}\n\treturn context;\n}\n\n/**\n * Safely get content locales from context.\n * Returns null if not inside provider (useful for optional features).\n */\nexport function useSafeContentLocales(): ContentLocalesContextValue | null {\n\treturn useContext(ContentLocalesContext);\n}\n"],"mappings":"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"}