@modern-admin/web 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/standalone/assets/{ai-assistant-widget-laqH_9UQ.js → ai-assistant-widget-DU9YZkvm.js} +2 -2
- package/dist/standalone/assets/ai-assistant-widget-DU9YZkvm.js.br +0 -0
- package/dist/standalone/assets/ai-assistant-widget-DU9YZkvm.js.gz +0 -0
- package/dist/standalone/assets/{ai-assistant-widget-laqH_9UQ.js.map → ai-assistant-widget-DU9YZkvm.js.map} +1 -1
- package/dist/standalone/assets/{audit-log-page-3t8elFPn.js → audit-log-page-8Gv2dmY7.js} +2 -2
- package/dist/standalone/assets/audit-log-page-8Gv2dmY7.js.br +0 -0
- package/dist/standalone/assets/audit-log-page-8Gv2dmY7.js.gz +0 -0
- package/dist/standalone/assets/{audit-log-page-3t8elFPn.js.map → audit-log-page-8Gv2dmY7.js.map} +1 -1
- package/dist/standalone/assets/{calendar-C1Ecnytz.js → calendar-BObEBLfG.js} +2 -2
- package/dist/standalone/assets/calendar-BObEBLfG.js.br +0 -0
- package/dist/standalone/assets/calendar-BObEBLfG.js.gz +0 -0
- package/dist/standalone/assets/{calendar-C1Ecnytz.js.map → calendar-BObEBLfG.js.map} +1 -1
- package/dist/standalone/assets/chart-widget-BWFpFuqE.js +2 -0
- package/dist/standalone/assets/chart-widget-BWFpFuqE.js.br +0 -0
- package/dist/standalone/assets/chart-widget-BWFpFuqE.js.gz +0 -0
- package/dist/standalone/assets/chart-widget-BWFpFuqE.js.map +1 -0
- package/dist/standalone/assets/{command-C1FjGx6t.js → command-BXuvMfZb.js} +2 -2
- package/dist/standalone/assets/command-BXuvMfZb.js.br +0 -0
- package/dist/standalone/assets/command-BXuvMfZb.js.gz +0 -0
- package/dist/standalone/assets/{command-C1FjGx6t.js.map → command-BXuvMfZb.js.map} +1 -1
- package/dist/standalone/assets/{date-picker-DVnnp1Ez.js → date-picker-r8u06XBh.js} +2 -2
- package/dist/standalone/assets/date-picker-r8u06XBh.js.br +0 -0
- package/dist/standalone/assets/date-picker-r8u06XBh.js.gz +0 -0
- package/dist/standalone/assets/{date-picker-DVnnp1Ez.js.map → date-picker-r8u06XBh.js.map} +1 -1
- package/dist/standalone/assets/{dist-DuSTm0pk.js → dist-Dkym1-ts.js} +2 -2
- package/dist/standalone/assets/dist-Dkym1-ts.js.br +0 -0
- package/dist/standalone/assets/dist-Dkym1-ts.js.gz +0 -0
- package/dist/standalone/assets/{dist-DuSTm0pk.js.map → dist-Dkym1-ts.js.map} +1 -1
- package/dist/standalone/assets/{edit-page-DFmI1Ckp.js → edit-page-BmisHwux.js} +2 -2
- package/dist/standalone/assets/edit-page-BmisHwux.js.br +0 -0
- package/dist/standalone/assets/edit-page-BmisHwux.js.gz +0 -0
- package/dist/standalone/assets/{edit-page-DFmI1Ckp.js.map → edit-page-BmisHwux.js.map} +1 -1
- package/dist/standalone/assets/{empty-D9nNJb_Y.js → empty-Ccn1VX37.js} +2 -2
- package/dist/standalone/assets/empty-Ccn1VX37.js.br +0 -0
- package/dist/standalone/assets/empty-Ccn1VX37.js.gz +0 -0
- package/dist/standalone/assets/{empty-D9nNJb_Y.js.map → empty-Ccn1VX37.js.map} +1 -1
- package/dist/standalone/assets/{global-search-dialog--zUHqLIo.js → global-search-dialog-DdRt4k5C.js} +2 -2
- package/dist/standalone/assets/global-search-dialog-DdRt4k5C.js.br +0 -0
- package/dist/standalone/assets/global-search-dialog-DdRt4k5C.js.gz +0 -0
- package/dist/standalone/assets/{global-search-dialog--zUHqLIo.js.map → global-search-dialog-DdRt4k5C.js.map} +1 -1
- package/dist/standalone/assets/{heavy-fields-Ctx9uZME.js → heavy-fields-CVzRBLt9.js} +2 -2
- package/dist/standalone/assets/heavy-fields-CVzRBLt9.js.br +0 -0
- package/dist/standalone/assets/heavy-fields-CVzRBLt9.js.gz +0 -0
- package/dist/standalone/assets/{heavy-fields-Ctx9uZME.js.map → heavy-fields-CVzRBLt9.js.map} +1 -1
- package/dist/standalone/assets/home-page-DyNb5GLu.js +3 -0
- package/dist/standalone/assets/home-page-DyNb5GLu.js.br +0 -0
- package/dist/standalone/assets/home-page-DyNb5GLu.js.gz +0 -0
- package/dist/standalone/assets/home-page-DyNb5GLu.js.map +1 -0
- package/dist/standalone/assets/icon-registry-FPXh-kNm.js +2 -0
- package/dist/standalone/assets/icon-registry-FPXh-kNm.js.br +0 -0
- package/dist/standalone/assets/icon-registry-FPXh-kNm.js.gz +0 -0
- package/dist/standalone/assets/icon-registry-FPXh-kNm.js.map +1 -0
- package/dist/standalone/assets/{index-Ldci8MK5.js → index-CSV54Ic9.js} +4 -4
- package/dist/standalone/assets/index-CSV54Ic9.js.br +0 -0
- package/dist/standalone/assets/index-CSV54Ic9.js.gz +0 -0
- package/dist/standalone/assets/{index-Ldci8MK5.js.map → index-CSV54Ic9.js.map} +1 -1
- package/dist/standalone/assets/index-OvloY2cG.css +2 -0
- package/dist/standalone/assets/index-OvloY2cG.css.br +0 -0
- package/dist/standalone/assets/index-OvloY2cG.css.gz +0 -0
- package/dist/standalone/assets/{json-editor-DwQqN8OM.js → json-editor-D6vtFyYl.js} +2 -2
- package/dist/standalone/assets/json-editor-D6vtFyYl.js.br +0 -0
- package/dist/standalone/assets/json-editor-D6vtFyYl.js.gz +0 -0
- package/dist/standalone/assets/{json-editor-DwQqN8OM.js.map → json-editor-D6vtFyYl.js.map} +1 -1
- package/dist/standalone/assets/palette-DVP_4RAn.js +2 -0
- package/dist/standalone/assets/palette-DVP_4RAn.js.map +1 -0
- package/dist/standalone/assets/{folder-plus-DebVc0CA.js → pipette-CqHYfQnn.js} +2 -2
- package/dist/standalone/assets/pipette-CqHYfQnn.js.br +0 -0
- package/dist/standalone/assets/pipette-CqHYfQnn.js.gz +0 -0
- package/dist/standalone/assets/pipette-CqHYfQnn.js.map +1 -0
- package/dist/standalone/assets/property-renderer-BGU_or5z.js +7 -0
- package/dist/standalone/assets/property-renderer-BGU_or5z.js.br +0 -0
- package/dist/standalone/assets/property-renderer-BGU_or5z.js.gz +0 -0
- package/dist/standalone/assets/property-renderer-BGU_or5z.js.map +1 -0
- package/dist/standalone/assets/{reference-053-L2WD.js → reference-Dfum6XNs.js} +2 -2
- package/dist/standalone/assets/reference-Dfum6XNs.js.br +0 -0
- package/dist/standalone/assets/reference-Dfum6XNs.js.gz +0 -0
- package/dist/standalone/assets/{reference-053-L2WD.js.map → reference-Dfum6XNs.js.map} +1 -1
- package/dist/standalone/assets/refresh-cw-B2G7AzZh.js +2 -0
- package/dist/standalone/assets/refresh-cw-B2G7AzZh.js.map +1 -0
- package/dist/standalone/assets/{revisions-button-B4wc6uYi.js → revisions-button-B1CRVduG.js} +2 -2
- package/dist/standalone/assets/revisions-button-B1CRVduG.js.br +0 -0
- package/dist/standalone/assets/revisions-button-B1CRVduG.js.gz +0 -0
- package/dist/standalone/assets/{revisions-button-B4wc6uYi.js.map → revisions-button-B1CRVduG.js.map} +1 -1
- package/dist/standalone/assets/router-DmBe_NWn.js +186 -0
- package/dist/standalone/assets/router-DmBe_NWn.js.br +0 -0
- package/dist/standalone/assets/router-DmBe_NWn.js.gz +0 -0
- package/dist/standalone/assets/router-DmBe_NWn.js.map +1 -0
- package/dist/standalone/assets/{select-B6fxO2bI.js → select-JdSGjgiW.js} +2 -2
- package/dist/standalone/assets/select-JdSGjgiW.js.br +0 -0
- package/dist/standalone/assets/select-JdSGjgiW.js.gz +0 -0
- package/dist/standalone/assets/{select-B6fxO2bI.js.map → select-JdSGjgiW.js.map} +1 -1
- package/dist/standalone/assets/{settings-page-BRhIGsdX.js → settings-page-7eRUjHFt.js} +2 -2
- package/dist/standalone/assets/settings-page-7eRUjHFt.js.br +0 -0
- package/dist/standalone/assets/settings-page-7eRUjHFt.js.gz +0 -0
- package/dist/standalone/assets/{settings-page-BRhIGsdX.js.map → settings-page-7eRUjHFt.js.map} +1 -1
- package/dist/standalone/assets/{show-page-BJt9Kmdd.js → show-page-CwO3Y0ej.js} +2 -2
- package/dist/standalone/assets/show-page-CwO3Y0ej.js.br +0 -0
- package/dist/standalone/assets/show-page-CwO3Y0ej.js.gz +0 -0
- package/dist/standalone/assets/{show-page-BJt9Kmdd.js.map → show-page-CwO3Y0ej.js.map} +1 -1
- package/dist/standalone/assets/{tabs-BgR4QuFh.js → tabs-CfQ4jLnP.js} +2 -2
- package/dist/standalone/assets/tabs-CfQ4jLnP.js.br +0 -0
- package/dist/standalone/assets/tabs-CfQ4jLnP.js.gz +0 -0
- package/dist/standalone/assets/{tabs-BgR4QuFh.js.map → tabs-CfQ4jLnP.js.map} +1 -1
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js +2 -0
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.br +0 -0
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.gz +0 -0
- package/dist/standalone/assets/use-dashboard-charts-Cr3OUSL5.js.map +1 -0
- package/dist/standalone/assets/{useQueries-BblIcy3I.js → useQueries-CX5Gh6HV.js} +2 -2
- package/dist/standalone/assets/useQueries-CX5Gh6HV.js.br +0 -0
- package/dist/standalone/assets/useQueries-CX5Gh6HV.js.gz +0 -0
- package/dist/standalone/assets/{useQueries-BblIcy3I.js.map → useQueries-CX5Gh6HV.js.map} +1 -1
- package/dist/standalone/assets/{user-directory-bre0Sulk.js → user-directory-ZxAjN_q9.js} +2 -2
- package/dist/standalone/assets/user-directory-ZxAjN_q9.js.br +0 -0
- package/dist/standalone/assets/user-directory-ZxAjN_q9.js.gz +0 -0
- package/dist/standalone/assets/{user-directory-bre0Sulk.js.map → user-directory-ZxAjN_q9.js.map} +1 -1
- package/dist/standalone/assets/value-format-Jmqe1qUg.js +60 -0
- package/dist/standalone/assets/value-format-Jmqe1qUg.js.br +0 -0
- package/dist/standalone/assets/value-format-Jmqe1qUg.js.gz +0 -0
- package/dist/standalone/assets/value-format-Jmqe1qUg.js.map +1 -0
- package/dist/standalone/assets/{wizard-create-page-3rZPPXLK.js → wizard-create-page-Bvgp93cM.js} +2 -2
- package/dist/standalone/assets/wizard-create-page-Bvgp93cM.js.br +0 -0
- package/dist/standalone/assets/wizard-create-page-Bvgp93cM.js.gz +0 -0
- package/dist/standalone/assets/{wizard-create-page-3rZPPXLK.js.map → wizard-create-page-Bvgp93cM.js.map} +1 -1
- package/dist/standalone/assets/zap-Be2c7_cs.js +2 -0
- package/dist/standalone/assets/zap-Be2c7_cs.js.br +0 -0
- package/dist/standalone/assets/zap-Be2c7_cs.js.gz +0 -0
- package/dist/standalone/assets/zap-Be2c7_cs.js.map +1 -0
- package/dist/standalone/assets/{zod-BVYoAymF.js → zod-BE6onVrX.js} +2 -2
- package/dist/standalone/assets/zod-BE6onVrX.js.br +0 -0
- package/dist/standalone/assets/zod-BE6onVrX.js.gz +0 -0
- package/dist/standalone/assets/{zod-BVYoAymF.js.map → zod-BE6onVrX.js.map} +1 -1
- package/dist/standalone/index.html +7 -7
- package/dist/standalone/index.html.br +0 -0
- package/dist/standalone/index.html.gz +0 -0
- package/package.json +5 -5
- package/dist/standalone/assets/ai-assistant-widget-laqH_9UQ.js.br +0 -0
- package/dist/standalone/assets/ai-assistant-widget-laqH_9UQ.js.gz +0 -0
- package/dist/standalone/assets/audit-log-page-3t8elFPn.js.br +0 -0
- package/dist/standalone/assets/audit-log-page-3t8elFPn.js.gz +0 -0
- package/dist/standalone/assets/calendar-C1Ecnytz.js.br +0 -0
- package/dist/standalone/assets/calendar-C1Ecnytz.js.gz +0 -0
- package/dist/standalone/assets/chart-widget-1GPloJY4.js +0 -60
- package/dist/standalone/assets/chart-widget-1GPloJY4.js.br +0 -0
- package/dist/standalone/assets/chart-widget-1GPloJY4.js.gz +0 -0
- package/dist/standalone/assets/chart-widget-1GPloJY4.js.map +0 -1
- package/dist/standalone/assets/command-C1FjGx6t.js.br +0 -0
- package/dist/standalone/assets/command-C1FjGx6t.js.gz +0 -0
- package/dist/standalone/assets/date-picker-DVnnp1Ez.js.br +0 -0
- package/dist/standalone/assets/date-picker-DVnnp1Ez.js.gz +0 -0
- package/dist/standalone/assets/dist-DuSTm0pk.js.br +0 -0
- package/dist/standalone/assets/dist-DuSTm0pk.js.gz +0 -0
- package/dist/standalone/assets/edit-page-DFmI1Ckp.js.br +0 -0
- package/dist/standalone/assets/edit-page-DFmI1Ckp.js.gz +0 -0
- package/dist/standalone/assets/empty-D9nNJb_Y.js.br +0 -0
- package/dist/standalone/assets/empty-D9nNJb_Y.js.gz +0 -0
- package/dist/standalone/assets/folder-plus-DebVc0CA.js.br +0 -0
- package/dist/standalone/assets/folder-plus-DebVc0CA.js.gz +0 -0
- package/dist/standalone/assets/folder-plus-DebVc0CA.js.map +0 -1
- package/dist/standalone/assets/folder-symlink-iMRmgjVt.js +0 -2
- package/dist/standalone/assets/folder-symlink-iMRmgjVt.js.map +0 -1
- package/dist/standalone/assets/global-search-dialog--zUHqLIo.js.br +0 -0
- package/dist/standalone/assets/global-search-dialog--zUHqLIo.js.gz +0 -0
- package/dist/standalone/assets/heavy-fields-Ctx9uZME.js.br +0 -0
- package/dist/standalone/assets/heavy-fields-Ctx9uZME.js.gz +0 -0
- package/dist/standalone/assets/home-page-B1hrpu2S.js +0 -3
- package/dist/standalone/assets/home-page-B1hrpu2S.js.br +0 -0
- package/dist/standalone/assets/home-page-B1hrpu2S.js.gz +0 -0
- package/dist/standalone/assets/home-page-B1hrpu2S.js.map +0 -1
- package/dist/standalone/assets/icon-registry-BBZirLGp.js +0 -2
- package/dist/standalone/assets/icon-registry-BBZirLGp.js.br +0 -0
- package/dist/standalone/assets/icon-registry-BBZirLGp.js.gz +0 -0
- package/dist/standalone/assets/icon-registry-BBZirLGp.js.map +0 -1
- package/dist/standalone/assets/index-CU0xv21_.css +0 -2
- package/dist/standalone/assets/index-CU0xv21_.css.br +0 -0
- package/dist/standalone/assets/index-CU0xv21_.css.gz +0 -0
- package/dist/standalone/assets/index-Ldci8MK5.js.br +0 -0
- package/dist/standalone/assets/index-Ldci8MK5.js.gz +0 -0
- package/dist/standalone/assets/json-editor-DwQqN8OM.js.br +0 -0
- package/dist/standalone/assets/json-editor-DwQqN8OM.js.gz +0 -0
- package/dist/standalone/assets/property-renderer-BogzDKIK.js +0 -7
- package/dist/standalone/assets/property-renderer-BogzDKIK.js.br +0 -0
- package/dist/standalone/assets/property-renderer-BogzDKIK.js.gz +0 -0
- package/dist/standalone/assets/property-renderer-BogzDKIK.js.map +0 -1
- package/dist/standalone/assets/reference-053-L2WD.js.br +0 -0
- package/dist/standalone/assets/reference-053-L2WD.js.gz +0 -0
- package/dist/standalone/assets/refresh-cw-Dz19XR6g.js +0 -2
- package/dist/standalone/assets/refresh-cw-Dz19XR6g.js.map +0 -1
- package/dist/standalone/assets/revisions-button-B4wc6uYi.js.br +0 -0
- package/dist/standalone/assets/revisions-button-B4wc6uYi.js.gz +0 -0
- package/dist/standalone/assets/router-CT00z_xv.js +0 -186
- package/dist/standalone/assets/router-CT00z_xv.js.br +0 -0
- package/dist/standalone/assets/router-CT00z_xv.js.gz +0 -0
- package/dist/standalone/assets/router-CT00z_xv.js.map +0 -1
- package/dist/standalone/assets/select-B6fxO2bI.js.br +0 -0
- package/dist/standalone/assets/select-B6fxO2bI.js.gz +0 -0
- package/dist/standalone/assets/settings-page-BRhIGsdX.js.br +0 -0
- package/dist/standalone/assets/settings-page-BRhIGsdX.js.gz +0 -0
- package/dist/standalone/assets/show-page-BJt9Kmdd.js.br +0 -0
- package/dist/standalone/assets/show-page-BJt9Kmdd.js.gz +0 -0
- package/dist/standalone/assets/tabs-BgR4QuFh.js.br +0 -0
- package/dist/standalone/assets/tabs-BgR4QuFh.js.gz +0 -0
- package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js +0 -2
- package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js.br +0 -0
- package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js.gz +0 -0
- package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js.map +0 -1
- package/dist/standalone/assets/useQueries-BblIcy3I.js.br +0 -0
- package/dist/standalone/assets/useQueries-BblIcy3I.js.gz +0 -0
- package/dist/standalone/assets/user-directory-bre0Sulk.js.br +0 -0
- package/dist/standalone/assets/user-directory-bre0Sulk.js.gz +0 -0
- package/dist/standalone/assets/wizard-create-page-3rZPPXLK.js.br +0 -0
- package/dist/standalone/assets/wizard-create-page-3rZPPXLK.js.gz +0 -0
- package/dist/standalone/assets/zap-DIzIW2MP.js +0 -2
- package/dist/standalone/assets/zap-DIzIW2MP.js.br +0 -0
- package/dist/standalone/assets/zap-DIzIW2MP.js.gz +0 -0
- package/dist/standalone/assets/zap-DIzIW2MP.js.map +0 -1
- package/dist/standalone/assets/zod-BVYoAymF.js.br +0 -0
- package/dist/standalone/assets/zod-BVYoAymF.js.gz +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router-CT00z_xv.js","names":["useCallbackRef","SideCar","#setup","#cleanup","#focused","#provider","functionalUpdate","isPlainObject","hasOwn","replaceEqualDeep","isPlainArray","hasObjectPrototype","#setup","#cleanup","#online","#gcTimeout","#abortSignalConsumed","#defaultOptions","#client","#cache","#initialState","getDefaultState","#queryType","#retryer","#dispatch","#isInitialPausedFetch","#revertState","#client","#selectError","#currentThenable","#currentQuery","#executeFetch","#updateTimers","#clearStaleTimeout","#clearRefetchInterval","#updateQuery","#updateStaleTimeout","#computeRefetchInterval","#currentRefetchInterval","#updateRefetchInterval","#currentResult","#currentResultOptions","#currentResultState","#trackedProps","#staleTimeoutId","#refetchIntervalId","#currentQueryInitialState","#lastQueryWithDefinedData","#selectFn","#selectResult","#notify","#client","#mutationCache","#observers","#retryer","#dispatch","#mutations","#scopes","#mutationId","MutationObserver","#client","#updateResult","#currentMutation","#notify","#currentResult","#mutateOptions","#queries","#queryCache","#mutationCache","#defaultOptions","#queryDefaults","#mutationDefaults","#mountCount","#unsubscribeFocus","#unsubscribeOnline","functionalUpdate","MutationObserver"],"sources":["../../../../../node_modules/.bun/@radix-ui+react-focus-guards@1.1.4+93dbe784b8baa420/node_modules/@radix-ui/react-focus-guards/dist/index.mjs","../../../../../node_modules/.bun/@radix-ui+react-focus-scope@1.1.12+ae2b4604ef263bc9/node_modules/@radix-ui/react-focus-scope/dist/index.mjs","../../../../../node_modules/.bun/aria-hidden@1.2.6/node_modules/aria-hidden/dist/es2015/index.js","../../../../../node_modules/.bun/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../../../../../node_modules/.bun/react-remove-scroll-bar@2.3.8+93dbe784b8baa420/node_modules/react-remove-scroll-bar/dist/es2015/constants.js","../../../../../node_modules/.bun/use-callback-ref@1.3.3+93dbe784b8baa420/node_modules/use-callback-ref/dist/es2015/assignRef.js","../../../../../node_modules/.bun/use-callback-ref@1.3.3+93dbe784b8baa420/node_modules/use-callback-ref/dist/es2015/useRef.js","../../../../../node_modules/.bun/use-callback-ref@1.3.3+93dbe784b8baa420/node_modules/use-callback-ref/dist/es2015/useMergeRef.js","../../../../../node_modules/.bun/use-sidecar@1.1.3+93dbe784b8baa420/node_modules/use-sidecar/dist/es2015/medium.js","../../../../../node_modules/.bun/use-sidecar@1.1.3+93dbe784b8baa420/node_modules/use-sidecar/dist/es2015/exports.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/medium.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/UI.js","../../../../../node_modules/.bun/get-nonce@1.0.1/node_modules/get-nonce/dist/es2015/index.js","../../../../../node_modules/.bun/react-style-singleton@2.2.3+93dbe784b8baa420/node_modules/react-style-singleton/dist/es2015/singleton.js","../../../../../node_modules/.bun/react-style-singleton@2.2.3+93dbe784b8baa420/node_modules/react-style-singleton/dist/es2015/hook.js","../../../../../node_modules/.bun/react-style-singleton@2.2.3+93dbe784b8baa420/node_modules/react-style-singleton/dist/es2015/component.js","../../../../../node_modules/.bun/react-remove-scroll-bar@2.3.8+93dbe784b8baa420/node_modules/react-remove-scroll-bar/dist/es2015/utils.js","../../../../../node_modules/.bun/react-remove-scroll-bar@2.3.8+93dbe784b8baa420/node_modules/react-remove-scroll-bar/dist/es2015/component.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/handleScroll.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/SideEffect.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/sidecar.js","../../../../../node_modules/.bun/react-remove-scroll@2.7.2+93dbe784b8baa420/node_modules/react-remove-scroll/dist/es2015/Combination.js","../../../../react/src/client.ts","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/subscribable.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/focusManager.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/utils.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/environmentManager.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/thenable.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/retryer.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/removable.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/infiniteQueryBehavior.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/query.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/queryObserver.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutation.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutationCache.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutationObserver.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/queryCache.js","../../../../../node_modules/.bun/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/queryClient.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/suspense.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/useQuery.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/useMutation.js","../../../../../node_modules/.bun/@tanstack+react-query@5.101.2+e14d3f224186685e/node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js","../../../../react/src/provider.tsx","../../../../react/src/types.ts","../../../../i18n/src/i18n.ts","../../../../i18n/src/locales/en.ts","../../../../i18n/src/locales/ru.ts","../../../../i18n/src/locales/de.ts","../../../../i18n/src/locales/fr.ts","../../../../i18n/src/locales/es.ts","../../../../i18n/src/locales/it.ts","../../../../i18n/src/locales/ja.ts","../../../../i18n/src/locales/pl.ts","../../../../i18n/src/locales/pt-BR.ts","../../../../i18n/src/index.ts","../../../../react/src/i18n.tsx","../../../../react/src/hooks.ts","../../../../../node_modules/.bun/@tanstack+router-core@1.171.14/node_modules/@tanstack/router-core/dist/esm/utils.js","../../../../../node_modules/.bun/@tanstack+router-core@1.171.14/node_modules/@tanstack/router-core/dist/esm/invariant.js","../../../../../node_modules/.bun/@tanstack+react-router@1.170.17+7492c01c6988791b/node_modules/@tanstack/react-router/dist/esm/routerContext.js","../../../../../node_modules/.bun/@tanstack+react-router@1.170.17+7492c01c6988791b/node_modules/@tanstack/react-router/dist/esm/useRouter.js","../../../../../node_modules/.bun/@tanstack+react-router@1.170.17+7492c01c6988791b/node_modules/@tanstack/react-router/dist/esm/matchContext.js","../../../../../node_modules/.bun/@tanstack+react-store@0.9.3+7492c01c6988791b/node_modules/@tanstack/react-store/dist/esm/useStore.js","../../../../../node_modules/.bun/@tanstack+react-router@1.170.17+7492c01c6988791b/node_modules/@tanstack/react-router/dist/esm/useMatch.js","../../../../../node_modules/.bun/@tanstack+react-router@1.170.17+7492c01c6988791b/node_modules/@tanstack/react-router/dist/esm/useRouterState.js","../../../../react/src/router.tsx"],"sourcesContent":["\"use client\";\n\n// src/focus-guards.tsx\nimport * as React from \"react\";\nvar count = 0;\nvar guards = null;\nfunction FocusGuards(props) {\n useFocusGuards();\n return props.children;\n}\nfunction useFocusGuards() {\n React.useEffect(() => {\n if (!guards) {\n guards = { start: createFocusGuard(), end: createFocusGuard() };\n }\n const { start, end } = guards;\n if (document.body.firstElementChild !== start) {\n document.body.insertAdjacentElement(\"afterbegin\", start);\n }\n if (document.body.lastElementChild !== end) {\n document.body.insertAdjacentElement(\"beforeend\", end);\n }\n count++;\n return () => {\n if (count === 1) {\n guards?.start.remove();\n guards?.end.remove();\n guards = null;\n }\n count = Math.max(0, count - 1);\n };\n }, []);\n}\nfunction createFocusGuard() {\n const element = document.createElement(\"span\");\n element.setAttribute(\"data-radix-focus-guard\", \"\");\n element.tabIndex = 0;\n element.style.outline = \"none\";\n element.style.opacity = \"0\";\n element.style.position = \"fixed\";\n element.style.pointerEvents = \"none\";\n return element;\n}\nexport {\n FocusGuards,\n FocusGuards as Root,\n useFocusGuards\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/focus-scope.tsx\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { jsx } from \"react/jsx-runtime\";\nvar AUTOFOCUS_ON_MOUNT = \"focusScope.autoFocusOnMount\";\nvar AUTOFOCUS_ON_UNMOUNT = \"focusScope.autoFocusOnUnmount\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar FOCUS_SCOPE_NAME = \"FocusScope\";\nvar FocusScope = React.forwardRef((props, forwardedRef) => {\n const {\n loop = false,\n trapped = false,\n onMountAutoFocus: onMountAutoFocusProp,\n onUnmountAutoFocus: onUnmountAutoFocusProp,\n ...scopeProps\n } = props;\n const [container, setContainer] = React.useState(null);\n const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp);\n const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp);\n const lastFocusedElementRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, setContainer);\n const focusScope = React.useRef({\n paused: false,\n pause() {\n this.paused = true;\n },\n resume() {\n this.paused = false;\n }\n }).current;\n React.useEffect(() => {\n if (trapped) {\n let handleFocusIn2 = function(event) {\n if (focusScope.paused || !container) return;\n const target = event.target;\n if (container.contains(target)) {\n lastFocusedElementRef.current = target;\n } else {\n focus(lastFocusedElementRef.current, { select: true });\n }\n }, handleFocusOut2 = function(event) {\n if (focusScope.paused || !container) return;\n const relatedTarget = event.relatedTarget;\n if (relatedTarget === null) return;\n if (!container.contains(relatedTarget)) {\n focus(lastFocusedElementRef.current, { select: true });\n }\n }, handleMutations2 = function(mutations) {\n const focusedElement = document.activeElement;\n if (focusedElement !== document.body) return;\n for (const mutation of mutations) {\n if (mutation.removedNodes.length > 0) focus(container);\n }\n };\n var handleFocusIn = handleFocusIn2, handleFocusOut = handleFocusOut2, handleMutations = handleMutations2;\n document.addEventListener(\"focusin\", handleFocusIn2);\n document.addEventListener(\"focusout\", handleFocusOut2);\n const mutationObserver = new MutationObserver(handleMutations2);\n if (container) mutationObserver.observe(container, { childList: true, subtree: true });\n return () => {\n document.removeEventListener(\"focusin\", handleFocusIn2);\n document.removeEventListener(\"focusout\", handleFocusOut2);\n mutationObserver.disconnect();\n };\n }\n }, [trapped, container, focusScope.paused]);\n React.useEffect(() => {\n if (container) {\n focusScopesStack.add(focusScope);\n const previouslyFocusedElement = document.activeElement;\n const hasFocusedCandidate = container.contains(previouslyFocusedElement);\n if (!hasFocusedCandidate) {\n const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);\n container.dispatchEvent(mountEvent);\n if (!mountEvent.defaultPrevented) {\n focusFirst(removeLinks(getTabbableCandidates(container)), { select: true });\n if (document.activeElement === previouslyFocusedElement) {\n focus(container);\n }\n }\n }\n return () => {\n container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);\n setTimeout(() => {\n const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);\n container.dispatchEvent(unmountEvent);\n if (!unmountEvent.defaultPrevented) {\n focus(previouslyFocusedElement ?? document.body, { select: true });\n }\n container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);\n focusScopesStack.remove(focusScope);\n }, 0);\n };\n }\n }, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]);\n const handleKeyDown = React.useCallback(\n (event) => {\n if (!loop && !trapped) return;\n if (focusScope.paused) return;\n const isTabKey = event.key === \"Tab\" && !event.altKey && !event.ctrlKey && !event.metaKey;\n const focusedElement = document.activeElement;\n if (isTabKey && focusedElement) {\n const container2 = event.currentTarget;\n const [first, last] = getTabbableEdges(container2);\n const hasTabbableElementsInside = first && last;\n if (!hasTabbableElementsInside) {\n if (focusedElement === container2) event.preventDefault();\n } else {\n if (!event.shiftKey && focusedElement === last) {\n event.preventDefault();\n if (loop) focus(first, { select: true });\n } else if (event.shiftKey && focusedElement === first) {\n event.preventDefault();\n if (loop) focus(last, { select: true });\n }\n }\n }\n },\n [loop, trapped, focusScope.paused]\n );\n return /* @__PURE__ */ jsx(Primitive.div, { tabIndex: -1, ...scopeProps, ref: composedRefs, onKeyDown: handleKeyDown });\n});\nFocusScope.displayName = FOCUS_SCOPE_NAME;\nfunction focusFirst(candidates, { select = false } = {}) {\n const previouslyFocusedElement = document.activeElement;\n for (const candidate of candidates) {\n focus(candidate, { select });\n if (document.activeElement !== previouslyFocusedElement) return;\n }\n}\nfunction getTabbableEdges(container) {\n const candidates = getTabbableCandidates(container);\n const first = findVisible(candidates, container);\n const last = findVisible(candidates.reverse(), container);\n return [first, last];\n}\nfunction getTabbableCandidates(container) {\n const nodes = [];\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node) => {\n const isHiddenInput = node.tagName === \"INPUT\" && node.type === \"hidden\";\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n });\n while (walker.nextNode()) nodes.push(walker.currentNode);\n return nodes;\n}\nfunction findVisible(elements, container) {\n const canUseCheckVisibility = typeof container.checkVisibility === \"function\" && container.checkVisibility({ checkVisibilityCSS: true });\n for (const element of elements) {\n const hidden = canUseCheckVisibility ? !element.checkVisibility({ checkVisibilityCSS: true }) : isHidden(element, { upTo: container });\n if (!hidden) {\n return element;\n }\n }\n}\nfunction isHidden(node, { upTo }) {\n if (getComputedStyle(node).visibility === \"hidden\") return true;\n while (node) {\n if (upTo !== void 0 && node === upTo) return false;\n if (getComputedStyle(node).display === \"none\") return true;\n node = node.parentElement;\n }\n return false;\n}\nfunction isSelectableInput(element) {\n return element instanceof HTMLInputElement && \"select\" in element;\n}\nfunction focus(element, { select = false } = {}) {\n if (element && element.focus) {\n const previouslyFocusedElement = document.activeElement;\n element.focus({ preventScroll: true });\n if (element !== previouslyFocusedElement && isSelectableInput(element) && select)\n element.select();\n }\n}\nvar focusScopesStack = createFocusScopesStack();\nfunction createFocusScopesStack() {\n let stack = [];\n return {\n add(focusScope) {\n const activeFocusScope = stack[0];\n if (focusScope !== activeFocusScope) {\n activeFocusScope?.pause();\n }\n stack = arrayRemove(stack, focusScope);\n stack.unshift(focusScope);\n },\n remove(focusScope) {\n stack = arrayRemove(stack, focusScope);\n stack[0]?.resume();\n }\n };\n}\nfunction arrayRemove(array, item) {\n const updatedArray = [...array];\n const index = updatedArray.indexOf(item);\n if (index !== -1) {\n updatedArray.splice(index, 1);\n }\n return updatedArray;\n}\nfunction removeLinks(items) {\n return items.filter((item) => item.tagName !== \"A\");\n}\nvar Root = FocusScope;\nexport {\n FocusScope,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","var getDefaultParent = function (originalTarget) {\n if (typeof document === 'undefined') {\n return null;\n }\n var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;\n return sampleTarget.ownerDocument.body;\n};\nvar counterMap = new WeakMap();\nvar uncontrolledNodes = new WeakMap();\nvar markerMap = {};\nvar lockCount = 0;\nvar unwrapHost = function (node) {\n return node && (node.host || unwrapHost(node.parentNode));\n};\nvar correctTargets = function (parent, targets) {\n return targets\n .map(function (target) {\n if (parent.contains(target)) {\n return target;\n }\n var correctedTarget = unwrapHost(target);\n if (correctedTarget && parent.contains(correctedTarget)) {\n return correctedTarget;\n }\n console.error('aria-hidden', target, 'in not contained inside', parent, '. Doing nothing');\n return null;\n })\n .filter(function (x) { return Boolean(x); });\n};\n/**\n * Marks everything except given node(or nodes) as aria-hidden\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @param {String} [controlAttribute] - html Attribute to control\n * @return {Undo} undo command\n */\nvar applyAttributeToOthers = function (originalTarget, parentNode, markerName, controlAttribute) {\n var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);\n if (!markerMap[markerName]) {\n markerMap[markerName] = new WeakMap();\n }\n var markerCounter = markerMap[markerName];\n var hiddenNodes = [];\n var elementsToKeep = new Set();\n var elementsToStop = new Set(targets);\n var keep = function (el) {\n if (!el || elementsToKeep.has(el)) {\n return;\n }\n elementsToKeep.add(el);\n keep(el.parentNode);\n };\n targets.forEach(keep);\n var deep = function (parent) {\n if (!parent || elementsToStop.has(parent)) {\n return;\n }\n Array.prototype.forEach.call(parent.children, function (node) {\n if (elementsToKeep.has(node)) {\n deep(node);\n }\n else {\n try {\n var attr = node.getAttribute(controlAttribute);\n var alreadyHidden = attr !== null && attr !== 'false';\n var counterValue = (counterMap.get(node) || 0) + 1;\n var markerValue = (markerCounter.get(node) || 0) + 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n hiddenNodes.push(node);\n if (counterValue === 1 && alreadyHidden) {\n uncontrolledNodes.set(node, true);\n }\n if (markerValue === 1) {\n node.setAttribute(markerName, 'true');\n }\n if (!alreadyHidden) {\n node.setAttribute(controlAttribute, 'true');\n }\n }\n catch (e) {\n console.error('aria-hidden: cannot operate on ', node, e);\n }\n }\n });\n };\n deep(parentNode);\n elementsToKeep.clear();\n lockCount++;\n return function () {\n hiddenNodes.forEach(function (node) {\n var counterValue = counterMap.get(node) - 1;\n var markerValue = markerCounter.get(node) - 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n if (!counterValue) {\n if (!uncontrolledNodes.has(node)) {\n node.removeAttribute(controlAttribute);\n }\n uncontrolledNodes.delete(node);\n }\n if (!markerValue) {\n node.removeAttribute(markerName);\n }\n });\n lockCount--;\n if (!lockCount) {\n // clear\n counterMap = new WeakMap();\n counterMap = new WeakMap();\n uncontrolledNodes = new WeakMap();\n markerMap = {};\n }\n };\n};\n/**\n * Marks everything except given node(or nodes) as aria-hidden\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var hideOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-aria-hidden'; }\n var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);\n var activeParentNode = parentNode || getDefaultParent(originalTarget);\n if (!activeParentNode) {\n return function () { return null; };\n }\n // we should not hide aria-live elements - https://github.com/theKashey/aria-hidden/issues/10\n // and script elements, as they have no impact on accessibility.\n targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll('[aria-live], script')));\n return applyAttributeToOthers(targets, activeParentNode, markerName, 'aria-hidden');\n};\n/**\n * Marks everything except given node(or nodes) as inert\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var inertOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-inert-ed'; }\n var activeParentNode = parentNode || getDefaultParent(originalTarget);\n if (!activeParentNode) {\n return function () { return null; };\n }\n return applyAttributeToOthers(originalTarget, activeParentNode, markerName, 'inert');\n};\n/**\n * @returns if current browser supports inert\n */\nexport var supportsInert = function () {\n return typeof HTMLElement !== 'undefined' && HTMLElement.prototype.hasOwnProperty('inert');\n};\n/**\n * Automatic function to \"suppress\" DOM elements - _hide_ or _inert_ in the best possible way\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var suppressOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-suppressed'; }\n return (supportsInert() ? inertOthers : hideOthers)(originalTarget, parentNode, markerName);\n};\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export var zeroRightClassName = 'right-scroll-bar-position';\nexport var fullWidthClassName = 'width-before-scroll-bar';\nexport var noScrollbarsClassName = 'with-scroll-bars-hidden';\n/**\n * Name of a CSS variable containing the amount of \"hidden\" scrollbar\n * ! might be undefined ! use will fallback!\n */\nexport var removedBarSizeVariable = '--removed-body-scroll-bar-size';\n","/**\n * Assigns a value for a given ref, no matter of the ref format\n * @param {RefObject} ref - a callback function or ref object\n * @param value - a new value\n *\n * @see https://github.com/theKashey/use-callback-ref#assignref\n * @example\n * const refObject = useRef();\n * const refFn = (ref) => {....}\n *\n * assignRef(refObject, \"refValue\");\n * assignRef(refFn, \"refValue\");\n */\nexport function assignRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n }\n else if (ref) {\n ref.current = value;\n }\n return ref;\n}\n","import { useState } from 'react';\n/**\n * creates a MutableRef with ref change callback\n * @param initialValue - initial ref value\n * @param {Function} callback - a callback to run when value changes\n *\n * @example\n * const ref = useCallbackRef(0, (newValue, oldValue) => console.log(oldValue, '->', newValue);\n * ref.current = 1;\n * // prints 0 -> 1\n *\n * @see https://reactjs.org/docs/hooks-reference.html#useref\n * @see https://github.com/theKashey/use-callback-ref#usecallbackref---to-replace-reactuseref\n * @returns {MutableRefObject}\n */\nexport function useCallbackRef(initialValue, callback) {\n var ref = useState(function () { return ({\n // value\n value: initialValue,\n // last callback\n callback: callback,\n // \"memoized\" public interface\n facade: {\n get current() {\n return ref.value;\n },\n set current(value) {\n var last = ref.value;\n if (last !== value) {\n ref.value = value;\n ref.callback(value, last);\n }\n },\n },\n }); })[0];\n // update callback\n ref.callback = callback;\n return ref.facade;\n}\n","import * as React from 'react';\nimport { assignRef } from './assignRef';\nimport { useCallbackRef } from './useRef';\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nvar currentValues = new WeakMap();\n/**\n * Merges two or more refs together providing a single interface to set their value\n * @param {RefObject|Ref} refs\n * @returns {MutableRefObject} - a new ref, which translates all changes to {refs}\n *\n * @see {@link mergeRefs} a version without buit-in memoization\n * @see https://github.com/theKashey/use-callback-ref#usemergerefs\n * @example\n * const Component = React.forwardRef((props, ref) => {\n * const ownRef = useRef();\n * const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together\n * return <div ref={domRef}>...</div>\n * }\n */\nexport function useMergeRefs(refs, defaultValue) {\n var callbackRef = useCallbackRef(defaultValue || null, function (newValue) {\n return refs.forEach(function (ref) { return assignRef(ref, newValue); });\n });\n // handle refs changes - added or removed\n useIsomorphicLayoutEffect(function () {\n var oldValue = currentValues.get(callbackRef);\n if (oldValue) {\n var prevRefs_1 = new Set(oldValue);\n var nextRefs_1 = new Set(refs);\n var current_1 = callbackRef.current;\n prevRefs_1.forEach(function (ref) {\n if (!nextRefs_1.has(ref)) {\n assignRef(ref, null);\n }\n });\n nextRefs_1.forEach(function (ref) {\n if (!prevRefs_1.has(ref)) {\n assignRef(ref, current_1);\n }\n });\n }\n currentValues.set(callbackRef, refs);\n }, [refs]);\n return callbackRef;\n}\n","import { __assign } from \"tslib\";\nfunction ItoI(a) {\n return a;\n}\nfunction innerCreateMedium(defaults, middleware) {\n if (middleware === void 0) { middleware = ItoI; }\n var buffer = [];\n var assigned = false;\n var medium = {\n read: function () {\n if (assigned) {\n throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.');\n }\n if (buffer.length) {\n return buffer[buffer.length - 1];\n }\n return defaults;\n },\n useMedium: function (data) {\n var item = middleware(data, assigned);\n buffer.push(item);\n return function () {\n buffer = buffer.filter(function (x) { return x !== item; });\n };\n },\n assignSyncMedium: function (cb) {\n assigned = true;\n while (buffer.length) {\n var cbs = buffer;\n buffer = [];\n cbs.forEach(cb);\n }\n buffer = {\n push: function (x) { return cb(x); },\n filter: function () { return buffer; },\n };\n },\n assignMedium: function (cb) {\n assigned = true;\n var pendingQueue = [];\n if (buffer.length) {\n var cbs = buffer;\n buffer = [];\n cbs.forEach(cb);\n pendingQueue = buffer;\n }\n var executeQueue = function () {\n var cbs = pendingQueue;\n pendingQueue = [];\n cbs.forEach(cb);\n };\n var cycle = function () { return Promise.resolve().then(executeQueue); };\n cycle();\n buffer = {\n push: function (x) {\n pendingQueue.push(x);\n cycle();\n },\n filter: function (filter) {\n pendingQueue = pendingQueue.filter(filter);\n return buffer;\n },\n };\n },\n };\n return medium;\n}\nexport function createMedium(defaults, middleware) {\n if (middleware === void 0) { middleware = ItoI; }\n return innerCreateMedium(defaults, middleware);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function createSidecarMedium(options) {\n if (options === void 0) { options = {}; }\n var medium = innerCreateMedium(null);\n medium.options = __assign({ async: true, ssr: false }, options);\n return medium;\n}\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nvar SideCar = function (_a) {\n var sideCar = _a.sideCar, rest = __rest(_a, [\"sideCar\"]);\n if (!sideCar) {\n throw new Error('Sidecar: please provide `sideCar` property to import the right car');\n }\n var Target = sideCar.read();\n if (!Target) {\n throw new Error('Sidecar medium not found');\n }\n return React.createElement(Target, __assign({}, rest));\n};\nSideCar.isSideCarExport = true;\nexport function exportSidecar(medium, exported) {\n medium.useMedium(exported);\n return SideCar;\n}\n","import { createSidecarMedium } from 'use-sidecar';\nexport var effectCar = createSidecarMedium();\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nimport { fullWidthClassName, zeroRightClassName } from 'react-remove-scroll-bar/constants';\nimport { useMergeRefs } from 'use-callback-ref';\nimport { effectCar } from './medium';\nvar nothing = function () {\n return;\n};\n/**\n * Removes scrollbar from the page and contain the scroll within the Lock\n */\nvar RemoveScroll = React.forwardRef(function (props, parentRef) {\n var ref = React.useRef(null);\n var _a = React.useState({\n onScrollCapture: nothing,\n onWheelCapture: nothing,\n onTouchMoveCapture: nothing,\n }), callbacks = _a[0], setCallbacks = _a[1];\n var forwardProps = props.forwardProps, children = props.children, className = props.className, removeScrollBar = props.removeScrollBar, enabled = props.enabled, shards = props.shards, sideCar = props.sideCar, noRelative = props.noRelative, noIsolation = props.noIsolation, inert = props.inert, allowPinchZoom = props.allowPinchZoom, _b = props.as, Container = _b === void 0 ? 'div' : _b, gapMode = props.gapMode, rest = __rest(props, [\"forwardProps\", \"children\", \"className\", \"removeScrollBar\", \"enabled\", \"shards\", \"sideCar\", \"noRelative\", \"noIsolation\", \"inert\", \"allowPinchZoom\", \"as\", \"gapMode\"]);\n var SideCar = sideCar;\n var containerRef = useMergeRefs([ref, parentRef]);\n var containerProps = __assign(__assign({}, rest), callbacks);\n return (React.createElement(React.Fragment, null,\n enabled && (React.createElement(SideCar, { sideCar: effectCar, removeScrollBar: removeScrollBar, shards: shards, noRelative: noRelative, noIsolation: noIsolation, inert: inert, setCallbacks: setCallbacks, allowPinchZoom: !!allowPinchZoom, lockRef: ref, gapMode: gapMode })),\n forwardProps ? (React.cloneElement(React.Children.only(children), __assign(__assign({}, containerProps), { ref: containerRef }))) : (React.createElement(Container, __assign({}, containerProps, { className: className, ref: containerRef }), children))));\n});\nRemoveScroll.defaultProps = {\n enabled: true,\n removeScrollBar: true,\n inert: false,\n};\nRemoveScroll.classNames = {\n fullWidth: fullWidthClassName,\n zeroRight: zeroRightClassName,\n};\nexport { RemoveScroll };\n","var currentNonce;\nexport var setNonce = function (nonce) {\n currentNonce = nonce;\n};\nexport var getNonce = function () {\n if (currentNonce) {\n return currentNonce;\n }\n if (typeof __webpack_nonce__ !== 'undefined') {\n return __webpack_nonce__;\n }\n return undefined;\n};\n","import { getNonce } from 'get-nonce';\nfunction makeStyleTag() {\n if (!document)\n return null;\n var tag = document.createElement('style');\n tag.type = 'text/css';\n var nonce = getNonce();\n if (nonce) {\n tag.setAttribute('nonce', nonce);\n }\n return tag;\n}\nfunction injectStyles(tag, css) {\n // @ts-ignore\n if (tag.styleSheet) {\n // @ts-ignore\n tag.styleSheet.cssText = css;\n }\n else {\n tag.appendChild(document.createTextNode(css));\n }\n}\nfunction insertStyleTag(tag) {\n var head = document.head || document.getElementsByTagName('head')[0];\n head.appendChild(tag);\n}\nexport var stylesheetSingleton = function () {\n var counter = 0;\n var stylesheet = null;\n return {\n add: function (style) {\n if (counter == 0) {\n if ((stylesheet = makeStyleTag())) {\n injectStyles(stylesheet, style);\n insertStyleTag(stylesheet);\n }\n }\n counter++;\n },\n remove: function () {\n counter--;\n if (!counter && stylesheet) {\n stylesheet.parentNode && stylesheet.parentNode.removeChild(stylesheet);\n stylesheet = null;\n }\n },\n };\n};\n","import * as React from 'react';\nimport { stylesheetSingleton } from './singleton';\n/**\n * creates a hook to control style singleton\n * @see {@link styleSingleton} for a safer component version\n * @example\n * ```tsx\n * const useStyle = styleHookSingleton();\n * ///\n * useStyle('body { overflow: hidden}');\n */\nexport var styleHookSingleton = function () {\n var sheet = stylesheetSingleton();\n return function (styles, isDynamic) {\n React.useEffect(function () {\n sheet.add(styles);\n return function () {\n sheet.remove();\n };\n }, [styles && isDynamic]);\n };\n};\n","import { styleHookSingleton } from './hook';\n/**\n * create a Component to add styles on demand\n * - styles are added when first instance is mounted\n * - styles are removed when the last instance is unmounted\n * - changing styles in runtime does nothing unless dynamic is set. But with multiple components that can lead to the undefined behavior\n */\nexport var styleSingleton = function () {\n var useStyle = styleHookSingleton();\n var Sheet = function (_a) {\n var styles = _a.styles, dynamic = _a.dynamic;\n useStyle(styles, dynamic);\n return null;\n };\n return Sheet;\n};\n","export var zeroGap = {\n left: 0,\n top: 0,\n right: 0,\n gap: 0,\n};\nvar parse = function (x) { return parseInt(x || '', 10) || 0; };\nvar getOffset = function (gapMode) {\n var cs = window.getComputedStyle(document.body);\n var left = cs[gapMode === 'padding' ? 'paddingLeft' : 'marginLeft'];\n var top = cs[gapMode === 'padding' ? 'paddingTop' : 'marginTop'];\n var right = cs[gapMode === 'padding' ? 'paddingRight' : 'marginRight'];\n return [parse(left), parse(top), parse(right)];\n};\nexport var getGapWidth = function (gapMode) {\n if (gapMode === void 0) { gapMode = 'margin'; }\n if (typeof window === 'undefined') {\n return zeroGap;\n }\n var offsets = getOffset(gapMode);\n var documentWidth = document.documentElement.clientWidth;\n var windowWidth = window.innerWidth;\n return {\n left: offsets[0],\n top: offsets[1],\n right: offsets[2],\n gap: Math.max(0, windowWidth - documentWidth + offsets[2] - offsets[0]),\n };\n};\n","import * as React from 'react';\nimport { styleSingleton } from 'react-style-singleton';\nimport { fullWidthClassName, zeroRightClassName, noScrollbarsClassName, removedBarSizeVariable } from './constants';\nimport { getGapWidth } from './utils';\nvar Style = styleSingleton();\nexport var lockAttribute = 'data-scroll-locked';\n// important tip - once we measure scrollBar width and remove them\n// we could not repeat this operation\n// thus we are using style-singleton - only the first \"yet correct\" style will be applied.\nvar getStyles = function (_a, allowRelative, gapMode, important) {\n var left = _a.left, top = _a.top, right = _a.right, gap = _a.gap;\n if (gapMode === void 0) { gapMode = 'margin'; }\n return \"\\n .\".concat(noScrollbarsClassName, \" {\\n overflow: hidden \").concat(important, \";\\n padding-right: \").concat(gap, \"px \").concat(important, \";\\n }\\n body[\").concat(lockAttribute, \"] {\\n overflow: hidden \").concat(important, \";\\n overscroll-behavior: contain;\\n \").concat([\n allowRelative && \"position: relative \".concat(important, \";\"),\n gapMode === 'margin' &&\n \"\\n padding-left: \".concat(left, \"px;\\n padding-top: \").concat(top, \"px;\\n padding-right: \").concat(right, \"px;\\n margin-left:0;\\n margin-top:0;\\n margin-right: \").concat(gap, \"px \").concat(important, \";\\n \"),\n gapMode === 'padding' && \"padding-right: \".concat(gap, \"px \").concat(important, \";\"),\n ]\n .filter(Boolean)\n .join(''), \"\\n }\\n \\n .\").concat(zeroRightClassName, \" {\\n right: \").concat(gap, \"px \").concat(important, \";\\n }\\n \\n .\").concat(fullWidthClassName, \" {\\n margin-right: \").concat(gap, \"px \").concat(important, \";\\n }\\n \\n .\").concat(zeroRightClassName, \" .\").concat(zeroRightClassName, \" {\\n right: 0 \").concat(important, \";\\n }\\n \\n .\").concat(fullWidthClassName, \" .\").concat(fullWidthClassName, \" {\\n margin-right: 0 \").concat(important, \";\\n }\\n \\n body[\").concat(lockAttribute, \"] {\\n \").concat(removedBarSizeVariable, \": \").concat(gap, \"px;\\n }\\n\");\n};\nvar getCurrentUseCounter = function () {\n var counter = parseInt(document.body.getAttribute(lockAttribute) || '0', 10);\n return isFinite(counter) ? counter : 0;\n};\nexport var useLockAttribute = function () {\n React.useEffect(function () {\n document.body.setAttribute(lockAttribute, (getCurrentUseCounter() + 1).toString());\n return function () {\n var newCounter = getCurrentUseCounter() - 1;\n if (newCounter <= 0) {\n document.body.removeAttribute(lockAttribute);\n }\n else {\n document.body.setAttribute(lockAttribute, newCounter.toString());\n }\n };\n }, []);\n};\n/**\n * Removes page scrollbar and blocks page scroll when mounted\n */\nexport var RemoveScrollBar = function (_a) {\n var noRelative = _a.noRelative, noImportant = _a.noImportant, _b = _a.gapMode, gapMode = _b === void 0 ? 'margin' : _b;\n useLockAttribute();\n /*\n gap will be measured on every component mount\n however it will be used only by the \"first\" invocation\n due to singleton nature of <Style\n */\n var gap = React.useMemo(function () { return getGapWidth(gapMode); }, [gapMode]);\n return React.createElement(Style, { styles: getStyles(gap, !noRelative, gapMode, !noImportant ? '!important' : '') });\n};\n","var passiveSupported = false;\nif (typeof window !== 'undefined') {\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function () {\n passiveSupported = true;\n return true;\n },\n });\n // @ts-ignore\n window.addEventListener('test', options, options);\n // @ts-ignore\n window.removeEventListener('test', options, options);\n }\n catch (err) {\n passiveSupported = false;\n }\n}\nexport var nonPassive = passiveSupported ? { passive: false } : false;\n","var alwaysContainsScroll = function (node) {\n // textarea will always _contain_ scroll inside self. It only can be hidden\n return node.tagName === 'TEXTAREA';\n};\nvar elementCanBeScrolled = function (node, overflow) {\n if (!(node instanceof Element)) {\n return false;\n }\n var styles = window.getComputedStyle(node);\n return (\n // not-not-scrollable\n styles[overflow] !== 'hidden' &&\n // contains scroll inside self\n !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible'));\n};\nvar elementCouldBeVScrolled = function (node) { return elementCanBeScrolled(node, 'overflowY'); };\nvar elementCouldBeHScrolled = function (node) { return elementCanBeScrolled(node, 'overflowX'); };\nexport var locationCouldBeScrolled = function (axis, node) {\n var ownerDocument = node.ownerDocument;\n var current = node;\n do {\n // Skip over shadow root\n if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) {\n current = current.host;\n }\n var isScrollable = elementCouldBeScrolled(axis, current);\n if (isScrollable) {\n var _a = getScrollVariables(axis, current), scrollHeight = _a[1], clientHeight = _a[2];\n if (scrollHeight > clientHeight) {\n return true;\n }\n }\n current = current.parentNode;\n } while (current && current !== ownerDocument.body);\n return false;\n};\nvar getVScrollVariables = function (_a) {\n var scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;\n return [\n scrollTop,\n scrollHeight,\n clientHeight,\n ];\n};\nvar getHScrollVariables = function (_a) {\n var scrollLeft = _a.scrollLeft, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth;\n return [\n scrollLeft,\n scrollWidth,\n clientWidth,\n ];\n};\nvar elementCouldBeScrolled = function (axis, node) {\n return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node);\n};\nvar getScrollVariables = function (axis, node) {\n return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node);\n};\nvar getDirectionFactor = function (axis, direction) {\n /**\n * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position,\n * and then increasingly negative as you scroll towards the end of the content.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft\n */\n return axis === 'h' && direction === 'rtl' ? -1 : 1;\n};\nexport var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) {\n var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction);\n var delta = directionFactor * sourceDelta;\n // find scrollable target\n var target = event.target;\n var targetInLock = endTarget.contains(target);\n var shouldCancelScroll = false;\n var isDeltaPositive = delta > 0;\n var availableScroll = 0;\n var availableScrollTop = 0;\n do {\n if (!target) {\n break;\n }\n var _a = getScrollVariables(axis, target), position = _a[0], scroll_1 = _a[1], capacity = _a[2];\n var elementScroll = scroll_1 - capacity - directionFactor * position;\n if (position || elementScroll) {\n if (elementCouldBeScrolled(axis, target)) {\n availableScroll += elementScroll;\n availableScrollTop += position;\n }\n }\n var parent_1 = target.parentNode;\n // we will \"bubble\" from ShadowDom in case we are, or just to the parent in normal case\n // this is the same logic used in focus-lock\n target = (parent_1 && parent_1.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? parent_1.host : parent_1);\n } while (\n // portaled content\n (!targetInLock && target !== document.body) ||\n // self content\n (targetInLock && (endTarget.contains(target) || endTarget === target)));\n // handle epsilon around 0 (non standard zoom levels)\n if (isDeltaPositive &&\n ((noOverscroll && Math.abs(availableScroll) < 1) || (!noOverscroll && delta > availableScroll))) {\n shouldCancelScroll = true;\n }\n else if (!isDeltaPositive &&\n ((noOverscroll && Math.abs(availableScrollTop) < 1) || (!noOverscroll && -delta > availableScrollTop))) {\n shouldCancelScroll = true;\n }\n return shouldCancelScroll;\n};\n","import { __spreadArray } from \"tslib\";\nimport * as React from 'react';\nimport { RemoveScrollBar } from 'react-remove-scroll-bar';\nimport { styleSingleton } from 'react-style-singleton';\nimport { nonPassive } from './aggresiveCapture';\nimport { handleScroll, locationCouldBeScrolled } from './handleScroll';\nexport var getTouchXY = function (event) {\n return 'changedTouches' in event ? [event.changedTouches[0].clientX, event.changedTouches[0].clientY] : [0, 0];\n};\nexport var getDeltaXY = function (event) { return [event.deltaX, event.deltaY]; };\nvar extractRef = function (ref) {\n return ref && 'current' in ref ? ref.current : ref;\n};\nvar deltaCompare = function (x, y) { return x[0] === y[0] && x[1] === y[1]; };\nvar generateStyle = function (id) { return \"\\n .block-interactivity-\".concat(id, \" {pointer-events: none;}\\n .allow-interactivity-\").concat(id, \" {pointer-events: all;}\\n\"); };\nvar idCounter = 0;\nvar lockStack = [];\nexport function RemoveScrollSideCar(props) {\n var shouldPreventQueue = React.useRef([]);\n var touchStartRef = React.useRef([0, 0]);\n var activeAxis = React.useRef();\n var id = React.useState(idCounter++)[0];\n var Style = React.useState(styleSingleton)[0];\n var lastProps = React.useRef(props);\n React.useEffect(function () {\n lastProps.current = props;\n }, [props]);\n React.useEffect(function () {\n if (props.inert) {\n document.body.classList.add(\"block-interactivity-\".concat(id));\n var allow_1 = __spreadArray([props.lockRef.current], (props.shards || []).map(extractRef), true).filter(Boolean);\n allow_1.forEach(function (el) { return el.classList.add(\"allow-interactivity-\".concat(id)); });\n return function () {\n document.body.classList.remove(\"block-interactivity-\".concat(id));\n allow_1.forEach(function (el) { return el.classList.remove(\"allow-interactivity-\".concat(id)); });\n };\n }\n return;\n }, [props.inert, props.lockRef.current, props.shards]);\n var shouldCancelEvent = React.useCallback(function (event, parent) {\n if (('touches' in event && event.touches.length === 2) || (event.type === 'wheel' && event.ctrlKey)) {\n return !lastProps.current.allowPinchZoom;\n }\n var touch = getTouchXY(event);\n var touchStart = touchStartRef.current;\n var deltaX = 'deltaX' in event ? event.deltaX : touchStart[0] - touch[0];\n var deltaY = 'deltaY' in event ? event.deltaY : touchStart[1] - touch[1];\n var currentAxis;\n var target = event.target;\n var moveDirection = Math.abs(deltaX) > Math.abs(deltaY) ? 'h' : 'v';\n // allow horizontal touch move on Range inputs. They will not cause any scroll\n if ('touches' in event && moveDirection === 'h' && target.type === 'range') {\n return false;\n }\n // allow drag selection (iOS); check if selection's anchorNode is the same as target or contains target\n var selection = window.getSelection();\n var anchorNode = selection && selection.anchorNode;\n var isTouchingSelection = anchorNode ? anchorNode === target || anchorNode.contains(target) : false;\n if (isTouchingSelection) {\n return false;\n }\n var canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n if (!canBeScrolledInMainDirection) {\n return true;\n }\n if (canBeScrolledInMainDirection) {\n currentAxis = moveDirection;\n }\n else {\n currentAxis = moveDirection === 'v' ? 'h' : 'v';\n canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n // other axis might be not scrollable\n }\n if (!canBeScrolledInMainDirection) {\n return false;\n }\n if (!activeAxis.current && 'changedTouches' in event && (deltaX || deltaY)) {\n activeAxis.current = currentAxis;\n }\n if (!currentAxis) {\n return true;\n }\n var cancelingAxis = activeAxis.current || currentAxis;\n return handleScroll(cancelingAxis, parent, event, cancelingAxis === 'h' ? deltaX : deltaY, true);\n }, []);\n var shouldPrevent = React.useCallback(function (_event) {\n var event = _event;\n if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) {\n // not the last active\n return;\n }\n var delta = 'deltaY' in event ? getDeltaXY(event) : getTouchXY(event);\n var sourceEvent = shouldPreventQueue.current.filter(function (e) { return e.name === event.type && (e.target === event.target || event.target === e.shadowParent) && deltaCompare(e.delta, delta); })[0];\n // self event, and should be canceled\n if (sourceEvent && sourceEvent.should) {\n if (event.cancelable) {\n event.preventDefault();\n }\n return;\n }\n // outside or shard event\n if (!sourceEvent) {\n var shardNodes = (lastProps.current.shards || [])\n .map(extractRef)\n .filter(Boolean)\n .filter(function (node) { return node.contains(event.target); });\n var shouldStop = shardNodes.length > 0 ? shouldCancelEvent(event, shardNodes[0]) : !lastProps.current.noIsolation;\n if (shouldStop) {\n if (event.cancelable) {\n event.preventDefault();\n }\n }\n }\n }, []);\n var shouldCancel = React.useCallback(function (name, delta, target, should) {\n var event = { name: name, delta: delta, target: target, should: should, shadowParent: getOutermostShadowParent(target) };\n shouldPreventQueue.current.push(event);\n setTimeout(function () {\n shouldPreventQueue.current = shouldPreventQueue.current.filter(function (e) { return e !== event; });\n }, 1);\n }, []);\n var scrollTouchStart = React.useCallback(function (event) {\n touchStartRef.current = getTouchXY(event);\n activeAxis.current = undefined;\n }, []);\n var scrollWheel = React.useCallback(function (event) {\n shouldCancel(event.type, getDeltaXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n }, []);\n var scrollTouchMove = React.useCallback(function (event) {\n shouldCancel(event.type, getTouchXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n }, []);\n React.useEffect(function () {\n lockStack.push(Style);\n props.setCallbacks({\n onScrollCapture: scrollWheel,\n onWheelCapture: scrollWheel,\n onTouchMoveCapture: scrollTouchMove,\n });\n document.addEventListener('wheel', shouldPrevent, nonPassive);\n document.addEventListener('touchmove', shouldPrevent, nonPassive);\n document.addEventListener('touchstart', scrollTouchStart, nonPassive);\n return function () {\n lockStack = lockStack.filter(function (inst) { return inst !== Style; });\n document.removeEventListener('wheel', shouldPrevent, nonPassive);\n document.removeEventListener('touchmove', shouldPrevent, nonPassive);\n document.removeEventListener('touchstart', scrollTouchStart, nonPassive);\n };\n }, []);\n var removeScrollBar = props.removeScrollBar, inert = props.inert;\n return (React.createElement(React.Fragment, null,\n inert ? React.createElement(Style, { styles: generateStyle(id) }) : null,\n removeScrollBar ? React.createElement(RemoveScrollBar, { noRelative: props.noRelative, gapMode: props.gapMode }) : null));\n}\nfunction getOutermostShadowParent(node) {\n var shadowParent = null;\n while (node !== null) {\n if (node instanceof ShadowRoot) {\n shadowParent = node.host;\n node = node.host;\n }\n node = node.parentNode;\n }\n return shadowParent;\n}\n","import { exportSidecar } from 'use-sidecar';\nimport { RemoveScrollSideCar } from './SideEffect';\nimport { effectCar } from './medium';\nexport default exportSidecar(effectCar, RemoveScrollSideCar);\n","import { __assign } from \"tslib\";\nimport * as React from 'react';\nimport { RemoveScroll } from './UI';\nimport SideCar from './sidecar';\nvar ReactRemoveScroll = React.forwardRef(function (props, ref) { return (React.createElement(RemoveScroll, __assign({}, props, { ref: ref, sideCar: SideCar }))); });\nReactRemoveScroll.classNames = RemoveScroll.classNames;\nexport default ReactRemoveScroll;\n","// Tiny `fetch` wrapper aimed at the @modern-admin/nest REST surface. We avoid\n// pulling axios — the host browser already has fetch, and TanStack Query gives\n// us retry/dedup/caching anyway.\n\nimport type { DashboardBlob } from '@modern-admin/core'\nimport type {\n AdminConfig,\n CustomActionResponse,\n CurrentUser,\n ListQuery,\n ListResponse,\n RecordResponse,\n} from './types.js'\n\nexport interface AuthUiProps {\n /** Enabled OAuth provider ids, e.g. ['google', 'github']. */\n providers: string[]\n emailAndPassword: boolean\n}\n\ninterface StoredDemoSession {\n email: string\n password: string\n}\n\nconst DEFAULT_DEMO_SESSION_STORAGE_KEY = 'modern-admin:demo-session:v1'\n\nexport interface AdminClientOptions {\n /** Absolute base URL of the API, e.g. http://localhost:3001 — defaults to same-origin. */\n baseUrl?: string\n /** Send credentials with every request (cookies for Better Auth sessions). */\n credentials?: RequestCredentials\n /** Optional global headers (auth tokens, CSRF). */\n headers?: Record<string, string>\n persistDemoSession?: boolean\n demoSessionStorageKey?: string\n /**\n * Path under which the host mounts Better Auth's Node handler\n * (`toNodeHandler(auth)`) AND configures `betterAuth({ basePath })`.\n * Drives the sign-in / sign-out endpoints — defaults to\n * `/admin/api/auth`, matching the canonical CLI scaffold. Override only\n * if the host mounts Better Auth elsewhere; pass *without* a trailing\n * slash, e.g. `'/api/auth'` (Better Auth's own default).\n */\n authBasePath?: string\n}\n\nconst DEFAULT_AUTH_BASE_PATH = '/admin/api/auth'\n\nconst buildQuery = (query?: ListQuery): string => {\n if (!query) return ''\n const params = new URLSearchParams()\n if (query.page != null) params.set('page', String(query.page))\n if (query.perPage != null) params.set('perPage', String(query.perPage))\n if (query.sortBy) params.set('sortBy', query.sortBy)\n if (query.direction) params.set('direction', query.direction)\n if (query.filters) {\n // Bracket notation — Express's qs parser turns `filters[k]=v` into\n // `query.filters = { k: 'v' }` which is what the list action expects.\n for (const [k, v] of Object.entries(query.filters)) {\n if (v !== '' && v != null) params.set(`filters[${k}]`, v)\n }\n }\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\nexport class AdminClient {\n private readonly baseUrl: string\n private readonly credentials: RequestCredentials\n private readonly headers: Record<string, string>\n private readonly demoSessionStorageKey: string | null\n private readonly authBasePath: string\n private readonly signInPath: string\n private readonly signOutPath: string\n\n constructor(opts: AdminClientOptions = {}) {\n this.baseUrl = opts.baseUrl?.replace(/\\/$/, '') ?? ''\n this.credentials = opts.credentials ?? 'include'\n this.headers = opts.headers ?? {}\n this.demoSessionStorageKey = opts.persistDemoSession\n ? (opts.demoSessionStorageKey ?? DEFAULT_DEMO_SESSION_STORAGE_KEY)\n : null\n this.authBasePath = (opts.authBasePath ?? DEFAULT_AUTH_BASE_PATH).replace(/\\/$/, '')\n this.signInPath = `${this.authBasePath}/sign-in/email`\n this.signOutPath = `${this.authBasePath}/sign-out`\n }\n\n /** Base URL the client was configured with ('' = same-origin). The\n * realtime bridge derives the WS endpoint from it. */\n get apiBaseUrl(): string {\n return this.baseUrl\n }\n\n private async requestOnce<T>(path: string, init: RequestInit = {}): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n credentials: this.credentials,\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...(init.headers as Record<string, string> | undefined),\n },\n })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new AdminApiError(res.status, text || res.statusText)\n }\n if (res.status === 204) return undefined as T\n return (await res.json()) as T\n }\n\n private async request<T>(path: string, init: RequestInit = {}, allowDemoRestore = true): Promise<T> {\n try {\n return await this.requestOnce<T>(path, init)\n } catch (err) {\n const canRestore =\n allowDemoRestore &&\n err instanceof AdminApiError &&\n err.status === 401 &&\n path !== this.signInPath &&\n path !== this.signOutPath\n if (!canRestore) throw err\n const restored = await this.restoreDemoSession()\n if (!restored) throw err\n return this.requestOnce<T>(path, init)\n }\n }\n\n private readDemoSession(): StoredDemoSession | null {\n if (!this.demoSessionStorageKey || typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(this.demoSessionStorageKey)\n if (!raw) return null\n const parsed = JSON.parse(raw) as Partial<StoredDemoSession>\n if (typeof parsed.email !== 'string' || typeof parsed.password !== 'string') return null\n return { email: parsed.email, password: parsed.password }\n } catch {\n return null\n }\n }\n\n private writeDemoSession(session: StoredDemoSession): void {\n if (!this.demoSessionStorageKey || typeof window === 'undefined') return\n try {\n window.localStorage.setItem(this.demoSessionStorageKey, JSON.stringify(session))\n } catch {\n return\n }\n }\n\n private clearDemoSession(): void {\n if (!this.demoSessionStorageKey || typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(this.demoSessionStorageKey)\n } catch {\n return\n }\n }\n\n private async restoreDemoSession(): Promise<boolean> {\n const session = this.readDemoSession()\n if (!session) return false\n try {\n await this.request<unknown>(this.signInPath, {\n method: 'POST',\n body: JSON.stringify(session),\n })\n return true\n } catch {\n this.clearDemoSession()\n return false\n }\n }\n\n config(): Promise<AdminConfig> {\n return this.request<AdminConfig>('/admin/api/config')\n }\n\n /** Resolve the current authenticated admin. Throws AdminApiError(401) when\n * unauthenticated — callers should branch on that to render login. */\n me(): Promise<{ user: CurrentUser }> {\n return this.request<{ user: CurrentUser }>('/admin/api/auth/me')\n }\n\n /** Email/password login via the host-mounted Better Auth handler. The\n * endpoint sets an http-only session cookie that subsequent requests\n * rely on (`credentials: 'include'`). The audit-log entry is written\n * server-side by Better Auth's `session.create.after` hook, which\n * covers email/password, OAuth, passkey and api-key flows uniformly. */\n async login(email: string, password: string): Promise<void> {\n await this.request<unknown>(this.signInPath, {\n method: 'POST',\n body: JSON.stringify({ email, password }),\n })\n this.writeDemoSession({ email, password })\n }\n\n /** Fetch public auth UI metadata: which social providers are enabled,\n * whether email/password login is active. The endpoint is unauthenticated. */\n getAuthUiProps(): Promise<AuthUiProps> {\n return this.requestOnce<AuthUiProps>('/admin/api/auth/ui-props')\n }\n\n /** Initiate an OAuth social-login flow. Calls Better Auth's sign-in/social\n * endpoint which returns a redirect URL, then navigates the browser there.\n * `callbackUrl` defaults to the current page so the app re-checks auth\n * after the provider redirects back. */\n async loginSocial(provider: string, callbackUrl?: string): Promise<void> {\n const resolved =\n callbackUrl ?? (typeof window !== 'undefined' ? window.location.href : '/')\n const data = await this.requestOnce<{ url?: string }>(\n `${this.authBasePath}/sign-in/social`,\n {\n method: 'POST',\n body: JSON.stringify({ provider, callbackURL: resolved }),\n },\n )\n if (data.url && typeof window !== 'undefined') {\n window.location.href = data.url\n }\n }\n\n /** Sign the current session out. Better Auth's sign-out endpoint requires\n * an explicit JSON body (even if empty) when Content-Type is JSON. */\n async logout(): Promise<void> {\n try {\n await this.request<unknown>(this.signOutPath, {\n method: 'POST',\n body: '{}',\n })\n } finally {\n this.clearDemoSession()\n }\n }\n\n list(resourceId: string, query?: ListQuery): Promise<ListResponse> {\n return this.request<ListResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/list${buildQuery(query)}`,\n )\n }\n\n show(resourceId: string, recordId: string): Promise<RecordResponse> {\n return this.request<RecordResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/actions/show`,\n )\n }\n\n create(resourceId: string, payload: Record<string, unknown>): Promise<RecordResponse> {\n return this.request<RecordResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/new`,\n { method: 'POST', body: JSON.stringify(payload) },\n )\n }\n\n update(\n resourceId: string,\n recordId: string,\n payload: Record<string, unknown>,\n ): Promise<RecordResponse> {\n return this.request<RecordResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/actions/edit`,\n { method: 'PATCH', body: JSON.stringify(payload) },\n )\n }\n\n delete(resourceId: string, recordId: string): Promise<void> {\n return this.request<void>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/actions/delete`,\n { method: 'DELETE' },\n )\n }\n\n /** Bulk-delete a set of records via the resource's `bulkDelete` action. */\n bulkDelete(resourceId: string, recordIds: ReadonlyArray<string>): Promise<unknown> {\n return this.request<unknown>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/bulkDelete`,\n { method: 'POST', body: JSON.stringify({ recordIds }) },\n )\n }\n\n /** Fetch distinct values for a field — used by the filter value picker.\n * Returns `{ values, hasMore }`. */\n distinctValues(\n resourceId: string,\n field: string,\n options?: { search?: string; limit?: number },\n ): Promise<{ values: string[]; hasMore: boolean }> {\n const params = new URLSearchParams({ field })\n if (options?.search) params.set('search', options.search)\n if (options?.limit != null) params.set('limit', String(options.limit))\n return this.request<{ values: string[]; hasMore: boolean }>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/values?${params.toString()}`,\n )\n }\n\n search(resourceId: string, query: string): Promise<ListResponse> {\n const qs = query ? `?q=${encodeURIComponent(query)}` : ''\n return this.request<ListResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/search${qs}`,\n )\n }\n\n /** Cross-resource search. Fans `query` out to every registered resource's\n * `search` action; resources the principal cannot access are omitted.\n *\n * Accepts an optional `AbortSignal` so the command-palette dialog can\n * cancel an in-flight request when the user keeps typing — without this\n * the server is hit once per keystroke and stale responses race with\n * newer ones. */\n globalSearch(\n query: string,\n perResourceLimit?: number,\n options: { signal?: AbortSignal } = {},\n ): Promise<GlobalSearchResponse> {\n const params = new URLSearchParams({ q: query })\n if (perResourceLimit != null) params.set('perResourceLimit', String(perResourceLimit))\n return this.request<GlobalSearchResponse>(\n `/admin/api/global-search?${params.toString()}`,\n options.signal ? { signal: options.signal } : {},\n )\n }\n\n /** Invoke a custom record-scoped action (actionType: 'record'). */\n invokeRecordAction(\n resourceId: string,\n recordId: string,\n actionName: string,\n payload: Record<string, unknown> = {},\n ): Promise<CustomActionResponse> {\n return this.request<CustomActionResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/actions/${encodeURIComponent(actionName)}`,\n { method: 'POST', body: JSON.stringify(payload) },\n )\n }\n\n /** Invoke a custom bulk-scoped action (actionType: 'bulk'). */\n invokeBulkAction(\n resourceId: string,\n actionName: string,\n recordIds: ReadonlyArray<string>,\n ): Promise<CustomActionResponse> {\n return this.request<CustomActionResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/${encodeURIComponent(actionName)}`,\n { method: 'POST', body: JSON.stringify({ recordIds: Array.from(recordIds) }) },\n )\n }\n\n /** Invoke a custom resource-scoped action (actionType: 'resource'). */\n invokeResourceAction(\n resourceId: string,\n actionName: string,\n payload: Record<string, unknown> = {},\n ): Promise<CustomActionResponse> {\n return this.request<CustomActionResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/actions/${encodeURIComponent(actionName)}`,\n { method: 'POST', body: JSON.stringify(payload) },\n )\n }\n\n /**\n * Run a time-series aggregation. KPI mode = `step: 'all'`. Multi-series\n * via secondary `groupBy` (top-N truncation server-side).\n */\n timeseries(query: TimeSeriesQuery): Promise<TimeSeriesResponse> {\n const body: Record<string, unknown> = {\n resource: query.resource,\n dateField: query.dateField,\n step: query.step,\n metric: query.metric,\n from: toIsoDateTime(query.from, 'start'),\n to: toIsoDateTime(query.to, 'end'),\n }\n if (query.field) body.field = query.field\n if (query.groupBy) body.groupBy = query.groupBy\n if (query.topN != null) body.topN = query.topN\n if (query.filters && Object.keys(query.filters).length) {\n body.filters = query.filters\n }\n if (query.comparePrevious) body.comparePrevious = true\n if (query.groupByLabelResource) body.groupByLabelResource = query.groupByLabelResource\n return this.request<TimeSeriesResponse>('/admin/api/timeseries', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n }\n\n listHistory(\n resourceId: string,\n recordId: string,\n query: { limit?: number; offset?: number } = {},\n ): Promise<HistoryListResponse> {\n const params = new URLSearchParams()\n if (query.limit != null) params.set('limit', String(query.limit))\n if (query.offset != null) params.set('offset', String(query.offset))\n const qs = params.toString() ? `?${params.toString()}` : ''\n return this.request<HistoryListResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/history${qs}`,\n )\n }\n\n getHistoryRevision(\n resourceId: string,\n recordId: string,\n revisionId: string,\n ): Promise<HistoryRevisionResponse> {\n return this.request<HistoryRevisionResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/history/${encodeURIComponent(revisionId)}`,\n )\n }\n\n revertHistoryRevision(\n resourceId: string,\n recordId: string,\n revisionId: string,\n body: { reason?: string } = {},\n ): Promise<RecordResponse> {\n return this.request<RecordResponse>(\n `/admin/api/resources/${encodeURIComponent(resourceId)}/records/${encodeURIComponent(recordId)}/history/${encodeURIComponent(revisionId)}/revert`,\n { method: 'POST', body: JSON.stringify(body) },\n )\n }\n\n listAuditLog(query: AuditLogQuery = {}): Promise<AuditLogResponse> {\n const params = new URLSearchParams()\n if (query.resourceId) params.set('resourceId', query.resourceId)\n if (query.recordId) params.set('recordId', query.recordId)\n if (query.userId) params.set('userId', query.userId)\n if (query.actions?.length) params.set('actions', query.actions.join(','))\n if (query.from) params.set('from', toIsoDateTime(query.from, 'start'))\n if (query.to) params.set('to', toIsoDateTime(query.to, 'end'))\n if (query.limit != null) params.set('limit', String(query.limit))\n if (query.offset != null) params.set('offset', String(query.offset))\n if (query.before != null) params.set('before', String(query.before))\n const qs = params.toString() ? `?${params.toString()}` : ''\n return this.request<AuditLogResponse>(`/admin/api/audit-log${qs}`)\n }\n\n /**\n * Upload a single file for a `type: 'file'` property, reporting progress\n * via `options.onProgress`. Uses `XMLHttpRequest` because the fetch API\n * does not expose upload-side progress events.\n *\n * Returns the metadata record for the uploaded file. The server endpoint\n * (`POST /admin/api/resources/:id/actions/upload`) accepts batch uploads\n * and replies with an array; we send one file per request and unwrap the\n * single result so the caller gets per-file progress and per-file errors.\n */\n uploadFile(\n resourceId: string,\n field: string,\n file: File,\n options: UploadFileOptions = {},\n ): Promise<UploadedFileInfo> {\n const url = `${this.baseUrl}/admin/api/resources/${encodeURIComponent(resourceId)}/actions/upload?field=${encodeURIComponent(field)}`\n const form = new FormData()\n form.append('files', file)\n return new Promise<UploadedFileInfo>((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('POST', url, true)\n xhr.withCredentials = this.credentials !== 'omit'\n for (const [k, v] of Object.entries(this.headers)) xhr.setRequestHeader(k, v)\n xhr.responseType = 'text'\n xhr.upload.onprogress = (ev): void => {\n if (!options.onProgress) return\n const total = ev.lengthComputable ? ev.total : file.size\n const loaded = ev.loaded\n options.onProgress({\n loaded,\n total,\n percent: total > 0 ? Math.min(100, Math.round((loaded / total) * 100)) : 0,\n })\n }\n xhr.onload = (): void => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const arr = JSON.parse(xhr.responseText) as UploadedFileInfo[]\n const first = arr[0]\n if (!first) {\n reject(new AdminApiError(500, 'Server returned no upload result'))\n return\n }\n // Emit a final 100% progress tick so UI can settle the bar.\n options.onProgress?.({ loaded: file.size, total: file.size, percent: 100 })\n resolve(first)\n } catch (err) {\n reject(new AdminApiError(500, err instanceof Error ? err.message : 'Invalid upload response'))\n }\n } else {\n reject(new AdminApiError(xhr.status, xhr.responseText || xhr.statusText))\n }\n }\n xhr.onerror = (): void => reject(new AdminApiError(0, 'Network error during upload'))\n xhr.onabort = (): void => reject(new AdminApiError(0, 'Upload aborted'))\n if (options.signal) {\n if (options.signal.aborted) {\n xhr.abort()\n return\n }\n options.signal.addEventListener('abort', () => xhr.abort(), { once: true })\n }\n xhr.send(form)\n })\n }\n\n /**\n * Upload many files with bounded concurrency, reporting per-file progress\n * via `options.onItem*` callbacks. Each file is sent in its own request,\n * so partial failures do not affect already-completed uploads.\n *\n * Returns the array of successful results in the order files were passed.\n * Failed entries are omitted from the returned array; consumers wanting\n * to react to failures should observe `onItemError`.\n */\n async uploadFiles(\n resourceId: string,\n field: string,\n files: ReadonlyArray<File>,\n options: UploadFilesOptions = {},\n ): Promise<UploadedFileInfo[]> {\n if (files.length === 0) return []\n const concurrency = Math.max(1, options.concurrency ?? 3)\n const results: Array<UploadedFileInfo | null> = new Array(files.length).fill(null)\n let cursor = 0\n const runOne = async (): Promise<void> => {\n while (true) {\n const i = cursor++\n if (i >= files.length) return\n const file = files[i]!\n options.onItemStart?.(i, file)\n try {\n const info = await this.uploadFile(resourceId, field, file, {\n signal: options.signal,\n onProgress: (p) => options.onItemProgress?.(i, file, p),\n })\n results[i] = info\n options.onItemComplete?.(i, file, info)\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n options.onItemError?.(i, file, e)\n }\n }\n }\n const workers = Array.from({ length: Math.min(concurrency, files.length) }, () => runOne())\n await Promise.all(workers)\n return results.filter((r): r is UploadedFileInfo => r != null)\n }\n\n /** Load the current user's dashboard layout from the server config store. */\n loadDashboard(): Promise<{ dashboard: DashboardBlob }> {\n return this.request<{ dashboard: DashboardBlob }>('/admin/api/dashboard')\n }\n\n /** Persist the current user's dashboard layout to the server config store. */\n saveDashboard(dashboard: DashboardBlob): Promise<{ ok: boolean }> {\n return this.request<{ ok: boolean }>('/admin/api/dashboard', {\n method: 'PUT',\n body: JSON.stringify(dashboard),\n })\n }\n\n /** List API keys belonging to the current admin. */\n listApiKeys(): Promise<{ keys: ApiKeyRecord[] }> {\n return this.request<{ keys: ApiKeyRecord[] }>('/admin/api/api-keys')\n }\n\n /** Create a new API key. The plaintext secret is returned exactly once. */\n createApiKey(payload: {\n name: string\n permissions: Record<string, string[]>\n expiresInDays?: number | null\n }): Promise<{ key: string; record: ApiKeyRecord }> {\n return this.request<{ key: string; record: ApiKeyRecord }>('/admin/api/api-keys', {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n }\n\n /** Patch a key — name/enabled/permissions/expiry. */\n updateApiKey(\n id: string,\n payload: {\n name?: string\n enabled?: boolean\n permissions?: Record<string, string[]>\n expiresInDays?: number | null\n },\n ): Promise<{ record: ApiKeyRecord }> {\n return this.request<{ record: ApiKeyRecord }>(\n `/admin/api/api-keys/${encodeURIComponent(id)}`,\n { method: 'PATCH', body: JSON.stringify(payload) },\n )\n }\n\n /** Permanently revoke (delete) an API key. */\n deleteApiKey(id: string): Promise<{ success: true }> {\n return this.request<{ success: true }>(\n `/admin/api/api-keys/${encodeURIComponent(id)}`,\n { method: 'DELETE' },\n )\n }\n\n listWebhooks(): Promise<{ webhooks: WebhookRecord[] }> {\n return this.request<{ webhooks: WebhookRecord[] }>('/admin/api/webhooks')\n }\n\n createWebhook(payload: WebhookInput): Promise<{ webhook: WebhookRecord }> {\n return this.request<{ webhook: WebhookRecord }>('/admin/api/webhooks', {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n }\n\n updateWebhook(id: string, payload: Partial<WebhookInput>): Promise<{ webhook: WebhookRecord }> {\n return this.request<{ webhook: WebhookRecord }>(\n `/admin/api/webhooks/${encodeURIComponent(id)}`,\n { method: 'PATCH', body: JSON.stringify(payload) },\n )\n }\n\n deleteWebhook(id: string): Promise<{ success: true }> {\n return this.request<{ success: true }>(\n `/admin/api/webhooks/${encodeURIComponent(id)}`,\n { method: 'DELETE' },\n )\n }\n\n listWebhookDeliveries(id: string, limit = 50): Promise<{ deliveries: WebhookDeliveryRecord[] }> {\n return this.request<{ deliveries: WebhookDeliveryRecord[] }>(\n `/admin/api/webhooks/${encodeURIComponent(id)}/deliveries?limit=${encodeURIComponent(String(limit))}`,\n )\n }\n\n testWebhook(id: string): Promise<{ success: true }> {\n return this.request<{ success: true }>(\n `/admin/api/webhooks/${encodeURIComponent(id)}/test`,\n { method: 'POST', body: '{}' },\n )\n }\n\n /**\n * Cancel a still-pending upload — deletes the file from storage immediately.\n * Use when the user removes a freshly uploaded file *before* saving the\n * form. Files that have already been confirmed (record saved) cannot be\n * cancelled via this endpoint and the call will reject with 404.\n */\n async cancelUpload(resourceId: string, field: string, key: string): Promise<void> {\n const qs = `?field=${encodeURIComponent(field)}&key=${encodeURIComponent(key)}`\n const res = await fetch(\n `${this.baseUrl}/admin/api/resources/${encodeURIComponent(resourceId)}/actions/upload${qs}`,\n { method: 'DELETE', credentials: this.credentials, headers: this.headers },\n )\n if (!res.ok && res.status !== 404) {\n const text = await res.text().catch(() => '')\n throw new AdminApiError(res.status, text || res.statusText)\n }\n }\n\n /**\n * Send a single image to the resource's `aiFill` action and receive a\n * `values` map the edit form can hydrate from. Uses multipart/form-data\n * because vision models expect raw bytes, not base64-stringified payloads.\n *\n * Supports an optional `signal` for cancellation and the demo-session 401\n * auto-restore logic (matching the behaviour of `request()`). Cannot use\n * `requestOnce` directly because that always sets `Content-Type: application/json`,\n * which would override the browser-generated multipart boundary.\n */\n async aiFillFromImage(\n resourceId: string,\n file: File,\n options: { signal?: AbortSignal } = {},\n ): Promise<AiFillResponse> {\n const url = `${this.baseUrl}/admin/api/resources/${encodeURIComponent(resourceId)}/ai-fill`\n\n const doFetch = async (): Promise<AiFillResponse> => {\n const form = new FormData()\n form.append('image', file)\n const res = await fetch(url, {\n method: 'POST',\n credentials: this.credentials,\n // Intentionally omit Content-Type — the browser sets it automatically\n // with the correct multipart/form-data boundary.\n headers: this.headers,\n body: form,\n signal: options.signal,\n })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new AdminApiError(res.status, text || res.statusText)\n }\n return (await res.json()) as AiFillResponse\n }\n\n try {\n return await doFetch()\n } catch (err) {\n const canRestore =\n err instanceof AdminApiError &&\n err.status === 401 &&\n !options.signal?.aborted\n if (!canRestore) throw err\n const restored = await this.restoreDemoSession()\n if (!restored) throw err\n return doFetch()\n }\n }\n\n getAiAssistantSettings(): Promise<AiAssistantSettings> {\n return this.request<AiAssistantSettings>('/admin/api/ai-assistant/settings')\n }\n\n async updateAiAssistantSettings(payload: {\n enabled: boolean\n model: string\n apiKey?: string\n systemPrompt?: string\n }): Promise<AiAssistantSettings> {\n return this.request<AiAssistantSettings>('/admin/api/ai-assistant/settings', {\n method: 'PUT',\n body: JSON.stringify(payload),\n })\n }\n\n async sendAiAssistantChat(\n messages: AiAssistantChatMessage[],\n requestId?: string,\n locale?: string,\n conversationId?: string,\n clientContext?: AiClientContext,\n ): Promise<AiAssistantChatEnqueueResponse> {\n return this.request<AiAssistantChatEnqueueResponse>('/admin/api/ai-assistant/chat', {\n method: 'POST',\n body: JSON.stringify({\n messages,\n ...(requestId ? { requestId } : {}),\n ...(locale ? { locale } : {}),\n ...(conversationId ? { conversationId } : {}),\n ...(clientContext ? { clientContext } : {}),\n }),\n })\n }\n\n async listAiAssistantChats(): Promise<AiAssistantChatHistoryItem[]> {\n return this.request<AiAssistantChatHistoryItem[]>('/admin/api/ai-assistant/chats')\n }\n\n async getAiAssistantTask(taskId: string): Promise<AiAssistantTask> {\n return this.request<AiAssistantTask>(`/admin/api/ai-assistant/tasks/${encodeURIComponent(taskId)}`)\n }\n\n}\n\n// ─── Time-series ──────────────────────────────────────────────────────────\n\nconst DATE_ONLY_RE = /^\\d{4}-\\d{2}-\\d{2}$/\n\nconst toIsoDateTime = (value: string, edge: 'start' | 'end'): string => {\n if (DATE_ONLY_RE.test(value)) {\n return `${value}T${edge === 'start' ? '00:00:00.000' : '23:59:59.999'}Z`\n }\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? value : date.toISOString()\n}\n\nexport type TimeSeriesMetric = 'count' | 'sum' | 'avg' | 'min' | 'max'\nexport type TimeSeriesStep = 'day' | 'week' | 'month' | 'year' | 'all'\n\nexport interface TimeSeriesQuery {\n resource: string\n /** Property path of the date/datetime column used for X-axis bucketing. */\n dateField: string\n step: TimeSeriesStep\n metric: TimeSeriesMetric\n /** Required for non-count metrics. */\n field?: string\n /** Optional secondary breakdown — produces one series per distinct value. */\n groupBy?: string\n /** Maximum series count for grouped charts. Default 10. */\n topN?: number\n /**\n * When set, the server resolves each non-special series key (FK id) to a\n * human-readable title via `findMany` on this resource.\n */\n groupByLabelResource?: string\n /** ISO datetime, inclusive start. */\n from: string\n /** ISO datetime, inclusive end. */\n to: string\n /** List-page-style filters narrowing the dataset. */\n filters?: Record<string, string>\n /** When true, response includes the equal-length previous window (KPI delta). */\n comparePrevious?: boolean\n}\n\nexport interface TimeSeriesPoint {\n /** ISO date `YYYY-MM-DD`. */\n date: string\n value: number\n}\n\nexport interface TimeSeriesSeries {\n /** Series identifier. `'__total__'` when no `groupBy` is set, `'__other__'` for the topN remainder. */\n key: string\n points: TimeSeriesPoint[]\n}\n\nexport interface TimeSeriesResponse {\n series: TimeSeriesSeries[]\n /** Populated when the request used `comparePrevious: true`. */\n previous?: TimeSeriesSeries[]\n /** Captured raw SQL — only present for callers whose role is allowed. */\n sql?: string\n /** `false` when the resource's adapter does not implement aggregateTimeSeries. */\n supported: boolean\n /** Populated when `groupByLabelResource` was set — maps series key → title. */\n resolvedLabels?: Record<string, string>\n /**\n * `true` when the adapter could not aggregate the full window and the\n * series reflect only a capped subset of rows — the chart is partial.\n */\n truncated?: boolean\n}\n\nexport type HistoryOp = 'create' | 'update' | 'delete'\n\nexport interface HistoryDiffEntry {\n path: string\n before?: unknown\n after?: unknown\n kind: 'added' | 'changed' | 'removed'\n}\n\nexport interface HistoryRevision {\n id: string\n resourceId: string\n recordId: string\n op: HistoryOp\n userId?: string\n snapshot: Record<string, unknown>\n snapshotBefore?: Record<string, unknown>\n createdAt: string\n}\n\nexport interface HistoryListResponse {\n revisions: HistoryRevision[]\n}\n\nexport interface HistoryRevisionResponse {\n revision: HistoryRevision\n}\n\nexport interface AuditLogEntry {\n /** UUID v7 assigned by the writer; optional for legacy in-memory rows. */\n id?: string\n resourceId: string\n action: string\n recordId?: string\n recordIds?: string[]\n /** Human-readable title of the affected record, stored at write time. */\n recordTitle?: string\n userId?: string\n payload?: Record<string, unknown>\n result?: Record<string, unknown>\n at: number\n}\n\nexport interface AuditLogQuery {\n resourceId?: string\n recordId?: string\n userId?: string\n actions?: string[]\n from?: string\n to?: string\n limit?: number\n offset?: number\n /** Cursor: fetch only entries with `at` strictly before this unix-ms value. */\n before?: number\n}\n\nexport interface AuditLogResponse {\n events: AuditLogEntry[]\n}\n\n/** Wire shape of an API key record exposed by `/admin/api/api-keys/*`. */\nexport interface ApiKeyRecord {\n id: string\n name: string | null\n start: string | null\n prefix: string | null\n enabled: boolean\n permissions: Record<string, string[]>\n expiresAt: string | null\n lastRequest: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface WebhookInput {\n name: string\n url: string\n events: string[]\n resourceId?: string | null\n enabled?: boolean\n secret?: string\n headers?: Record<string, string>\n filters?: Record<string, string>\n payloadFields?: string[]\n}\n\nexport interface WebhookRecord extends Required<Omit<WebhookInput, 'secret'>> {\n id: string\n secret?: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface WebhookDeliveryRecord {\n id: string\n webhookId: string\n event: string\n payload: Record<string, unknown>\n status: 'pending' | 'success' | 'failed'\n responseStatus?: number\n responseBody?: string\n error?: string\n attempt: number\n createdAt: string\n deliveredAt?: string\n}\n\nexport interface AiAssistantSettings {\n enabled: boolean\n configured: boolean\n provider: 'openrouter'\n model: string\n maskedApiKey: string | null\n systemPrompt: string\n canManage: boolean\n canChat: boolean\n readOnly: boolean\n}\n\nexport interface AiAssistantChatMessage {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Snapshot of the admin frontend at the moment the user sent the message,\n * passed alongside the chat payload so the assistant can ground itself.\n */\nexport interface AiClientContext {\n /** Current window pathname, e.g. \"/\" or \"/resources/posts/abc\". */\n pathname?: string\n}\n\n/** Allowed navigation targets — mirrors the safe subset of `Route`. */\nexport type AiNavigateRoute =\n | { name: 'home' }\n | { name: 'audit-log' }\n | { name: 'list'; resourceId: string }\n | { name: 'show'; resourceId: string; recordId: string }\n | { name: 'settings'; section?: string }\n\n/** Side-effect emitted by the assistant for the frontend to execute. */\nexport type AiUiAction =\n | { kind: 'navigate'; route: AiNavigateRoute }\n | { kind: 'refresh'; target: 'dashboard' }\n\nexport interface AiAssistantCitation {\n resourceId: string\n recordId?: string\n label: string\n}\n\nexport interface AiAssistantChatResponse {\n message: { role: 'assistant'; content: string }\n citations: AiAssistantCitation[]\n toolCalls: Array<{ toolName: string; state: string }>\n taskId?: string\n}\n\nexport interface AiAssistantChatEnqueueResponse {\n taskId: string\n status: 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'\n}\n\nexport interface AiAssistantChatHistoryItem {\n conversationId: string\n taskId: string\n title: string\n status: 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'\n updatedAt: string\n}\n\nexport interface AiAssistantTask {\n id: string\n kind: string\n resourceId?: string\n recordId?: string\n userId?: string\n status: 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'\n input: Record<string, unknown>\n output?: {\n text?: string\n citations?: AiAssistantCitation[]\n toolCalls?: Array<{ toolName: string }>\n uiActions?: AiUiAction[]\n [key: string]: unknown\n }\n error?: string\n progress: number | null\n createdAt: string\n updatedAt: string\n startedAt?: string\n finishedAt?: string\n}\n\nexport interface AiFillResponse {\n /** Map of property path → extracted value. Only fields the model could\n * confidently extract are present; the form merges them into existing\n * values without clobbering unrelated columns. */\n values: Record<string, unknown>\n}\n\n/** Metadata returned by `POST /upload` for one file. */\nexport interface UploadedFileInfo {\n key: string\n url: string\n name: string\n size: number\n mimeType: string\n}\n\n/** Bytes-loaded snapshot emitted by `XMLHttpRequest.upload.onprogress`. */\nexport interface UploadProgress {\n loaded: number\n total: number\n /** 0–100, rounded. */\n percent: number\n}\n\nexport interface UploadFileOptions {\n onProgress?: (p: UploadProgress) => void\n signal?: AbortSignal\n}\n\nexport interface UploadFilesOptions {\n /** Maximum concurrent in-flight requests. Default 3. */\n concurrency?: number\n signal?: AbortSignal\n onItemStart?: (index: number, file: File) => void\n onItemProgress?: (index: number, file: File, p: UploadProgress) => void\n onItemComplete?: (index: number, file: File, info: UploadedFileInfo) => void\n onItemError?: (index: number, file: File, error: Error) => void\n}\n\nexport interface GlobalSearchHit {\n resourceId: string\n resourceName: string\n recordId: string\n title: string\n /** Property path whose value matched the query (omitted when matched on title or id). */\n matchedField?: string\n /** ~80-char excerpt with the matched substring near its center. */\n snippet?: string\n /** Relevance ranking — higher is better. Mirrors the server-side rubric. */\n score?: number\n}\n\nexport interface GlobalSearchGroup {\n resourceId: string\n resourceName: string\n records: GlobalSearchHit[]\n}\n\nexport interface GlobalSearchResponse {\n query: string\n groups: GlobalSearchGroup[]\n total: number\n}\n\nexport class AdminApiError extends Error {\n constructor(public readonly status: number, message: string) {\n super(message)\n this.name = 'AdminApiError'\n }\n}\n\n/** Extract a human-readable message from any error thrown by AdminClient.\n * The raw message is the HTTP response body text (often JSON). We try to\n * parse the `.message` field from the JSON payload before falling back. */\nexport function parseApiError(err: unknown): { status?: number; message: string } {\n if (err instanceof AdminApiError) {\n try {\n const body = JSON.parse(err.message) as { message?: string }\n return { status: err.status, message: body.message ?? err.message }\n } catch {\n return { status: err.status, message: err.message }\n }\n }\n return { message: err instanceof Error ? err.message : String(err) }\n}\n","// src/subscribable.ts\nvar Subscribable = class {\n constructor() {\n this.listeners = /* @__PURE__ */ new Set();\n this.subscribe = this.subscribe.bind(this);\n }\n subscribe(listener) {\n this.listeners.add(listener);\n this.onSubscribe();\n return () => {\n this.listeners.delete(listener);\n this.onUnsubscribe();\n };\n }\n hasListeners() {\n return this.listeners.size > 0;\n }\n onSubscribe() {\n }\n onUnsubscribe() {\n }\n};\nexport {\n Subscribable\n};\n//# sourceMappingURL=subscribable.js.map","// src/focusManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nvar FocusManager = class extends Subscribable {\n #focused;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onFocus) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const listener = () => onFocus();\n window.addEventListener(\"visibilitychange\", listener, false);\n return () => {\n window.removeEventListener(\"visibilitychange\", listener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup((focused) => {\n if (typeof focused === \"boolean\") {\n this.setFocused(focused);\n } else {\n this.onFocus();\n }\n });\n }\n setFocused(focused) {\n const changed = this.#focused !== focused;\n if (changed) {\n this.#focused = focused;\n this.onFocus();\n }\n }\n onFocus() {\n const isFocused = this.isFocused();\n this.listeners.forEach((listener) => {\n listener(isFocused);\n });\n }\n isFocused() {\n if (typeof this.#focused === \"boolean\") {\n return this.#focused;\n }\n return globalThis.document?.visibilityState !== \"hidden\";\n }\n};\nvar focusManager = new FocusManager();\nexport {\n FocusManager,\n focusManager\n};\n//# sourceMappingURL=focusManager.js.map","// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support the default provider's concrete timer ID, which is\n // infeasible across environments.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider = defaultTimeoutProvider;\n #providerCalled = false;\n setTimeoutProvider(provider) {\n if (process.env.NODE_ENV !== \"production\") {\n if (this.#providerCalled && provider !== this.#provider) {\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider }\n );\n }\n }\n this.#provider = provider;\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = false;\n }\n }\n setTimeout(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setTimeout(callback, delay);\n }\n clearTimeout(timeoutId) {\n this.#provider.clearTimeout(timeoutId);\n }\n setInterval(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setInterval(callback, delay);\n }\n clearInterval(intervalId) {\n this.#provider.clearInterval(intervalId);\n }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n setTimeout(callback, 0);\n}\nexport {\n TimeoutManager,\n defaultTimeoutProvider,\n systemSetTimeoutZero,\n timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveQueryBoolean(option, query) {\n return typeof option === \"function\" ? option(query) : option;\n}\nfunction matchQuery(filters, query) {\n const {\n type = \"all\",\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale\n } = filters;\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n if (type !== \"all\") {\n const isActive = query.isActive();\n if (type === \"active\" && !isActive) {\n return false;\n }\n if (type === \"inactive\" && isActive) {\n return false;\n }\n }\n if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n return false;\n }\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false;\n }\n if (predicate && !predicate(query)) {\n return false;\n }\n return true;\n}\nfunction matchMutation(filters, mutation) {\n const { exact, status, predicate, mutationKey } = filters;\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n if (status && mutation.state.status !== status) {\n return false;\n }\n if (predicate && !predicate(mutation)) {\n return false;\n }\n return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n const hashFn = options?.queryKeyHashFn || hashKey;\n return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n return JSON.stringify(\n queryKey,\n (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {}) : val\n );\n}\nfunction partialMatchKey(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n }\n return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b, depth = 0) {\n if (a === b) {\n return a;\n }\n if (depth > 500) return b;\n const array = isPlainArray(a) && isPlainArray(b);\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n const aItems = array ? a : Object.keys(a);\n const aSize = aItems.length;\n const bItems = array ? b : Object.keys(b);\n const bSize = bItems.length;\n const copy = array ? new Array(bSize) : {};\n let equalItems = 0;\n for (let i = 0; i < bSize; i++) {\n const key = array ? i : bItems[i];\n const aItem = a[key];\n const bItem = b[key];\n if (aItem === bItem) {\n copy[key] = aItem;\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n continue;\n }\n if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n copy[key] = bItem;\n continue;\n }\n const v = replaceEqualDeep(aItem, bItem, depth + 1);\n copy[key] = v;\n if (v === aItem) equalItems++;\n }\n return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\nfunction isPlainArray(value) {\n return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n }\n const ctor = o.constructor;\n if (ctor === void 0) {\n return true;\n }\n const prot = ctor.prototype;\n if (!hasObjectPrototype(prot)) {\n return false;\n }\n if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false;\n }\n return true;\n}\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout);\n });\n}\nfunction replaceData(prevData, data, options) {\n if (typeof options.structuralSharing === \"function\") {\n return options.structuralSharing(prevData, data);\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== \"production\") {\n try {\n return replaceEqualDeep(prevData, data);\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n );\n throw error;\n }\n }\n return replaceEqualDeep(prevData, data);\n }\n return data;\n}\nfunction keepPreviousData(previousData) {\n return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = /* @__PURE__ */ Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n );\n }\n }\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise;\n }\n if (!options.queryFn || options.queryFn === skipToken) {\n return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n }\n return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n if (typeof throwOnError === \"function\") {\n return throwOnError(...params);\n }\n return !!throwOnError;\n}\nfunction addConsumeAwareSignal(object, getSignal, onCancelled) {\n let consumed = false;\n let signal;\n Object.defineProperty(object, \"signal\", {\n enumerable: true,\n get: () => {\n signal ??= getSignal();\n if (consumed) {\n return signal;\n }\n consumed = true;\n if (signal.aborted) {\n onCancelled();\n } else {\n signal.addEventListener(\"abort\", onCancelled, { once: true });\n }\n return signal;\n }\n });\n return object;\n}\nexport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn,\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n isPlainArray,\n isPlainObject,\n isServer,\n isValidTimeout,\n keepPreviousData,\n matchMutation,\n matchQuery,\n noop,\n partialMatchKey,\n replaceData,\n replaceEqualDeep,\n resolveQueryBoolean,\n resolveStaleTime,\n shallowEqualObjects,\n shouldThrowError,\n skipToken,\n sleep,\n timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/environmentManager.ts\nimport { isServer } from \"./utils.js\";\nvar environmentManager = /* @__PURE__ */ (() => {\n let isServerFn = () => isServer;\n return {\n /**\n * Returns whether the current runtime should be treated as a server environment.\n */\n isServer() {\n return isServerFn();\n },\n /**\n * Overrides the server check globally.\n */\n setIsServer(isServerValue) {\n isServerFn = isServerValue;\n }\n };\n})();\nexport {\n environmentManager\n};\n//# sourceMappingURL=environmentManager.js.map","// src/thenable.ts\nimport { noop } from \"./utils.js\";\nfunction pendingThenable() {\n let resolve;\n let reject;\n const thenable = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n thenable.status = \"pending\";\n thenable.catch(() => {\n });\n function finalize(data) {\n Object.assign(thenable, data);\n delete thenable.resolve;\n delete thenable.reject;\n }\n thenable.resolve = (value) => {\n finalize({\n status: \"fulfilled\",\n value\n });\n resolve(value);\n };\n thenable.reject = (reason) => {\n finalize({\n status: \"rejected\",\n reason\n });\n reject(reason);\n };\n return thenable;\n}\nfunction tryResolveSync(promise) {\n let data;\n promise.then((result) => {\n data = result;\n return result;\n }, noop)?.catch(noop);\n if (data !== void 0) {\n return { data };\n }\n return void 0;\n}\nexport {\n pendingThenable,\n tryResolveSync\n};\n//# sourceMappingURL=thenable.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n let queue = [];\n let transactions = 0;\n let notifyFn = (callback) => {\n callback();\n };\n let batchNotifyFn = (callback) => {\n callback();\n };\n let scheduleFn = defaultScheduler;\n const schedule = (callback) => {\n if (transactions) {\n queue.push(callback);\n } else {\n scheduleFn(() => {\n notifyFn(callback);\n });\n }\n };\n const flush = () => {\n const originalQueue = queue;\n queue = [];\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback);\n });\n });\n });\n }\n };\n return {\n batch: (callback) => {\n let result;\n transactions++;\n try {\n result = callback();\n } finally {\n transactions--;\n if (!transactions) {\n flush();\n }\n }\n return result;\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: (callback) => {\n return (...args) => {\n schedule(() => {\n callback(...args);\n });\n };\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn) => {\n notifyFn = fn;\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn) => {\n batchNotifyFn = fn;\n },\n setScheduler: (fn) => {\n scheduleFn = fn;\n }\n };\n}\nvar notifyManager = createNotifyManager();\nexport {\n createNotifyManager,\n defaultScheduler,\n notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/onlineManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nvar OnlineManager = class extends Subscribable {\n #online = true;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onOnline) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const onlineListener = () => onOnline(true);\n const offlineListener = () => onOnline(false);\n window.addEventListener(\"online\", onlineListener, false);\n window.addEventListener(\"offline\", offlineListener, false);\n return () => {\n window.removeEventListener(\"online\", onlineListener);\n window.removeEventListener(\"offline\", offlineListener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup(this.setOnline.bind(this));\n }\n setOnline(online) {\n const changed = this.#online !== online;\n if (changed) {\n this.#online = online;\n this.listeners.forEach((listener) => {\n listener(online);\n });\n }\n }\n isOnline() {\n return this.#online;\n }\n};\nvar onlineManager = new OnlineManager();\nexport {\n OnlineManager,\n onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map","// src/retryer.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { sleep } from \"./utils.js\";\nfunction defaultRetryDelay(failureCount) {\n return Math.min(1e3 * 2 ** failureCount, 3e4);\n}\nfunction canFetch(networkMode) {\n return (networkMode ?? \"online\") === \"online\" ? onlineManager.isOnline() : true;\n}\nvar CancelledError = class extends Error {\n constructor(options) {\n super(\"CancelledError\");\n this.revert = options?.revert;\n this.silent = options?.silent;\n }\n};\nfunction isCancelledError(value) {\n return value instanceof CancelledError;\n}\nfunction createRetryer(config) {\n let isRetryCancelled = false;\n let failureCount = 0;\n let continueFn;\n const thenable = pendingThenable();\n const isResolved = () => thenable.status !== \"pending\";\n const cancel = (cancelOptions) => {\n if (!isResolved()) {\n const error = new CancelledError(cancelOptions);\n reject(error);\n config.onCancel?.(error);\n }\n };\n const cancelRetry = () => {\n isRetryCancelled = true;\n };\n const continueRetry = () => {\n isRetryCancelled = false;\n };\n const canContinue = () => focusManager.isFocused() && (config.networkMode === \"always\" || onlineManager.isOnline()) && config.canRun();\n const canStart = () => canFetch(config.networkMode) && config.canRun();\n const resolve = (value) => {\n if (!isResolved()) {\n continueFn?.();\n thenable.resolve(value);\n }\n };\n const reject = (value) => {\n if (!isResolved()) {\n continueFn?.();\n thenable.reject(value);\n }\n };\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved() || canContinue()) {\n continueResolve(value);\n }\n };\n config.onPause?.();\n }).then(() => {\n continueFn = void 0;\n if (!isResolved()) {\n config.onContinue?.();\n }\n });\n };\n const run = () => {\n if (isResolved()) {\n return;\n }\n let promiseOrValue;\n const initialPromise = failureCount === 0 ? config.initialPromise : void 0;\n try {\n promiseOrValue = initialPromise ?? config.fn();\n } catch (error) {\n promiseOrValue = Promise.reject(error);\n }\n Promise.resolve(promiseOrValue).then(resolve).catch((error) => {\n if (isResolved()) {\n return;\n }\n const retry = config.retry ?? (environmentManager.isServer() ? 0 : 3);\n const retryDelay = config.retryDelay ?? defaultRetryDelay;\n const delay = typeof retryDelay === \"function\" ? retryDelay(failureCount, error) : retryDelay;\n const shouldRetry = retry === true || typeof retry === \"number\" && failureCount < retry || typeof retry === \"function\" && retry(failureCount, error);\n if (isRetryCancelled || !shouldRetry) {\n reject(error);\n return;\n }\n failureCount++;\n config.onFail?.(failureCount, error);\n sleep(delay).then(() => {\n return canContinue() ? void 0 : pause();\n }).then(() => {\n if (isRetryCancelled) {\n reject(error);\n } else {\n run();\n }\n });\n });\n };\n return {\n promise: thenable,\n status: () => thenable.status,\n cancel,\n continue: () => {\n continueFn?.();\n return thenable;\n },\n cancelRetry,\n continueRetry,\n canStart,\n start: () => {\n if (canStart()) {\n run();\n } else {\n pause().then(run);\n }\n return thenable;\n }\n };\n}\nexport {\n CancelledError,\n canFetch,\n createRetryer,\n isCancelledError\n};\n//# sourceMappingURL=retryer.js.map","// src/removable.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { isValidTimeout } from \"./utils.js\";\nvar Removable = class {\n #gcTimeout;\n destroy() {\n this.clearGcTimeout();\n }\n scheduleGc() {\n this.clearGcTimeout();\n if (isValidTimeout(this.gcTime)) {\n this.#gcTimeout = timeoutManager.setTimeout(() => {\n this.optionalRemove();\n }, this.gcTime);\n }\n }\n updateGcTime(newGcTime) {\n this.gcTime = Math.max(\n this.gcTime || 0,\n newGcTime ?? (environmentManager.isServer() ? Infinity : 5 * 60 * 1e3)\n );\n }\n clearGcTimeout() {\n if (this.#gcTimeout !== void 0) {\n timeoutManager.clearTimeout(this.#gcTimeout);\n this.#gcTimeout = void 0;\n }\n }\n};\nexport {\n Removable\n};\n//# sourceMappingURL=removable.js.map","// src/infiniteQueryBehavior.ts\nimport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn\n} from \"./utils.js\";\nfunction infiniteQueryBehavior(pages) {\n return {\n onFetch: (context, query) => {\n const options = context.options;\n const direction = context.fetchOptions?.meta?.fetchMore?.direction;\n const oldPages = context.state.data?.pages || [];\n const oldPageParams = context.state.data?.pageParams || [];\n let result = { pages: [], pageParams: [] };\n let currentPage = 0;\n const fetchFn = async () => {\n let cancelled = false;\n const addSignalProperty = (object) => {\n addConsumeAwareSignal(\n object,\n () => context.signal,\n () => cancelled = true\n );\n };\n const queryFn = ensureQueryFn(context.options, context.fetchOptions);\n const fetchPage = async (data, param, previous) => {\n if (cancelled) {\n return Promise.reject(context.signal.reason);\n }\n if (param == null && data.pages.length) {\n return Promise.resolve(data);\n }\n const createQueryFnContext = () => {\n const queryFnContext2 = {\n client: context.client,\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? \"backward\" : \"forward\",\n meta: context.options.meta\n };\n addSignalProperty(queryFnContext2);\n return queryFnContext2;\n };\n const queryFnContext = createQueryFnContext();\n const page = await queryFn(queryFnContext);\n const { maxPages } = context.options;\n const addTo = previous ? addToStart : addToEnd;\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages)\n };\n };\n if (direction && oldPages.length) {\n const previous = direction === \"backward\";\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams\n };\n const param = pageParamFn(options, oldData);\n result = await fetchPage(oldData, param, previous);\n } else {\n const remainingPages = pages ?? oldPages.length;\n do {\n const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);\n if (currentPage > 0 && param == null) {\n break;\n }\n result = await fetchPage(result, param);\n currentPage++;\n } while (currentPage < remainingPages);\n }\n return result;\n };\n if (context.options.persister) {\n context.fetchFn = () => {\n return context.options.persister?.(\n fetchFn,\n {\n client: context.client,\n queryKey: context.queryKey,\n meta: context.options.meta,\n signal: context.signal\n },\n query\n );\n };\n } else {\n context.fetchFn = fetchFn;\n }\n }\n };\n}\nfunction getNextPageParam(options, { pages, pageParams }) {\n const lastIndex = pages.length - 1;\n return pages.length > 0 ? options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams\n ) : void 0;\n}\nfunction getPreviousPageParam(options, { pages, pageParams }) {\n return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;\n}\nfunction hasNextPage(options, data) {\n if (!data) return false;\n return getNextPageParam(options, data) != null;\n}\nfunction hasPreviousPage(options, data) {\n if (!data || !options.getPreviousPageParam) return false;\n return getPreviousPageParam(options, data) != null;\n}\nexport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior\n};\n//# sourceMappingURL=infiniteQueryBehavior.js.map","// src/query.ts\nimport {\n ensureQueryFn,\n noop,\n replaceData,\n resolveQueryBoolean,\n resolveStaleTime,\n skipToken,\n timeUntilStale\n} from \"./utils.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { CancelledError, canFetch, createRetryer } from \"./retryer.js\";\nimport { Removable } from \"./removable.js\";\nimport { infiniteQueryBehavior } from \"./infiniteQueryBehavior.js\";\nvar Query = class extends Removable {\n #queryType;\n #initialState;\n #revertState;\n #cache;\n #client;\n #retryer;\n #defaultOptions;\n #abortSignalConsumed;\n constructor(config) {\n super();\n this.#abortSignalConsumed = false;\n this.#defaultOptions = config.defaultOptions;\n this.setOptions(config.options);\n this.observers = [];\n this.#client = config.client;\n this.#cache = this.#client.getQueryCache();\n this.queryKey = config.queryKey;\n this.queryHash = config.queryHash;\n this.#initialState = getDefaultState(this.options);\n this.state = config.state ?? this.#initialState;\n this.scheduleGc();\n }\n get meta() {\n return this.options.meta;\n }\n get queryType() {\n return this.#queryType;\n }\n get promise() {\n return this.#retryer?.promise;\n }\n setOptions(options) {\n this.options = { ...this.#defaultOptions, ...options };\n if (options?._type) {\n this.#queryType = options._type;\n }\n this.updateGcTime(this.options.gcTime);\n if (this.state && this.state.data === void 0) {\n const defaultState = getDefaultState(this.options);\n if (defaultState.data !== void 0) {\n this.setState(\n successState(defaultState.data, defaultState.dataUpdatedAt)\n );\n this.#initialState = defaultState;\n }\n }\n }\n optionalRemove() {\n if (!this.observers.length && this.state.fetchStatus === \"idle\") {\n this.#cache.remove(this);\n }\n }\n setData(newData, options) {\n const data = replaceData(this.state.data, newData, this.options);\n this.#dispatch({\n data,\n type: \"success\",\n dataUpdatedAt: options?.updatedAt,\n manual: options?.manual\n });\n return data;\n }\n setState(state) {\n this.#dispatch({ type: \"setState\", state });\n }\n cancel(options) {\n const promise = this.#retryer?.promise;\n this.#retryer?.cancel(options);\n return promise ? promise.then(noop).catch(noop) : Promise.resolve();\n }\n destroy() {\n super.destroy();\n this.cancel({ silent: true });\n }\n get resetState() {\n return this.#initialState;\n }\n reset() {\n this.destroy();\n this.setState(this.resetState);\n }\n isActive() {\n return this.observers.some(\n (observer) => resolveQueryBoolean(observer.options.enabled, this) !== false\n );\n }\n isDisabled() {\n if (this.getObserversCount() > 0) {\n return !this.isActive();\n }\n return this.options.queryFn === skipToken || !this.isFetched();\n }\n isFetched() {\n return this.state.dataUpdateCount + this.state.errorUpdateCount > 0;\n }\n isStatic() {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => resolveStaleTime(observer.options.staleTime, this) === \"static\"\n );\n }\n return false;\n }\n isStale() {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => observer.getCurrentResult().isStale\n );\n }\n return this.state.data === void 0 || this.state.isInvalidated;\n }\n isStaleByTime(staleTime = 0) {\n if (this.state.data === void 0) {\n return true;\n }\n if (staleTime === \"static\") {\n return false;\n }\n if (this.state.isInvalidated) {\n return true;\n }\n return !timeUntilStale(this.state.dataUpdatedAt, staleTime);\n }\n onFocus() {\n const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus());\n observer?.refetch({ cancelRefetch: false });\n this.#retryer?.continue();\n }\n onOnline() {\n const observer = this.observers.find((x) => x.shouldFetchOnReconnect());\n observer?.refetch({ cancelRefetch: false });\n this.#retryer?.continue();\n }\n addObserver(observer) {\n if (!this.observers.includes(observer)) {\n this.observers.push(observer);\n this.clearGcTimeout();\n this.#cache.notify({ type: \"observerAdded\", query: this, observer });\n }\n }\n removeObserver(observer) {\n if (this.observers.includes(observer)) {\n this.observers = this.observers.filter((x) => x !== observer);\n if (!this.observers.length) {\n if (this.#retryer) {\n if (this.#abortSignalConsumed || this.#isInitialPausedFetch()) {\n this.#retryer.cancel({ revert: true });\n } else {\n this.#retryer.cancelRetry();\n }\n }\n this.scheduleGc();\n }\n this.#cache.notify({ type: \"observerRemoved\", query: this, observer });\n }\n }\n getObserversCount() {\n return this.observers.length;\n }\n #isInitialPausedFetch() {\n return this.state.fetchStatus === \"paused\" && this.state.status === \"pending\";\n }\n invalidate() {\n if (!this.state.isInvalidated) {\n this.#dispatch({ type: \"invalidate\" });\n }\n }\n async fetch(options, fetchOptions) {\n if (this.state.fetchStatus !== \"idle\" && // If the promise in the retryer is already rejected, we have to definitely\n // re-start the fetch; there is a chance that the query is still in a\n // pending state when that happens\n this.#retryer?.status() !== \"rejected\") {\n if (this.state.data !== void 0 && fetchOptions?.cancelRefetch) {\n this.cancel({ silent: true });\n } else if (this.#retryer) {\n this.#retryer.continueRetry();\n return this.#retryer.promise;\n }\n }\n if (options) {\n this.setOptions(options);\n }\n if (!this.options.queryFn) {\n const observer = this.observers.find((x) => x.options.queryFn);\n if (observer) {\n this.setOptions(observer.options);\n }\n }\n if (process.env.NODE_ENV !== \"production\") {\n if (!Array.isArray(this.options.queryKey)) {\n console.error(\n `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`\n );\n }\n }\n const abortController = new AbortController();\n const addSignalProperty = (object) => {\n Object.defineProperty(object, \"signal\", {\n enumerable: true,\n get: () => {\n this.#abortSignalConsumed = true;\n return abortController.signal;\n }\n });\n };\n const fetchFn = () => {\n const queryFn = ensureQueryFn(this.options, fetchOptions);\n const createQueryFnContext = () => {\n const queryFnContext2 = {\n client: this.#client,\n queryKey: this.queryKey,\n meta: this.meta\n };\n addSignalProperty(queryFnContext2);\n return queryFnContext2;\n };\n const queryFnContext = createQueryFnContext();\n this.#abortSignalConsumed = false;\n if (this.options.persister) {\n return this.options.persister(\n queryFn,\n queryFnContext,\n this\n );\n }\n return queryFn(queryFnContext);\n };\n const createFetchContext = () => {\n const context2 = {\n fetchOptions,\n options: this.options,\n queryKey: this.queryKey,\n client: this.#client,\n state: this.state,\n fetchFn\n };\n addSignalProperty(context2);\n return context2;\n };\n const context = createFetchContext();\n const behavior = this.#queryType === \"infinite\" ? infiniteQueryBehavior(\n this.options.pages\n ) : this.options.behavior;\n behavior?.onFetch(context, this);\n this.#revertState = this.state;\n if (this.state.fetchStatus === \"idle\" || this.state.fetchMeta !== context.fetchOptions?.meta) {\n this.#dispatch({ type: \"fetch\", meta: context.fetchOptions?.meta });\n }\n this.#retryer = createRetryer({\n initialPromise: fetchOptions?.initialPromise,\n fn: context.fetchFn,\n onCancel: (error) => {\n if (error instanceof CancelledError && error.revert) {\n this.setState({\n ...this.#revertState,\n fetchStatus: \"idle\"\n });\n }\n abortController.abort();\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: \"failed\", failureCount, error });\n },\n onPause: () => {\n this.#dispatch({ type: \"pause\" });\n },\n onContinue: () => {\n this.#dispatch({ type: \"continue\" });\n },\n retry: context.options.retry,\n retryDelay: context.options.retryDelay,\n networkMode: context.options.networkMode,\n canRun: () => true\n });\n try {\n const data = await this.#retryer.start();\n if (data === void 0) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`\n );\n }\n throw new Error(`${this.queryHash} data is undefined`);\n }\n this.setData(data);\n this.#cache.config.onSuccess?.(data, this);\n this.#cache.config.onSettled?.(\n data,\n this.state.error,\n this\n );\n return data;\n } catch (error) {\n if (error instanceof CancelledError) {\n if (error.silent) {\n return this.#retryer.promise;\n } else if (error.revert) {\n if (this.state.data === void 0) {\n throw error;\n }\n return this.state.data;\n }\n }\n this.#dispatch({\n type: \"error\",\n error\n });\n this.#cache.config.onError?.(\n error,\n this\n );\n this.#cache.config.onSettled?.(\n this.state.data,\n error,\n this\n );\n throw error;\n } finally {\n this.scheduleGc();\n }\n }\n #dispatch(action) {\n const reducer = (state) => {\n switch (action.type) {\n case \"failed\":\n return {\n ...state,\n fetchFailureCount: action.failureCount,\n fetchFailureReason: action.error\n };\n case \"pause\":\n return {\n ...state,\n fetchStatus: \"paused\"\n };\n case \"continue\":\n return {\n ...state,\n fetchStatus: \"fetching\"\n };\n case \"fetch\":\n return {\n ...state,\n ...fetchState(state.data, this.options),\n fetchMeta: action.meta ?? null\n };\n case \"success\":\n const newState = {\n ...state,\n ...successState(action.data, action.dataUpdatedAt),\n dataUpdateCount: state.dataUpdateCount + 1,\n ...!action.manual && {\n fetchStatus: \"idle\",\n fetchFailureCount: 0,\n fetchFailureReason: null\n }\n };\n this.#revertState = action.manual ? newState : void 0;\n return newState;\n case \"error\":\n const error = action.error;\n return {\n ...state,\n error,\n errorUpdateCount: state.errorUpdateCount + 1,\n errorUpdatedAt: Date.now(),\n fetchFailureCount: state.fetchFailureCount + 1,\n fetchFailureReason: error,\n fetchStatus: \"idle\",\n status: \"error\",\n // flag existing data as invalidated if we get a background error\n // note that \"no data\" always means stale so we can set unconditionally here\n isInvalidated: true\n };\n case \"invalidate\":\n return {\n ...state,\n isInvalidated: true\n };\n case \"setState\":\n return {\n ...state,\n ...action.state\n };\n }\n };\n this.state = reducer(this.state);\n notifyManager.batch(() => {\n this.observers.forEach((observer) => {\n observer.onQueryUpdate();\n });\n this.#cache.notify({ query: this, type: \"updated\", action });\n });\n }\n};\nfunction fetchState(data, options) {\n return {\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchStatus: canFetch(options.networkMode) ? \"fetching\" : \"paused\",\n ...data === void 0 && {\n error: null,\n status: \"pending\"\n }\n };\n}\nfunction successState(data, dataUpdatedAt) {\n return {\n data,\n dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n error: null,\n isInvalidated: false,\n status: \"success\"\n };\n}\nfunction getDefaultState(options) {\n const data = typeof options.initialData === \"function\" ? options.initialData() : options.initialData;\n const hasData = data !== void 0;\n const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === \"function\" ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;\n return {\n data,\n dataUpdateCount: 0,\n dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,\n error: null,\n errorUpdateCount: 0,\n errorUpdatedAt: 0,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchMeta: null,\n isInvalidated: false,\n status: hasData ? \"success\" : \"pending\",\n fetchStatus: \"idle\"\n };\n}\nexport {\n Query,\n fetchState\n};\n//# sourceMappingURL=query.js.map","// src/queryObserver.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { fetchState } from \"./query.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport {\n isValidTimeout,\n noop,\n replaceData,\n resolveQueryBoolean,\n resolveStaleTime,\n shallowEqualObjects,\n timeUntilStale\n} from \"./utils.js\";\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar QueryObserver = class extends Subscribable {\n constructor(client, options) {\n super();\n this.options = options;\n this.#client = client;\n this.#selectError = null;\n this.#currentThenable = pendingThenable();\n this.bindMethods();\n this.setOptions(options);\n }\n #client;\n #currentQuery = void 0;\n #currentQueryInitialState = void 0;\n #currentResult = void 0;\n #currentResultState;\n #currentResultOptions;\n #currentThenable;\n #selectError;\n #selectFn;\n #selectResult;\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData;\n #staleTimeoutId;\n #refetchIntervalId;\n #currentRefetchInterval;\n #trackedProps = /* @__PURE__ */ new Set();\n bindMethods() {\n this.refetch = this.refetch.bind(this);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this);\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch();\n } else {\n this.updateResult();\n }\n this.#updateTimers();\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.destroy();\n }\n }\n shouldFetchOnReconnect() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect\n );\n }\n shouldFetchOnWindowFocus() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus\n );\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#clearStaleTimeout();\n this.#clearRefetchInterval();\n this.#currentQuery.removeObserver(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n const prevQuery = this.#currentQuery;\n this.options = this.#client.defaultQueryOptions(options);\n if (this.options.enabled !== void 0 && typeof this.options.enabled !== \"boolean\" && typeof this.options.enabled !== \"function\" && typeof resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== \"boolean\") {\n throw new Error(\n \"Expected enabled to be a boolean or a callback that returns a boolean\"\n );\n }\n this.#updateQuery();\n this.#currentQuery.setOptions(this.options);\n if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getQueryCache().notify({\n type: \"observerOptionsUpdated\",\n query: this.#currentQuery,\n observer: this\n });\n }\n const mounted = this.hasListeners();\n if (mounted && shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions\n )) {\n this.#executeFetch();\n }\n this.updateResult();\n if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || resolveStaleTime(this.options.staleTime, this.#currentQuery) !== resolveStaleTime(prevOptions.staleTime, this.#currentQuery))) {\n this.#updateStaleTimeout();\n }\n const nextRefetchInterval = this.#computeRefetchInterval();\n if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || nextRefetchInterval !== this.#currentRefetchInterval)) {\n this.#updateRefetchInterval(nextRefetchInterval);\n }\n }\n getOptimisticResult(options) {\n const query = this.#client.getQueryCache().build(this.#client, options);\n const result = this.createResult(query, options);\n if (shouldAssignObserverCurrentProperties(this, result)) {\n this.#currentResult = result;\n this.#currentResultOptions = this.options;\n this.#currentResultState = this.#currentQuery.state;\n }\n return result;\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n trackResult(result, onPropTracked) {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key);\n onPropTracked?.(key);\n if (key === \"promise\") {\n this.trackProp(\"data\");\n if (!this.options.experimental_prefetchInRender && this.#currentThenable.status === \"pending\") {\n this.#currentThenable.reject(\n new Error(\n \"experimental_prefetchInRender feature flag is not enabled\"\n )\n );\n }\n }\n return Reflect.get(target, key);\n }\n });\n }\n trackProp(key) {\n this.#trackedProps.add(key);\n }\n getCurrentQuery() {\n return this.#currentQuery;\n }\n refetch({ ...options } = {}) {\n return this.fetch({\n ...options\n });\n }\n fetchOptimistic(options) {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const query = this.#client.getQueryCache().build(this.#client, defaultedOptions);\n return query.fetch().then(() => this.createResult(query, defaultedOptions));\n }\n fetch(fetchOptions) {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true\n }).then(() => {\n this.updateResult();\n return this.#currentResult;\n });\n }\n #executeFetch(fetchOptions) {\n this.#updateQuery();\n let promise = this.#currentQuery.fetch(\n this.options,\n fetchOptions\n );\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop);\n }\n return promise;\n }\n #updateStaleTimeout() {\n this.#clearStaleTimeout();\n const staleTime = resolveStaleTime(\n this.options.staleTime,\n this.#currentQuery\n );\n if (environmentManager.isServer() || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n return;\n }\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime);\n const timeout = time + 1;\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult();\n }\n }, timeout);\n }\n #computeRefetchInterval() {\n return (typeof this.options.refetchInterval === \"function\" ? this.options.refetchInterval(this.#currentQuery) : this.options.refetchInterval) ?? false;\n }\n #updateRefetchInterval(nextInterval) {\n this.#clearRefetchInterval();\n this.#currentRefetchInterval = nextInterval;\n if (environmentManager.isServer() || resolveQueryBoolean(this.options.enabled, this.#currentQuery) === false || !isValidTimeout(this.#currentRefetchInterval) || this.#currentRefetchInterval === 0) {\n return;\n }\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n this.#executeFetch();\n }\n }, this.#currentRefetchInterval);\n }\n #updateTimers() {\n this.#updateStaleTimeout();\n this.#updateRefetchInterval(this.#computeRefetchInterval());\n }\n #clearStaleTimeout() {\n if (this.#staleTimeoutId !== void 0) {\n timeoutManager.clearTimeout(this.#staleTimeoutId);\n this.#staleTimeoutId = void 0;\n }\n }\n #clearRefetchInterval() {\n if (this.#refetchIntervalId !== void 0) {\n timeoutManager.clearInterval(this.#refetchIntervalId);\n this.#refetchIntervalId = void 0;\n }\n }\n createResult(query, options) {\n const prevQuery = this.#currentQuery;\n const prevOptions = this.options;\n const prevResult = this.#currentResult;\n const prevResultState = this.#currentResultState;\n const prevResultOptions = this.#currentResultOptions;\n const queryChange = query !== prevQuery;\n const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;\n const { state } = query;\n let newState = { ...state };\n let isPlaceholderData = false;\n let data;\n if (options._optimisticResults) {\n const mounted = this.hasListeners();\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options)\n };\n }\n if (options._optimisticResults === \"isRestoring\") {\n newState.fetchStatus = \"idle\";\n }\n }\n let { error, errorUpdatedAt, status } = newState;\n data = newState.data;\n let skipSelect = false;\n if (options.placeholderData !== void 0 && data === void 0 && status === \"pending\") {\n let placeholderData;\n if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {\n placeholderData = prevResult.data;\n skipSelect = true;\n } else {\n placeholderData = typeof options.placeholderData === \"function\" ? options.placeholderData(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData\n ) : options.placeholderData;\n }\n if (placeholderData !== void 0) {\n status = \"success\";\n data = replaceData(\n prevResult?.data,\n placeholderData,\n options\n );\n isPlaceholderData = true;\n }\n }\n if (options.select && data !== void 0 && !skipSelect) {\n if (prevResult && data === prevResultState?.data && options.select === this.#selectFn) {\n data = this.#selectResult;\n } else {\n try {\n this.#selectFn = options.select;\n data = options.select(data);\n data = replaceData(prevResult?.data, data, options);\n this.#selectResult = data;\n this.#selectError = null;\n } catch (selectError) {\n this.#selectError = selectError;\n }\n }\n }\n if (this.#selectError) {\n error = this.#selectError;\n data = this.#selectResult;\n errorUpdatedAt = Date.now();\n status = \"error\";\n }\n const isFetching = newState.fetchStatus === \"fetching\";\n const isPending = status === \"pending\";\n const isError = status === \"error\";\n const isLoading = isPending && isFetching;\n const hasData = data !== void 0;\n const result = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === \"success\",\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: query.isFetched(),\n isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === \"paused\",\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n promise: this.#currentThenable,\n isEnabled: resolveQueryBoolean(options.enabled, query) !== false\n };\n const nextResult = result;\n if (this.options.experimental_prefetchInRender) {\n const hasResultData = nextResult.data !== void 0;\n const isErrorWithoutData = nextResult.status === \"error\" && !hasResultData;\n const finalizeThenableIfPossible = (thenable) => {\n if (isErrorWithoutData) {\n thenable.reject(nextResult.error);\n } else if (hasResultData) {\n thenable.resolve(nextResult.data);\n }\n };\n const recreateThenable = () => {\n const pending = this.#currentThenable = nextResult.promise = pendingThenable();\n finalizeThenableIfPossible(pending);\n };\n const prevThenable = this.#currentThenable;\n switch (prevThenable.status) {\n case \"pending\":\n if (query.queryHash === prevQuery.queryHash) {\n finalizeThenableIfPossible(prevThenable);\n }\n break;\n case \"fulfilled\":\n if (isErrorWithoutData || nextResult.data !== prevThenable.value) {\n recreateThenable();\n }\n break;\n case \"rejected\":\n if (!isErrorWithoutData || nextResult.error !== prevThenable.reason) {\n recreateThenable();\n }\n break;\n }\n }\n return nextResult;\n }\n updateResult() {\n const prevResult = this.#currentResult;\n const nextResult = this.createResult(this.#currentQuery, this.options);\n this.#currentResultState = this.#currentQuery.state;\n this.#currentResultOptions = this.options;\n if (this.#currentResultState.data !== void 0) {\n this.#lastQueryWithDefinedData = this.#currentQuery;\n }\n if (shallowEqualObjects(nextResult, prevResult)) {\n return;\n }\n this.#currentResult = nextResult;\n const shouldNotifyListeners = () => {\n if (!prevResult) {\n return true;\n }\n const { notifyOnChangeProps } = this.options;\n const notifyOnChangePropsValue = typeof notifyOnChangeProps === \"function\" ? notifyOnChangeProps() : notifyOnChangeProps;\n if (notifyOnChangePropsValue === \"all\" || !notifyOnChangePropsValue && !this.#trackedProps.size) {\n return true;\n }\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps\n );\n if (this.options.throwOnError) {\n includedProps.add(\"error\");\n }\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key;\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey];\n return changed && includedProps.has(typedKey);\n });\n };\n this.#notify({ listeners: shouldNotifyListeners() });\n }\n #updateQuery() {\n const query = this.#client.getQueryCache().build(this.#client, this.options);\n if (query === this.#currentQuery) {\n return;\n }\n const prevQuery = this.#currentQuery;\n this.#currentQuery = query;\n this.#currentQueryInitialState = query.state;\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this);\n query.addObserver(this);\n }\n }\n onQueryUpdate() {\n this.updateResult();\n if (this.hasListeners()) {\n this.#updateTimers();\n }\n }\n #notify(notifyOptions) {\n notifyManager.batch(() => {\n if (notifyOptions.listeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n }\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: \"observerResultsUpdated\"\n });\n });\n }\n};\nfunction shouldLoadOnMount(query, options) {\n return resolveQueryBoolean(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === \"error\" && resolveQueryBoolean(options.retryOnMount, query) === false);\n}\nfunction shouldFetchOnMount(query, options) {\n return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\nfunction shouldFetchOn(query, options, field) {\n if (resolveQueryBoolean(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== \"static\") {\n const value = typeof field === \"function\" ? field(query) : field;\n return value === \"always\" || value !== false && isStale(query, options);\n }\n return false;\n}\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n return (query !== prevQuery || resolveQueryBoolean(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== \"error\") && isStale(query, options);\n}\nfunction isStale(query, options) {\n return resolveQueryBoolean(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));\n}\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult) {\n if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n return true;\n }\n return false;\n}\nexport {\n QueryObserver\n};\n//# sourceMappingURL=queryObserver.js.map","// src/infiniteQueryObserver.ts\nimport { QueryObserver } from \"./queryObserver.js\";\nimport { hasNextPage, hasPreviousPage } from \"./infiniteQueryBehavior.js\";\nvar InfiniteQueryObserver = class extends QueryObserver {\n constructor(client, options) {\n super(client, options);\n }\n bindMethods() {\n super.bindMethods();\n this.fetchNextPage = this.fetchNextPage.bind(this);\n this.fetchPreviousPage = this.fetchPreviousPage.bind(this);\n }\n setOptions(options) {\n options._type = \"infinite\";\n super.setOptions(options);\n }\n getOptimisticResult(options) {\n options._type = \"infinite\";\n return super.getOptimisticResult(options);\n }\n fetchNextPage(options) {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: \"forward\" }\n }\n });\n }\n fetchPreviousPage(options) {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: \"backward\" }\n }\n });\n }\n createResult(query, options) {\n const { state } = query;\n const parentResult = super.createResult(query, options);\n const { isFetching, isRefetching, isError, isRefetchError } = parentResult;\n const fetchDirection = state.fetchMeta?.fetchMore?.direction;\n const isFetchNextPageError = isError && fetchDirection === \"forward\";\n const isFetchingNextPage = isFetching && fetchDirection === \"forward\";\n const isFetchPreviousPageError = isError && fetchDirection === \"backward\";\n const isFetchingPreviousPage = isFetching && fetchDirection === \"backward\";\n const result = {\n ...parentResult,\n fetchNextPage: this.fetchNextPage,\n fetchPreviousPage: this.fetchPreviousPage,\n hasNextPage: hasNextPage(options, state.data),\n hasPreviousPage: hasPreviousPage(options, state.data),\n isFetchNextPageError,\n isFetchingNextPage,\n isFetchPreviousPageError,\n isFetchingPreviousPage,\n isRefetchError: isRefetchError && !isFetchNextPageError && !isFetchPreviousPageError,\n isRefetching: isRefetching && !isFetchingNextPage && !isFetchingPreviousPage\n };\n return result;\n }\n};\nexport {\n InfiniteQueryObserver\n};\n//# sourceMappingURL=infiniteQueryObserver.js.map","// src/mutation.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Removable } from \"./removable.js\";\nimport { createRetryer } from \"./retryer.js\";\nvar Mutation = class extends Removable {\n #client;\n #observers;\n #mutationCache;\n #retryer;\n constructor(config) {\n super();\n this.#client = config.client;\n this.mutationId = config.mutationId;\n this.#mutationCache = config.mutationCache;\n this.#observers = [];\n this.state = config.state || getDefaultState();\n this.setOptions(config.options);\n this.scheduleGc();\n }\n setOptions(options) {\n this.options = options;\n this.updateGcTime(this.options.gcTime);\n }\n get meta() {\n return this.options.meta;\n }\n addObserver(observer) {\n if (!this.#observers.includes(observer)) {\n this.#observers.push(observer);\n this.clearGcTimeout();\n this.#mutationCache.notify({\n type: \"observerAdded\",\n mutation: this,\n observer\n });\n }\n }\n removeObserver(observer) {\n this.#observers = this.#observers.filter((x) => x !== observer);\n this.scheduleGc();\n this.#mutationCache.notify({\n type: \"observerRemoved\",\n mutation: this,\n observer\n });\n }\n optionalRemove() {\n if (!this.#observers.length) {\n if (this.state.status === \"pending\") {\n this.scheduleGc();\n } else {\n this.#mutationCache.remove(this);\n }\n }\n }\n continue() {\n return this.#retryer?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n this.execute(this.state.variables);\n }\n async execute(variables) {\n const onContinue = () => {\n this.#dispatch({ type: \"continue\" });\n };\n const mutationFnContext = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n this.#retryer = createRetryer({\n fn: () => {\n if (!this.options.mutationFn) {\n return Promise.reject(new Error(\"No mutationFn found\"));\n }\n return this.options.mutationFn(variables, mutationFnContext);\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: \"failed\", failureCount, error });\n },\n onPause: () => {\n this.#dispatch({ type: \"pause\" });\n },\n onContinue,\n retry: this.options.retry ?? 0,\n retryDelay: this.options.retryDelay,\n networkMode: this.options.networkMode,\n canRun: () => this.#mutationCache.canRun(this)\n });\n const restored = this.state.status === \"pending\";\n const isPaused = !this.#retryer.canStart();\n try {\n if (restored) {\n onContinue();\n } else {\n this.#dispatch({ type: \"pending\", variables, isPaused });\n if (this.#mutationCache.config.onMutate) {\n await this.#mutationCache.config.onMutate(\n variables,\n this,\n mutationFnContext\n );\n }\n const context = await this.options.onMutate?.(\n variables,\n mutationFnContext\n );\n if (context !== this.state.context) {\n this.#dispatch({\n type: \"pending\",\n context,\n variables,\n isPaused\n });\n }\n }\n const data = await this.#retryer.start();\n await this.#mutationCache.config.onSuccess?.(\n data,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSuccess?.(\n data,\n variables,\n this.state.context,\n mutationFnContext\n );\n await this.#mutationCache.config.onSettled?.(\n data,\n null,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSettled?.(\n data,\n null,\n variables,\n this.state.context,\n mutationFnContext\n );\n this.#dispatch({ type: \"success\", data });\n return data;\n } catch (error) {\n try {\n await this.#mutationCache.config.onError?.(\n error,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onError?.(\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.#mutationCache.config.onSettled?.(\n void 0,\n error,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onSettled?.(\n void 0,\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n this.#dispatch({ type: \"error\", error });\n throw error;\n } finally {\n this.#mutationCache.runNext(this);\n }\n }\n #dispatch(action) {\n const reducer = (state) => {\n switch (action.type) {\n case \"failed\":\n return {\n ...state,\n failureCount: action.failureCount,\n failureReason: action.error\n };\n case \"pause\":\n return {\n ...state,\n isPaused: true\n };\n case \"continue\":\n return {\n ...state,\n isPaused: false\n };\n case \"pending\":\n return {\n ...state,\n context: action.context,\n data: void 0,\n failureCount: 0,\n failureReason: null,\n error: null,\n isPaused: action.isPaused,\n status: \"pending\",\n variables: action.variables,\n submittedAt: Date.now()\n };\n case \"success\":\n return {\n ...state,\n data: action.data,\n failureCount: 0,\n failureReason: null,\n error: null,\n status: \"success\",\n isPaused: false\n };\n case \"error\":\n return {\n ...state,\n data: void 0,\n error: action.error,\n failureCount: state.failureCount + 1,\n failureReason: action.error,\n isPaused: false,\n status: \"error\"\n };\n }\n };\n this.state = reducer(this.state);\n notifyManager.batch(() => {\n this.#observers.forEach((observer) => {\n observer.onMutationUpdate(action);\n });\n this.#mutationCache.notify({\n mutation: this,\n type: \"updated\",\n action\n });\n });\n }\n};\nfunction getDefaultState() {\n return {\n context: void 0,\n data: void 0,\n error: null,\n failureCount: 0,\n failureReason: null,\n isPaused: false,\n status: \"idle\",\n variables: void 0,\n submittedAt: 0\n };\n}\nexport {\n Mutation,\n getDefaultState\n};\n//# sourceMappingURL=mutation.js.map","// src/mutationCache.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Mutation } from \"./mutation.js\";\nimport { matchMutation, noop } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar MutationCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#mutations = /* @__PURE__ */ new Set();\n this.#scopes = /* @__PURE__ */ new Map();\n this.#mutationId = 0;\n }\n #mutations;\n #scopes;\n #mutationId;\n build(client, options, state) {\n const mutation = new Mutation({\n client,\n mutationCache: this,\n mutationId: ++this.#mutationId,\n options: client.defaultMutationOptions(options),\n state\n });\n this.add(mutation);\n return mutation;\n }\n add(mutation) {\n this.#mutations.add(mutation);\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n scopedMutations.push(mutation);\n } else {\n this.#scopes.set(scope, [mutation]);\n }\n }\n this.notify({ type: \"added\", mutation });\n }\n remove(mutation) {\n if (this.#mutations.delete(mutation)) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n if (scopedMutations.length > 1) {\n const index = scopedMutations.indexOf(mutation);\n if (index !== -1) {\n scopedMutations.splice(index, 1);\n }\n } else if (scopedMutations[0] === mutation) {\n this.#scopes.delete(scope);\n }\n }\n }\n }\n this.notify({ type: \"removed\", mutation });\n }\n canRun(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const mutationsWithSameScope = this.#scopes.get(scope);\n const firstPendingMutation = mutationsWithSameScope?.find(\n (m) => m.state.status === \"pending\"\n );\n return !firstPendingMutation || firstPendingMutation === mutation;\n } else {\n return true;\n }\n }\n runNext(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const foundMutation = this.#scopes.get(scope)?.find((m) => m !== mutation && m.state.isPaused);\n return foundMutation?.continue() ?? Promise.resolve();\n } else {\n return Promise.resolve();\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.#mutations.forEach((mutation) => {\n this.notify({ type: \"removed\", mutation });\n });\n this.#mutations.clear();\n this.#scopes.clear();\n });\n }\n getAll() {\n return Array.from(this.#mutations);\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (mutation) => matchMutation(defaultedFilters, mutation)\n );\n }\n findAll(filters = {}) {\n return this.getAll().filter((mutation) => matchMutation(filters, mutation));\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n resumePausedMutations() {\n const pausedMutations = this.getAll().filter((x) => x.state.isPaused);\n return notifyManager.batch(\n () => Promise.all(\n pausedMutations.map((mutation) => mutation.continue().catch(noop))\n )\n );\n }\n};\nfunction scopeFor(mutation) {\n return mutation.options.scope?.id;\n}\nexport {\n MutationCache\n};\n//# sourceMappingURL=mutationCache.js.map","// src/mutationObserver.ts\nimport { getDefaultState } from \"./mutation.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { hashKey, shallowEqualObjects } from \"./utils.js\";\nvar MutationObserver = class extends Subscribable {\n #client;\n #currentResult = void 0;\n #currentMutation;\n #mutateOptions;\n constructor(client, options) {\n super();\n this.#client = client;\n this.setOptions(options);\n this.bindMethods();\n this.#updateResult();\n }\n bindMethods() {\n this.mutate = this.mutate.bind(this);\n this.reset = this.reset.bind(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n this.options = this.#client.defaultMutationOptions(options);\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: \"observerOptionsUpdated\",\n mutation: this.#currentMutation,\n observer: this\n });\n }\n if (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) {\n this.reset();\n } else if (this.#currentMutation?.state.status === \"pending\") {\n this.#currentMutation.setOptions(this.options);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this);\n }\n }\n onMutationUpdate(action) {\n this.#updateResult();\n this.#notify(action);\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n reset() {\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = void 0;\n this.#updateResult();\n this.#notify();\n }\n mutate(variables, options) {\n this.#mutateOptions = options;\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n this.#currentMutation.addObserver(this);\n return this.#currentMutation.execute(variables);\n }\n #updateResult() {\n const state = this.#currentMutation?.state ?? getDefaultState();\n this.#currentResult = {\n ...state,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n isIdle: state.status === \"idle\",\n mutate: this.mutate,\n reset: this.reset\n };\n }\n #notify(action) {\n notifyManager.batch(() => {\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables;\n const onMutateResult = this.#currentResult.context;\n const context = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n if (action?.type === \"success\") {\n try {\n this.#mutateOptions.onSuccess?.(\n action.data,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n action.data,\n null,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n } else if (action?.type === \"error\") {\n try {\n this.#mutateOptions.onError?.(\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n void 0,\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n }\n }\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n });\n }\n};\nexport {\n MutationObserver\n};\n//# sourceMappingURL=mutationObserver.js.map","// src/queryCache.ts\nimport { hashQueryKeyByOptions, matchQuery } from \"./utils.js\";\nimport { Query } from \"./query.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar QueryCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#queries = /* @__PURE__ */ new Map();\n }\n #queries;\n build(client, options, state) {\n const queryKey = options.queryKey;\n const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);\n let query = this.get(queryHash);\n if (!query) {\n query = new Query({\n client,\n queryKey,\n queryHash,\n options: client.defaultQueryOptions(options),\n state,\n defaultOptions: client.getQueryDefaults(queryKey)\n });\n this.add(query);\n }\n return query;\n }\n add(query) {\n if (!this.#queries.has(query.queryHash)) {\n this.#queries.set(query.queryHash, query);\n this.notify({\n type: \"added\",\n query\n });\n }\n }\n remove(query) {\n const queryInMap = this.#queries.get(query.queryHash);\n if (queryInMap) {\n query.destroy();\n if (queryInMap === query) {\n this.#queries.delete(query.queryHash);\n }\n this.notify({ type: \"removed\", query });\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n this.remove(query);\n });\n });\n }\n get(queryHash) {\n return this.#queries.get(queryHash);\n }\n getAll() {\n return [...this.#queries.values()];\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (query) => matchQuery(defaultedFilters, query)\n );\n }\n findAll(filters = {}) {\n const queries = this.getAll();\n return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n onFocus() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onFocus();\n });\n });\n }\n onOnline() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onOnline();\n });\n });\n }\n};\nexport {\n QueryCache\n};\n//# sourceMappingURL=queryCache.js.map","// src/queryClient.ts\nimport {\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n noop,\n partialMatchKey,\n resolveStaleTime,\n skipToken\n} from \"./utils.js\";\nimport { QueryCache } from \"./queryCache.js\";\nimport { MutationCache } from \"./mutationCache.js\";\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nvar QueryClient = class {\n #queryCache;\n #mutationCache;\n #defaultOptions;\n #queryDefaults;\n #mutationDefaults;\n #mountCount;\n #unsubscribeFocus;\n #unsubscribeOnline;\n constructor(config = {}) {\n this.#queryCache = config.queryCache || new QueryCache();\n this.#mutationCache = config.mutationCache || new MutationCache();\n this.#defaultOptions = config.defaultOptions || {};\n this.#queryDefaults = /* @__PURE__ */ new Map();\n this.#mutationDefaults = /* @__PURE__ */ new Map();\n this.#mountCount = 0;\n }\n mount() {\n this.#mountCount++;\n if (this.#mountCount !== 1) return;\n this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n if (focused) {\n await this.resumePausedMutations();\n this.#queryCache.onFocus();\n }\n });\n this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n if (online) {\n await this.resumePausedMutations();\n this.#queryCache.onOnline();\n }\n });\n }\n unmount() {\n this.#mountCount--;\n if (this.#mountCount !== 0) return;\n this.#unsubscribeFocus?.();\n this.#unsubscribeFocus = void 0;\n this.#unsubscribeOnline?.();\n this.#unsubscribeOnline = void 0;\n }\n isFetching(filters) {\n return this.#queryCache.findAll({ ...filters, fetchStatus: \"fetching\" }).length;\n }\n isMutating(filters) {\n return this.#mutationCache.findAll({ ...filters, status: \"pending\" }).length;\n }\n /**\n * Imperative (non-reactive) way to retrieve data for a QueryKey.\n * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n *\n * Hint: Do not use this function inside a component, because it won't receive updates.\n * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n */\n getQueryData(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(options.queryHash)?.state.data;\n }\n ensureQueryData(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n const query = this.#queryCache.build(this, defaultedOptions);\n const cachedData = query.state.data;\n if (cachedData === void 0) {\n return this.fetchQuery(options);\n }\n if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) {\n void this.prefetchQuery(defaultedOptions);\n }\n return Promise.resolve(cachedData);\n }\n getQueriesData(filters) {\n return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n const data = state.data;\n return [queryKey, data];\n });\n }\n setQueryData(queryKey, updater, options) {\n const defaultedOptions = this.defaultQueryOptions({ queryKey });\n const query = this.#queryCache.get(\n defaultedOptions.queryHash\n );\n const prevData = query?.state.data;\n const data = functionalUpdate(updater, prevData);\n if (data === void 0) {\n return void 0;\n }\n return this.#queryCache.build(this, defaultedOptions).setData(data, { ...options, manual: true });\n }\n setQueriesData(filters, updater, options) {\n return notifyManager.batch(\n () => this.#queryCache.findAll(filters).map(({ queryKey }) => [\n queryKey,\n this.setQueryData(queryKey, updater, options)\n ])\n );\n }\n getQueryState(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(\n options.queryHash\n )?.state;\n }\n removeQueries(filters) {\n const queryCache = this.#queryCache;\n notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n queryCache.remove(query);\n });\n });\n }\n resetQueries(filters, options) {\n const queryCache = this.#queryCache;\n return notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n query.reset();\n });\n return this.refetchQueries(\n {\n type: \"active\",\n ...filters\n },\n options\n );\n });\n }\n cancelQueries(filters, cancelOptions = {}) {\n const defaultedCancelOptions = { revert: true, ...cancelOptions };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).map((query) => query.cancel(defaultedCancelOptions))\n );\n return Promise.all(promises).then(noop).catch(noop);\n }\n invalidateQueries(filters, options = {}) {\n return notifyManager.batch(() => {\n this.#queryCache.findAll(filters).forEach((query) => {\n query.invalidate();\n });\n if (filters?.refetchType === \"none\") {\n return Promise.resolve();\n }\n return this.refetchQueries(\n {\n ...filters,\n type: filters?.refetchType ?? filters?.type ?? \"active\"\n },\n options\n );\n });\n }\n refetchQueries(filters, options = {}) {\n const fetchOptions = {\n ...options,\n cancelRefetch: options.cancelRefetch ?? true\n };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {\n let promise = query.fetch(void 0, fetchOptions);\n if (!fetchOptions.throwOnError) {\n promise = promise.catch(noop);\n }\n return query.state.fetchStatus === \"paused\" ? Promise.resolve() : promise;\n })\n );\n return Promise.all(promises).then(noop);\n }\n fetchQuery(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n if (defaultedOptions.retry === void 0) {\n defaultedOptions.retry = false;\n }\n const query = this.#queryCache.build(this, defaultedOptions);\n return query.isStaleByTime(\n resolveStaleTime(defaultedOptions.staleTime, query)\n ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n }\n prefetchQuery(options) {\n return this.fetchQuery(options).then(noop).catch(noop);\n }\n fetchInfiniteQuery(options) {\n options._type = \"infinite\";\n return this.fetchQuery(options);\n }\n prefetchInfiniteQuery(options) {\n return this.fetchInfiniteQuery(options).then(noop).catch(noop);\n }\n ensureInfiniteQueryData(options) {\n options._type = \"infinite\";\n return this.ensureQueryData(options);\n }\n resumePausedMutations() {\n if (onlineManager.isOnline()) {\n return this.#mutationCache.resumePausedMutations();\n }\n return Promise.resolve();\n }\n getQueryCache() {\n return this.#queryCache;\n }\n getMutationCache() {\n return this.#mutationCache;\n }\n getDefaultOptions() {\n return this.#defaultOptions;\n }\n setDefaultOptions(options) {\n this.#defaultOptions = options;\n }\n setQueryDefaults(queryKey, options) {\n this.#queryDefaults.set(hashKey(queryKey), {\n queryKey,\n defaultOptions: options\n });\n }\n getQueryDefaults(queryKey) {\n const defaults = [...this.#queryDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n setMutationDefaults(mutationKey, options) {\n this.#mutationDefaults.set(hashKey(mutationKey), {\n mutationKey,\n defaultOptions: options\n });\n }\n getMutationDefaults(mutationKey) {\n const defaults = [...this.#mutationDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n defaultQueryOptions(options) {\n if (options._defaulted) {\n return options;\n }\n const defaultedOptions = {\n ...this.#defaultOptions.queries,\n ...this.getQueryDefaults(options.queryKey),\n ...options,\n _defaulted: true\n };\n if (!defaultedOptions.queryHash) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(\n defaultedOptions.queryKey,\n defaultedOptions\n );\n }\n if (defaultedOptions.refetchOnReconnect === void 0) {\n defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== \"always\";\n }\n if (defaultedOptions.throwOnError === void 0) {\n defaultedOptions.throwOnError = !!defaultedOptions.suspense;\n }\n if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n defaultedOptions.networkMode = \"offlineFirst\";\n }\n if (defaultedOptions.queryFn === skipToken) {\n defaultedOptions.enabled = false;\n }\n return defaultedOptions;\n }\n defaultMutationOptions(options) {\n if (options?._defaulted) {\n return options;\n }\n return {\n ...this.#defaultOptions.mutations,\n ...options?.mutationKey && this.getMutationDefaults(options.mutationKey),\n ...options,\n _defaulted: true\n };\n }\n clear() {\n this.#queryCache.clear();\n this.#mutationCache.clear();\n }\n};\nexport {\n QueryClient\n};\n//# sourceMappingURL=queryClient.js.map","\"use client\";\n\n// src/QueryClientProvider.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nvar QueryClientContext = React.createContext(\n void 0\n);\nvar useQueryClient = (queryClient) => {\n const client = React.useContext(QueryClientContext);\n if (queryClient) {\n return queryClient;\n }\n if (!client) {\n throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n }\n return client;\n};\nvar QueryClientProvider = ({\n client,\n children\n}) => {\n React.useEffect(() => {\n client.mount();\n return () => {\n client.unmount();\n };\n }, [client]);\n return /* @__PURE__ */ jsx(QueryClientContext.Provider, { value: client, children });\n};\nexport {\n QueryClientContext,\n QueryClientProvider,\n useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map","\"use client\";\n\n// src/IsRestoringProvider.ts\nimport * as React from \"react\";\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nvar IsRestoringProvider = IsRestoringContext.Provider;\nexport {\n IsRestoringProvider,\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map","\"use client\";\n\n// src/QueryErrorResetBoundary.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nvar QueryErrorResetBoundary = ({\n children\n}) => {\n const [value] = React.useState(() => createValue());\n return /* @__PURE__ */ jsx(QueryErrorResetBoundaryContext.Provider, { value, children: typeof children === \"function\" ? children(value) : children });\n};\nexport {\n QueryErrorResetBoundary,\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map","\"use client\";\n\n// src/errorBoundaryUtils.ts\nimport * as React from \"react\";\nimport { shouldThrowError } from \"@tanstack/query-core\";\nvar ensurePreventErrorBoundaryRetry = (options, errorResetBoundary, query) => {\n const throwOnError = query?.state.error && typeof options.throwOnError === \"function\" ? shouldThrowError(options.throwOnError, [query.state.error, query]) : options.throwOnError;\n if (options.suspense || options.experimental_prefetchInRender || throwOnError) {\n if (!errorResetBoundary.isReset()) {\n options.retryOnMount = false;\n }\n }\n};\nvar useClearResetErrorBoundary = (errorResetBoundary) => {\n React.useEffect(() => {\n errorResetBoundary.clearReset();\n }, [errorResetBoundary]);\n};\nvar getHasError = ({\n result,\n errorResetBoundary,\n throwOnError,\n query,\n suspense\n}) => {\n return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));\n};\nexport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n};\n//# sourceMappingURL=errorBoundaryUtils.js.map","// src/suspense.ts\nvar defaultThrowOnError = (_error, query) => query.state.data === void 0;\nvar ensureSuspenseTimers = (defaultedOptions) => {\n if (defaultedOptions.suspense) {\n const MIN_SUSPENSE_TIME_MS = 1e3;\n const clamp = (value) => value === \"static\" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS);\n const originalStaleTime = defaultedOptions.staleTime;\n defaultedOptions.staleTime = typeof originalStaleTime === \"function\" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);\n if (typeof defaultedOptions.gcTime === \"number\") {\n defaultedOptions.gcTime = Math.max(\n defaultedOptions.gcTime,\n MIN_SUSPENSE_TIME_MS\n );\n }\n }\n};\nvar willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;\nvar shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;\nvar fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {\n errorResetBoundary.clearReset();\n});\nexport {\n defaultThrowOnError,\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n};\n//# sourceMappingURL=suspense.js.map","\"use client\";\n\n// src/useBaseQuery.ts\nimport * as React from \"react\";\nimport { environmentManager, noop, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n} from \"./suspense.js\";\nfunction useBaseQuery(options, Observer, queryClient) {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new Error(\n 'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'\n );\n }\n }\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const client = useQueryClient(queryClient);\n const defaultedOptions = client.defaultQueryOptions(options);\n client.getDefaultOptions().queries?._experimental_beforeQuery?.(\n defaultedOptions\n );\n const query = client.getQueryCache().get(defaultedOptions.queryHash);\n if (process.env.NODE_ENV !== \"production\") {\n if (!defaultedOptions.queryFn) {\n console.error(\n `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`\n );\n }\n }\n const subscribed = options.subscribed !== false;\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : subscribed ? \"optimistic\" : void 0;\n ensureSuspenseTimers(defaultedOptions);\n ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query);\n useClearResetErrorBoundary(errorResetBoundary);\n const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);\n const [observer] = React.useState(\n () => new Observer(\n client,\n defaultedOptions\n )\n );\n const result = observer.getOptimisticResult(defaultedOptions);\n const shouldSubscribe = !isRestoring && subscribed;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;\n observer.updateResult();\n return unsubscribe;\n },\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setOptions(defaultedOptions);\n }, [defaultedOptions, observer]);\n if (shouldSuspend(defaultedOptions, result)) {\n throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);\n }\n if (getHasError({\n result,\n errorResetBoundary,\n throwOnError: defaultedOptions.throwOnError,\n query,\n suspense: defaultedOptions.suspense\n })) {\n throw result.error;\n }\n ;\n client.getDefaultOptions().queries?._experimental_afterQuery?.(\n defaultedOptions,\n result\n );\n if (defaultedOptions.experimental_prefetchInRender && !environmentManager.isServer() && willFetch(result, isRestoring)) {\n const promise = isNewCacheEntry ? (\n // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n ) : (\n // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n query?.promise\n );\n promise?.catch(noop).finally(() => {\n observer.updateResult();\n });\n }\n return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;\n}\nexport {\n useBaseQuery\n};\n//# sourceMappingURL=useBaseQuery.js.map","\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport {\n MutationObserver,\n noop,\n notifyManager,\n shouldThrowError\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nfunction useMutation(options, queryClient) {\n const client = useQueryClient(queryClient);\n const [observer] = React.useState(\n () => new MutationObserver(\n client,\n options\n )\n );\n React.useEffect(() => {\n observer.setOptions(options);\n }, [observer, options]);\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n const mutate = React.useCallback(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop);\n },\n [observer]\n );\n if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n throw result.error;\n }\n return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n useMutation\n};\n//# sourceMappingURL=useMutation.js.map","\"use client\";\n\n// src/useInfiniteQuery.ts\nimport { InfiniteQueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useInfiniteQuery(options, queryClient) {\n return useBaseQuery(\n options,\n InfiniteQueryObserver,\n queryClient\n );\n}\nexport {\n useInfiniteQuery\n};\n//# sourceMappingURL=useInfiniteQuery.js.map","// React context exposing the AdminClient + a shared QueryClient. Apps wrap\n// their tree once with <ModernAdminProvider client={...}>.\n\nimport * as React from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { AdminClient, type AdminClientOptions } from './client.js'\nimport type { ComponentLoader } from './component-loader.js'\n\ninterface ContextShape {\n client: AdminClient\n components: ComponentLoader | null\n}\n\nconst ModernAdminContext = React.createContext<ContextShape | null>(null)\n\nexport interface ModernAdminProviderProps {\n client?: AdminClient\n clientOptions?: AdminClientOptions\n queryClient?: QueryClient\n components?: ComponentLoader\n children: React.ReactNode\n}\n\nconst defaultQueryClient = (): QueryClient =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5_000,\n refetchOnWindowFocus: false,\n retry: 1,\n },\n },\n })\n\nexport function ModernAdminProvider({\n client,\n clientOptions,\n queryClient,\n components,\n children,\n}: ModernAdminProviderProps): React.ReactElement {\n const resolvedClient = React.useMemo(\n () => client ?? new AdminClient(clientOptions),\n [client, clientOptions],\n )\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? defaultQueryClient(),\n [queryClient],\n )\n const value = React.useMemo<ContextShape>(\n () => ({ client: resolvedClient, components: components ?? null }),\n [resolvedClient, components],\n )\n\n return (\n <QueryClientProvider client={resolvedQueryClient}>\n <ModernAdminContext.Provider value={value}>{children}</ModernAdminContext.Provider>\n </QueryClientProvider>\n )\n}\n\nexport const useAdminContext = (): ContextShape => {\n const ctx = React.useContext(ModernAdminContext)\n if (!ctx) {\n throw new Error('useAdminContext must be used inside <ModernAdminProvider />')\n }\n return ctx\n}\n\nexport const useAdminClient = (): AdminClient => useAdminContext().client\n","// Wire-shape mirror of `ResourceDecorator#toJSON()` and friends. We re-declare\n// rather than re-import so the React bundle doesn't drag in the full core\n// (which references Node-only deps in a few corners).\n\nexport type View = 'list' | 'show' | 'edit' | 'filter'\n\n/**\n * Mirror of `core` `ShowWhen` — declarative rule that conditionally hides a\n * field on the edit form based on the current value of another form field.\n * Operators combine with OR semantics; `defaultWhenEmpty` triggers when the\n * control field is null / undefined / ''.\n */\nexport interface ShowWhenSpec {\n field: string\n equals?: unknown\n notEquals?: unknown\n in?: unknown[]\n notIn?: unknown[]\n isEmpty?: boolean\n defaultWhenEmpty?: boolean\n}\n\n/**\n * Mirror of `core` `KeyValueField` — declares one row in the key-value\n * editor used as a friendly alternative to the raw JSON editor.\n */\nexport interface KeyValueFieldSpec {\n key: string\n label?: string\n type?: 'string' | 'number' | 'boolean' | 'textarea' | 'select' | 'autocomplete'\n description?: string\n placeholder?: string\n isRequired?: boolean\n availableValues?: ReadonlyArray<string | { value: string; label: string }>\n /** For `type: 'autocomplete'`: pull dynamic suggestions from another resource. */\n suggestionsResource?: string\n /** Path of the field on `suggestionsResource` to project. */\n suggestionsField?: string\n}\n\nexport interface PropertyJSON {\n path: string\n label: string\n type: string\n isId: boolean\n isSortable: boolean\n isRequired: boolean\n isDisabled: boolean\n isArray: boolean\n reference: string | null\n availableValues: Array<{ value: string; label: string }> | null\n components: { list?: string; edit?: string; show?: string; filter?: string } | Record<string, string>\n visibility: Record<View, boolean>\n position: number\n description?: string\n showWhen?: ShowWhenSpec\n keyValueFields?: KeyValueFieldSpec[]\n custom: Record<string, unknown>\n}\n\nexport interface ActionGroup {\n name: string\n icon?: string\n}\n\nexport interface ActionDescriptor {\n name: string\n actionType: 'resource' | 'record' | 'bulk'\n resourceId: string\n nesting?: ActionGroup[]\n guard?: string\n component?: string | null\n custom?: Record<string, unknown>\n}\n\nexport interface RelatedResource {\n resourceId: string\n foreignKey: string\n label?: string\n}\n\nexport interface ResourceJSON {\n id: string\n name: string\n navigation: { name?: string; icon?: string; group?: string } | null\n relatedResources?: RelatedResource[]\n /** Master switch for the show-page \"Related records\" section. When\n * explicitly `false`, the whole block is hidden. Defaults to shown. */\n showRelatedResources?: boolean\n properties: PropertyJSON[]\n actions: ActionDescriptor[]\n}\n\nexport interface CurrentUser {\n id: string\n email?: string\n name?: string\n role?: string\n avatarUrl?: string\n [claim: string]: unknown\n}\n\n/**\n * Mirror of `core` `AdminFeatures`. Each flag is `true` iff the\n * corresponding backend subsystem is wired and ready. The SPA uses these\n * to hide UI surfaces (audit-log link, settings sections, revisions\n * button, AI assistant widget) for features the host hasn't enabled.\n */\nexport interface AdminFeatures {\n auditLog: boolean\n history: boolean\n webhooks: boolean\n apiKeys: boolean\n aiAssistant: boolean\n /** Realtime WS gateway is mounted — the SPA live-invalidates its cache. */\n realtime: boolean\n}\n\nconst ALL_FEATURES_OFF: AdminFeatures = {\n auditLog: false,\n history: false,\n webhooks: false,\n apiKeys: false,\n aiAssistant: false,\n realtime: false,\n}\n\n/** Defensive resolver for older API servers that don't yet surface\n * `features` in their `/admin/api/config` payload — every flag falls back\n * to `false`, so optional surfaces stay hidden until the backend opts in. */\nexport const resolveFeatures = (raw?: Partial<AdminFeatures>): AdminFeatures => ({\n ...ALL_FEATURES_OFF,\n ...(raw ?? {}),\n})\n\nexport interface AdminConfig {\n rootPath: string\n branding?: { companyName?: string; logo?: string; theme?: string }\n auth: Record<string, unknown>\n resources: ResourceJSON[]\n features?: Partial<AdminFeatures>\n}\n\nexport interface RecordJSON {\n id: string\n title: string\n params: Record<string, unknown>\n populated: Record<string, unknown>\n errors: Record<string, unknown>\n baseError: unknown | null\n}\n\nexport interface ListResponse {\n records: RecordJSON[]\n meta: { total: number; page: number; perPage: number; sortBy?: string; direction?: 'asc' | 'desc' }\n}\n\nexport interface RecordResponse {\n record: RecordJSON\n}\n\n/** Generic response from a custom action invocation (record / bulk / resource). */\nexport interface CustomActionResponse {\n record?: RecordJSON\n records?: RecordJSON[]\n notice?: { message: string; type: 'success' | 'info' | 'error' | 'warning' }\n redirectUrl?: string\n [key: string]: unknown\n}\n\nexport interface ListQuery {\n page?: number\n perPage?: number\n sortBy?: string\n direction?: 'asc' | 'desc'\n filters?: Record<string, string>\n}\n\n/**\n * Props contract for a property **display** component. Shared between the\n * built-in `PropertyDisplay` and any custom property extension registered\n * via `registerPropertyExtension`.\n */\nexport interface PropertyDisplayProps {\n property: PropertyJSON\n value: unknown\n view?: 'list' | 'show'\n /** The record's `populated` map (pre-fetched reference titles). */\n populated?: Record<string, unknown>\n}\n\n/**\n * Props contract for a property **editor** component. Shared between the\n * built-in `PropertyEditor` and any custom property extension registered\n * via `registerPropertyExtension`.\n */\nexport interface PropertyEditorProps {\n property: PropertyJSON\n value: unknown\n onChange(next: unknown): void\n disabled?: boolean\n /** Required for `type: 'file'` properties to route uploads correctly. */\n resourceId?: string\n}\n","import type { LocaleBundle, TranslationDict } from './types.js'\n\nexport interface I18nOptions {\n locales: LocaleBundle[]\n /** Default locale code; falls back to the first registered locale. */\n defaultLocale?: string\n /** Locale to use when a key is missing in the active dict. */\n fallbackLocale?: string\n}\n\nconst interpolate = (template: string, params?: Record<string, unknown>): string => {\n if (!params) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n const v = params[name]\n return v == null ? match : String(v)\n })\n}\n\n/**\n * Tiny translation registry. Drop-in replacement for the parts of i18next we\n * actually use (lookup, interpolation, fallback). Frameworks pluging in real\n * i18next can wrap this interface trivially.\n */\nexport class I18n {\n private readonly dicts = new Map<string, TranslationDict>()\n private readonly names = new Map<string, string>()\n private current: string\n private readonly fallback: string\n\n constructor(options: I18nOptions) {\n if (options.locales.length === 0) {\n throw new Error('I18n requires at least one locale')\n }\n for (const bundle of options.locales) {\n this.dicts.set(bundle.code, { ...bundle.dict })\n this.names.set(bundle.code, bundle.name)\n }\n this.current = options.defaultLocale ?? options.locales[0]!.code\n this.fallback = options.fallbackLocale ?? options.locales[0]!.code\n if (!this.dicts.has(this.current)) this.current = options.locales[0]!.code\n }\n\n get locale(): string {\n return this.current\n }\n\n setLocale(code: string): void {\n if (this.dicts.has(code)) this.current = code\n }\n\n availableLocales(): Array<{ code: string; name: string }> {\n return Array.from(this.names.entries()).map(([code, name]) => ({ code, name }))\n }\n\n t(key: string, params?: Record<string, unknown>): string {\n const dict = this.dicts.get(this.current)\n const fallbackDict = this.dicts.get(this.fallback)\n const value = dict?.[key] ?? fallbackDict?.[key] ?? key\n return interpolate(value, params)\n }\n\n /** Add or replace translations for an existing locale (merges). */\n extend(code: string, dict: TranslationDict): void {\n const existing = this.dicts.get(code) ?? {}\n this.dicts.set(code, { ...existing, ...dict })\n }\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const en: LocaleBundle = {\n code: 'en',\n name: 'English',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Home',\n 'common:search': 'Search',\n 'common:loading': 'Loading…',\n 'common:save': 'Save',\n 'common:cancel': 'Cancel',\n 'common:delete': 'Delete',\n 'common:create': 'Create',\n 'common:edit': 'Edit',\n 'common:show': 'Show',\n 'common:back': 'Back',\n 'common:noRecords': 'No records found.',\n 'common:noRecordsHint': 'Get started by creating a new {resource}.',\n 'common:noMatchingRecords': 'No records match your filters.',\n 'common:clearFilters': 'Clear filters',\n 'common:confirmDelete': 'Delete this record?',\n 'common:perPage': 'Per page',\n 'common:page': 'Page',\n 'common:of': 'of',\n 'common:total': 'Total',\n 'auth:login': 'Sign in',\n 'auth:logout': 'Sign out',\n 'auth:email': 'Email',\n 'auth:password': 'Password',\n 'auth:loginFailed': 'Invalid credentials.',\n 'errors:notFound': 'Not found.',\n 'errors:forbidden': 'You do not have access to this resource.',\n 'errors:server': 'Something went wrong. Please retry.',\n 'common:resources': 'Resources',\n 'common:actions': 'Actions',\n 'common:new': 'New',\n 'common:rowsPerPage': 'Rows per page',\n 'common:filter': 'Filter {label}…',\n 'validation:required': '{label} is required',\n 'validation:invalidNumber': '{label} must be a valid number',\n 'validation:invalidInteger': '{label} must be an integer',\n 'validation:invalidEmail': '{label} must be a valid email',\n 'validation:invalidUrl': '{label} must be a valid URL',\n 'validation:invalidDate': '{label} must be a valid date',\n 'validation:invalidUuid': '{label} must be a valid UUID',\n 'validation:tooShort': '{label} must be at least {min} characters',\n 'validation:tooLong': '{label} must be at most {max} characters',\n 'validation:notInList': '{label} has an invalid value',\n 'validation:emptySelection': 'Select at least one {label}',\n 'toast:created': 'Created successfully',\n 'toast:saved': 'Saved successfully',\n 'toast:deleted': 'Deleted successfully',\n 'toast:createFailed': 'Failed to create',\n 'toast:saveFailed': 'Failed to save',\n 'toast:deleteFailed': 'Failed to delete',\n 'toast:loadFailed': 'Failed to load',\n 'toast:validationFailed': 'Please fix the errors and try again',\n 'common:close': 'Close',\n 'common:export': 'Export',\n 'export:title': 'Export records',\n 'export:description': 'Download all matching records of {resource} as a single file.',\n 'export:csvHint': 'Comma-separated values',\n 'export:jsonHint': 'Structured JSON array',\n 'export:downloading': 'Preparing download…',\n 'export:progress': 'Loaded {loaded} of {total}…',\n 'export:exported': 'Exported {count} records',\n 'export:exportFailed': 'Failed to export records',\n 'common:apply': 'Apply',\n 'common:clear': 'Clear',\n 'common:filters': 'Filters',\n 'common:columns': 'Columns',\n 'common:toggleColumns': 'Toggle columns',\n 'common:openMenu': 'Open menu',\n 'common:refresh': 'Refresh',\n 'common:copy': 'Copy',\n 'common:copied': 'Copied!',\n 'common:applyFilters': 'Apply filters',\n 'common:clearAll': 'Clear all',\n 'common:any': 'Any',\n 'common:yes': 'Yes',\n 'common:no': 'No',\n 'common:filterPlaceholder': 'Filter…',\n 'common:loadFailed': 'Failed to load: {error}',\n 'common:theme': 'Theme',\n 'common:language': 'Language',\n 'common:toggleTheme': 'Toggle theme',\n 'common:clearSelection': 'Clear selection',\n 'common:searchPlaceholder': 'Search…',\n 'globalSearch:title': 'Global search',\n 'globalSearch:description': 'Search across all resources and records.',\n 'globalSearch:trigger': 'Search…',\n 'globalSearch:placeholder': 'Search across all resources…',\n 'globalSearch:hint': 'Start typing to search across all resources.',\n 'globalSearch:noResults': 'No matching records found.',\n 'globalSearch:error': 'Search failed. Please try again.',\n 'globalSearch:hotkey': 'Open global search',\n 'globalSearch:matchedIn': 'in {field}',\n 'globalSearch:recent': 'Recent searches',\n 'globalSearch:clearRecent': 'Clear',\n 'globalSearch:showAllIn': 'Show all in {resource}',\n 'common:pageOf': 'Page {page} of {total}',\n 'common:firstPage': 'First page',\n 'common:previousPage': 'Previous page',\n 'common:nextPage': 'Next page',\n 'common:lastPage': 'Last page',\n 'common:recordsCount': '{count} records',\n 'common:selectedCount': '{count} selected',\n 'common:selectRow': 'Select row',\n 'common:selectAll': 'Select all',\n 'common:deleteSelected': 'Delete selected',\n 'common:bulkDeleteConfirm': 'Delete {count} selected records?',\n 'toast:bulkDeleted': 'Deleted {count} records',\n 'toast:bulkDeleteFailed': 'Failed to delete records',\n 'common:from': 'From',\n 'common:to': 'To',\n 'common:sortBy': 'Sort by',\n 'common:next': 'Next',\n 'common:previous': 'Previous',\n 'common:relatedRecords': 'Related records',\n 'common:viewAll': 'View all',\n 'common:noRelatedRecords': 'No related records.',\n 'common:shortcutsHelp': 'Keyboard shortcuts',\n 'common:shortcutsEmpty': 'No shortcuts available on this screen.',\n 'common:preview': 'Preview',\n 'common:download': 'Download',\n 'common:openInNewTab': 'Open in new tab',\n 'common:format': 'Format',\n 'common:invalidJson': 'Invalid JSON',\n 'common:showPassword': 'Show password',\n 'common:hidePassword': 'Hide password',\n 'auth:title': 'Sign in',\n 'auth:subtitle': 'Enter your email and password to sign in',\n 'auth:tagline': 'The modern admin panel for any stack.',\n 'auth:orContinueWith': 'Or continue with',\n 'auth:continueWith': 'Continue with {provider}',\n 'common:chooseFile': 'Choose file',\n 'common:chooseFiles': 'Choose files',\n 'common:dragAndDrop': 'Drag and drop or',\n 'common:chooseAFile': 'choose a file',\n 'common:addMoreFiles': 'add more files',\n 'common:uploading': 'Uploading…',\n 'common:uploadingFile': 'Uploading {name}…',\n 'common:removeFile': 'Remove file',\n 'common:uploadFailed': 'Upload failed',\n 'common:dismiss': 'Dismiss',\n 'common:openCalendar': 'Open calendar',\n 'common:time': 'Time',\n 'common:downloadFailed': 'Download failed',\n 'richtext:bold': 'Bold',\n 'richtext:italic': 'Italic',\n 'richtext:strikethrough': 'Strikethrough',\n 'richtext:inlineCode': 'Inline code',\n 'richtext:heading': 'Heading {level}',\n 'richtext:bulletList': 'Bullet list',\n 'richtext:numberedList': 'Numbered list',\n 'richtext:blockquote': 'Blockquote',\n 'richtext:horizontalRule': 'Horizontal rule',\n 'richtext:insertLink': 'Insert link',\n 'richtext:undo': 'Undo',\n 'richtext:redo': 'Redo',\n 'richtext:source': 'Source ({format})',\n 'richtext:splitView': 'Split view',\n 'richtext:visualEditor': 'Visual editor',\n 'richtext:fullscreen': 'Fullscreen',\n 'richtext:exitFullscreen': 'Exit fullscreen',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Saving…',\n 'common:done': 'Done',\n 'settings:menuItem': 'Settings',\n 'settings:noSectionsConfigured': 'No settings sections are available for this deployment.',\n 'settings:apiKeys.title': 'API keys',\n 'settings:apiKeys.description': 'Programmatic access tokens for the admin API. Each key carries a permission set that limits which resources and actions it can invoke.',\n 'settings:apiKeys.actions.create': 'New API key',\n 'settings:apiKeys.actions.edit': 'Edit',\n 'settings:apiKeys.actions.revoke': 'Revoke',\n 'settings:apiKeys.empty.title': 'No API keys yet',\n 'settings:apiKeys.empty.description': 'Create your first key to grant programmatic access.',\n 'settings:apiKeys.columns.name': 'Name',\n 'settings:apiKeys.columns.start': 'Prefix',\n 'settings:apiKeys.columns.permissions': 'Permissions',\n 'settings:apiKeys.columns.expiresAt': 'Expires',\n 'settings:apiKeys.columns.enabled': 'Enabled',\n 'settings:apiKeys.columns.actions': 'Actions',\n 'settings:apiKeys.lastUsed': 'Last used {date}',\n 'settings:apiKeys.expiresNever': 'Never',\n 'settings:apiKeys.permissions.resource': 'Resource',\n 'settings:apiKeys.permissions.actions': 'Actions',\n 'settings:apiKeys.permissions.selectAll': 'Select all',\n 'settings:apiKeys.permissions.clearAll': 'Clear all',\n 'settings:apiKeys.permissions.none': 'No permissions',\n 'settings:apiKeys.permissions.summary': '{resources} resources · {actions} actions',\n 'settings:apiKeys.permissions.noResources': 'No resources are registered.',\n 'settings:apiKeys.permissions.selectAllResources': 'Select all resources & actions',\n 'settings:apiKeys.permissions.clearAllResources': 'Clear all resources & actions',\n 'settings:apiKeys.editor.titleCreate': 'New API key',\n 'settings:apiKeys.editor.titleEdit': 'Edit API key',\n 'settings:apiKeys.editor.description': 'Pick a descriptive name and grant only the resources and actions this key needs.',\n 'settings:apiKeys.editor.name': 'Name',\n 'settings:apiKeys.editor.namePlaceholder': 'e.g. CI deploy bot',\n 'settings:apiKeys.editor.expiresInDays': 'Expires in (days)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'never',\n 'settings:apiKeys.editor.expiresHint': 'Leave blank for no expiry. Maximum 3650 days.',\n 'settings:apiKeys.editor.permissions': 'Permissions',\n 'settings:apiKeys.editor.selectedActions': '{count} selected',\n 'settings:apiKeys.created.title': 'API key created',\n 'settings:apiKeys.created.description': 'Copy the key now — it will not be shown again.',\n 'settings:apiKeys.created.warning': 'This is the only time you will see the full key. Store it somewhere safe.',\n 'settings:apiKeys.created.reveal': 'Reveal key',\n 'settings:apiKeys.created.hide': 'Hide key',\n 'settings:apiKeys.created.copy': 'Copy',\n 'settings:apiKeys.created.copied': 'Copied',\n 'settings:apiKeys.notice.revoked': 'API key revoked',\n 'settings:apiKeys.notice.updated': 'API key updated',\n 'settings:apiKeys.notice.copied': 'Copied to clipboard',\n 'settings:apiKeys.notice.copyFailed': 'Could not copy to clipboard',\n 'settings:apiKeys.confirmRevoke.title': 'Revoke API key',\n 'settings:apiKeys.confirmRevoke.description': 'Revoke \"{name}\"? Any service using this key will stop working immediately.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'chart:dashboard': 'Dashboard',\n 'chart:addChart': 'Add chart',\n 'chart:newChart': 'New chart',\n 'chart:editChart': 'Edit chart',\n 'chart:deleteChart': 'Remove chart',\n 'chart:noCharts': 'No charts yet',\n 'chart:noChartsHint': 'Add a chart to start monitoring your data.',\n 'chart:addGroup': 'Add group',\n 'chart:newGroup': 'New group',\n 'chart:editGroup': 'Edit group',\n 'chart:deleteGroup': 'Remove group',\n 'chart:saveGroup': 'Save group',\n 'chart:groupName': 'Group name',\n 'chart:groupNamePlaceholder': 'e.g. Sales metrics',\n 'chart:groupNameRequired': 'Group name is required',\n 'chart:groupOrder': 'Group order',\n 'chart:order': 'Order',\n 'chart:orderHint': 'Lower numbers come first.',\n 'chart:moveToGroup': 'Move to group',\n 'chart:moveChart': 'Move chart',\n 'chart:moveGroup': 'Group',\n 'chart:moveNoGroups': 'No groups yet.',\n 'chart:moveNoGroupsHint': 'Create a group first to organize your charts.',\n 'chart:deleteChartConfirm': 'Remove this chart?',\n 'chart:deleteChartConfirmHint': 'This action cannot be undone.',\n 'chart:deleteGroupConfirm': 'Remove this group?',\n 'chart:deleteGroupConfirmHint': 'This will permanently delete the group and {count} chart(s) inside it.',\n 'chart:title': 'Title',\n 'chart:titlePlaceholder': 'e.g. New users per day',\n 'chart:untitled': 'Untitled chart',\n 'chart:chartType': 'Chart type',\n 'chart:resource': 'Resource',\n 'chart:groupBy': 'Group by',\n 'chart:step': 'Step',\n 'chart:metric': 'Metric',\n 'chart:aggregateField': 'Aggregate field',\n 'chart:selectField': 'Select field…',\n 'chart:saveChart': 'Save chart',\n 'chart:typeLine': 'Line',\n 'chart:typeArea': 'Area',\n 'chart:typeBar': 'Bar',\n 'chart:typePie': 'Pie',\n 'chart:stepDay': 'Day',\n 'chart:stepWeek': 'Week',\n 'chart:stepMonth': 'Month',\n 'chart:stepYear': 'Year',\n 'chart:metricCount': 'Count',\n 'chart:metricSum': 'Sum',\n 'chart:metricAvg': 'Average',\n 'chart:noData': 'No data for selected period',\n 'chart:loadError': 'Failed to load chart data',\n 'chart:value': 'Value',\n 'dashboard:vis': 'Visualisation',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Line',\n 'dashboard:visArea': 'Area',\n 'dashboard:visBar': 'Bar',\n 'dashboard:visPie': 'Pie',\n 'dashboard:metricCount': 'Count',\n 'dashboard:metricSum': 'Sum',\n 'dashboard:metricAvg': 'Average',\n 'dashboard:metricMin': 'Min',\n 'dashboard:metricMax': 'Max',\n 'dashboard:builder.range': 'Time range',\n 'dashboard:builder.filters': 'Filters',\n 'dashboard:builder.filtersHint': 'Narrow the dataset before aggregating. Tick a filter to expose it as a quick toggle above the chart.',\n 'dashboard:builder.quickFilterHint': 'Expose this filter above the chart on the dashboard.',\n 'dashboard:builder.quickFilterToggle': 'Expose {field} as a quick filter',\n 'dashboard:range.7d': '7d',\n 'dashboard:range.30d': '30d',\n 'dashboard:range.90d': '90d',\n 'dashboard:range.1y': '1y',\n 'dashboard:range.all': 'All',\n 'dashboard:range.custom': 'Custom',\n 'dashboard:widget.previousPeriod': 'vs. previous period',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Shrink to half width',\n 'dashboard:widget.expand': 'Expand to full row',\n 'dashboard:widget.toggleSql': 'Toggle SQL',\n 'dashboard:widget.unsupported': 'Charts are not supported for your database yet.',\n 'dashboard:widget.truncatedWarning': 'Showing partial data — too many rows to aggregate the full range.',\n 'dashboard:widget.showAll': 'Show all',\n 'dashboard:widget.hideAll': 'Hide all',\n 'dashboard:seriesTotal': 'Total',\n 'dashboard:seriesOther': 'Other',\n 'dashboard:seriesNull': 'Empty',\n 'dashboard:builder.dateField': 'Date field',\n 'dashboard:builder.dateFieldHint': 'X-axis bucketing uses this date column.',\n 'dashboard:builder.secondaryGroupBy': 'Breakdown',\n 'dashboard:builder.noBreakdown': 'Single series',\n 'dashboard:builder.topN': 'Max series',\n 'dashboard:builder.width': 'Width',\n 'dashboard:width.half': 'Half',\n 'dashboard:width.full': 'Full row',\n 'history:revisions': 'Revisions',\n 'history:noRevisions': 'No revisions yet',\n 'history:loadError': 'Failed to load revision history',\n 'history:revert': 'Revert',\n 'history:confirmRevert': 'Revert to this revision?',\n 'history:revertSuccess': 'Revision restored',\n 'history:revertFailed': 'Failed to restore revision',\n 'history:unknownUser': 'Unknown user',\n 'history:changes': 'changes',\n 'history:compareTo': 'Compare to',\n 'history:storedDiff': 'Change diff',\n 'history:op.create': 'Created',\n 'history:op.update': 'Updated',\n 'history:op.delete': 'Deleted',\n 'diff:added': 'Added',\n 'diff:changed': 'Changed',\n 'diff:removed': 'Removed',\n 'diff:before': 'Before',\n 'diff:after': 'After',\n 'diff:noChanges': 'No field changes recorded',\n 'audit:title': 'Activity',\n 'audit:resource': 'Resource',\n 'audit:action': 'Action',\n 'audit:recordId': 'Record ID',\n 'audit:userId': 'User ID',\n 'audit:allResources': 'All resources',\n 'audit:allActions': 'All actions',\n 'audit:noEvents': 'No activity yet',\n 'audit:records': 'records',\n 'audit:loadError': 'Failed to load activity',\n 'audit:by': 'by {user}',\n 'audit:viewRecord': 'View record',\n 'audit:viewChanges': 'View changes',\n 'audit:hideChanges': 'Hide changes',\n 'audit:noDiff': 'Change details unavailable',\n 'audit:loadDiffError': 'Failed to load changes',\n 'audit:action.new': 'Record created',\n 'audit:action.edit': 'Record updated',\n 'audit:action.delete': 'Record deleted',\n 'audit:action.bulkDelete': 'Records deleted',\n 'audit:action.login': 'Signed in',\n 'audit:action.apiKeyCreate': 'API key created',\n 'audit:action.apiKeyUpdate': 'API key updated',\n 'audit:action.apiKeyDelete': 'API key deleted',\n 'audit:virtualResource.auth': 'Authentication',\n 'audit:virtualResource.apiKeys': 'API Keys',\n 'audit:prevPage': 'Previous',\n 'audit:nextPage': 'Next',\n 'audit:dateRangePlaceholder': 'Select date range',\n 'keyValue:noMatches': 'No matches — press Enter to keep \"{value}\".',\n 'aiAssistant:queue.cancel': 'Remove from queue',\n 'aiAssistant:title': 'AI Assistant',\n 'aiAssistant:fab.label': 'Open AI assistant',\n 'aiAssistant:fab.short': 'AI',\n 'aiAssistant:description': 'Ask questions about records, relationships, reports, and data trends.',\n 'aiAssistant:notConfigured.title': 'Assistant is not configured',\n 'aiAssistant:notConfigured.description': 'Add the OpenRouter API key in settings to enable the read-only AI assistant.',\n 'aiAssistant:notConfigured.openSettings': 'Open settings',\n 'aiAssistant:tryAsking': 'Try asking:',\n 'aiAssistant:tryAsking.example1': 'Which customers have the most posts?',\n 'aiAssistant:tryAsking.example2': 'Show recently created records for a resource.',\n 'aiAssistant:tryAsking.example3': 'Explain relationships between specific records.',\n 'aiAssistant:thinking': 'Thinking',\n 'aiAssistant:thinkingProgress': 'Thinking ({progress}%)',\n 'aiAssistant:input.placeholder': 'Ask about your data…',\n 'aiAssistant:input.hint': 'Enter to send · Shift+Enter for a new line',\n 'aiAssistant:send': 'Send message',\n 'aiAssistant:newChat': 'New chat',\n 'aiAssistant:history': 'Chat history',\n 'aiAssistant:history.empty': 'No previous chats',\n 'aiAssistant:noText': 'Here are the related records I found:',\n 'aiAssistant:fallback.noToolResult': 'I ran the request, but the model did not return a text answer. Try refining the question or enable debug logs to inspect the tool result.',\n 'aiAssistant:fallback.noRows': 'No records were found for this request.',\n 'aiAssistant:fallback.rowsFound': 'Rows found: {count}.',\n 'aiAssistant:taskFailed': 'AI assistant task failed',\n 'aiAssistant:settings.title': 'AI Assistant',\n 'aiAssistant:settings.description': 'Configure the floating AI chat widget, model, and server-side assistant behavior.',\n 'aiAssistant:settings.enabled': 'Enabled',\n 'aiAssistant:settings.disabled': 'Disabled',\n 'aiAssistant:settings.configured': 'Configured',\n 'aiAssistant:settings.apiKeyRequired': 'API key required',\n 'aiAssistant:settings.readOnly': 'Read only',\n 'aiAssistant:settings.provider': 'Provider: {provider}',\n 'aiAssistant:settings.enableLabel': 'Enable assistant',\n 'aiAssistant:settings.enableHint': 'Controls the visibility of the floating widget and chat endpoint.',\n 'aiAssistant:settings.modelLabel': 'OpenRouter model',\n 'aiAssistant:settings.apiKeyLabel': 'OpenRouter API key',\n 'aiAssistant:settings.apiKeyHint': 'Leave empty to keep the existing saved key on the server.',\n 'aiAssistant:settings.systemPromptLabel': 'System prompt override',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Optional project-specific instructions for the assistant',\n 'aiAssistant:settings.accessTitle': 'Access model',\n 'aiAssistant:settings.accessDescription': 'The current assistant is limited to read-only record inspection through admin resource actions.',\n 'aiAssistant:settings.futureToolsReady': 'Future tools ready',\n 'aiAssistant:settings.save': 'Save settings',\n 'aiAssistant:settings.saving': 'Saving…',\n 'aiAssistant:settings.saved': 'AI assistant settings saved',\n 'aiAssistant:settings.empty': 'No settings available.',\n 'filter:op.co': 'Contains',\n 'filter:op.nco': 'Does not contain',\n 'filter:op.sw': 'Starts with',\n 'filter:op.ew': 'Ends with',\n 'filter:op.eq': 'Equals',\n 'filter:op.neq': 'Does not equal',\n 'filter:op.empty': 'Is empty',\n 'filter:op.nempty': 'Is not empty',\n 'filter:op.in': 'Is one of',\n 'filter:op.gt': 'Greater than',\n 'filter:op.lt': 'Less than',\n 'filter:op.between': 'Between',\n 'filter:searchValues': 'Search in list…',\n 'filter:selectAll': 'Select all',\n 'filter:noValues': 'No values found',\n 'common:newRecord': 'New {name}',\n 'common:editRecord': 'Edit {name} #{id}',\n 'common:themeLight': 'Light',\n 'common:themeDark': 'Dark',\n 'common:themeSystem': 'System',\n 'common:ok': 'OK',\n 'common:select': 'Select…',\n 'common:removeItem': 'Remove {title}',\n 'common:nSelectedAddMore': '{count} selected — add more',\n 'common:pickRecords': 'Pick records',\n 'common:managePickRecords': 'Manage selection ({count})',\n 'common:pickRecordsFrom': 'Pick from {name}',\n 'common:draftRestored': 'Restored unsaved draft',\n 'common:undoDraftRestore': 'Undo',\n 'aiFill:button': 'AI Fill',\n 'aiFill:dialogTitle': 'Fill form from photo',\n 'aiFill:dialogDescription': 'Upload an image — AI will extract values and fill the form.',\n 'aiFill:fillButton': 'Recognize',\n 'aiFill:processing': 'Recognizing image…',\n 'aiFill:success': 'Filled {count} field(s)',\n 'aiFill:errorNoFields': 'This resource has no AI-fillable fields.',\n 'aiFill:errorGeneric': 'AI fill failed: {message}',\n 'aiFill:noValues': 'AI could not extract any values from this image.',\n 'aiFill:applied': 'AI filled {count} field(s). You can undo below.',\n 'wizard:stepOf': 'Step {current} of {total}',\n 'wizard:products.step1': 'Basic info',\n 'wizard:products.step2': 'Pricing',\n 'wizard:products.step3': 'Media & tags',\n 'common:invalidValue': 'Invalid value',\n 'common:collapseSidebar': 'Collapse sidebar',\n 'common:expandSidebar': 'Expand sidebar',\n 'common:toggleSidebar': 'Toggle sidebar',\n 'common:sidebarTitle': 'Sidebar',\n 'common:sidebarNavigation': 'Navigation menu',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const ru: LocaleBundle = {\n code: 'ru',\n name: 'Русский',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Главная',\n 'common:search': 'Поиск',\n 'common:loading': 'Загрузка…',\n 'common:save': 'Сохранить',\n 'common:cancel': 'Отмена',\n 'common:delete': 'Удалить',\n 'common:create': 'Создать',\n 'common:edit': 'Редактировать',\n 'common:show': 'Просмотр',\n 'common:back': 'Назад',\n 'common:noRecords': 'Записей не найдено.',\n 'common:noRecordsHint': 'Создайте новую запись «{resource}», чтобы начать.',\n 'common:noMatchingRecords': 'Нет записей, соответствующих фильтрам.',\n 'common:clearFilters': 'Сбросить фильтры',\n 'common:confirmDelete': 'Удалить запись?',\n 'common:perPage': 'На странице',\n 'common:page': 'Страница',\n 'common:of': 'из',\n 'common:total': 'Всего',\n 'auth:login': 'Войти',\n 'auth:logout': 'Выйти',\n 'auth:email': 'Email',\n 'auth:password': 'Пароль',\n 'auth:loginFailed': 'Неверные данные.',\n 'errors:notFound': 'Не найдено.',\n 'errors:forbidden': 'Нет доступа к этому ресурсу.',\n 'errors:server': 'Что-то пошло не так. Повторите попытку.',\n 'common:resources': 'Ресурсы',\n 'common:actions': 'Действия',\n 'common:new': 'Создать',\n 'common:rowsPerPage': 'Строк на странице',\n 'common:filter': 'Фильтр {label}…',\n 'validation:required': 'Поле «{label}» обязательно',\n 'validation:invalidNumber': 'Поле «{label}» должно быть числом',\n 'validation:invalidInteger': 'Поле «{label}» должно быть целым числом',\n 'validation:invalidEmail': 'Поле «{label}» должно быть корректным email',\n 'validation:invalidUrl': 'Поле «{label}» должно быть корректной ссылкой',\n 'validation:invalidDate': 'Поле «{label}» должно быть корректной датой',\n 'validation:invalidUuid': 'Поле «{label}» должно быть корректным UUID',\n 'validation:tooShort': 'Поле «{label}» должно содержать не менее {min} символов',\n 'validation:tooLong': 'Поле «{label}» должно содержать не более {max} символов',\n 'validation:notInList': 'Поле «{label}» содержит недопустимое значение',\n 'validation:emptySelection': 'Выберите хотя бы одно значение для «{label}»',\n 'toast:created': 'Запись успешно создана',\n 'toast:saved': 'Изменения сохранены',\n 'toast:deleted': 'Запись удалена',\n 'toast:createFailed': 'Не удалось создать запись',\n 'toast:saveFailed': 'Не удалось сохранить изменения',\n 'toast:deleteFailed': 'Не удалось удалить запись',\n 'toast:loadFailed': 'Не удалось загрузить данные',\n 'toast:validationFailed': 'Исправьте ошибки и попробуйте снова',\n 'common:close': 'Закрыть',\n 'common:export': 'Экспорт',\n 'export:title': 'Экспорт записей',\n 'export:description': 'Скачать все подходящие записи ресурса «{resource}» одним файлом.',\n 'export:csvHint': 'Значения через запятую',\n 'export:jsonHint': 'Структурированный JSON-массив',\n 'export:downloading': 'Готовим файл…',\n 'export:progress': 'Загружено {loaded} из {total}…',\n 'export:exported': 'Экспортировано записей: {count}',\n 'export:exportFailed': 'Не удалось экспортировать записи',\n 'common:apply': 'Применить',\n 'common:clear': 'Очистить',\n 'common:filters': 'Фильтры',\n 'common:columns': 'Колонки',\n 'common:toggleColumns': 'Видимые колонки',\n 'common:openMenu': 'Открыть меню',\n 'common:refresh': 'Обновить',\n 'common:copy': 'Копировать',\n 'common:copied': 'Скопировано!',\n 'common:applyFilters': 'Применить фильтры',\n 'common:clearAll': 'Сбросить все',\n 'common:any': 'Любое',\n 'common:yes': 'Да',\n 'common:no': 'Нет',\n 'common:filterPlaceholder': 'Фильтр…',\n 'common:loadFailed': 'Не удалось загрузить: {error}',\n 'common:theme': 'Тема',\n 'common:language': 'Язык',\n 'common:toggleTheme': 'Переключить тему',\n 'common:clearSelection': 'Очистить выбор',\n 'common:searchPlaceholder': 'Поиск…',\n 'globalSearch:title': 'Глобальный поиск',\n 'globalSearch:description': 'Поиск по всем ресурсам и записям.',\n 'globalSearch:trigger': 'Поиск…',\n 'globalSearch:placeholder': 'Поиск по всем ресурсам…',\n 'globalSearch:hint': 'Начните вводить, чтобы искать по всем ресурсам.',\n 'globalSearch:noResults': 'Ничего не найдено.',\n 'globalSearch:error': 'Не удалось выполнить поиск. Попробуйте ещё раз.',\n 'globalSearch:hotkey': 'Открыть глобальный поиск',\n 'globalSearch:matchedIn': 'в {field}',\n 'globalSearch:recent': 'Недавние запросы',\n 'globalSearch:clearRecent': 'Очистить',\n 'globalSearch:showAllIn': 'Показать все в {resource}',\n 'common:pageOf': 'Страница {page} из {total}',\n 'common:firstPage': 'Первая страница',\n 'common:previousPage': 'Предыдущая страница',\n 'common:nextPage': 'Следующая страница',\n 'common:lastPage': 'Последняя страница',\n 'common:recordsCount': 'Всего записей: {count}',\n 'common:selectedCount': 'Выбрано: {count}',\n 'common:selectRow': 'Выбрать строку',\n 'common:selectAll': 'Выбрать все',\n 'common:deleteSelected': 'Удалить выбранные',\n 'common:bulkDeleteConfirm': 'Удалить выбранные записи ({count})?',\n 'toast:bulkDeleted': 'Удалено записей: {count}',\n 'toast:bulkDeleteFailed': 'Не удалось удалить записи',\n 'common:from': 'От',\n 'common:to': 'До',\n 'common:sortBy': 'Сортировка',\n 'common:next': 'Вперёд',\n 'common:previous': 'Назад',\n 'common:relatedRecords': 'Связанные записи',\n 'common:viewAll': 'Все записи',\n 'common:noRelatedRecords': 'Связанных записей нет.',\n 'common:shortcutsHelp': 'Сочетания клавиш',\n 'common:shortcutsEmpty': 'На этом экране нет доступных сочетаний.',\n 'common:preview': 'Просмотр',\n 'common:download': 'Скачать',\n 'common:openInNewTab': 'Открыть в новой вкладке',\n 'common:format': 'Форматировать',\n 'common:invalidJson': 'Некорректный JSON',\n 'common:showPassword': 'Показать пароль',\n 'common:hidePassword': 'Скрыть пароль',\n 'auth:title': 'Вход',\n 'auth:subtitle': 'Введите email и пароль для входа',\n 'auth:tagline': 'Современная админ-панель для любого стека.',\n 'auth:orContinueWith': 'Или войти через',\n 'auth:continueWith': 'Войти через {provider}',\n 'common:chooseFile': 'Выбрать файл',\n 'common:chooseFiles': 'Выбрать файлы',\n 'common:dragAndDrop': 'Перетащите или',\n 'common:chooseAFile': 'выберите файл',\n 'common:addMoreFiles': 'добавить файлы',\n 'common:uploading': 'Загрузка…',\n 'common:uploadingFile': 'Загрузка {name}…',\n 'common:removeFile': 'Удалить файл',\n 'common:uploadFailed': 'Ошибка загрузки',\n 'common:dismiss': 'Закрыть',\n 'common:openCalendar': 'Открыть календарь',\n 'common:time': 'Время',\n 'common:downloadFailed': 'Ошибка скачивания',\n 'richtext:bold': 'Жирный',\n 'richtext:italic': 'Курсив',\n 'richtext:strikethrough': 'Зачёркнутый',\n 'richtext:inlineCode': 'Код',\n 'richtext:heading': 'Заголовок {level}',\n 'richtext:bulletList': 'Маркированный список',\n 'richtext:numberedList': 'Нумерованный список',\n 'richtext:blockquote': 'Цитата',\n 'richtext:horizontalRule': 'Горизонтальная линия',\n 'richtext:insertLink': 'Вставить ссылку',\n 'richtext:undo': 'Отменить',\n 'richtext:redo': 'Повторить',\n 'richtext:source': 'Исходник ({format})',\n 'richtext:splitView': 'Разделённый вид',\n 'richtext:visualEditor': 'Визуальный редактор',\n 'richtext:fullscreen': 'Полный экран',\n 'richtext:exitFullscreen': 'Выйти из полного экрана',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Сохранение…',\n 'common:done': 'Готово',\n 'settings:menuItem': 'Настройки',\n 'settings:noSectionsConfigured': 'В этом развёртывании нет доступных разделов настроек.',\n 'settings:apiKeys.title': 'API-ключи',\n 'settings:apiKeys.description': 'Программные токены доступа к API админ-панели. Каждый ключ имеет набор прав, ограничивающий доступные ресурсы и действия.',\n 'settings:apiKeys.actions.create': 'Создать ключ',\n 'settings:apiKeys.actions.edit': 'Редактировать',\n 'settings:apiKeys.actions.revoke': 'Отозвать',\n 'settings:apiKeys.empty.title': 'Ключей ещё нет',\n 'settings:apiKeys.empty.description': 'Создайте первый ключ, чтобы предоставить программный доступ.',\n 'settings:apiKeys.columns.name': 'Название',\n 'settings:apiKeys.columns.start': 'Префикс',\n 'settings:apiKeys.columns.permissions': 'Права',\n 'settings:apiKeys.columns.expiresAt': 'Истекает',\n 'settings:apiKeys.columns.enabled': 'Активен',\n 'settings:apiKeys.columns.actions': 'Действия',\n 'settings:apiKeys.lastUsed': 'Использован {date}',\n 'settings:apiKeys.expiresNever': 'Никогда',\n 'settings:apiKeys.permissions.resource': 'Ресурс',\n 'settings:apiKeys.permissions.actions': 'Действия',\n 'settings:apiKeys.permissions.selectAll': 'Выбрать все',\n 'settings:apiKeys.permissions.clearAll': 'Снять все',\n 'settings:apiKeys.permissions.none': 'Нет прав',\n 'settings:apiKeys.permissions.summary': 'Ресурсов: {resources} · действий: {actions}',\n 'settings:apiKeys.permissions.noResources': 'Нет зарегистрированных ресурсов.',\n 'settings:apiKeys.permissions.selectAllResources': 'Выбрать все ресурсы и действия',\n 'settings:apiKeys.permissions.clearAllResources': 'Снять все ресурсы и действия',\n 'settings:apiKeys.editor.titleCreate': 'Новый API-ключ',\n 'settings:apiKeys.editor.titleEdit': 'Изменить API-ключ',\n 'settings:apiKeys.editor.description': 'Дайте ключу понятное название и выдайте только те ресурсы и действия, которые ему действительно нужны.',\n 'settings:apiKeys.editor.name': 'Название',\n 'settings:apiKeys.editor.namePlaceholder': 'напр. CI-бот деплоя',\n 'settings:apiKeys.editor.expiresInDays': 'Срок действия (дней)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'без срока',\n 'settings:apiKeys.editor.expiresHint': 'Оставьте пустым, чтобы ключ не истекал. Максимум 3650 дней.',\n 'settings:apiKeys.editor.permissions': 'Права',\n 'settings:apiKeys.editor.selectedActions': 'Выбрано: {count}',\n 'settings:apiKeys.created.title': 'API-ключ создан',\n 'settings:apiKeys.created.description': 'Скопируйте ключ сейчас — он больше не будет показан.',\n 'settings:apiKeys.created.warning': 'Это единственный раз, когда виден полный ключ. Сохраните его в надёжном месте.',\n 'settings:apiKeys.created.reveal': 'Показать ключ',\n 'settings:apiKeys.created.hide': 'Скрыть ключ',\n 'settings:apiKeys.created.copy': 'Копировать',\n 'settings:apiKeys.created.copied': 'Скопировано',\n 'settings:apiKeys.notice.revoked': 'API-ключ отозван',\n 'settings:apiKeys.notice.updated': 'API-ключ обновлён',\n 'settings:apiKeys.notice.copied': 'Скопировано в буфер обмена',\n 'settings:apiKeys.notice.copyFailed': 'Не удалось скопировать в буфер обмена',\n 'settings:apiKeys.confirmRevoke.title': 'Отозвать API-ключ',\n 'settings:apiKeys.confirmRevoke.description': 'Отозвать «{name}»? Все сервисы, использующие этот ключ, сразу перестанут работать.',\n 'settings:webhooks.title': 'Вебхуки',\n 'settings:webhooks.description': 'Отправляйте подписанные HTTP-уведомления при создании, изменении или удалении записей.',\n 'settings:webhooks.actions.create': 'Новый вебхук',\n 'settings:webhooks.actions.test': 'Тест',\n 'settings:webhooks.notice.saved': 'Вебхук сохранён',\n 'settings:webhooks.notice.deleted': 'Вебхук удалён',\n 'settings:webhooks.notice.testQueued': 'Тестовое уведомление поставлено в очередь',\n 'settings:webhooks.confirmDelete.title': 'Удалить вебхук',\n 'settings:webhooks.confirmDelete.description': 'Удалить «{name}»? История доставок этого вебхука тоже будет удалена.',\n 'settings:webhooks.empty.title': 'Вебхуков пока нет',\n 'settings:webhooks.empty.description': 'Создайте вебхук, чтобы уведомлять внешние системы об изменениях в админке.',\n 'settings:webhooks.columns.name': 'Название',\n 'settings:webhooks.columns.resource': 'Ресурс',\n 'settings:webhooks.columns.events': 'События',\n 'settings:webhooks.columns.enabled': 'Включён',\n 'settings:webhooks.columns.actions': 'Действия',\n 'settings:webhooks.deliveries.title': 'Последние доставки',\n 'settings:webhooks.deliveries.status': 'Статус',\n 'settings:webhooks.deliveries.event': 'Событие',\n 'settings:webhooks.deliveries.attempt': 'Попытка',\n 'settings:webhooks.deliveries.response': 'Ответ',\n 'settings:webhooks.deliveries.createdAt': 'Создано',\n 'settings:webhooks.editor.titleCreate': 'Новый вебхук',\n 'settings:webhooks.editor.titleEdit': 'Редактировать вебхук',\n 'settings:webhooks.editor.description': 'Выберите URL, события, фильтры и поля payload.',\n 'settings:webhooks.editor.name': 'Название',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Ресурс',\n 'settings:webhooks.editor.allResources': 'Все ресурсы',\n 'settings:webhooks.editor.secret': 'Секрет подписи',\n 'settings:webhooks.editor.enabled': 'Включён',\n 'settings:webhooks.editor.events': 'События',\n 'settings:webhooks.editor.payloadFields': 'Поля payload',\n 'settings:webhooks.editor.payloadFieldsHint': 'Ограничьте payload конкретными полями. Оставьте все не выбранными, чтобы включить полную запись. Удобно для скрытия чувствительных данных.',\n 'settings:webhooks.editor.headers': 'Заголовки',\n 'settings:webhooks.editor.headersHint': 'HTTP-заголовки, отправляемые с каждым запросом.\\n\\nПример:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nПодходит для токенов авторизации и подписей.',\n 'settings:webhooks.editor.filters': 'Фильтры',\n 'settings:webhooks.editor.filtersHint': 'Доставлять только когда запись соответствует всем условиям (AND). Оставьте пустым для доставки по всем событиям.\\n\\nПример:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nПримечание: события удаления игнорируют фильтры, т.к. записи уже нет.',\n 'settings:webhooks.editor.secretHint': 'Случайная строка для подписи доставок через HMAC-SHA256. Проверяйте заголовок X-Webhook-Signature на сервере.',\n 'chart:dashboard': 'Дашборд',\n 'chart:addChart': 'Добавить график',\n 'chart:newChart': 'Новый график',\n 'chart:editChart': 'Редактировать график',\n 'chart:deleteChart': 'Удалить график',\n 'chart:noCharts': 'Нет графиков',\n 'chart:noChartsHint': 'Добавьте график для мониторинга данных.',\n 'chart:addGroup': 'Добавить группу',\n 'chart:newGroup': 'Новая группа',\n 'chart:editGroup': 'Редактировать группу',\n 'chart:deleteGroup': 'Удалить группу',\n 'chart:saveGroup': 'Сохранить группу',\n 'chart:groupName': 'Название группы',\n 'chart:groupNamePlaceholder': 'напр. Метрики продаж',\n 'chart:groupNameRequired': 'Укажите название группы',\n 'chart:groupOrder': 'Порядок группы',\n 'chart:order': 'Порядок',\n 'chart:orderHint': 'Меньшие значения отображаются первыми.',\n 'chart:moveToGroup': 'Переместить в группу',\n 'chart:moveChart': 'Переместить график',\n 'chart:moveGroup': 'Группа',\n 'chart:moveNoGroups': 'Групп ещё нет.',\n 'chart:moveNoGroupsHint': 'Сначала создайте группу для организации графиков.',\n 'chart:deleteChartConfirm': 'Удалить этот график?',\n 'chart:deleteChartConfirmHint': 'Это действие нельзя отменить.',\n 'chart:deleteGroupConfirm': 'Удалить эту группу?',\n 'chart:deleteGroupConfirmHint': 'Группа и все графики в ней ({count}) будут удалены безвозвратно.',\n 'chart:title': 'Название',\n 'chart:titlePlaceholder': 'напр. Новые пользователи в день',\n 'chart:untitled': 'Без названия',\n 'chart:chartType': 'Тип графика',\n 'chart:resource': 'Ресурс',\n 'chart:groupBy': 'Группировать по',\n 'chart:step': 'Шаг',\n 'chart:metric': 'Метрика',\n 'chart:aggregateField': 'Поле для агрегации',\n 'chart:selectField': 'Выберите поле…',\n 'chart:saveChart': 'Сохранить график',\n 'chart:typeLine': 'Линейный',\n 'chart:typeArea': 'Площадной',\n 'chart:typeBar': 'Столбчатый',\n 'chart:typePie': 'Круговой',\n 'chart:stepDay': 'День',\n 'chart:stepWeek': 'Неделя',\n 'chart:stepMonth': 'Месяц',\n 'chart:stepYear': 'Год',\n 'chart:metricCount': 'Количество',\n 'chart:metricSum': 'Сумма',\n 'chart:metricAvg': 'Среднее',\n 'chart:noData': 'Нет данных за выбранный период',\n 'chart:loadError': 'Не удалось загрузить данные графика',\n 'chart:value': 'Значение',\n 'dashboard:vis': 'Визуализация',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Линейный',\n 'dashboard:visArea': 'Площадной',\n 'dashboard:visBar': 'Столбчатый',\n 'dashboard:visPie': 'Круговой',\n 'dashboard:metricCount': 'Количество',\n 'dashboard:metricSum': 'Сумма',\n 'dashboard:metricAvg': 'Среднее',\n 'dashboard:metricMin': 'Минимум',\n 'dashboard:metricMax': 'Максимум',\n 'dashboard:builder.range': 'Период',\n 'dashboard:builder.filters': 'Фильтры',\n 'dashboard:builder.filtersHint': 'Сузить выборку перед агрегацией. Отметьте фильтр, чтобы вывести его над графиком как быстрый фильтр.',\n 'dashboard:builder.quickFilterHint': 'Показывать этот фильтр над графиком на дашборде.',\n 'dashboard:builder.quickFilterToggle': 'Вывести {field} как быстрый фильтр',\n 'dashboard:range.7d': '7 дн.',\n 'dashboard:range.30d': '30 дн.',\n 'dashboard:range.90d': '90 дн.',\n 'dashboard:range.1y': '1 год',\n 'dashboard:range.all': 'Всё время',\n 'dashboard:range.custom': 'Свой',\n 'dashboard:widget.previousPeriod': 'к предыдущему периоду',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Уменьшить до половины',\n 'dashboard:widget.expand': 'Растянуть на всю ширину',\n 'dashboard:widget.toggleSql': 'Показать SQL',\n 'dashboard:widget.unsupported': 'Графики для вашей базы данных пока не поддерживаются.',\n 'dashboard:widget.truncatedWarning': 'Показаны неполные данные — слишком много строк для агрегации всего диапазона.',\n 'dashboard:widget.showAll': 'Показать все',\n 'dashboard:widget.hideAll': 'Скрыть все',\n 'dashboard:seriesTotal': 'Всего',\n 'dashboard:seriesOther': 'Прочее',\n 'dashboard:seriesNull': 'Пусто',\n 'dashboard:builder.dateField': 'Поле даты',\n 'dashboard:builder.dateFieldHint': 'Бакетирование по оси X использует это поле даты.',\n 'dashboard:builder.secondaryGroupBy': 'Разбивка',\n 'dashboard:builder.noBreakdown': 'Один ряд',\n 'dashboard:builder.topN': 'Макс. рядов',\n 'dashboard:builder.width': 'Ширина',\n 'dashboard:width.half': 'Половина',\n 'dashboard:width.full': 'Полная',\n 'history:revisions': 'Версии',\n 'history:noRevisions': 'Версий пока нет',\n 'history:loadError': 'Не удалось загрузить историю изменений',\n 'history:revert': 'Откатить',\n 'history:confirmRevert': 'Откатить запись к этой версии?',\n 'history:revertSuccess': 'Версия восстановлена',\n 'history:revertFailed': 'Не удалось восстановить версию',\n 'history:unknownUser': 'Неизвестный пользователь',\n 'history:changes': 'изменений',\n 'history:compareTo': 'Сравнить с',\n 'history:storedDiff': 'Изменения версии',\n 'history:op.create': 'Создано',\n 'history:op.update': 'Обновлено',\n 'history:op.delete': 'Удалено',\n 'diff:added': 'Добавлено',\n 'diff:changed': 'Изменено',\n 'diff:removed': 'Удалено',\n 'diff:before': 'До',\n 'diff:after': 'После',\n 'diff:noChanges': 'Изменения полей не записаны',\n 'audit:title': 'Активность',\n 'audit:resource': 'Ресурс',\n 'audit:action': 'Действие',\n 'audit:recordId': 'ID записи',\n 'audit:userId': 'ID пользователя',\n 'audit:allResources': 'Все ресурсы',\n 'audit:allActions': 'Все действия',\n 'audit:noEvents': 'Активности пока нет',\n 'audit:records': 'записей',\n 'audit:loadError': 'Не удалось загрузить активность',\n 'audit:by': 'автор: {user}',\n 'audit:viewRecord': 'Открыть запись',\n 'audit:viewChanges': 'Показать изменения',\n 'audit:hideChanges': 'Скрыть изменения',\n 'audit:noDiff': 'Детали изменений недоступны',\n 'audit:loadDiffError': 'Не удалось загрузить изменения',\n 'audit:action.new': 'Запись создана',\n 'audit:action.edit': 'Запись обновлена',\n 'audit:action.delete': 'Запись удалена',\n 'audit:action.bulkDelete': 'Записи удалены',\n 'audit:action.login': 'Вход выполнен',\n 'audit:action.apiKeyCreate': 'API-ключ создан',\n 'audit:action.apiKeyUpdate': 'API-ключ обновлён',\n 'audit:action.apiKeyDelete': 'API-ключ удалён',\n 'audit:virtualResource.auth': 'Аутентификация',\n 'audit:virtualResource.apiKeys': 'API-ключи',\n 'audit:prevPage': 'Назад',\n 'audit:nextPage': 'Вперёд',\n 'audit:dateRangePlaceholder': 'Выберите период',\n 'keyValue:noMatches': 'Совпадений нет — нажмите Enter, чтобы оставить «{value}».',\n 'aiAssistant:queue.cancel': 'Убрать из очереди',\n 'aiAssistant:title': 'AI Помощник',\n 'aiAssistant:fab.label': 'Открыть AI помощника',\n 'aiAssistant:fab.short': 'AI',\n 'aiAssistant:description': 'Задайте вопросы о записях, связях, отчётах и трендах данных.',\n 'aiAssistant:notConfigured.title': 'Помощник не настроен',\n 'aiAssistant:notConfigured.description': 'Добавьте ключ API OpenRouter в настройках, чтобы включить помощника (только чтение).',\n 'aiAssistant:notConfigured.openSettings': 'Открыть настройки',\n 'aiAssistant:tryAsking': 'Попробуйте спросить:',\n 'aiAssistant:tryAsking.example1': 'У каких клиентов больше всего постов?',\n 'aiAssistant:tryAsking.example2': 'Покажи недавно созданные записи ресурса.',\n 'aiAssistant:tryAsking.example3': 'Объясни связи между конкретными записями.',\n 'aiAssistant:thinking': 'Думаю',\n 'aiAssistant:thinkingProgress': 'Думаю ({progress}%)',\n 'aiAssistant:input.placeholder': 'Спросите о ваших данных…',\n 'aiAssistant:input.hint': 'Enter — отправить · Shift+Enter — новая строка',\n 'aiAssistant:send': 'Отправить сообщение',\n 'aiAssistant:newChat': 'Новый чат',\n 'aiAssistant:history': 'История чатов',\n 'aiAssistant:history.empty': 'Предыдущих чатов нет',\n 'aiAssistant:noText': 'Вот найденные связанные записи:',\n 'aiAssistant:fallback.noToolResult': 'Запрос выполнен, но модель не вернула текстовый ответ. Уточните вопрос или включите debug-логи, чтобы проверить результат инструмента.',\n 'aiAssistant:fallback.noRows': 'По этому запросу записи не найдены.',\n 'aiAssistant:fallback.rowsFound': 'Найдено строк: {count}.',\n 'aiAssistant:taskFailed': 'Задача AI помощника не выполнена',\n 'aiAssistant:settings.title': 'AI Помощник',\n 'aiAssistant:settings.description': 'Настройте плавающий чат-виджет, модель и серверное поведение помощника.',\n 'aiAssistant:settings.enabled': 'Включён',\n 'aiAssistant:settings.disabled': 'Выключен',\n 'aiAssistant:settings.configured': 'Настроен',\n 'aiAssistant:settings.apiKeyRequired': 'Требуется ключ API',\n 'aiAssistant:settings.readOnly': 'Только чтение',\n 'aiAssistant:settings.provider': 'Провайдер: {provider}',\n 'aiAssistant:settings.enableLabel': 'Включить помощника',\n 'aiAssistant:settings.enableHint': 'Управляет видимостью плавающего виджета и эндпоинта чата.',\n 'aiAssistant:settings.modelLabel': 'Модель OpenRouter',\n 'aiAssistant:settings.apiKeyLabel': 'Ключ API OpenRouter',\n 'aiAssistant:settings.apiKeyHint': 'Оставьте пустым, чтобы сохранить уже сохранённый на сервере ключ.',\n 'aiAssistant:settings.systemPromptLabel': 'Переопределение системного промпта',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Дополнительные инструкции под ваш проект (необязательно)',\n 'aiAssistant:settings.accessTitle': 'Модель доступа',\n 'aiAssistant:settings.accessDescription': 'Сейчас помощник ограничен инспекцией записей в режиме только чтения через действия ресурсов.',\n 'aiAssistant:settings.futureToolsReady': 'Готов к будущим инструментам',\n 'aiAssistant:settings.save': 'Сохранить настройки',\n 'aiAssistant:settings.saving': 'Сохраняем…',\n 'aiAssistant:settings.saved': 'Настройки AI помощника сохранены',\n 'aiAssistant:settings.empty': 'Настройки недоступны.',\n 'filter:op.co': 'Содержит',\n 'filter:op.nco': 'Не содержит',\n 'filter:op.sw': 'Начинается с',\n 'filter:op.ew': 'Заканчивается на',\n 'filter:op.eq': 'Равно',\n 'filter:op.neq': 'Не равно',\n 'filter:op.empty': 'Пусто',\n 'filter:op.nempty': 'Не пусто',\n 'filter:op.in': 'Одно из',\n 'filter:op.gt': 'Больше',\n 'filter:op.lt': 'Меньше',\n 'filter:op.between': 'Между',\n 'filter:searchValues': 'Поиск в списке…',\n 'filter:selectAll': 'Выбрать всё',\n 'filter:noValues': 'Значения не найдены',\n 'common:newRecord': 'Новый {name}',\n 'common:editRecord': 'Редактирование {name} #{id}',\n 'common:themeLight': 'Светлая',\n 'common:themeDark': 'Тёмная',\n 'common:themeSystem': 'Системная',\n 'common:ok': 'OK',\n 'common:select': 'Выбрать…',\n 'common:removeItem': 'Удалить {title}',\n 'common:nSelectedAddMore': 'Выбрано {count} — добавить ещё',\n 'common:pickRecords': 'Выбрать записи',\n 'common:managePickRecords': 'Управлять выбором ({count})',\n 'common:pickRecordsFrom': 'Выбрать из {name}',\n 'common:draftRestored': 'Восстановлен несохранённый черновик',\n 'common:undoDraftRestore': 'Отменить',\n 'aiFill:button': 'ИИ-заполнение',\n 'aiFill:dialogTitle': 'Заполнить форму по фото',\n 'aiFill:dialogDescription': 'Загрузите изображение — ИИ извлечёт значения и заполнит форму.',\n 'aiFill:fillButton': 'Распознать',\n 'aiFill:processing': 'Распознавание изображения…',\n 'aiFill:success': 'Заполнено полей: {count}',\n 'aiFill:errorNoFields': 'У этого ресурса нет полей для ИИ-заполнения.',\n 'aiFill:errorGeneric': 'Ошибка ИИ-заполнения: {message}',\n 'aiFill:noValues': 'ИИ не смог извлечь ни одного значения с этого изображения.',\n 'aiFill:applied': 'ИИ заполнил {count} поле(й). Можно отменить ниже.',\n 'wizard:stepOf': 'Шаг {current} из {total}',\n 'wizard:products.step1': 'Основные данные',\n 'wizard:products.step2': 'Цены',\n 'wizard:products.step3': 'Медиа и теги',\n 'common:invalidValue': 'Недопустимое значение',\n 'common:collapseSidebar': 'Свернуть боковую панель',\n 'common:expandSidebar': 'Развернуть боковую панель',\n 'common:toggleSidebar': 'Переключить боковую панель',\n 'common:sidebarTitle': 'Боковая панель',\n 'common:sidebarNavigation': 'Меню навигации',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const de: LocaleBundle = {\n code: 'de',\n name: 'Deutsch',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Startseite',\n 'common:search': 'Suche',\n 'common:loading': 'Lädt…',\n 'common:save': 'Speichern',\n 'common:cancel': 'Abbrechen',\n 'common:delete': 'Löschen',\n 'common:create': 'Erstellen',\n 'common:edit': 'Bearbeiten',\n 'common:show': 'Anzeigen',\n 'common:back': 'Zurück',\n 'common:noRecords': 'Keine Einträge gefunden.',\n 'common:noRecordsHint': 'Erstellen Sie einen neuen Eintrag „{resource}\", um zu beginnen.',\n 'common:noMatchingRecords': 'Keine Einträge entsprechen Ihren Filtern.',\n 'common:clearFilters': 'Filter zurücksetzen',\n 'common:confirmDelete': 'Diesen Eintrag löschen?',\n 'common:perPage': 'Pro Seite',\n 'common:page': 'Seite',\n 'common:of': 'von',\n 'common:total': 'Gesamt',\n 'auth:login': 'Anmelden',\n 'auth:logout': 'Abmelden',\n 'auth:email': 'E-Mail',\n 'auth:password': 'Passwort',\n 'auth:loginFailed': 'Ungültige Zugangsdaten.',\n 'errors:notFound': 'Nicht gefunden.',\n 'errors:forbidden': 'Kein Zugriff auf diese Ressource.',\n 'errors:server': 'Etwas ist schiefgelaufen. Bitte erneut versuchen.',\n 'common:resources': 'Ressourcen',\n 'common:actions': 'Aktionen',\n 'common:new': 'Neu',\n 'common:rowsPerPage': 'Zeilen pro Seite',\n 'common:filter': 'Filter {label}…',\n 'validation:required': '{label} ist erforderlich',\n 'validation:invalidNumber': '{label} muss eine gültige Zahl sein',\n 'validation:invalidInteger': '{label} muss eine ganze Zahl sein',\n 'validation:invalidEmail': '{label} muss eine gültige E-Mail sein',\n 'validation:invalidUrl': '{label} muss eine gültige URL sein',\n 'validation:invalidDate': '{label} muss ein gültiges Datum sein',\n 'validation:invalidUuid': '{label} muss eine gültige UUID sein',\n 'validation:tooShort': '{label} muss mindestens {min} Zeichen lang sein',\n 'validation:tooLong': '{label} darf höchstens {max} Zeichen lang sein',\n 'validation:notInList': '{label} hat einen ungültigen Wert',\n 'validation:emptySelection': 'Bitte mindestens einen Wert für {label} wählen',\n 'toast:created': 'Erfolgreich erstellt',\n 'toast:saved': 'Erfolgreich gespeichert',\n 'toast:deleted': 'Erfolgreich gelöscht',\n 'toast:createFailed': 'Erstellen fehlgeschlagen',\n 'toast:saveFailed': 'Speichern fehlgeschlagen',\n 'toast:deleteFailed': 'Löschen fehlgeschlagen',\n 'toast:loadFailed': 'Laden fehlgeschlagen',\n 'toast:validationFailed': 'Bitte Fehler beheben und erneut versuchen',\n 'common:close': 'Schließen',\n 'common:export': 'Export',\n 'export:title': 'Datensätze exportieren',\n 'export:description': 'Alle passenden Datensätze von {resource} als Datei herunterladen.',\n 'export:csvHint': 'Kommagetrennte Werte',\n 'export:jsonHint': 'Strukturiertes JSON-Array',\n 'export:downloading': 'Download wird vorbereitet…',\n 'export:progress': '{loaded} von {total} geladen…',\n 'export:exported': '{count} Datensätze exportiert',\n 'export:exportFailed': 'Export fehlgeschlagen',\n 'common:apply': 'Anwenden',\n 'common:clear': 'Zurücksetzen',\n 'common:filters': 'Filter',\n 'common:columns': 'Spalten',\n 'common:toggleColumns': 'Spalten anzeigen',\n 'common:openMenu': 'Menü öffnen',\n 'common:refresh': 'Aktualisieren',\n 'common:copy': 'Kopieren',\n 'common:copied': 'Kopiert!',\n 'common:applyFilters': 'Filter anwenden',\n 'common:clearAll': 'Alle löschen',\n 'common:any': 'Beliebig',\n 'common:yes': 'Ja',\n 'common:no': 'Nein',\n 'common:filterPlaceholder': 'Filter…',\n 'common:loadFailed': 'Laden fehlgeschlagen: {error}',\n 'common:theme': 'Design',\n 'common:language': 'Sprache',\n 'common:toggleTheme': 'Design umschalten',\n 'common:clearSelection': 'Auswahl löschen',\n 'common:searchPlaceholder': 'Suchen…',\n 'globalSearch:title': 'Globale Suche',\n 'globalSearch:description': 'Über alle Ressourcen und Datensätze hinweg suchen.',\n 'globalSearch:trigger': 'Suchen…',\n 'globalSearch:placeholder': 'Über alle Ressourcen suchen…',\n 'globalSearch:hint': 'Tippen, um in allen Ressourcen zu suchen.',\n 'globalSearch:noResults': 'Keine passenden Datensätze gefunden.',\n 'globalSearch:error': 'Suche fehlgeschlagen. Bitte erneut versuchen.',\n 'globalSearch:hotkey': 'Globale Suche öffnen',\n 'globalSearch:matchedIn': 'in {field}',\n 'globalSearch:recent': 'Letzte Suchen',\n 'globalSearch:clearRecent': 'Löschen',\n 'globalSearch:showAllIn': 'Alle in {resource} anzeigen',\n 'common:pageOf': 'Seite {page} von {total}',\n 'common:firstPage': 'Erste Seite',\n 'common:previousPage': 'Vorherige Seite',\n 'common:nextPage': 'Nächste Seite',\n 'common:lastPage': 'Letzte Seite',\n 'common:recordsCount': '{count} Einträge',\n 'common:selectedCount': '{count} ausgewählt',\n 'common:selectRow': 'Zeile auswählen',\n 'common:selectAll': 'Alle auswählen',\n 'common:deleteSelected': 'Ausgewählte löschen',\n 'common:bulkDeleteConfirm': '{count} ausgewählte Datensätze löschen?',\n 'toast:bulkDeleted': '{count} Datensätze gelöscht',\n 'toast:bulkDeleteFailed': 'Datensätze konnten nicht gelöscht werden',\n 'common:from': 'Von',\n 'common:to': 'Bis',\n 'common:sortBy': 'Sortieren nach',\n 'common:next': 'Weiter',\n 'common:previous': 'Zurück',\n 'common:relatedRecords': 'Verknüpfte Datensätze',\n 'common:viewAll': 'Alle anzeigen',\n 'common:noRelatedRecords': 'Keine verknüpften Datensätze.',\n 'common:preview': 'Vorschau',\n 'common:download': 'Herunterladen',\n 'common:openInNewTab': 'In neuem Tab öffnen',\n 'common:format': 'Formatieren',\n 'common:invalidJson': 'Ungültiges JSON',\n 'common:showPassword': 'Passwort anzeigen',\n 'common:hidePassword': 'Passwort verbergen',\n 'common:shortcutsHelp': 'Tastenkürzel',\n 'common:shortcutsEmpty': 'Auf diesem Bildschirm sind keine Kürzel verfügbar.',\n 'auth:title': 'Anmelden',\n 'auth:subtitle': 'Geben Sie Ihre E-Mail und Ihr Passwort ein',\n 'auth:tagline': 'Das moderne Admin-Panel für jeden Stack.',\n 'auth:orContinueWith': 'Oder weiter mit',\n 'auth:continueWith': 'Weiter mit {provider}',\n 'common:chooseFile': 'Datei auswählen',\n 'common:chooseFiles': 'Dateien auswählen',\n 'common:dragAndDrop': 'Ziehen und ablegen oder',\n 'common:chooseAFile': 'Datei auswählen',\n 'common:addMoreFiles': 'weitere Dateien hinzufügen',\n 'common:uploading': 'Wird hochgeladen…',\n 'common:uploadingFile': '„{name}\" wird hochgeladen…',\n 'common:removeFile': 'Datei entfernen',\n 'common:uploadFailed': 'Upload fehlgeschlagen',\n 'common:dismiss': 'Schließen',\n 'common:openCalendar': 'Kalender öffnen',\n 'common:time': 'Uhrzeit',\n 'common:downloadFailed': 'Download fehlgeschlagen',\n 'richtext:bold': 'Fett',\n 'richtext:italic': 'Kursiv',\n 'richtext:strikethrough': 'Durchgestrichen',\n 'richtext:inlineCode': 'Inline-Code',\n 'richtext:heading': 'Überschrift {level}',\n 'richtext:bulletList': 'Aufzählungsliste',\n 'richtext:numberedList': 'Nummerierte Liste',\n 'richtext:blockquote': 'Blockzitat',\n 'richtext:horizontalRule': 'Horizontale Linie',\n 'richtext:insertLink': 'Link einfügen',\n 'richtext:undo': 'Rückgängig',\n 'richtext:redo': 'Wiederholen',\n 'richtext:source': 'Quelltext ({format})',\n 'richtext:splitView': 'Geteilte Ansicht',\n 'richtext:visualEditor': 'Visueller Editor',\n 'richtext:fullscreen': 'Vollbild',\n 'richtext:exitFullscreen': 'Vollbild beenden',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Speichern…',\n 'common:done': 'Fertig',\n 'settings:menuItem': 'Einstellungen',\n 'settings:noSectionsConfigured': 'Für diese Installation sind keine Einstellungsbereiche verfügbar.',\n 'settings:apiKeys.title': 'API-Schlüssel',\n 'settings:apiKeys.description': 'Programmatische Zugriffstoken für die Admin-API. Jeder Schlüssel hat eine Berechtigungsmenge, die einschränkt, welche Ressourcen und Aktionen er ausführen darf.',\n 'settings:apiKeys.actions.create': 'Neuer Schlüssel',\n 'settings:apiKeys.actions.edit': 'Bearbeiten',\n 'settings:apiKeys.actions.revoke': 'Widerrufen',\n 'settings:apiKeys.empty.title': 'Noch keine API-Schlüssel',\n 'settings:apiKeys.empty.description': 'Erstelle deinen ersten Schlüssel für programmatischen Zugriff.',\n 'settings:apiKeys.columns.name': 'Name',\n 'settings:apiKeys.columns.start': 'Präfix',\n 'settings:apiKeys.columns.permissions': 'Berechtigungen',\n 'settings:apiKeys.columns.expiresAt': 'Läuft ab',\n 'settings:apiKeys.columns.enabled': 'Aktiviert',\n 'settings:apiKeys.columns.actions': 'Aktionen',\n 'settings:apiKeys.lastUsed': 'Zuletzt verwendet {date}',\n 'settings:apiKeys.expiresNever': 'Nie',\n 'settings:apiKeys.permissions.resource': 'Ressource',\n 'settings:apiKeys.permissions.actions': 'Aktionen',\n 'settings:apiKeys.permissions.selectAll': 'Alle auswählen',\n 'settings:apiKeys.permissions.clearAll': 'Alle entfernen',\n 'settings:apiKeys.permissions.none': 'Keine Berechtigungen',\n 'settings:apiKeys.permissions.summary': '{resources} Ressourcen · {actions} Aktionen',\n 'settings:apiKeys.permissions.noResources': 'Es sind keine Ressourcen registriert.',\n 'settings:apiKeys.permissions.selectAllResources': 'Alle Ressourcen und Aktionen auswählen',\n 'settings:apiKeys.permissions.clearAllResources': 'Alle Ressourcen und Aktionen entfernen',\n 'settings:apiKeys.editor.titleCreate': 'Neuer API-Schlüssel',\n 'settings:apiKeys.editor.titleEdit': 'API-Schlüssel bearbeiten',\n 'settings:apiKeys.editor.description': 'Wähle einen aussagekräftigen Namen und gewähre nur die Ressourcen und Aktionen, die der Schlüssel wirklich braucht.',\n 'settings:apiKeys.editor.name': 'Name',\n 'settings:apiKeys.editor.namePlaceholder': 'z. B. CI-Deploy-Bot',\n 'settings:apiKeys.editor.expiresInDays': 'Läuft ab in (Tagen)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'nie',\n 'settings:apiKeys.editor.expiresHint': 'Leer lassen, damit der Schlüssel nicht abläuft. Maximal 3650 Tage.',\n 'settings:apiKeys.editor.permissions': 'Berechtigungen',\n 'settings:apiKeys.editor.selectedActions': '{count} ausgewählt',\n 'settings:apiKeys.created.title': 'API-Schlüssel erstellt',\n 'settings:apiKeys.created.description': 'Kopiere den Schlüssel jetzt — er wird nicht erneut angezeigt.',\n 'settings:apiKeys.created.warning': 'Dies ist die einzige Gelegenheit, den vollständigen Schlüssel zu sehen. Bewahre ihn sicher auf.',\n 'settings:apiKeys.created.reveal': 'Schlüssel anzeigen',\n 'settings:apiKeys.created.hide': 'Schlüssel ausblenden',\n 'settings:apiKeys.created.copy': 'Kopieren',\n 'settings:apiKeys.created.copied': 'Kopiert',\n 'settings:apiKeys.notice.revoked': 'API-Schlüssel widerrufen',\n 'settings:apiKeys.notice.updated': 'API-Schlüssel aktualisiert',\n 'settings:apiKeys.notice.copied': 'In die Zwischenablage kopiert',\n 'settings:apiKeys.notice.copyFailed': 'Kopieren in die Zwischenablage fehlgeschlagen',\n 'settings:apiKeys.confirmRevoke.title': 'API-Schlüssel widerrufen',\n 'settings:apiKeys.confirmRevoke.description': '„{name}\" widerrufen? Alle Dienste, die diesen Schlüssel verwenden, funktionieren sofort nicht mehr.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'Dashboard',\n 'chart:addChart': 'Diagramm hinzufügen',\n 'chart:newChart': 'Neues Diagramm',\n 'chart:editChart': 'Diagramm bearbeiten',\n 'chart:deleteChart': 'Diagramm entfernen',\n 'chart:noCharts': 'Keine Diagramme vorhanden',\n 'chart:noChartsHint': 'Fügen Sie ein Diagramm hinzu, um Ihre Daten zu überwachen.',\n 'chart:addGroup': 'Gruppe hinzufügen',\n 'chart:newGroup': 'Neue Gruppe',\n 'chart:editGroup': 'Gruppe bearbeiten',\n 'chart:deleteGroup': 'Gruppe entfernen',\n 'chart:saveGroup': 'Gruppe speichern',\n 'chart:groupName': 'Gruppenname',\n 'chart:groupNamePlaceholder': 'z. B. Verkaufsmetriken',\n 'chart:groupNameRequired': 'Gruppenname ist erforderlich',\n 'chart:groupOrder': 'Reihenfolge der Gruppe',\n 'chart:order': 'Reihenfolge',\n 'chart:orderHint': 'Niedrigere Zahlen erscheinen zuerst.',\n 'chart:moveToGroup': 'In Gruppe verschieben',\n 'chart:moveChart': 'Diagramm verschieben',\n 'chart:moveGroup': 'Gruppe',\n 'chart:moveNoGroups': 'Noch keine Gruppen.',\n 'chart:moveNoGroupsHint': 'Erstellen Sie zuerst eine Gruppe, um Diagramme zu organisieren.',\n 'chart:deleteChartConfirm': 'Diagramm entfernen?',\n 'chart:deleteChartConfirmHint': 'Diese Aktion kann nicht rückgängig gemacht werden.',\n 'chart:deleteGroupConfirm': 'Diese Gruppe entfernen?',\n 'chart:deleteGroupConfirmHint': 'Die Gruppe und alle darin enthaltenen Diagramme ({count}) werden dauerhaft gelöscht.',\n 'chart:title': 'Titel',\n 'chart:titlePlaceholder': 'z.B. Neue Nutzer pro Tag',\n 'chart:untitled': 'Ohne Titel',\n 'chart:chartType': 'Diagrammtyp',\n 'chart:resource': 'Ressource',\n 'chart:groupBy': 'Gruppieren nach',\n 'chart:step': 'Schritt',\n 'chart:metric': 'Metrik',\n 'chart:aggregateField': 'Aggregationsfeld',\n 'chart:selectField': 'Feld auswählen…',\n 'chart:saveChart': 'Diagramm speichern',\n 'chart:typeLine': 'Linie',\n 'chart:typeArea': 'Fläche',\n 'chart:typeBar': 'Balken',\n 'chart:typePie': 'Kreis',\n 'chart:stepDay': 'Tag',\n 'chart:stepWeek': 'Woche',\n 'chart:stepMonth': 'Monat',\n 'chart:stepYear': 'Jahr',\n 'chart:metricCount': 'Anzahl',\n 'chart:metricSum': 'Summe',\n 'chart:metricAvg': 'Durchschnitt',\n 'chart:noData': 'Keine Daten für den ausgewählten Zeitraum',\n 'chart:loadError': 'Diagrammdaten konnten nicht geladen werden',\n 'chart:value': 'Wert',\n 'dashboard:vis': 'Visualisierung',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Linie',\n 'dashboard:visArea': 'Fläche',\n 'dashboard:visBar': 'Balken',\n 'dashboard:visPie': 'Kreis',\n 'dashboard:metricCount': 'Anzahl',\n 'dashboard:metricSum': 'Summe',\n 'dashboard:metricAvg': 'Durchschnitt',\n 'dashboard:metricMin': 'Min',\n 'dashboard:metricMax': 'Max',\n 'dashboard:builder.range': 'Zeitraum',\n 'dashboard:builder.filters': 'Filter',\n 'dashboard:builder.filtersHint': 'Datensatz vor der Aggregation eingrenzen. Aktiviere ein Häkchen, um den Filter über dem Diagramm einzublenden.',\n 'dashboard:builder.quickFilterHint': 'Diesen Filter über dem Diagramm im Dashboard anzeigen.',\n 'dashboard:builder.quickFilterToggle': '{field} als Schnellfilter einblenden',\n 'dashboard:range.7d': '7T',\n 'dashboard:range.30d': '30T',\n 'dashboard:range.90d': '90T',\n 'dashboard:range.1y': '1J',\n 'dashboard:range.all': 'Alle',\n 'dashboard:range.custom': 'Benutzerdefiniert',\n 'dashboard:widget.previousPeriod': 'ggü. Vorperiode',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Auf halbe Breite verkleinern',\n 'dashboard:widget.expand': 'Auf volle Zeile erweitern',\n 'dashboard:widget.toggleSql': 'SQL anzeigen',\n 'dashboard:widget.unsupported': 'Diagramme werden für Ihre Datenbank noch nicht unterstützt.',\n 'dashboard:widget.truncatedWarning': 'Teildaten werden angezeigt – zu viele Zeilen, um den gesamten Bereich zu aggregieren.',\n 'dashboard:widget.showAll': 'Alle anzeigen',\n 'dashboard:widget.hideAll': 'Alle ausblenden',\n 'dashboard:seriesTotal': 'Gesamt',\n 'dashboard:seriesOther': 'Sonstige',\n 'dashboard:seriesNull': 'Leer',\n 'dashboard:builder.dateField': 'Datumsfeld',\n 'dashboard:builder.dateFieldHint': 'Die X-Achse wird nach diesem Datumsfeld gruppiert.',\n 'dashboard:builder.secondaryGroupBy': 'Aufschlüsselung',\n 'dashboard:builder.noBreakdown': 'Einzelne Reihe',\n 'dashboard:builder.topN': 'Max. Reihen',\n 'dashboard:builder.width': 'Breite',\n 'dashboard:width.half': 'Halb',\n 'dashboard:width.full': 'Volle Zeile',\n 'history:revisions': 'Revisionen',\n 'history:noRevisions': 'Noch keine Revisionen',\n 'history:loadError': 'Revisionsverlauf konnte nicht geladen werden',\n 'history:revert': 'Zurücksetzen',\n 'history:confirmRevert': 'Zu dieser Revision zurücksetzen?',\n 'history:revertSuccess': 'Revision wiederhergestellt',\n 'history:revertFailed': 'Revision konnte nicht wiederhergestellt werden',\n 'history:unknownUser': 'Unbekannter Benutzer',\n 'history:changes': 'Änderungen',\n 'history:compareTo': 'Vergleichen mit',\n 'history:storedDiff': 'Änderungsdiff',\n 'history:op.create': 'Erstellt',\n 'history:op.update': 'Aktualisiert',\n 'history:op.delete': 'Gelöscht',\n 'diff:added': 'Hinzugefügt',\n 'diff:changed': 'Geändert',\n 'diff:removed': 'Entfernt',\n 'diff:before': 'Vorher',\n 'diff:after': 'Nachher',\n 'diff:noChanges': 'Keine Feldänderungen aufgezeichnet',\n 'audit:title': 'Aktivität',\n 'audit:resource': 'Ressource',\n 'audit:action': 'Aktion',\n 'audit:recordId': 'Datensatz-ID',\n 'audit:userId': 'Benutzer-ID',\n 'audit:allResources': 'Alle Ressourcen',\n 'audit:allActions': 'Alle Aktionen',\n 'audit:noEvents': 'Noch keine Aktivität',\n 'audit:records': 'Datensätze',\n 'audit:loadError': 'Aktivität konnte nicht geladen werden',\n 'audit:by': 'von {user}',\n 'audit:viewRecord': 'Datensatz öffnen',\n 'audit:viewChanges': 'Änderungen anzeigen',\n 'audit:hideChanges': 'Änderungen ausblenden',\n 'audit:noDiff': 'Details zu den Änderungen sind nicht verfügbar',\n 'audit:loadDiffError': 'Änderungen konnten nicht geladen werden',\n 'audit:action.new': 'Datensatz erstellt',\n 'audit:action.edit': 'Datensatz aktualisiert',\n 'audit:action.delete': 'Datensatz gelöscht',\n 'audit:action.bulkDelete': 'Datensätze gelöscht',\n 'audit:action.login': 'Angemeldet',\n 'audit:action.apiKeyCreate': 'API-Schlüssel erstellt',\n 'audit:action.apiKeyUpdate': 'API-Schlüssel aktualisiert',\n 'audit:action.apiKeyDelete': 'API-Schlüssel gelöscht',\n 'audit:virtualResource.auth': 'Authentifizierung',\n 'audit:virtualResource.apiKeys': 'API-Schlüssel',\n 'audit:prevPage': 'Zurück',\n 'audit:nextPage': 'Weiter',\n 'audit:dateRangePlaceholder': 'Datumsbereich auswählen',\n 'keyValue:noMatches': 'Keine Treffer – Enter drücken, um „{value}\" zu übernehmen.',\n 'aiAssistant:queue.cancel': 'Aus Warteschlange entfernen',\n 'aiAssistant:title': 'KI-Assistent',\n 'aiAssistant:fab.label': 'KI-Assistenten öffnen',\n 'aiAssistant:fab.short': 'KI',\n 'aiAssistant:description': 'Stellen Sie Fragen zu Datensätzen, Beziehungen, Berichten und Datentrends.',\n 'aiAssistant:notConfigured.title': 'Assistent ist nicht konfiguriert',\n 'aiAssistant:notConfigured.description': 'Fügen Sie den OpenRouter-API-Schlüssel in den Einstellungen hinzu, um den schreibgeschützten KI-Assistenten zu aktivieren.',\n 'aiAssistant:notConfigured.openSettings': 'Einstellungen öffnen',\n 'aiAssistant:tryAsking': 'Versuchen Sie zu fragen:',\n 'aiAssistant:tryAsking.example1': 'Welche Kunden haben die meisten Beiträge?',\n 'aiAssistant:tryAsking.example2': 'Zeige kürzlich erstellte Datensätze einer Ressource.',\n 'aiAssistant:tryAsking.example3': 'Erkläre Beziehungen zwischen bestimmten Datensätzen.',\n 'aiAssistant:thinking': 'Denke nach',\n 'aiAssistant:thinkingProgress': 'Denke nach ({progress}%)',\n 'aiAssistant:input.placeholder': 'Fragen Sie zu Ihren Daten…',\n 'aiAssistant:input.hint': 'Enter zum Senden · Shift+Enter für eine neue Zeile',\n 'aiAssistant:send': 'Nachricht senden',\n 'aiAssistant:newChat': 'Neuer Chat',\n 'aiAssistant:history': 'Chatverlauf',\n 'aiAssistant:history.empty': 'Keine früheren Chats',\n 'aiAssistant:noText': 'Hier sind die gefundenen zugehörigen Datensätze:',\n 'aiAssistant:fallback.noToolResult': 'Die Anfrage wurde ausgeführt, aber das Modell hat keine Textantwort zurückgegeben. Präzisieren Sie die Frage oder aktivieren Sie Debug-Logs, um das Tool-Ergebnis zu prüfen.',\n 'aiAssistant:fallback.noRows': 'Für diese Anfrage wurden keine Datensätze gefunden.',\n 'aiAssistant:fallback.rowsFound': 'Gefundene Zeilen: {count}.',\n 'aiAssistant:taskFailed': 'KI-Assistent-Aufgabe fehlgeschlagen',\n 'aiAssistant:settings.title': 'KI-Assistent',\n 'aiAssistant:settings.description': 'Konfigurieren Sie das schwebende Chat-Widget, das Modell und das serverseitige Assistentenverhalten.',\n 'aiAssistant:settings.enabled': 'Aktiviert',\n 'aiAssistant:settings.disabled': 'Deaktiviert',\n 'aiAssistant:settings.configured': 'Konfiguriert',\n 'aiAssistant:settings.apiKeyRequired': 'API-Schlüssel erforderlich',\n 'aiAssistant:settings.readOnly': 'Nur lesen',\n 'aiAssistant:settings.provider': 'Anbieter: {provider}',\n 'aiAssistant:settings.enableLabel': 'Assistenten aktivieren',\n 'aiAssistant:settings.enableHint': 'Steuert die Sichtbarkeit des schwebenden Widgets und des Chat-Endpunkts.',\n 'aiAssistant:settings.modelLabel': 'OpenRouter-Modell',\n 'aiAssistant:settings.apiKeyLabel': 'OpenRouter-API-Schlüssel',\n 'aiAssistant:settings.apiKeyHint': 'Leer lassen, um den auf dem Server gespeicherten Schlüssel beizubehalten.',\n 'aiAssistant:settings.systemPromptLabel': 'System-Prompt überschreiben',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Optionale projektspezifische Anweisungen für den Assistenten',\n 'aiAssistant:settings.accessTitle': 'Zugriffsmodell',\n 'aiAssistant:settings.accessDescription': 'Der aktuelle Assistent ist auf schreibgeschützte Datensatzprüfung über Admin-Ressourcenaktionen beschränkt.',\n 'aiAssistant:settings.futureToolsReady': 'Bereit für zukünftige Tools',\n 'aiAssistant:settings.save': 'Einstellungen speichern',\n 'aiAssistant:settings.saving': 'Speichere…',\n 'aiAssistant:settings.saved': 'KI-Assistent-Einstellungen gespeichert',\n 'aiAssistant:settings.empty': 'Keine Einstellungen verfügbar.',\n 'filter:op.co': 'Enthält',\n 'filter:op.nco': 'Enthält nicht',\n 'filter:op.sw': 'Beginnt mit',\n 'filter:op.ew': 'Endet mit',\n 'filter:op.eq': 'Ist gleich',\n 'filter:op.neq': 'Ist nicht gleich',\n 'filter:op.empty': 'Ist leer',\n 'filter:op.nempty': 'Ist nicht leer',\n 'filter:op.in': 'Ist einer von',\n 'filter:op.gt': 'Größer als',\n 'filter:op.lt': 'Kleiner als',\n 'filter:op.between': 'Zwischen',\n 'filter:searchValues': 'In Liste suchen…',\n 'filter:selectAll': 'Alle auswählen',\n 'filter:noValues': 'Keine Werte gefunden',\n 'common:newRecord': 'Neu: {name}',\n 'common:editRecord': '{name} #{id} bearbeiten',\n 'common:themeLight': 'Hell',\n 'common:themeDark': 'Dunkel',\n 'common:themeSystem': 'System',\n 'common:ok': 'OK',\n 'common:select': 'Auswählen…',\n 'common:removeItem': '{title} entfernen',\n 'common:nSelectedAddMore': '{count} ausgewählt — weitere hinzufügen',\n 'common:pickRecords': 'Datensätze auswählen',\n 'common:managePickRecords': 'Auswahl verwalten ({count})',\n 'common:pickRecordsFrom': 'Aus {name} auswählen',\n 'common:draftRestored': 'Nicht gespeicherter Entwurf wiederhergestellt',\n 'common:undoDraftRestore': 'Rückgängig',\n 'aiFill:button': 'KI-Ausfüllen',\n 'aiFill:dialogTitle': 'Formular aus Foto ausfüllen',\n 'aiFill:dialogDescription': 'Bild hochladen — die KI extrahiert die Werte und füllt das Formular aus.',\n 'aiFill:fillButton': 'Erkennen',\n 'aiFill:processing': 'Bild wird erkannt…',\n 'aiFill:success': '{count} Feld(er) ausgefüllt',\n 'aiFill:errorNoFields': 'Diese Ressource hat keine KI-ausfüllbaren Felder.',\n 'aiFill:errorGeneric': 'KI-Ausfüllen fehlgeschlagen: {message}',\n 'aiFill:noValues': 'Die KI konnte aus diesem Bild keine Werte extrahieren.',\n 'aiFill:applied': 'KI hat {count} Feld(er) ausgefüllt. Unten rückgängig machen.',\n 'wizard:stepOf': 'Schritt {current} von {total}',\n 'wizard:products.step1': 'Grundinfo',\n 'wizard:products.step2': 'Preisgestaltung',\n 'wizard:products.step3': 'Medien & Tags',\n 'common:invalidValue': 'Ungültiger Wert',\n 'common:collapseSidebar': 'Seitenleiste einklappen',\n 'common:expandSidebar': 'Seitenleiste ausklappen',\n 'common:toggleSidebar': 'Seitenleiste umschalten',\n 'common:sidebarTitle': 'Seitenleiste',\n 'common:sidebarNavigation': 'Navigationsmenü',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const fr: LocaleBundle = {\n code: 'fr',\n name: 'Français',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Accueil',\n 'common:search': 'Recherche',\n 'common:loading': 'Chargement…',\n 'common:save': 'Enregistrer',\n 'common:cancel': 'Annuler',\n 'common:delete': 'Supprimer',\n 'common:create': 'Créer',\n 'common:edit': 'Modifier',\n 'common:show': 'Afficher',\n 'common:back': 'Retour',\n 'common:noRecords': 'Aucun enregistrement.',\n 'common:noRecordsHint': 'Commencez par créer un nouveau {resource}.',\n 'common:noMatchingRecords': 'Aucun enregistrement ne correspond à vos filtres.',\n 'common:clearFilters': 'Effacer les filtres',\n 'common:confirmDelete': 'Supprimer cet enregistrement ?',\n 'common:perPage': 'Par page',\n 'common:page': 'Page',\n 'common:of': 'sur',\n 'common:total': 'Total',\n 'auth:login': 'Connexion',\n 'auth:logout': 'Déconnexion',\n 'auth:email': 'E-mail',\n 'auth:password': 'Mot de passe',\n 'auth:loginFailed': 'Identifiants invalides.',\n 'errors:notFound': 'Introuvable.',\n 'errors:forbidden': 'Accès refusé à cette ressource.',\n 'errors:server': 'Une erreur est survenue. Veuillez réessayer.',\n 'common:resources': 'Ressources',\n 'common:actions': 'Actions',\n 'common:new': 'Nouveau',\n 'common:rowsPerPage': 'Lignes par page',\n 'common:filter': 'Filtrer {label}…',\n 'validation:required': '{label} est requis',\n 'validation:invalidNumber': '{label} doit être un nombre valide',\n 'validation:invalidInteger': '{label} doit être un entier',\n 'validation:invalidEmail': '{label} doit être un e-mail valide',\n 'validation:invalidUrl': '{label} doit être une URL valide',\n 'validation:invalidDate': '{label} doit être une date valide',\n 'validation:invalidUuid': '{label} doit être un UUID valide',\n 'validation:tooShort': '{label} doit contenir au moins {min} caractères',\n 'validation:tooLong': '{label} doit contenir au plus {max} caractères',\n 'validation:notInList': '{label} a une valeur invalide',\n 'validation:emptySelection': 'Sélectionnez au moins une valeur pour {label}',\n 'toast:created': 'Créé avec succès',\n 'toast:saved': 'Enregistré avec succès',\n 'toast:deleted': 'Supprimé avec succès',\n 'toast:createFailed': 'Échec de la création',\n 'toast:saveFailed': 'Échec de l\\u2019enregistrement',\n 'toast:deleteFailed': 'Échec de la suppression',\n 'toast:loadFailed': 'Échec du chargement',\n 'toast:validationFailed': 'Veuillez corriger les erreurs et réessayer',\n 'common:close': 'Fermer',\n 'common:export': 'Exporter',\n 'export:title': 'Exporter les enregistrements',\n 'export:description': 'Télécharger tous les enregistrements correspondants de {resource} dans un seul fichier.',\n 'export:csvHint': 'Valeurs séparées par des virgules',\n 'export:jsonHint': 'Tableau JSON structuré',\n 'export:downloading': 'Préparation du téléchargement…',\n 'export:progress': '{loaded} sur {total} chargés…',\n 'export:exported': '{count} enregistrements exportés',\n 'export:exportFailed': 'Échec de l\\u2019export',\n 'common:apply': 'Appliquer',\n 'common:clear': 'Effacer',\n 'common:filters': 'Filtres',\n 'common:columns': 'Colonnes',\n 'common:toggleColumns': 'Afficher les colonnes',\n 'common:openMenu': 'Ouvrir le menu',\n 'common:refresh': 'Actualiser',\n 'common:copy': 'Copier',\n 'common:copied': 'Copié !',\n 'common:applyFilters': 'Appliquer les filtres',\n 'common:clearAll': 'Tout effacer',\n 'common:any': 'Aucun',\n 'common:yes': 'Oui',\n 'common:no': 'Non',\n 'common:filterPlaceholder': 'Filtrer…',\n 'common:loadFailed': 'Échec du chargement : {error}',\n 'common:theme': 'Thème',\n 'common:language': 'Langue',\n 'common:toggleTheme': 'Changer de thème',\n 'common:clearSelection': 'Effacer la sélection',\n 'common:searchPlaceholder': 'Rechercher…',\n 'globalSearch:title': 'Recherche globale',\n 'globalSearch:description': 'Rechercher dans toutes les ressources et tous les enregistrements.',\n 'globalSearch:trigger': 'Rechercher…',\n 'globalSearch:placeholder': 'Rechercher dans toutes les ressources…',\n 'globalSearch:hint': 'Commencez à taper pour rechercher dans toutes les ressources.',\n 'globalSearch:noResults': 'Aucun enregistrement correspondant.',\n 'globalSearch:error': 'Échec de la recherche. Veuillez réessayer.',\n 'globalSearch:hotkey': 'Ouvrir la recherche globale',\n 'globalSearch:matchedIn': 'dans {field}',\n 'globalSearch:recent': 'Recherches récentes',\n 'globalSearch:clearRecent': 'Effacer',\n 'globalSearch:showAllIn': 'Tout afficher dans {resource}',\n 'common:pageOf': 'Page {page} sur {total}',\n 'common:firstPage': 'Première page',\n 'common:previousPage': 'Page précédente',\n 'common:nextPage': 'Page suivante',\n 'common:lastPage': 'Dernière page',\n 'common:recordsCount': '{count} enregistrements',\n 'common:selectedCount': '{count} sélectionné(s)',\n 'common:selectRow': 'Sélectionner la ligne',\n 'common:selectAll': 'Tout sélectionner',\n 'common:deleteSelected': 'Supprimer la sélection',\n 'common:bulkDeleteConfirm': 'Supprimer les {count} enregistrements sélectionnés ?',\n 'toast:bulkDeleted': '{count} enregistrements supprimés',\n 'toast:bulkDeleteFailed': 'Échec de la suppression des enregistrements',\n 'common:from': 'De',\n 'common:to': 'À',\n 'common:sortBy': 'Trier par',\n 'common:next': 'Suivant',\n 'common:previous': 'Précédent',\n 'common:relatedRecords': 'Enregistrements liés',\n 'common:viewAll': 'Tout afficher',\n 'common:noRelatedRecords': 'Aucun enregistrement lié.',\n 'common:preview': 'Aperçu',\n 'common:download': 'Télécharger',\n 'common:openInNewTab': 'Ouvrir dans un nouvel onglet',\n 'common:format': 'Formater',\n 'common:invalidJson': 'JSON invalide',\n 'common:showPassword': 'Afficher le mot de passe',\n 'common:hidePassword': 'Masquer le mot de passe',\n 'common:shortcutsHelp': 'Raccourcis clavier',\n 'common:shortcutsEmpty': 'Aucun raccourci disponible sur cet écran.',\n 'auth:title': 'Connexion',\n 'auth:subtitle': 'Saisissez votre e-mail et votre mot de passe',\n 'auth:tagline': 'Le panneau d\\'administration moderne pour toute stack.',\n 'auth:orContinueWith': 'Ou continuer avec',\n 'auth:continueWith': 'Continuer avec {provider}',\n 'common:chooseFile': 'Choisir un fichier',\n 'common:chooseFiles': 'Choisir des fichiers',\n 'common:dragAndDrop': 'Glisser-déposer ou',\n 'common:chooseAFile': 'choisir un fichier',\n 'common:addMoreFiles': 'ajouter d\\'autres fichiers',\n 'common:uploading': 'Téléversement…',\n 'common:uploadingFile': 'Téléversement de {name}…',\n 'common:removeFile': 'Supprimer le fichier',\n 'common:uploadFailed': 'Échec du téléversement',\n 'common:dismiss': 'Fermer',\n 'common:openCalendar': 'Ouvrir le calendrier',\n 'common:time': 'Heure',\n 'common:downloadFailed': 'Échec du téléchargement',\n 'richtext:bold': 'Gras',\n 'richtext:italic': 'Italique',\n 'richtext:strikethrough': 'Barré',\n 'richtext:inlineCode': 'Code en ligne',\n 'richtext:heading': 'Titre {level}',\n 'richtext:bulletList': 'Liste à puces',\n 'richtext:numberedList': 'Liste numérotée',\n 'richtext:blockquote': 'Citation',\n 'richtext:horizontalRule': 'Ligne horizontale',\n 'richtext:insertLink': 'Insérer un lien',\n 'richtext:undo': 'Annuler',\n 'richtext:redo': 'Refaire',\n 'richtext:source': 'Source ({format})',\n 'richtext:splitView': 'Vue partagée',\n 'richtext:visualEditor': 'Éditeur visuel',\n 'richtext:fullscreen': 'Plein écran',\n 'richtext:exitFullscreen': 'Quitter le plein écran',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Enregistrement…',\n 'common:done': 'Terminé',\n 'settings:menuItem': 'Paramètres',\n 'settings:noSectionsConfigured': 'Aucune section de paramètres n’est disponible pour ce déploiement.',\n 'settings:apiKeys.title': 'Clés API',\n 'settings:apiKeys.description': 'Jetons d\\'accès programmatique à l\\'API d\\'administration. Chaque clé porte un ensemble de permissions qui limite les ressources et actions qu\\'elle peut invoquer.',\n 'settings:apiKeys.actions.create': 'Nouvelle clé',\n 'settings:apiKeys.actions.edit': 'Modifier',\n 'settings:apiKeys.actions.revoke': 'Révoquer',\n 'settings:apiKeys.empty.title': 'Aucune clé API',\n 'settings:apiKeys.empty.description': 'Créez votre première clé pour accorder un accès programmatique.',\n 'settings:apiKeys.columns.name': 'Nom',\n 'settings:apiKeys.columns.start': 'Préfixe',\n 'settings:apiKeys.columns.permissions': 'Permissions',\n 'settings:apiKeys.columns.expiresAt': 'Expire',\n 'settings:apiKeys.columns.enabled': 'Activée',\n 'settings:apiKeys.columns.actions': 'Actions',\n 'settings:apiKeys.lastUsed': 'Dernière utilisation {date}',\n 'settings:apiKeys.expiresNever': 'Jamais',\n 'settings:apiKeys.permissions.resource': 'Ressource',\n 'settings:apiKeys.permissions.actions': 'Actions',\n 'settings:apiKeys.permissions.selectAll': 'Tout sélectionner',\n 'settings:apiKeys.permissions.clearAll': 'Tout effacer',\n 'settings:apiKeys.permissions.none': 'Aucune permission',\n 'settings:apiKeys.permissions.summary': '{resources} ressources · {actions} actions',\n 'settings:apiKeys.permissions.noResources': 'Aucune ressource enregistrée.',\n 'settings:apiKeys.permissions.selectAllResources': 'Sélectionner toutes les ressources et actions',\n 'settings:apiKeys.permissions.clearAllResources': 'Effacer toutes les ressources et actions',\n 'settings:apiKeys.editor.titleCreate': 'Nouvelle clé API',\n 'settings:apiKeys.editor.titleEdit': 'Modifier la clé API',\n 'settings:apiKeys.editor.description': 'Choisissez un nom explicite et n\\'accordez que les ressources et actions dont cette clé a réellement besoin.',\n 'settings:apiKeys.editor.name': 'Nom',\n 'settings:apiKeys.editor.namePlaceholder': 'ex. bot de déploiement CI',\n 'settings:apiKeys.editor.expiresInDays': 'Expire dans (jours)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'jamais',\n 'settings:apiKeys.editor.expiresHint': 'Laissez vide pour ne jamais expirer. Maximum 3650 jours.',\n 'settings:apiKeys.editor.permissions': 'Permissions',\n 'settings:apiKeys.editor.selectedActions': '{count} sélectionnées',\n 'settings:apiKeys.created.title': 'Clé API créée',\n 'settings:apiKeys.created.description': 'Copiez la clé maintenant — elle ne sera plus affichée.',\n 'settings:apiKeys.created.warning': 'C\\'est la seule fois où vous verrez la clé complète. Conservez-la en lieu sûr.',\n 'settings:apiKeys.created.reveal': 'Afficher la clé',\n 'settings:apiKeys.created.hide': 'Masquer la clé',\n 'settings:apiKeys.created.copy': 'Copier',\n 'settings:apiKeys.created.copied': 'Copiée',\n 'settings:apiKeys.notice.revoked': 'Clé API révoquée',\n 'settings:apiKeys.notice.updated': 'Clé API mise à jour',\n 'settings:apiKeys.notice.copied': 'Copiée dans le presse-papiers',\n 'settings:apiKeys.notice.copyFailed': 'Impossible de copier dans le presse-papiers',\n 'settings:apiKeys.confirmRevoke.title': 'Révoquer la clé API',\n 'settings:apiKeys.confirmRevoke.description': 'Révoquer « {name} » ? Tout service utilisant cette clé cessera immédiatement de fonctionner.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'Tableau de bord',\n 'chart:addChart': 'Ajouter un graphique',\n 'chart:newChart': 'Nouveau graphique',\n 'chart:editChart': 'Modifier le graphique',\n 'chart:deleteChart': 'Supprimer le graphique',\n 'chart:noCharts': 'Aucun graphique',\n 'chart:noChartsHint': 'Ajoutez un graphique pour commencer à surveiller vos données.',\n 'chart:addGroup': 'Ajouter un groupe',\n 'chart:newGroup': 'Nouveau groupe',\n 'chart:editGroup': 'Modifier le groupe',\n 'chart:deleteGroup': 'Supprimer le groupe',\n 'chart:saveGroup': 'Enregistrer le groupe',\n 'chart:groupName': 'Nom du groupe',\n 'chart:groupNamePlaceholder': 'p. ex. Indicateurs commerciaux',\n 'chart:groupNameRequired': 'Le nom du groupe est requis',\n 'chart:groupOrder': 'Ordre du groupe',\n 'chart:order': 'Ordre',\n 'chart:orderHint': 'Les plus petites valeurs apparaissent en premier.',\n 'chart:moveToGroup': 'Déplacer vers le groupe',\n 'chart:moveChart': 'Déplacer le graphique',\n 'chart:moveGroup': 'Groupe',\n 'chart:moveNoGroups': \"Aucun groupe pour l'instant.\",\n 'chart:moveNoGroupsHint': \"Créez d'abord un groupe pour organiser vos graphiques.\",\n 'chart:deleteChartConfirm': 'Supprimer ce graphique ?',\n 'chart:deleteChartConfirmHint': 'Cette action est irréversible.',\n 'chart:deleteGroupConfirm': 'Supprimer ce groupe ?',\n 'chart:deleteGroupConfirmHint': 'Le groupe et ses {count} graphique(s) seront définitivement supprimés.',\n 'chart:title': 'Titre',\n 'chart:titlePlaceholder': 'ex. Nouveaux utilisateurs par jour',\n 'chart:untitled': 'Sans titre',\n 'chart:chartType': 'Type de graphique',\n 'chart:resource': 'Ressource',\n 'chart:groupBy': 'Regrouper par',\n 'chart:step': 'Pas',\n 'chart:metric': 'Métrique',\n 'chart:aggregateField': 'Champ d\\'agrégation',\n 'chart:selectField': 'Sélectionner un champ…',\n 'chart:saveChart': 'Enregistrer le graphique',\n 'chart:typeLine': 'Ligne',\n 'chart:typeArea': 'Aire',\n 'chart:typeBar': 'Barres',\n 'chart:typePie': 'Camembert',\n 'chart:stepDay': 'Jour',\n 'chart:stepWeek': 'Semaine',\n 'chart:stepMonth': 'Mois',\n 'chart:stepYear': 'Année',\n 'chart:metricCount': 'Nombre',\n 'chart:metricSum': 'Somme',\n 'chart:metricAvg': 'Moyenne',\n 'chart:noData': 'Aucune donnée pour la période sélectionnée',\n 'chart:loadError': 'Impossible de charger les données du graphique',\n 'chart:value': 'Valeur',\n 'dashboard:vis': 'Visualisation',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Ligne',\n 'dashboard:visArea': 'Aire',\n 'dashboard:visBar': 'Barres',\n 'dashboard:visPie': 'Camembert',\n 'dashboard:metricCount': 'Nombre',\n 'dashboard:metricSum': 'Somme',\n 'dashboard:metricAvg': 'Moyenne',\n 'dashboard:metricMin': 'Min',\n 'dashboard:metricMax': 'Max',\n 'dashboard:builder.range': 'Période',\n 'dashboard:builder.filters': 'Filtres',\n 'dashboard:builder.filtersHint': \"Restreindre le jeu de données avant l'agrégation. Cochez un filtre pour l'afficher au-dessus du graphique.\",\n 'dashboard:builder.quickFilterHint': 'Afficher ce filtre au-dessus du graphique sur le tableau de bord.',\n 'dashboard:builder.quickFilterToggle': 'Exposer {field} comme filtre rapide',\n 'dashboard:range.7d': '7j',\n 'dashboard:range.30d': '30j',\n 'dashboard:range.90d': '90j',\n 'dashboard:range.1y': '1an',\n 'dashboard:range.all': 'Tout',\n 'dashboard:range.custom': 'Personnalisé',\n 'dashboard:widget.previousPeriod': 'vs. période précédente',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Réduire à la moitié',\n 'dashboard:widget.expand': 'Étendre sur toute la ligne',\n 'dashboard:widget.toggleSql': 'Afficher le SQL',\n 'dashboard:widget.unsupported': 'Les graphiques ne sont pas encore pris en charge pour votre base de données.',\n 'dashboard:widget.truncatedWarning': 'Affichage de données partielles — trop de lignes pour agréger toute la plage.',\n 'dashboard:widget.showAll': 'Tout afficher',\n 'dashboard:widget.hideAll': 'Tout masquer',\n 'dashboard:seriesTotal': 'Total',\n 'dashboard:seriesOther': 'Autres',\n 'dashboard:seriesNull': 'Vide',\n 'dashboard:builder.dateField': 'Champ de date',\n 'dashboard:builder.dateFieldHint': \"L'axe X est groupé par cette colonne de date.\",\n 'dashboard:builder.secondaryGroupBy': 'Répartition',\n 'dashboard:builder.noBreakdown': 'Série unique',\n 'dashboard:builder.topN': 'Max. séries',\n 'dashboard:builder.width': 'Largeur',\n 'dashboard:width.half': 'Moitié',\n 'dashboard:width.full': 'Pleine largeur',\n 'history:revisions': 'Révisions',\n 'history:noRevisions': 'Aucune révision pour le moment',\n 'history:loadError': 'Impossible de charger l’historique des modifications',\n 'history:revert': 'Restaurer',\n 'history:confirmRevert': 'Restaurer cette révision ?',\n 'history:revertSuccess': 'Révision restaurée',\n 'history:revertFailed': 'Impossible de restaurer la révision',\n 'history:unknownUser': 'Utilisateur inconnu',\n 'history:changes': 'modifications',\n 'history:compareTo': 'Comparer à',\n 'history:storedDiff': 'Diff des changements',\n 'history:op.create': 'Créé',\n 'history:op.update': 'Mis à jour',\n 'history:op.delete': 'Supprimé',\n 'diff:added': 'Ajouté',\n 'diff:changed': 'Modifié',\n 'diff:removed': 'Supprimé',\n 'diff:before': 'Avant',\n 'diff:after': 'Après',\n 'diff:noChanges': 'Aucune modification de champ enregistrée',\n 'audit:title': 'Activité',\n 'audit:resource': 'Ressource',\n 'audit:action': 'Action',\n 'audit:recordId': 'ID enregistrement',\n 'audit:userId': 'ID utilisateur',\n 'audit:allResources': 'Toutes les ressources',\n 'audit:allActions': 'Toutes les actions',\n 'audit:noEvents': 'Aucune activité pour le moment',\n 'audit:records': 'enregistrements',\n 'audit:loadError': 'Impossible de charger l’activité',\n 'audit:by': 'par {user}',\n 'audit:viewRecord': 'Voir l’enregistrement',\n 'audit:viewChanges': 'Voir les modifications',\n 'audit:hideChanges': 'Masquer les modifications',\n 'audit:noDiff': 'Détails des modifications indisponibles',\n 'audit:loadDiffError': 'Échec du chargement des modifications',\n 'audit:action.new': 'Enregistrement créé',\n 'audit:action.edit': 'Enregistrement mis à jour',\n 'audit:action.delete': 'Enregistrement supprimé',\n 'audit:action.bulkDelete': 'Enregistrements supprimés',\n 'audit:action.login': 'Connexion',\n 'audit:action.apiKeyCreate': 'Clé API créée',\n 'audit:action.apiKeyUpdate': 'Clé API mise à jour',\n 'audit:action.apiKeyDelete': 'Clé API supprimée',\n 'audit:virtualResource.auth': 'Authentification',\n 'audit:virtualResource.apiKeys': 'Clés API',\n 'audit:prevPage': 'Précédent',\n 'audit:nextPage': 'Suivant',\n 'audit:dateRangePlaceholder': 'Sélectionner une plage de dates',\n 'keyValue:noMatches': 'Aucune correspondance — appuyez sur Entrée pour conserver « {value} ».',\n 'aiAssistant:queue.cancel': 'Retirer de la file',\n 'aiAssistant:title': 'Assistant IA',\n 'aiAssistant:fab.label': 'Ouvrir l’assistant IA',\n 'aiAssistant:fab.short': 'IA',\n 'aiAssistant:description': 'Posez des questions sur les enregistrements, relations, rapports et tendances de données.',\n 'aiAssistant:notConfigured.title': 'L’assistant n’est pas configuré',\n 'aiAssistant:notConfigured.description': 'Ajoutez la clé API OpenRouter dans les paramètres pour activer l’assistant IA en lecture seule.',\n 'aiAssistant:notConfigured.openSettings': 'Ouvrir les paramètres',\n 'aiAssistant:tryAsking': 'Essayez de demander :',\n 'aiAssistant:tryAsking.example1': 'Quels clients ont le plus de publications ?',\n 'aiAssistant:tryAsking.example2': 'Affiche les enregistrements récemment créés d’une ressource.',\n 'aiAssistant:tryAsking.example3': 'Explique les relations entre des enregistrements précis.',\n 'aiAssistant:thinking': 'Réflexion',\n 'aiAssistant:thinkingProgress': 'Réflexion ({progress}%)',\n 'aiAssistant:input.placeholder': 'Posez une question sur vos données…',\n 'aiAssistant:input.hint': 'Entrée pour envoyer · Maj+Entrée pour une nouvelle ligne',\n 'aiAssistant:send': 'Envoyer le message',\n 'aiAssistant:newChat': 'Nouveau chat',\n 'aiAssistant:history': 'Historique des chats',\n 'aiAssistant:history.empty': 'Aucun chat précédent',\n 'aiAssistant:noText': 'Voici les enregistrements liés trouvés00a0:',\n 'aiAssistant:fallback.noToolResult': 'La requête a été exécutée, mais le modèle n’a pas renvoyé de réponse textuelle. Précisez la question ou activez les journaux de débogage pour inspecter le résultat de l’outil.',\n 'aiAssistant:fallback.noRows': 'Aucun enregistrement trouvé pour cette requête.',\n 'aiAssistant:fallback.rowsFound': 'Lignes trouvées00a0: {count}.',\n 'aiAssistant:taskFailed': 'Échec de la tâche de l’assistant IA',\n 'aiAssistant:settings.title': 'Assistant IA',\n 'aiAssistant:settings.description': 'Configurez le widget de chat flottant, le modèle et le comportement côté serveur.',\n 'aiAssistant:settings.enabled': 'Activé',\n 'aiAssistant:settings.disabled': 'Désactivé',\n 'aiAssistant:settings.configured': 'Configuré',\n 'aiAssistant:settings.apiKeyRequired': 'Clé API requise',\n 'aiAssistant:settings.readOnly': 'Lecture seule',\n 'aiAssistant:settings.provider': 'Fournisseur : {provider}',\n 'aiAssistant:settings.enableLabel': 'Activer l’assistant',\n 'aiAssistant:settings.enableHint': 'Contrôle la visibilité du widget flottant et du point de terminaison de chat.',\n 'aiAssistant:settings.modelLabel': 'Modèle OpenRouter',\n 'aiAssistant:settings.apiKeyLabel': 'Clé API OpenRouter',\n 'aiAssistant:settings.apiKeyHint': 'Laissez vide pour conserver la clé enregistrée côté serveur.',\n 'aiAssistant:settings.systemPromptLabel': 'Surcharge du prompt système',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Instructions optionnelles spécifiques au projet',\n 'aiAssistant:settings.accessTitle': 'Modèle d’accès',\n 'aiAssistant:settings.accessDescription': 'L’assistant actuel est limité à l’inspection en lecture seule via les actions de ressource.',\n 'aiAssistant:settings.futureToolsReady': 'Prêt pour de futurs outils',\n 'aiAssistant:settings.save': 'Enregistrer les paramètres',\n 'aiAssistant:settings.saving': 'Enregistrement…',\n 'aiAssistant:settings.saved': 'Paramètres de l’assistant IA enregistrés',\n 'aiAssistant:settings.empty': 'Aucun paramètre disponible.',\n 'filter:op.co': 'Contient',\n 'filter:op.nco': 'Ne contient pas',\n 'filter:op.sw': 'Commence par',\n 'filter:op.ew': 'Se termine par',\n 'filter:op.eq': 'Est égal à',\n 'filter:op.neq': 'N\\'est pas égal à',\n 'filter:op.empty': 'Est vide',\n 'filter:op.nempty': 'N\\'est pas vide',\n 'filter:op.in': 'Est l\\'un de',\n 'filter:op.gt': 'Supérieur à',\n 'filter:op.lt': 'Inférieur à',\n 'filter:op.between': 'Entre',\n 'filter:searchValues': 'Rechercher dans la liste…',\n 'filter:selectAll': 'Tout sélectionner',\n 'filter:noValues': 'Aucune valeur trouvée',\n 'common:newRecord': 'Nouveau {name}',\n 'common:editRecord': 'Modifier {name} #{id}',\n 'common:themeLight': 'Clair',\n 'common:themeDark': 'Sombre',\n 'common:themeSystem': 'Système',\n 'common:ok': 'OK',\n 'common:select': 'Sélectionner…',\n 'common:removeItem': 'Supprimer {title}',\n 'common:nSelectedAddMore': '{count} sélectionné(s) — en ajouter',\n 'common:pickRecords': 'Choisir des enregistrements',\n 'common:managePickRecords': 'Gérer la sélection ({count})',\n 'common:pickRecordsFrom': 'Choisir dans {name}',\n 'common:draftRestored': 'Brouillon non enregistré restauré',\n 'common:undoDraftRestore': 'Annuler',\n 'aiFill:button': 'Remplir avec l’IA',\n 'aiFill:dialogTitle': 'Remplir le formulaire depuis une photo',\n 'aiFill:dialogDescription': 'Téléversez une image — l’IA extraira les valeurs et remplira le formulaire.',\n 'aiFill:fillButton': 'Reconnaître',\n 'aiFill:processing': 'Reconnaissance de l’image…',\n 'aiFill:success': '{count} champ(s) rempli(s)',\n 'aiFill:errorNoFields': 'Cette ressource n’a aucun champ remplissable par l’IA.',\n 'aiFill:errorGeneric': 'Échec du remplissage par l’IA : {message}',\n 'aiFill:noValues': 'L’IA n’a pu extraire aucune valeur de cette image.',\n 'aiFill:applied': \"L'IA a rempli {count} champ(s). Annulable ci-dessous.\",\n 'wizard:stepOf': 'Étape {current} sur {total}',\n 'wizard:products.step1': 'Informations de base',\n 'wizard:products.step2': 'Tarification',\n 'wizard:products.step3': 'Médias et tags',\n 'common:invalidValue': 'Valeur invalide',\n 'common:collapseSidebar': 'Réduire la barre latérale',\n 'common:expandSidebar': 'Développer la barre latérale',\n 'common:toggleSidebar': 'Basculer la barre latérale',\n 'common:sidebarTitle': 'Barre latérale',\n 'common:sidebarNavigation': 'Menu de navigation',\n },\n}\n\n","import type { LocaleBundle } from '../types.js'\n\nexport const es: LocaleBundle = {\n code: 'es',\n name: 'Español',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Inicio',\n 'common:search': 'Buscar',\n 'common:loading': 'Cargando…',\n 'common:save': 'Guardar',\n 'common:cancel': 'Cancelar',\n 'common:delete': 'Eliminar',\n 'common:create': 'Crear',\n 'common:edit': 'Editar',\n 'common:show': 'Ver',\n 'common:back': 'Atrás',\n 'common:noRecords': 'No hay registros.',\n 'common:noRecordsHint': 'Comience creando un nuevo {resource}.',\n 'common:noMatchingRecords': 'Ningún registro coincide con tus filtros.',\n 'common:clearFilters': 'Borrar filtros',\n 'common:confirmDelete': '¿Eliminar este registro?',\n 'common:perPage': 'Por página',\n 'common:page': 'Página',\n 'common:of': 'de',\n 'common:total': 'Total',\n 'auth:login': 'Iniciar sesión',\n 'auth:logout': 'Cerrar sesión',\n 'auth:email': 'Correo',\n 'auth:password': 'Contraseña',\n 'auth:loginFailed': 'Credenciales no válidas.',\n 'errors:notFound': 'No encontrado.',\n 'errors:forbidden': 'No tienes acceso a este recurso.',\n 'errors:server': 'Algo salió mal. Inténtalo de nuevo.',\n 'common:resources': 'Recursos',\n 'common:actions': 'Acciones',\n 'common:new': 'Nuevo',\n 'common:rowsPerPage': 'Filas por página',\n 'common:filter': 'Filtrar {label}…',\n 'validation:required': '{label} es obligatorio',\n 'validation:invalidNumber': '{label} debe ser un número válido',\n 'validation:invalidInteger': '{label} debe ser un entero',\n 'validation:invalidEmail': '{label} debe ser un correo válido',\n 'validation:invalidUrl': '{label} debe ser una URL válida',\n 'validation:invalidDate': '{label} debe ser una fecha válida',\n 'validation:invalidUuid': '{label} debe ser un UUID válido',\n 'validation:tooShort': '{label} debe tener al menos {min} caracteres',\n 'validation:tooLong': '{label} debe tener como máximo {max} caracteres',\n 'validation:notInList': '{label} tiene un valor no válido',\n 'validation:emptySelection': 'Selecciona al menos un valor para {label}',\n 'toast:created': 'Creado correctamente',\n 'toast:saved': 'Guardado correctamente',\n 'toast:deleted': 'Eliminado correctamente',\n 'toast:createFailed': 'Error al crear',\n 'toast:saveFailed': 'Error al guardar',\n 'toast:deleteFailed': 'Error al eliminar',\n 'toast:loadFailed': 'Error al cargar',\n 'toast:validationFailed': 'Corrige los errores e inténtalo de nuevo',\n 'common:close': 'Cerrar',\n 'common:export': 'Exportar',\n 'export:title': 'Exportar registros',\n 'export:description': 'Descargar todos los registros coincidentes de {resource} en un único archivo.',\n 'export:csvHint': 'Valores separados por comas',\n 'export:jsonHint': 'Array JSON estructurado',\n 'export:downloading': 'Preparando descarga…',\n 'export:progress': 'Cargados {loaded} de {total}…',\n 'export:exported': '{count} registros exportados',\n 'export:exportFailed': 'Error al exportar registros',\n 'common:apply': 'Aplicar',\n 'common:clear': 'Limpiar',\n 'common:filters': 'Filtros',\n 'common:columns': 'Columnas',\n 'common:toggleColumns': 'Mostrar columnas',\n 'common:openMenu': 'Abrir menú',\n 'common:refresh': 'Actualizar',\n 'common:copy': 'Copiar',\n 'common:copied': '¡Copiado!',\n 'common:applyFilters': 'Aplicar filtros',\n 'common:clearAll': 'Limpiar todo',\n 'common:any': 'Cualquiera',\n 'common:yes': 'Sí',\n 'common:no': 'No',\n 'common:filterPlaceholder': 'Filtrar…',\n 'common:loadFailed': 'Error al cargar: {error}',\n 'common:theme': 'Tema',\n 'common:language': 'Idioma',\n 'common:toggleTheme': 'Cambiar tema',\n 'common:clearSelection': 'Borrar selección',\n 'common:searchPlaceholder': 'Buscar…',\n 'globalSearch:title': 'Búsqueda global',\n 'globalSearch:description': 'Buscar en todos los recursos y registros.',\n 'globalSearch:trigger': 'Buscar…',\n 'globalSearch:placeholder': 'Buscar en todos los recursos…',\n 'globalSearch:hint': 'Empieza a escribir para buscar en todos los recursos.',\n 'globalSearch:noResults': 'No se encontraron registros coincidentes.',\n 'globalSearch:error': 'Error en la búsqueda. Inténtalo de nuevo.',\n 'globalSearch:hotkey': 'Abrir búsqueda global',\n 'globalSearch:matchedIn': 'en {field}',\n 'globalSearch:recent': 'Búsquedas recientes',\n 'globalSearch:clearRecent': 'Borrar',\n 'globalSearch:showAllIn': 'Ver todo en {resource}',\n 'common:pageOf': 'Página {page} de {total}',\n 'common:firstPage': 'Primera página',\n 'common:previousPage': 'Página anterior',\n 'common:nextPage': 'Página siguiente',\n 'common:lastPage': 'Última página',\n 'common:recordsCount': '{count} registros',\n 'common:selectedCount': '{count} seleccionados',\n 'common:selectRow': 'Seleccionar fila',\n 'common:selectAll': 'Seleccionar todo',\n 'common:deleteSelected': 'Eliminar seleccionados',\n 'common:bulkDeleteConfirm': '¿Eliminar {count} registros seleccionados?',\n 'toast:bulkDeleted': '{count} registros eliminados',\n 'toast:bulkDeleteFailed': 'Error al eliminar los registros',\n 'common:from': 'Desde',\n 'common:to': 'Hasta',\n 'common:sortBy': 'Ordenar por',\n 'common:next': 'Siguiente',\n 'common:previous': 'Anterior',\n 'common:relatedRecords': 'Registros relacionados',\n 'common:viewAll': 'Ver todos',\n 'common:noRelatedRecords': 'Sin registros relacionados.',\n 'common:preview': 'Vista previa',\n 'common:download': 'Descargar',\n 'common:openInNewTab': 'Abrir en una pestaña nueva',\n 'common:format': 'Formatear',\n 'common:invalidJson': 'JSON inválido',\n 'common:showPassword': 'Mostrar contraseña',\n 'common:hidePassword': 'Ocultar contraseña',\n 'common:shortcutsHelp': 'Atajos de teclado',\n 'common:shortcutsEmpty': 'No hay atajos disponibles en esta pantalla.',\n 'auth:title': 'Iniciar sesión',\n 'auth:subtitle': 'Ingrese su correo y contraseña para iniciar sesión',\n 'auth:tagline': 'El panel de administración moderno para cualquier stack.',\n 'auth:orContinueWith': 'O continuar con',\n 'auth:continueWith': 'Continuar con {provider}',\n 'common:chooseFile': 'Elegir archivo',\n 'common:chooseFiles': 'Elegir archivos',\n 'common:dragAndDrop': 'Arrastra y suelta o',\n 'common:chooseAFile': 'elegir un archivo',\n 'common:addMoreFiles': 'agregar más archivos',\n 'common:uploading': 'Subiendo…',\n 'common:uploadingFile': 'Subiendo {name}…',\n 'common:removeFile': 'Quitar archivo',\n 'common:uploadFailed': 'Error al subir',\n 'common:dismiss': 'Cerrar',\n 'common:openCalendar': 'Abrir calendario',\n 'common:time': 'Hora',\n 'common:downloadFailed': 'Error al descargar',\n 'richtext:bold': 'Negrita',\n 'richtext:italic': 'Cursiva',\n 'richtext:strikethrough': 'Tachado',\n 'richtext:inlineCode': 'Código en línea',\n 'richtext:heading': 'Encabezado {level}',\n 'richtext:bulletList': 'Lista con viñetas',\n 'richtext:numberedList': 'Lista numerada',\n 'richtext:blockquote': 'Cita en bloque',\n 'richtext:horizontalRule': 'Línea horizontal',\n 'richtext:insertLink': 'Insertar enlace',\n 'richtext:undo': 'Deshacer',\n 'richtext:redo': 'Rehacer',\n 'richtext:source': 'Fuente ({format})',\n 'richtext:splitView': 'Vista dividida',\n 'richtext:visualEditor': 'Editor visual',\n 'richtext:fullscreen': 'Pantalla completa',\n 'richtext:exitFullscreen': 'Salir de pantalla completa',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Guardando…',\n 'common:done': 'Listo',\n 'settings:menuItem': 'Ajustes',\n 'settings:noSectionsConfigured': 'No hay secciones de ajustes disponibles en esta instalación.',\n 'settings:apiKeys.title': 'Claves de API',\n 'settings:apiKeys.description': 'Tokens de acceso programático a la API de administración. Cada clave incluye un conjunto de permisos que limita los recursos y acciones que puede invocar.',\n 'settings:apiKeys.actions.create': 'Nueva clave',\n 'settings:apiKeys.actions.edit': 'Editar',\n 'settings:apiKeys.actions.revoke': 'Revocar',\n 'settings:apiKeys.empty.title': 'Aún no hay claves',\n 'settings:apiKeys.empty.description': 'Crea tu primera clave para conceder acceso programático.',\n 'settings:apiKeys.columns.name': 'Nombre',\n 'settings:apiKeys.columns.start': 'Prefijo',\n 'settings:apiKeys.columns.permissions': 'Permisos',\n 'settings:apiKeys.columns.expiresAt': 'Expira',\n 'settings:apiKeys.columns.enabled': 'Activa',\n 'settings:apiKeys.columns.actions': 'Acciones',\n 'settings:apiKeys.lastUsed': 'Último uso {date}',\n 'settings:apiKeys.expiresNever': 'Nunca',\n 'settings:apiKeys.permissions.resource': 'Recurso',\n 'settings:apiKeys.permissions.actions': 'Acciones',\n 'settings:apiKeys.permissions.selectAll': 'Seleccionar todo',\n 'settings:apiKeys.permissions.clearAll': 'Limpiar todo',\n 'settings:apiKeys.permissions.none': 'Sin permisos',\n 'settings:apiKeys.permissions.summary': '{resources} recursos · {actions} acciones',\n 'settings:apiKeys.permissions.noResources': 'No hay recursos registrados.',\n 'settings:apiKeys.permissions.selectAllResources': 'Seleccionar todos los recursos y acciones',\n 'settings:apiKeys.permissions.clearAllResources': 'Borrar todos los recursos y acciones',\n 'settings:apiKeys.editor.titleCreate': 'Nueva clave de API',\n 'settings:apiKeys.editor.titleEdit': 'Editar clave de API',\n 'settings:apiKeys.editor.description': 'Elige un nombre descriptivo y concede solo los recursos y acciones que esta clave necesita.',\n 'settings:apiKeys.editor.name': 'Nombre',\n 'settings:apiKeys.editor.namePlaceholder': 'p. ej. bot de despliegue CI',\n 'settings:apiKeys.editor.expiresInDays': 'Expira en (días)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'nunca',\n 'settings:apiKeys.editor.expiresHint': 'Déjalo en blanco para que no caduque. Máximo 3650 días.',\n 'settings:apiKeys.editor.permissions': 'Permisos',\n 'settings:apiKeys.editor.selectedActions': '{count} seleccionadas',\n 'settings:apiKeys.created.title': 'Clave de API creada',\n 'settings:apiKeys.created.description': 'Copia la clave ahora — no se mostrará de nuevo.',\n 'settings:apiKeys.created.warning': 'Esta es la única vez que verás la clave completa. Guárdala en un lugar seguro.',\n 'settings:apiKeys.created.reveal': 'Mostrar clave',\n 'settings:apiKeys.created.hide': 'Ocultar clave',\n 'settings:apiKeys.created.copy': 'Copiar',\n 'settings:apiKeys.created.copied': 'Copiada',\n 'settings:apiKeys.notice.revoked': 'Clave de API revocada',\n 'settings:apiKeys.notice.updated': 'Clave de API actualizada',\n 'settings:apiKeys.notice.copied': 'Copiada al portapapeles',\n 'settings:apiKeys.notice.copyFailed': 'No se pudo copiar al portapapeles',\n 'settings:apiKeys.confirmRevoke.title': 'Revocar clave de API',\n 'settings:apiKeys.confirmRevoke.description': '¿Revocar «{name}»? Cualquier servicio que use esta clave dejará de funcionar inmediatamente.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'Panel de control',\n 'chart:addChart': 'Añadir gráfico',\n 'chart:newChart': 'Nuevo gráfico',\n 'chart:editChart': 'Editar gráfico',\n 'chart:deleteChart': 'Eliminar gráfico',\n 'chart:noCharts': 'Sin gráficos todavía',\n 'chart:noChartsHint': 'Añada un gráfico para empezar a monitorear sus datos.',\n 'chart:addGroup': 'Añadir grupo',\n 'chart:newGroup': 'Nuevo grupo',\n 'chart:editGroup': 'Editar grupo',\n 'chart:deleteGroup': 'Eliminar grupo',\n 'chart:saveGroup': 'Guardar grupo',\n 'chart:groupName': 'Nombre del grupo',\n 'chart:groupNamePlaceholder': 'p. ej. Métricas de ventas',\n 'chart:groupNameRequired': 'El nombre del grupo es obligatorio',\n 'chart:groupOrder': 'Orden del grupo',\n 'chart:order': 'Orden',\n 'chart:orderHint': 'Los valores menores aparecen primero.',\n 'chart:moveToGroup': 'Mover al grupo',\n 'chart:moveChart': 'Mover gráfico',\n 'chart:moveGroup': 'Grupo',\n 'chart:moveNoGroups': 'Aún no hay grupos.',\n 'chart:moveNoGroupsHint': 'Crea un grupo primero para organizar tus gráficos.',\n 'chart:deleteChartConfirm': '¿Eliminar este gráfico?',\n 'chart:deleteChartConfirmHint': 'Esta acción no se puede deshacer.',\n 'chart:deleteGroupConfirm': '¿Eliminar este grupo?',\n 'chart:deleteGroupConfirmHint': 'Esto eliminará permanentemente el grupo y los {count} gráfico(s) que contiene.',\n 'chart:title': 'Título',\n 'chart:titlePlaceholder': 'p. ej. Nuevos usuarios por día',\n 'chart:untitled': 'Sin título',\n 'chart:chartType': 'Tipo de gráfico',\n 'chart:resource': 'Recurso',\n 'chart:groupBy': 'Agrupar por',\n 'chart:step': 'Paso',\n 'chart:metric': 'Métrica',\n 'chart:aggregateField': 'Campo de agregación',\n 'chart:selectField': 'Seleccionar campo…',\n 'chart:saveChart': 'Guardar gráfico',\n 'chart:typeLine': 'Líneas',\n 'chart:typeArea': 'Área',\n 'chart:typeBar': 'Barras',\n 'chart:typePie': 'Circular',\n 'chart:stepDay': 'Día',\n 'chart:stepWeek': 'Semana',\n 'chart:stepMonth': 'Mes',\n 'chart:stepYear': 'Año',\n 'chart:metricCount': 'Recuento',\n 'chart:metricSum': 'Suma',\n 'chart:metricAvg': 'Promedio',\n 'chart:noData': 'Sin datos para el período seleccionado',\n 'chart:loadError': 'Error al cargar los datos del gráfico',\n 'chart:value': 'Valor',\n 'dashboard:vis': 'Visualización',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Líneas',\n 'dashboard:visArea': 'Área',\n 'dashboard:visBar': 'Barras',\n 'dashboard:visPie': 'Circular',\n 'dashboard:metricCount': 'Cantidad',\n 'dashboard:metricSum': 'Suma',\n 'dashboard:metricAvg': 'Promedio',\n 'dashboard:metricMin': 'Mínimo',\n 'dashboard:metricMax': 'Máximo',\n 'dashboard:builder.range': 'Rango temporal',\n 'dashboard:builder.filters': 'Filtros',\n 'dashboard:builder.filtersHint': 'Acotar el conjunto antes de agregar. Marca un filtro para exponerlo encima del gráfico.',\n 'dashboard:builder.quickFilterHint': 'Mostrar este filtro encima del gráfico en el panel.',\n 'dashboard:builder.quickFilterToggle': 'Exponer {field} como filtro rápido',\n 'dashboard:range.7d': '7d',\n 'dashboard:range.30d': '30d',\n 'dashboard:range.90d': '90d',\n 'dashboard:range.1y': '1a',\n 'dashboard:range.all': 'Todo',\n 'dashboard:range.custom': 'Personalizado',\n 'dashboard:widget.previousPeriod': 'vs. período anterior',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Reducir a la mitad',\n 'dashboard:widget.expand': 'Expandir a fila completa',\n 'dashboard:widget.toggleSql': 'Mostrar SQL',\n 'dashboard:widget.unsupported': 'Los gráficos aún no son compatibles con tu base de datos.',\n 'dashboard:widget.truncatedWarning': 'Mostrando datos parciales: demasiadas filas para agregar todo el rango.',\n 'dashboard:widget.showAll': 'Mostrar todo',\n 'dashboard:widget.hideAll': 'Ocultar todo',\n 'dashboard:seriesTotal': 'Total',\n 'dashboard:seriesOther': 'Otros',\n 'dashboard:seriesNull': 'Vacío',\n 'dashboard:builder.dateField': 'Campo de fecha',\n 'dashboard:builder.dateFieldHint': 'El eje X se agrupa por esta columna de fecha.',\n 'dashboard:builder.secondaryGroupBy': 'Desglose',\n 'dashboard:builder.noBreakdown': 'Serie única',\n 'dashboard:builder.topN': 'Máx. series',\n 'dashboard:builder.width': 'Ancho',\n 'dashboard:width.half': 'Mitad',\n 'dashboard:width.full': 'Completo',\n 'history:revisions': 'Revisiones',\n 'history:noRevisions': 'Aún no hay revisiones',\n 'history:loadError': 'No se pudo cargar el historial de cambios',\n 'history:revert': 'Revertir',\n 'history:confirmRevert': '¿Revertir a esta revisión?',\n 'history:revertSuccess': 'Revisión restaurada',\n 'history:revertFailed': 'No se pudo restaurar la revisión',\n 'history:unknownUser': 'Usuario desconocido',\n 'history:changes': 'cambios',\n 'history:compareTo': 'Comparar con',\n 'history:storedDiff': 'Diff del cambio',\n 'history:op.create': 'Creado',\n 'history:op.update': 'Actualizado',\n 'history:op.delete': 'Eliminado',\n 'diff:added': 'Añadido',\n 'diff:changed': 'Cambiado',\n 'diff:removed': 'Eliminado',\n 'diff:before': 'Antes',\n 'diff:after': 'Después',\n 'diff:noChanges': 'No se registraron cambios de campos',\n 'audit:title': 'Actividad',\n 'audit:resource': 'Recurso',\n 'audit:action': 'Acción',\n 'audit:recordId': 'ID de registro',\n 'audit:userId': 'ID de usuario',\n 'audit:allResources': 'Todos los recursos',\n 'audit:allActions': 'Todas las acciones',\n 'audit:noEvents': 'Aún no hay actividad',\n 'audit:records': 'registros',\n 'audit:loadError': 'No se pudo cargar la actividad',\n 'audit:by': 'por {user}',\n 'audit:viewRecord': 'Ver registro',\n 'audit:viewChanges': 'Ver cambios',\n 'audit:hideChanges': 'Ocultar cambios',\n 'audit:noDiff': 'Detalles de los cambios no disponibles',\n 'audit:loadDiffError': 'No se pudieron cargar los cambios',\n 'audit:action.new': 'Registro creado',\n 'audit:action.edit': 'Registro actualizado',\n 'audit:action.delete': 'Registro eliminado',\n 'audit:action.bulkDelete': 'Registros eliminados',\n 'audit:action.login': 'Sesión iniciada',\n 'audit:action.apiKeyCreate': 'Clave API creada',\n 'audit:action.apiKeyUpdate': 'Clave API actualizada',\n 'audit:action.apiKeyDelete': 'Clave API eliminada',\n 'audit:virtualResource.auth': 'Autenticación',\n 'audit:virtualResource.apiKeys': 'Claves API',\n 'audit:prevPage': 'Anterior',\n 'audit:nextPage': 'Siguiente',\n 'audit:dateRangePlaceholder': 'Seleccionar rango de fechas',\n 'keyValue:noMatches': 'Sin coincidencias — pulsa Enter para conservar \"{value}\".',\n 'aiAssistant:queue.cancel': 'Quitar de la cola',\n 'aiAssistant:title': 'Asistente IA',\n 'aiAssistant:fab.label': 'Abrir asistente IA',\n 'aiAssistant:fab.short': 'IA',\n 'aiAssistant:description': 'Haz preguntas sobre registros, relaciones, informes y tendencias de datos.',\n 'aiAssistant:notConfigured.title': 'El asistente no está configurado',\n 'aiAssistant:notConfigured.description': 'Añade la clave API de OpenRouter en los ajustes para activar el asistente IA de solo lectura.',\n 'aiAssistant:notConfigured.openSettings': 'Abrir ajustes',\n 'aiAssistant:tryAsking': 'Pruebe a preguntar:',\n 'aiAssistant:tryAsking.example1': '¿Qué clientes tienen más publicaciones?',\n 'aiAssistant:tryAsking.example2': 'Muestra registros creados recientemente para un recurso.',\n 'aiAssistant:tryAsking.example3': 'Explica relaciones entre registros concretos.',\n 'aiAssistant:thinking': 'Pensando',\n 'aiAssistant:thinkingProgress': 'Pensando ({progress}%)',\n 'aiAssistant:input.placeholder': 'Pregunta sobre tus datos…',\n 'aiAssistant:input.hint': 'Enter para enviar · Shift+Enter para una nueva línea',\n 'aiAssistant:send': 'Enviar mensaje',\n 'aiAssistant:newChat': 'Nuevo chat',\n 'aiAssistant:history': 'Historial de chats',\n 'aiAssistant:history.empty': 'No hay chats anteriores',\n 'aiAssistant:noText': 'Aquí están los registros relacionados que encontré:',\n 'aiAssistant:fallback.noToolResult': 'Ejecuté la solicitud, pero el modelo no devolvió una respuesta de texto. Prueba a precisar la pregunta o activa los logs de depuración para revisar el resultado de la herramienta.',\n 'aiAssistant:fallback.noRows': 'No se encontraron registros para esta solicitud.',\n 'aiAssistant:fallback.rowsFound': 'Filas encontradas: {count}.',\n 'aiAssistant:taskFailed': 'Tarea del asistente IA fallida',\n 'aiAssistant:settings.title': 'Asistente IA',\n 'aiAssistant:settings.description': 'Configura el widget de chat flotante, el modelo y el comportamiento del asistente en el servidor.',\n 'aiAssistant:settings.enabled': 'Activado',\n 'aiAssistant:settings.disabled': 'Desactivado',\n 'aiAssistant:settings.configured': 'Configurado',\n 'aiAssistant:settings.apiKeyRequired': 'Se requiere clave API',\n 'aiAssistant:settings.readOnly': 'Solo lectura',\n 'aiAssistant:settings.provider': 'Proveedor: {provider}',\n 'aiAssistant:settings.enableLabel': 'Activar asistente',\n 'aiAssistant:settings.enableHint': 'Controla la visibilidad del widget flotante y el endpoint de chat.',\n 'aiAssistant:settings.modelLabel': 'Modelo de OpenRouter',\n 'aiAssistant:settings.apiKeyLabel': 'Clave API de OpenRouter',\n 'aiAssistant:settings.apiKeyHint': 'Déjalo vacío para conservar la clave guardada en el servidor.',\n 'aiAssistant:settings.systemPromptLabel': 'Sobrescribir prompt del sistema',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Instrucciones específicas del proyecto para el asistente (opcional)',\n 'aiAssistant:settings.accessTitle': 'Modelo de acceso',\n 'aiAssistant:settings.accessDescription': 'El asistente actual se limita a inspección de registros en modo solo lectura a través de acciones de recurso.',\n 'aiAssistant:settings.futureToolsReady': 'Listo para futuras herramientas',\n 'aiAssistant:settings.save': 'Guardar ajustes',\n 'aiAssistant:settings.saving': 'Guardando…',\n 'aiAssistant:settings.saved': 'Ajustes del asistente IA guardados',\n 'aiAssistant:settings.empty': 'No hay ajustes disponibles.',\n 'filter:op.co': 'Contiene',\n 'filter:op.nco': 'No contiene',\n 'filter:op.sw': 'Comienza con',\n 'filter:op.ew': 'Termina con',\n 'filter:op.eq': 'Es igual a',\n 'filter:op.neq': 'No es igual a',\n 'filter:op.empty': 'Está vacío',\n 'filter:op.nempty': 'No está vacío',\n 'filter:op.in': 'Es uno de',\n 'filter:op.gt': 'Mayor que',\n 'filter:op.lt': 'Menor que',\n 'filter:op.between': 'Entre',\n 'filter:searchValues': 'Buscar en lista…',\n 'filter:selectAll': 'Seleccionar todo',\n 'filter:noValues': 'No se encontraron valores',\n 'common:newRecord': 'Nuevo {name}',\n 'common:editRecord': 'Editar {name} #{id}',\n 'common:themeLight': 'Claro',\n 'common:themeDark': 'Oscuro',\n 'common:themeSystem': 'Sistema',\n 'common:ok': 'OK',\n 'common:select': 'Seleccionar…',\n 'common:removeItem': 'Eliminar {title}',\n 'common:nSelectedAddMore': '{count} seleccionado(s) — agregar más',\n 'common:pickRecords': 'Elegir registros',\n 'common:managePickRecords': 'Gestionar selección ({count})',\n 'common:pickRecordsFrom': 'Elegir de {name}',\n 'common:draftRestored': 'Borrador no guardado restaurado',\n 'common:undoDraftRestore': 'Deshacer',\n 'aiFill:button': 'Rellenar con IA',\n 'aiFill:dialogTitle': 'Rellenar formulario desde foto',\n 'aiFill:dialogDescription': 'Sube una imagen — la IA extraerá los valores y rellenará el formulario.',\n 'aiFill:fillButton': 'Reconocer',\n 'aiFill:processing': 'Reconociendo imagen…',\n 'aiFill:success': '{count} campo(s) rellenado(s)',\n 'aiFill:errorNoFields': 'Este recurso no tiene campos rellenables por IA.',\n 'aiFill:errorGeneric': 'Error al rellenar con IA: {message}',\n 'aiFill:noValues': 'La IA no pudo extraer ningún valor de esta imagen.',\n 'aiFill:applied': 'La IA rellenó {count} campo(s). Puedes deshacer abajo.',\n 'wizard:stepOf': 'Paso {current} de {total}',\n 'wizard:products.step1': 'Información básica',\n 'wizard:products.step2': 'Precios',\n 'wizard:products.step3': 'Medios y etiquetas',\n 'common:invalidValue': 'Valor no válido',\n 'common:collapseSidebar': 'Contraer barra lateral',\n 'common:expandSidebar': 'Expandir barra lateral',\n 'common:toggleSidebar': 'Alternar barra lateral',\n 'common:sidebarTitle': 'Barra lateral',\n 'common:sidebarNavigation': 'Menú de navegación',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const it: LocaleBundle = {\n code: 'it',\n name: 'Italiano',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Home',\n 'common:search': 'Cerca',\n 'common:loading': 'Caricamento…',\n 'common:save': 'Salva',\n 'common:cancel': 'Annulla',\n 'common:delete': 'Elimina',\n 'common:create': 'Crea',\n 'common:edit': 'Modifica',\n 'common:show': 'Visualizza',\n 'common:back': 'Indietro',\n 'common:noRecords': 'Nessun record trovato.',\n 'common:noRecordsHint': 'Inizia creando un nuovo {resource}.',\n 'common:noMatchingRecords': 'Nessun record corrisponde ai filtri.',\n 'common:clearFilters': 'Cancella filtri',\n 'common:confirmDelete': 'Eliminare questo record?',\n 'common:perPage': 'Per pagina',\n 'common:page': 'Pagina',\n 'common:of': 'di',\n 'common:total': 'Totale',\n 'auth:login': 'Accedi',\n 'auth:logout': 'Esci',\n 'auth:email': 'Email',\n 'auth:password': 'Password',\n 'auth:loginFailed': 'Credenziali non valide.',\n 'errors:notFound': 'Non trovato.',\n 'errors:forbidden': 'Non hai accesso a questa risorsa.',\n 'errors:server': 'Qualcosa è andato storto. Riprova.',\n 'common:resources': 'Risorse',\n 'common:actions': 'Azioni',\n 'common:new': 'Nuovo',\n 'common:rowsPerPage': 'Righe per pagina',\n 'common:filter': 'Filtra {label}…',\n 'validation:required': '{label} è obbligatorio',\n 'validation:invalidNumber': '{label} deve essere un numero valido',\n 'validation:invalidInteger': '{label} deve essere un intero',\n 'validation:invalidEmail': '{label} deve essere un\\u2019email valida',\n 'validation:invalidUrl': '{label} deve essere un URL valido',\n 'validation:invalidDate': '{label} deve essere una data valida',\n 'validation:invalidUuid': '{label} deve essere un UUID valido',\n 'validation:tooShort': '{label} deve contenere almeno {min} caratteri',\n 'validation:tooLong': '{label} deve contenere al massimo {max} caratteri',\n 'validation:notInList': '{label} ha un valore non valido',\n 'validation:emptySelection': 'Seleziona almeno un valore per {label}',\n 'toast:created': 'Creato con successo',\n 'toast:saved': 'Salvato con successo',\n 'toast:deleted': 'Eliminato con successo',\n 'toast:createFailed': 'Creazione non riuscita',\n 'toast:saveFailed': 'Salvataggio non riuscito',\n 'toast:deleteFailed': 'Eliminazione non riuscita',\n 'toast:loadFailed': 'Caricamento non riuscito',\n 'toast:validationFailed': 'Correggi gli errori e riprova',\n 'common:close': 'Chiudi',\n 'common:export': 'Esporta',\n 'export:title': 'Esporta record',\n 'export:description': 'Scarica tutti i record corrispondenti di {resource} in un unico file.',\n 'export:csvHint': 'Valori separati da virgola',\n 'export:jsonHint': 'Array JSON strutturato',\n 'export:downloading': 'Preparazione del download…',\n 'export:progress': 'Caricati {loaded} di {total}…',\n 'export:exported': '{count} record esportati',\n 'export:exportFailed': 'Esportazione non riuscita',\n 'common:apply': 'Applica',\n 'common:clear': 'Cancella',\n 'common:filters': 'Filtri',\n 'common:columns': 'Colonne',\n 'common:toggleColumns': 'Mostra colonne',\n 'common:openMenu': 'Apri menu',\n 'common:refresh': 'Aggiorna',\n 'common:copy': 'Copia',\n 'common:copied': 'Copiato!',\n 'common:applyFilters': 'Applica filtri',\n 'common:clearAll': 'Cancella tutto',\n 'common:any': 'Qualsiasi',\n 'common:yes': 'Sì',\n 'common:no': 'No',\n 'common:filterPlaceholder': 'Filtra…',\n 'common:loadFailed': 'Caricamento non riuscito: {error}',\n 'common:theme': 'Tema',\n 'common:language': 'Lingua',\n 'common:toggleTheme': 'Cambia tema',\n 'common:clearSelection': 'Cancella selezione',\n 'common:searchPlaceholder': 'Cerca…',\n 'globalSearch:title': 'Ricerca globale',\n 'globalSearch:description': 'Cerca tra tutte le risorse e i record.',\n 'globalSearch:trigger': 'Cerca…',\n 'globalSearch:placeholder': 'Cerca in tutte le risorse…',\n 'globalSearch:hint': 'Inizia a digitare per cercare in tutte le risorse.',\n 'globalSearch:noResults': 'Nessun record corrispondente.',\n 'globalSearch:error': 'Ricerca non riuscita. Riprova.',\n 'globalSearch:hotkey': 'Apri ricerca globale',\n 'globalSearch:matchedIn': 'in {field}',\n 'globalSearch:recent': 'Ricerche recenti',\n 'globalSearch:clearRecent': 'Cancella',\n 'globalSearch:showAllIn': 'Mostra tutto in {resource}',\n 'common:pageOf': 'Pagina {page} di {total}',\n 'common:firstPage': 'Prima pagina',\n 'common:previousPage': 'Pagina precedente',\n 'common:nextPage': 'Pagina successiva',\n 'common:lastPage': 'Ultima pagina',\n 'common:recordsCount': '{count} record',\n 'common:selectedCount': '{count} selezionati',\n 'common:selectRow': 'Seleziona riga',\n 'common:selectAll': 'Seleziona tutto',\n 'common:deleteSelected': 'Elimina selezionati',\n 'common:bulkDeleteConfirm': 'Eliminare {count} record selezionati?',\n 'toast:bulkDeleted': '{count} record eliminati',\n 'toast:bulkDeleteFailed': 'Impossibile eliminare i record',\n 'common:from': 'Da',\n 'common:to': 'A',\n 'common:sortBy': 'Ordina per',\n 'common:next': 'Avanti',\n 'common:previous': 'Indietro',\n 'common:relatedRecords': 'Record correlati',\n 'common:viewAll': 'Vedi tutti',\n 'common:noRelatedRecords': 'Nessun record correlato.',\n 'common:preview': 'Anteprima',\n 'common:download': 'Scarica',\n 'common:openInNewTab': 'Apri in una nuova scheda',\n 'common:format': 'Formatta',\n 'common:invalidJson': 'JSON non valido',\n 'common:showPassword': 'Mostra password',\n 'common:hidePassword': 'Nascondi password',\n 'common:shortcutsHelp': 'Scorciatoie da tastiera',\n 'common:shortcutsEmpty': 'Nessuna scorciatoia disponibile in questa schermata.',\n 'auth:title': 'Accedi',\n 'auth:subtitle': 'Inserisci email e password per accedere',\n 'auth:tagline': 'Il pannello di amministrazione moderno per qualsiasi stack.',\n 'auth:orContinueWith': 'O continua con',\n 'auth:continueWith': 'Continua con {provider}',\n 'common:chooseFile': 'Scegli file',\n 'common:chooseFiles': 'Scegli file',\n 'common:dragAndDrop': 'Trascina o',\n 'common:chooseAFile': 'scegli un file',\n 'common:addMoreFiles': 'aggiungi altri file',\n 'common:uploading': 'Caricamento…',\n 'common:uploadingFile': 'Caricamento di {name}…',\n 'common:removeFile': 'Rimuovi file',\n 'common:uploadFailed': 'Caricamento fallito',\n 'common:dismiss': 'Chiudi',\n 'common:openCalendar': 'Apri calendario',\n 'common:time': 'Orario',\n 'common:downloadFailed': 'Download fallito',\n 'richtext:bold': 'Grassetto',\n 'richtext:italic': 'Corsivo',\n 'richtext:strikethrough': 'Barrato',\n 'richtext:inlineCode': 'Codice inline',\n 'richtext:heading': 'Intestazione {level}',\n 'richtext:bulletList': 'Elenco puntato',\n 'richtext:numberedList': 'Elenco numerato',\n 'richtext:blockquote': 'Blocco citazione',\n 'richtext:horizontalRule': 'Linea orizzontale',\n 'richtext:insertLink': 'Inserisci collegamento',\n 'richtext:undo': 'Annulla',\n 'richtext:redo': 'Ripeti',\n 'richtext:source': 'Sorgente ({format})',\n 'richtext:splitView': 'Vista divisa',\n 'richtext:visualEditor': 'Editor visivo',\n 'richtext:fullscreen': 'Schermo intero',\n 'richtext:exitFullscreen': 'Esci dallo schermo intero',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Salvataggio…',\n 'common:done': 'Fatto',\n 'settings:menuItem': 'Impostazioni',\n 'settings:noSectionsConfigured': 'Per questa installazione non sono disponibili sezioni delle impostazioni.',\n 'settings:apiKeys.title': 'Chiavi API',\n 'settings:apiKeys.description': 'Token di accesso programmatico all\\'API admin. Ogni chiave porta con sé un set di permessi che limita le risorse e le azioni che può invocare.',\n 'settings:apiKeys.actions.create': 'Nuova chiave',\n 'settings:apiKeys.actions.edit': 'Modifica',\n 'settings:apiKeys.actions.revoke': 'Revoca',\n 'settings:apiKeys.empty.title': 'Nessuna chiave API',\n 'settings:apiKeys.empty.description': 'Crea la prima chiave per concedere accesso programmatico.',\n 'settings:apiKeys.columns.name': 'Nome',\n 'settings:apiKeys.columns.start': 'Prefisso',\n 'settings:apiKeys.columns.permissions': 'Permessi',\n 'settings:apiKeys.columns.expiresAt': 'Scade',\n 'settings:apiKeys.columns.enabled': 'Attiva',\n 'settings:apiKeys.columns.actions': 'Azioni',\n 'settings:apiKeys.lastUsed': 'Ultimo utilizzo {date}',\n 'settings:apiKeys.expiresNever': 'Mai',\n 'settings:apiKeys.permissions.resource': 'Risorsa',\n 'settings:apiKeys.permissions.actions': 'Azioni',\n 'settings:apiKeys.permissions.selectAll': 'Seleziona tutto',\n 'settings:apiKeys.permissions.clearAll': 'Pulisci tutto',\n 'settings:apiKeys.permissions.none': 'Nessun permesso',\n 'settings:apiKeys.permissions.summary': '{resources} risorse · {actions} azioni',\n 'settings:apiKeys.permissions.noResources': 'Nessuna risorsa registrata.',\n 'settings:apiKeys.permissions.selectAllResources': 'Seleziona tutte le risorse e le azioni',\n 'settings:apiKeys.permissions.clearAllResources': 'Cancella tutte le risorse e le azioni',\n 'settings:apiKeys.editor.titleCreate': 'Nuova chiave API',\n 'settings:apiKeys.editor.titleEdit': 'Modifica chiave API',\n 'settings:apiKeys.editor.description': 'Scegli un nome descrittivo e concedi solo le risorse e azioni di cui questa chiave ha realmente bisogno.',\n 'settings:apiKeys.editor.name': 'Nome',\n 'settings:apiKeys.editor.namePlaceholder': 'es. bot di deploy CI',\n 'settings:apiKeys.editor.expiresInDays': 'Scade in (giorni)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'mai',\n 'settings:apiKeys.editor.expiresHint': 'Lascia vuoto per non scadere mai. Massimo 3650 giorni.',\n 'settings:apiKeys.editor.permissions': 'Permessi',\n 'settings:apiKeys.editor.selectedActions': '{count} selezionate',\n 'settings:apiKeys.created.title': 'Chiave API creata',\n 'settings:apiKeys.created.description': 'Copia la chiave ora — non sarà più mostrata.',\n 'settings:apiKeys.created.warning': 'Questa è l\\'unica volta in cui vedrai la chiave completa. Conservala in un luogo sicuro.',\n 'settings:apiKeys.created.reveal': 'Mostra chiave',\n 'settings:apiKeys.created.hide': 'Nascondi chiave',\n 'settings:apiKeys.created.copy': 'Copia',\n 'settings:apiKeys.created.copied': 'Copiata',\n 'settings:apiKeys.notice.revoked': 'Chiave API revocata',\n 'settings:apiKeys.notice.updated': 'Chiave API aggiornata',\n 'settings:apiKeys.notice.copied': 'Copiata negli appunti',\n 'settings:apiKeys.notice.copyFailed': 'Impossibile copiare negli appunti',\n 'settings:apiKeys.confirmRevoke.title': 'Revoca chiave API',\n 'settings:apiKeys.confirmRevoke.description': 'Revocare «{name}»? Qualsiasi servizio che utilizza questa chiave smetterà di funzionare immediatamente.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'Dashboard',\n 'chart:addChart': 'Aggiungi grafico',\n 'chart:newChart': 'Nuovo grafico',\n 'chart:editChart': 'Modifica grafico',\n 'chart:deleteChart': 'Rimuovi grafico',\n 'chart:noCharts': 'Nessun grafico',\n 'chart:noChartsHint': 'Aggiungi un grafico per iniziare a monitorare i dati.',\n 'chart:addGroup': 'Aggiungi gruppo',\n 'chart:newGroup': 'Nuovo gruppo',\n 'chart:editGroup': 'Modifica gruppo',\n 'chart:deleteGroup': 'Rimuovi gruppo',\n 'chart:saveGroup': 'Salva gruppo',\n 'chart:groupName': 'Nome del gruppo',\n 'chart:groupNamePlaceholder': 'es. Metriche vendite',\n 'chart:groupNameRequired': 'Il nome del gruppo è obbligatorio',\n 'chart:groupOrder': 'Ordine del gruppo',\n 'chart:order': 'Ordine',\n 'chart:orderHint': 'I valori più bassi vengono visualizzati per primi.',\n 'chart:moveToGroup': 'Sposta nel gruppo',\n 'chart:moveChart': 'Sposta grafico',\n 'chart:moveGroup': 'Gruppo',\n 'chart:moveNoGroups': 'Nessun gruppo ancora.',\n 'chart:moveNoGroupsHint': 'Crea prima un gruppo per organizzare i grafici.',\n 'chart:deleteChartConfirm': 'Rimuovere questo grafico?',\n 'chart:deleteChartConfirmHint': 'Questa azione non può essere annullata.',\n 'chart:deleteGroupConfirm': 'Rimuovere questo gruppo?',\n 'chart:deleteGroupConfirmHint': 'Il gruppo e i {count} grafici al suo interno verranno eliminati definitivamente.',\n 'chart:title': 'Titolo',\n 'chart:titlePlaceholder': 'es. Nuovi utenti al giorno',\n 'chart:untitled': 'Senza titolo',\n 'chart:chartType': 'Tipo di grafico',\n 'chart:resource': 'Risorsa',\n 'chart:groupBy': 'Raggruppa per',\n 'chart:step': 'Passo',\n 'chart:metric': 'Metrica',\n 'chart:aggregateField': 'Campo di aggregazione',\n 'chart:selectField': 'Seleziona campo…',\n 'chart:saveChart': 'Salva grafico',\n 'chart:typeLine': 'Linea',\n 'chart:typeArea': 'Area',\n 'chart:typeBar': 'Barre',\n 'chart:typePie': 'Torta',\n 'chart:stepDay': 'Giorno',\n 'chart:stepWeek': 'Settimana',\n 'chart:stepMonth': 'Mese',\n 'chart:stepYear': 'Anno',\n 'chart:metricCount': 'Conteggio',\n 'chart:metricSum': 'Somma',\n 'chart:metricAvg': 'Media',\n 'chart:noData': 'Nessun dato per il periodo selezionato',\n 'chart:loadError': 'Impossibile caricare i dati del grafico',\n 'chart:value': 'Valore',\n 'dashboard:vis': 'Visualizzazione',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Linea',\n 'dashboard:visArea': 'Area',\n 'dashboard:visBar': 'Barre',\n 'dashboard:visPie': 'Torta',\n 'dashboard:metricCount': 'Conteggio',\n 'dashboard:metricSum': 'Somma',\n 'dashboard:metricAvg': 'Media',\n 'dashboard:metricMin': 'Min',\n 'dashboard:metricMax': 'Max',\n 'dashboard:builder.range': 'Periodo',\n 'dashboard:builder.filters': 'Filtri',\n 'dashboard:builder.filtersHint': \"Limita il dataset prima dell'aggregazione. Spunta un filtro per mostrarlo sopra al grafico.\",\n 'dashboard:builder.quickFilterHint': 'Mostra questo filtro sopra al grafico nella dashboard.',\n 'dashboard:builder.quickFilterToggle': 'Esporre {field} come filtro rapido',\n 'dashboard:range.7d': '7g',\n 'dashboard:range.30d': '30g',\n 'dashboard:range.90d': '90g',\n 'dashboard:range.1y': '1a',\n 'dashboard:range.all': 'Tutto',\n 'dashboard:range.custom': 'Personalizzato',\n 'dashboard:widget.previousPeriod': 'vs. periodo precedente',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Riduci a metà larghezza',\n 'dashboard:widget.expand': 'Espandi a tutta la riga',\n 'dashboard:widget.toggleSql': 'Mostra SQL',\n 'dashboard:widget.unsupported': 'I grafici non sono ancora supportati per il tuo database.',\n 'dashboard:widget.truncatedWarning': 'Visualizzazione di dati parziali — troppe righe per aggregare l’intero intervallo.',\n 'dashboard:widget.showAll': 'Mostra tutto',\n 'dashboard:widget.hideAll': 'Nascondi tutto',\n 'dashboard:seriesTotal': 'Totale',\n 'dashboard:seriesOther': 'Altro',\n 'dashboard:seriesNull': 'Vuoto',\n 'dashboard:builder.dateField': 'Campo data',\n 'dashboard:builder.dateFieldHint': \"L'asse X è raggruppato per questa colonna data.\",\n 'dashboard:builder.secondaryGroupBy': 'Suddivisione',\n 'dashboard:builder.noBreakdown': 'Serie singola',\n 'dashboard:builder.topN': 'Max. serie',\n 'dashboard:builder.width': 'Larghezza',\n 'dashboard:width.half': 'Metà',\n 'dashboard:width.full': 'Riga intera',\n 'history:revisions': 'Revisioni',\n 'history:noRevisions': 'Nessuna revisione ancora',\n 'history:loadError': 'Impossibile caricare la cronologia modifiche',\n 'history:revert': 'Ripristina',\n 'history:confirmRevert': 'Ripristinare questa revisione?',\n 'history:revertSuccess': 'Revisione ripristinata',\n 'history:revertFailed': 'Impossibile ripristinare la revisione',\n 'history:unknownUser': 'Utente sconosciuto',\n 'history:changes': 'modifiche',\n 'history:compareTo': 'Confronta con',\n 'history:storedDiff': 'Diff modifica',\n 'history:op.create': 'Creato',\n 'history:op.update': 'Aggiornato',\n 'history:op.delete': 'Eliminato',\n 'diff:added': 'Aggiunto',\n 'diff:changed': 'Modificato',\n 'diff:removed': 'Rimosso',\n 'diff:before': 'Prima',\n 'diff:after': 'Dopo',\n 'diff:noChanges': 'Nessuna modifica ai campi registrata',\n 'audit:title': 'Attività',\n 'audit:resource': 'Risorsa',\n 'audit:action': 'Azione',\n 'audit:recordId': 'ID record',\n 'audit:userId': 'ID utente',\n 'audit:allResources': 'Tutte le risorse',\n 'audit:allActions': 'Tutte le azioni',\n 'audit:noEvents': 'Nessuna attività ancora',\n 'audit:records': 'record',\n 'audit:loadError': 'Impossibile caricare l’attività',\n 'audit:by': 'da {user}',\n 'audit:viewRecord': 'Apri record',\n 'audit:viewChanges': 'Mostra modifiche',\n 'audit:hideChanges': 'Nascondi modifiche',\n 'audit:noDiff': 'Dettagli delle modifiche non disponibili',\n 'audit:loadDiffError': 'Impossibile caricare le modifiche',\n 'audit:action.new': 'Record creato',\n 'audit:action.edit': 'Record aggiornato',\n 'audit:action.delete': 'Record eliminato',\n 'audit:action.bulkDelete': 'Record eliminati',\n 'audit:action.login': 'Accesso effettuato',\n 'audit:action.apiKeyCreate': 'Chiave API creata',\n 'audit:action.apiKeyUpdate': 'Chiave API aggiornata',\n 'audit:action.apiKeyDelete': 'Chiave API eliminata',\n 'audit:virtualResource.auth': 'Autenticazione',\n 'audit:virtualResource.apiKeys': 'Chiavi API',\n 'audit:prevPage': 'Precedente',\n 'audit:nextPage': 'Successivo',\n 'audit:dateRangePlaceholder': 'Seleziona intervallo di date',\n 'keyValue:noMatches': 'Nessuna corrispondenza — premi Invio per mantenere \"{value}\".',\n 'aiAssistant:queue.cancel': 'Rimuovi dalla coda',\n 'aiAssistant:title': 'Assistente IA',\n 'aiAssistant:fab.label': 'Apri assistente IA',\n 'aiAssistant:fab.short': 'IA',\n 'aiAssistant:description': 'Fai domande su record, relazioni, report e tendenze dei dati.',\n 'aiAssistant:notConfigured.title': 'Assistente non configurato',\n 'aiAssistant:notConfigured.description': 'Aggiungi la chiave API OpenRouter nelle impostazioni per abilitare l’assistente IA in sola lettura.',\n 'aiAssistant:notConfigured.openSettings': 'Apri impostazioni',\n 'aiAssistant:tryAsking': 'Prova a chiedere:',\n 'aiAssistant:tryAsking.example1': 'Quali clienti hanno il maggior numero di post?',\n 'aiAssistant:tryAsking.example2': 'Mostra i record creati di recente per una risorsa.',\n 'aiAssistant:tryAsking.example3': 'Spiega le relazioni tra record specifici.',\n 'aiAssistant:thinking': 'In elaborazione',\n 'aiAssistant:thinkingProgress': 'In elaborazione ({progress}%)',\n 'aiAssistant:input.placeholder': 'Chiedi informazioni sui tuoi dati…',\n 'aiAssistant:input.hint': 'Invio per inviare · Maiusc+Invio per una nuova riga',\n 'aiAssistant:send': 'Invia messaggio',\n 'aiAssistant:newChat': 'Nuova chat',\n 'aiAssistant:history': 'Cronologia chat',\n 'aiAssistant:history.empty': 'Nessuna chat precedente',\n 'aiAssistant:noText': 'Ecco i record correlati trovati:',\n 'aiAssistant:fallback.noToolResult': 'La richiesta è stata eseguita, ma il modello non ha restituito una risposta testuale. Prova a precisare la domanda o abilita i log di debug per controllare il risultato dello strumento.',\n 'aiAssistant:fallback.noRows': 'Nessun record trovato per questa richiesta.',\n 'aiAssistant:fallback.rowsFound': 'Righe trovate: {count}.',\n 'aiAssistant:taskFailed': 'Operazione dell’assistente IA non riuscita',\n 'aiAssistant:settings.title': 'Assistente IA',\n 'aiAssistant:settings.description': 'Configura il widget di chat IA flottante, il modello e il comportamento dell’assistente lato server.',\n 'aiAssistant:settings.enabled': 'Attivato',\n 'aiAssistant:settings.disabled': 'Disattivato',\n 'aiAssistant:settings.configured': 'Configurato',\n 'aiAssistant:settings.apiKeyRequired': 'Chiave API richiesta',\n 'aiAssistant:settings.readOnly': 'Sola lettura',\n 'aiAssistant:settings.provider': 'Provider: {provider}',\n 'aiAssistant:settings.enableLabel': 'Abilita assistente',\n 'aiAssistant:settings.enableHint': 'Controlla la visibilità del widget flottante e dell’endpoint di chat.',\n 'aiAssistant:settings.modelLabel': 'Modello OpenRouter',\n 'aiAssistant:settings.apiKeyLabel': 'Chiave API OpenRouter',\n 'aiAssistant:settings.apiKeyHint': 'Lascia vuoto per mantenere la chiave già salvata sul server.',\n 'aiAssistant:settings.systemPromptLabel': 'Override del prompt di sistema',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Istruzioni opzionali specifiche del progetto per l’assistente',\n 'aiAssistant:settings.accessTitle': 'Modello di accesso',\n 'aiAssistant:settings.accessDescription': 'L’assistente attuale è limitato all’ispezione in sola lettura dei record tramite le azioni delle risorse di amministrazione.',\n 'aiAssistant:settings.futureToolsReady': 'Strumenti futuri pronti',\n 'aiAssistant:settings.save': 'Salva impostazioni',\n 'aiAssistant:settings.saving': 'Salvataggio…',\n 'aiAssistant:settings.saved': 'Impostazioni dell’assistente IA salvate',\n 'aiAssistant:settings.empty': 'Nessuna impostazione disponibile.',\n 'aiFill:button': 'Compila con IA',\n 'aiFill:dialogTitle': 'Compila il modulo da una foto',\n 'aiFill:dialogDescription': 'Carica un\\u2019immagine — l\\u2019IA estrarrà i valori e compilerà il modulo.',\n 'aiFill:fillButton': 'Riconosci',\n 'aiFill:processing': 'Riconoscimento dell\\u2019immagine\\u2026',\n 'aiFill:success': '{count} campo/i compilato/i',\n 'aiFill:errorNoFields': 'Questa risorsa non ha campi compilabili dall\\u2019IA.',\n 'aiFill:errorGeneric': 'Compilazione tramite IA non riuscita: {message}',\n 'aiFill:noValues': 'L\\u2019IA non è riuscita a estrarre alcun valore da questa immagine.',\n 'aiFill:applied': \"L'IA ha compilato {count} campo/i. Puoi annullare in basso.\",\n 'filter:op.co': 'Contiene',\n 'filter:op.nco': 'Non contiene',\n 'filter:op.sw': 'Inizia con',\n 'filter:op.ew': 'Finisce con',\n 'filter:op.eq': 'È uguale a',\n 'filter:op.neq': 'Non è uguale a',\n 'filter:op.empty': 'È vuoto',\n 'filter:op.nempty': 'Non è vuoto',\n 'filter:op.in': 'È uno di',\n 'filter:op.gt': 'Maggiore di',\n 'filter:op.lt': 'Minore di',\n 'filter:op.between': 'Tra',\n 'filter:searchValues': 'Cerca nella lista…',\n 'filter:selectAll': 'Seleziona tutto',\n 'filter:noValues': 'Nessun valore trovato',\n 'common:newRecord': 'Nuovo {name}',\n 'common:editRecord': 'Modifica {name} #{id}',\n 'common:themeLight': 'Chiaro',\n 'common:themeDark': 'Scuro',\n 'common:themeSystem': 'Sistema',\n 'common:ok': 'OK',\n 'common:select': 'Seleziona…',\n 'common:removeItem': 'Rimuovi {title}',\n 'common:nSelectedAddMore': '{count} selezionato/i — aggiungi altri',\n 'common:pickRecords': 'Scegli record',\n 'common:managePickRecords': 'Gestisci selezione ({count})',\n 'common:pickRecordsFrom': 'Scegli da {name}',\n 'common:draftRestored': 'Bozza non salvata ripristinata',\n 'common:undoDraftRestore': 'Annulla',\n 'wizard:stepOf': 'Passo {current} di {total}',\n 'wizard:products.step1': 'Informazioni di base',\n 'wizard:products.step2': 'Prezzi',\n 'wizard:products.step3': 'Media e tag',\n 'common:invalidValue': 'Valore non valido',\n 'common:collapseSidebar': 'Comprimi barra laterale',\n 'common:expandSidebar': 'Espandi barra laterale',\n 'common:toggleSidebar': 'Attiva/disattiva barra laterale',\n 'common:sidebarTitle': 'Barra laterale',\n 'common:sidebarNavigation': 'Menu di navigazione',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const ja: LocaleBundle = {\n code: 'ja',\n name: '日本語',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'ホーム',\n 'common:search': '検索',\n 'common:loading': '読み込み中…',\n 'common:save': '保存',\n 'common:cancel': 'キャンセル',\n 'common:delete': '削除',\n 'common:create': '作成',\n 'common:edit': '編集',\n 'common:show': '表示',\n 'common:back': '戻る',\n 'common:noRecords': 'レコードが見つかりません。',\n 'common:noRecordsHint': '新しい{resource}を作成して始めましょう。',\n 'common:noMatchingRecords': 'フィルターに一致するレコードがありません。',\n 'common:clearFilters': 'フィルターをクリア',\n 'common:confirmDelete': 'このレコードを削除しますか?',\n 'common:perPage': '1ページあたり',\n 'common:page': 'ページ',\n 'common:of': '/',\n 'common:total': '合計',\n 'auth:login': 'ログイン',\n 'auth:logout': 'ログアウト',\n 'auth:email': 'メールアドレス',\n 'auth:password': 'パスワード',\n 'auth:loginFailed': '認証情報が無効です。',\n 'errors:notFound': '見つかりません。',\n 'errors:forbidden': 'このリソースへのアクセス権がありません。',\n 'errors:server': 'エラーが発生しました。再試行してください。',\n 'common:resources': 'リソース',\n 'common:actions': 'アクション',\n 'common:new': '新規',\n 'common:rowsPerPage': '1ページの行数',\n 'common:filter': '{label}でフィルター…',\n 'validation:required': '{label}は必須です',\n 'validation:invalidNumber': '{label}は有効な数値である必要があります',\n 'validation:invalidInteger': '{label}は整数である必要があります',\n 'validation:invalidEmail': '{label}は有効なメールアドレスである必要があります',\n 'validation:invalidUrl': '{label}は有効なURLである必要があります',\n 'validation:invalidDate': '{label}は有効な日付である必要があります',\n 'validation:invalidUuid': '{label}は有効なUUIDである必要があります',\n 'validation:tooShort': '{label}は{min}文字以上で入力してください',\n 'validation:tooLong': '{label}は{max}文字以内で入力してください',\n 'validation:notInList': '{label}の値が無効です',\n 'validation:emptySelection': '{label}を1つ以上選択してください',\n 'toast:created': '作成しました',\n 'toast:saved': '保存しました',\n 'toast:deleted': '削除しました',\n 'toast:createFailed': '作成に失敗しました',\n 'toast:saveFailed': '保存に失敗しました',\n 'toast:deleteFailed': '削除に失敗しました',\n 'toast:loadFailed': '読み込みに失敗しました',\n 'toast:validationFailed': 'エラーを修正してから再度お試しください',\n 'common:close': '閉じる',\n 'common:export': 'エクスポート',\n 'export:title': 'レコードをエクスポート',\n 'export:description': '{resource} の該当レコードをすべて 1 つのファイルにダウンロードします。',\n 'export:csvHint': 'カンマ区切り値',\n 'export:jsonHint': '構造化された JSON 配列',\n 'export:downloading': 'ダウンロードを準備しています…',\n 'export:progress': '{loaded} / {total} 件読み込み済み…',\n 'export:exported': '{count} 件のレコードをエクスポートしました',\n 'export:exportFailed': 'エクスポートに失敗しました',\n 'common:apply': '適用',\n 'common:clear': 'クリア',\n 'common:filters': 'フィルター',\n 'common:columns': '列',\n 'common:toggleColumns': '列の表示切替',\n 'common:openMenu': 'メニューを開く',\n 'common:refresh': '更新',\n 'common:copy': 'コピー',\n 'common:copied': 'コピーしました!',\n 'common:applyFilters': 'フィルターを適用',\n 'common:clearAll': 'すべてクリア',\n 'common:any': '任意',\n 'common:yes': 'はい',\n 'common:no': 'いいえ',\n 'common:filterPlaceholder': '絞り込み…',\n 'common:loadFailed': '読み込みに失敗しました: {error}',\n 'common:theme': 'テーマ',\n 'common:language': '言語',\n 'common:toggleTheme': 'テーマ切替',\n 'common:clearSelection': '選択を解除',\n 'common:searchPlaceholder': '検索…',\n 'globalSearch:title': 'グローバル検索',\n 'globalSearch:description': 'すべてのリソースとレコードを検索します。',\n 'globalSearch:trigger': '検索…',\n 'globalSearch:placeholder': 'すべてのリソースを検索…',\n 'globalSearch:hint': '入力してすべてのリソースを検索します。',\n 'globalSearch:noResults': '一致するレコードが見つかりません。',\n 'globalSearch:error': '検索に失敗しました。もう一度お試しください。',\n 'globalSearch:hotkey': 'グローバル検索を開く',\n 'globalSearch:matchedIn': '{field}内',\n 'globalSearch:recent': '最近の検索',\n 'globalSearch:clearRecent': 'クリア',\n 'globalSearch:showAllIn': '{resource}内をすべて表示',\n 'common:pageOf': '{total} ページ中 {page} ページ',\n 'common:firstPage': '最初のページ',\n 'common:previousPage': '前のページ',\n 'common:nextPage': '次のページ',\n 'common:lastPage': '最後のページ',\n 'common:recordsCount': '{count} 件',\n 'common:selectedCount': '{count} 件選択中',\n 'common:selectRow': '行を選択',\n 'common:selectAll': 'すべて選択',\n 'common:deleteSelected': '選択を削除',\n 'common:bulkDeleteConfirm': '選択した {count} 件のレコードを削除しますか?',\n 'toast:bulkDeleted': '{count} 件を削除しました',\n 'toast:bulkDeleteFailed': 'レコードの削除に失敗しました',\n 'common:from': 'から',\n 'common:to': 'まで',\n 'common:sortBy': '並び順',\n 'common:next': '次へ',\n 'common:previous': '前へ',\n 'common:relatedRecords': '関連レコード',\n 'common:viewAll': 'すべて表示',\n 'common:noRelatedRecords': '関連レコードはありません。',\n 'common:preview': 'プレビュー',\n 'common:download': 'ダウンロード',\n 'common:openInNewTab': '新しいタブで開く',\n 'common:format': '整形',\n 'common:invalidJson': '無効な JSON です',\n 'common:showPassword': 'パスワードを表示',\n 'common:hidePassword': 'パスワードを非表示',\n 'common:shortcutsHelp': 'キーボードショートカット',\n 'common:shortcutsEmpty': 'この画面でのショートカットはありません。',\n 'auth:title': 'サインイン',\n 'auth:subtitle': 'メールアドレスとパスワードを入力してください',\n 'auth:tagline': 'あらゆるスタックに対応したモダンな管理パネル。',\n 'auth:orContinueWith': 'または連携してログイン',\n 'auth:continueWith': '{provider}でログイン',\n 'common:chooseFile': 'ファイルを選択',\n 'common:chooseFiles': 'ファイルを選択',\n 'common:dragAndDrop': 'ドラッグ&ドロップまたは',\n 'common:chooseAFile': 'ファイルを選択',\n 'common:addMoreFiles': 'ファイルを追加',\n 'common:uploading': 'アップロード中…',\n 'common:uploadingFile': '{name} をアップロード中…',\n 'common:removeFile': 'ファイルを削除',\n 'common:uploadFailed': 'アップロード失敗',\n 'common:dismiss': '閉じる',\n 'common:openCalendar': 'カレンダーを開く',\n 'common:time': '時刻',\n 'common:downloadFailed': 'ダウンロード失敗',\n 'richtext:bold': '太字',\n 'richtext:italic': '斜体',\n 'richtext:strikethrough': '取り消し線',\n 'richtext:inlineCode': 'インラインコード',\n 'richtext:heading': '見出し {level}',\n 'richtext:bulletList': '箇条書き',\n 'richtext:numberedList': '番号付きリスト',\n 'richtext:blockquote': '引用',\n 'richtext:horizontalRule': '水平線',\n 'richtext:insertLink': 'リンクを挿入',\n 'richtext:undo': '元に戻す',\n 'richtext:redo': 'やり直し',\n 'richtext:source': 'ソース ({format})',\n 'richtext:splitView': '分割表示',\n 'richtext:visualEditor': 'ビジュアルエディタ',\n 'richtext:fullscreen': 'フルスクリーン',\n 'richtext:exitFullscreen': 'フルスクリーンを終了',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': '保存中…',\n 'common:done': '完了',\n 'settings:menuItem': '設定',\n 'settings:noSectionsConfigured': 'このデプロイメントで利用できる設定セクションはありません。',\n 'settings:apiKeys.title': 'APIキー',\n 'settings:apiKeys.description': '管理APIへのプログラムアクセス用トークン。各キーには、呼び出せるリソースとアクションを制限する権限セットが含まれます。',\n 'settings:apiKeys.actions.create': '新しいキー',\n 'settings:apiKeys.actions.edit': '編集',\n 'settings:apiKeys.actions.revoke': '無効化',\n 'settings:apiKeys.empty.title': 'APIキーがまだありません',\n 'settings:apiKeys.empty.description': '最初のキーを作成してプログラムアクセスを許可しましょう。',\n 'settings:apiKeys.columns.name': '名前',\n 'settings:apiKeys.columns.start': 'プレフィックス',\n 'settings:apiKeys.columns.permissions': '権限',\n 'settings:apiKeys.columns.expiresAt': '有効期限',\n 'settings:apiKeys.columns.enabled': '有効',\n 'settings:apiKeys.columns.actions': '操作',\n 'settings:apiKeys.lastUsed': '最終使用 {date}',\n 'settings:apiKeys.expiresNever': '無期限',\n 'settings:apiKeys.permissions.resource': 'リソース',\n 'settings:apiKeys.permissions.actions': 'アクション',\n 'settings:apiKeys.permissions.selectAll': 'すべて選択',\n 'settings:apiKeys.permissions.clearAll': 'すべて解除',\n 'settings:apiKeys.permissions.none': '権限なし',\n 'settings:apiKeys.permissions.summary': '{resources}件のリソース · {actions}件のアクション',\n 'settings:apiKeys.permissions.noResources': '登録されているリソースがありません。',\n 'settings:apiKeys.permissions.selectAllResources': 'すべてのリソースとアクションを選択',\n 'settings:apiKeys.permissions.clearAllResources': 'すべてのリソースとアクションを解除',\n 'settings:apiKeys.editor.titleCreate': '新しいAPIキー',\n 'settings:apiKeys.editor.titleEdit': 'APIキーを編集',\n 'settings:apiKeys.editor.description': '分かりやすい名前を付け、このキーが本当に必要とするリソースとアクションだけを許可してください。',\n 'settings:apiKeys.editor.name': '名前',\n 'settings:apiKeys.editor.namePlaceholder': '例: CIデプロイボット',\n 'settings:apiKeys.editor.expiresInDays': '有効期限(日数)',\n 'settings:apiKeys.editor.expiresPlaceholder': '無期限',\n 'settings:apiKeys.editor.expiresHint': '無期限にする場合は空欄のままにします。最大3650日。',\n 'settings:apiKeys.editor.permissions': '権限',\n 'settings:apiKeys.editor.selectedActions': '{count}件選択',\n 'settings:apiKeys.created.title': 'APIキーを作成しました',\n 'settings:apiKeys.created.description': '今すぐキーをコピーしてください — 再表示されません。',\n 'settings:apiKeys.created.warning': '完全なキーが表示されるのは今回だけです。安全な場所に保管してください。',\n 'settings:apiKeys.created.reveal': 'キーを表示',\n 'settings:apiKeys.created.hide': 'キーを隠す',\n 'settings:apiKeys.created.copy': 'コピー',\n 'settings:apiKeys.created.copied': 'コピー済み',\n 'settings:apiKeys.notice.revoked': 'APIキーを無効化しました',\n 'settings:apiKeys.notice.updated': 'APIキーを更新しました',\n 'settings:apiKeys.notice.copied': 'クリップボードにコピーしました',\n 'settings:apiKeys.notice.copyFailed': 'クリップボードへのコピーに失敗しました',\n 'settings:apiKeys.confirmRevoke.title': 'APIキーを無効化',\n 'settings:apiKeys.confirmRevoke.description': '「{name}」を無効化しますか?このキーを使用しているすべてのサービスは即座に動作しなくなります。',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'ダッシュボード',\n 'chart:addChart': 'グラフを追加',\n 'chart:newChart': '新しいグラフ',\n 'chart:editChart': 'グラフを編集',\n 'chart:deleteChart': 'グラフを削除',\n 'chart:noCharts': 'グラフがありません',\n 'chart:noChartsHint': 'グラフを追加してデータの監視を始めましょう。',\n 'chart:addGroup': 'グループを追加',\n 'chart:newGroup': '新規グループ',\n 'chart:editGroup': 'グループを編集',\n 'chart:deleteGroup': 'グループを削除',\n 'chart:saveGroup': 'グループを保存',\n 'chart:groupName': 'グループ名',\n 'chart:groupNamePlaceholder': '例: 売上指標',\n 'chart:groupNameRequired': 'グループ名は必須です',\n 'chart:groupOrder': 'グループの順序',\n 'chart:order': '順序',\n 'chart:orderHint': '値が小さいほど先に表示されます。',\n 'chart:moveToGroup': 'グループに移動',\n 'chart:moveChart': 'グラフを移動',\n 'chart:moveGroup': 'グループ',\n 'chart:moveNoGroups': 'まだグループがありません。',\n 'chart:moveNoGroupsHint': 'グラフを整理するには、まずグループを作成してください。',\n 'chart:deleteChartConfirm': 'このグラフを削除しますか?',\n 'chart:deleteChartConfirmHint': 'この操作は取り消せません。',\n 'chart:deleteGroupConfirm': 'このグループを削除しますか?',\n 'chart:deleteGroupConfirmHint': 'グループと内部の {count} 件のグラフが完全に削除されます。',\n 'chart:title': 'タイトル',\n 'chart:titlePlaceholder': '例:1日あたりの新規ユーザー数',\n 'chart:untitled': 'タイトルなし',\n 'chart:chartType': 'グラフの種類',\n 'chart:resource': 'リソース',\n 'chart:groupBy': 'グループ化',\n 'chart:step': 'ステップ',\n 'chart:metric': '指標',\n 'chart:aggregateField': '集計フィールド',\n 'chart:selectField': 'フィールドを選択…',\n 'chart:saveChart': 'グラフを保存',\n 'chart:typeLine': '折れ線',\n 'chart:typeArea': 'エリア',\n 'chart:typeBar': '棒',\n 'chart:typePie': '円',\n 'chart:stepDay': '日',\n 'chart:stepWeek': '週',\n 'chart:stepMonth': '月',\n 'chart:stepYear': '年',\n 'chart:metricCount': '件数',\n 'chart:metricSum': '合計',\n 'chart:metricAvg': '平均',\n 'chart:noData': '選択期間のデータがありません',\n 'chart:loadError': 'グラフデータの読み込みに失敗しました',\n 'chart:value': '値',\n 'dashboard:vis': '表示形式',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': '折れ線',\n 'dashboard:visArea': 'エリア',\n 'dashboard:visBar': '棒',\n 'dashboard:visPie': '円',\n 'dashboard:metricCount': '件数',\n 'dashboard:metricSum': '合計',\n 'dashboard:metricAvg': '平均',\n 'dashboard:metricMin': '最小',\n 'dashboard:metricMax': '最大',\n 'dashboard:builder.range': '期間',\n 'dashboard:builder.filters': 'フィルター',\n 'dashboard:builder.filtersHint': '集計前にデータを絞り込みます。チェックを付けると、グラフの上にクイックフィルターとして表示されます。',\n 'dashboard:builder.quickFilterHint': 'このフィルターをダッシュボードのグラフ上部に表示します。',\n 'dashboard:builder.quickFilterToggle': '{field} をクイックフィルターとして表示',\n 'dashboard:range.7d': '7日',\n 'dashboard:range.30d': '30日',\n 'dashboard:range.90d': '90日',\n 'dashboard:range.1y': '1年',\n 'dashboard:range.all': '全期間',\n 'dashboard:range.custom': 'カスタム',\n 'dashboard:widget.previousPeriod': '前期比',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': '半分の幅に縮小',\n 'dashboard:widget.expand': '全幅に拡大',\n 'dashboard:widget.toggleSql': 'SQLを表示',\n 'dashboard:widget.unsupported': 'お使いのデータベースではグラフをまだサポートしていません。',\n 'dashboard:widget.truncatedWarning': '部分的なデータを表示しています。行数が多すぎて全期間を集計できません。',\n 'dashboard:widget.showAll': 'すべて表示',\n 'dashboard:widget.hideAll': 'すべて非表示',\n 'dashboard:seriesTotal': '合計',\n 'dashboard:seriesOther': 'その他',\n 'dashboard:seriesNull': '空',\n 'dashboard:builder.dateField': '日付フィールド',\n 'dashboard:builder.dateFieldHint': 'X軸はこの日付列でバケット化されます。',\n 'dashboard:builder.secondaryGroupBy': '内訳',\n 'dashboard:builder.noBreakdown': '単一系列',\n 'dashboard:builder.topN': '最大系列数',\n 'dashboard:builder.width': '幅',\n 'dashboard:width.half': '半分',\n 'dashboard:width.full': '全幅',\n 'history:revisions': 'リビジョン',\n 'history:noRevisions': 'リビジョンはまだありません',\n 'history:loadError': '変更履歴を読み込めませんでした',\n 'history:revert': '元に戻す',\n 'history:confirmRevert': 'このリビジョンに戻しますか?',\n 'history:revertSuccess': 'リビジョンを復元しました',\n 'history:revertFailed': 'リビジョンを復元できませんでした',\n 'history:unknownUser': '不明なユーザー',\n 'history:changes': '件の変更',\n 'history:compareTo': '比較先',\n 'history:storedDiff': '変更差分',\n 'history:op.create': '作成',\n 'history:op.update': '更新',\n 'history:op.delete': '削除',\n 'diff:added': '追加',\n 'diff:changed': '変更',\n 'diff:removed': '削除',\n 'diff:before': '変更前',\n 'diff:after': '変更後',\n 'diff:noChanges': 'フィールド変更は記録されていません',\n 'audit:title': 'アクティビティ',\n 'audit:resource': 'リソース',\n 'audit:action': 'アクション',\n 'audit:recordId': 'レコードID',\n 'audit:userId': 'ユーザーID',\n 'audit:allResources': 'すべてのリソース',\n 'audit:allActions': 'すべてのアクション',\n 'audit:noEvents': 'アクティビティはまだありません',\n 'audit:records': 'レコード',\n 'audit:loadError': 'アクティビティを読み込めませんでした',\n 'audit:by': '実行者: {user}',\n 'audit:viewRecord': 'レコードを表示',\n 'audit:viewChanges': '変更を表示',\n 'audit:hideChanges': '変更を非表示',\n 'audit:noDiff': '変更の詳細は利用できません',\n 'audit:loadDiffError': '変更を読み込めませんでした',\n 'audit:action.new': 'レコードを作成しました',\n 'audit:action.edit': 'レコードを更新しました',\n 'audit:action.delete': 'レコードを削除しました',\n 'audit:action.bulkDelete': 'レコードを一括削除しました',\n 'audit:action.login': 'サインイン',\n 'audit:action.apiKeyCreate': 'APIキーを作成しました',\n 'audit:action.apiKeyUpdate': 'APIキーを更新しました',\n 'audit:action.apiKeyDelete': 'APIキーを削除しました',\n 'audit:virtualResource.auth': '認証',\n 'audit:virtualResource.apiKeys': 'APIキー',\n 'audit:prevPage': '前へ',\n 'audit:nextPage': '次へ',\n 'audit:dateRangePlaceholder': '日付範囲を選択',\n 'keyValue:noMatches': '一致なし — Enter キーで「{value}」をそのまま使用します。',\n 'aiAssistant:queue.cancel': 'キューから削除',\n 'aiAssistant:title': 'AI アシスタント',\n 'aiAssistant:fab.label': 'AI アシスタントを開く',\n 'aiAssistant:fab.short': 'AI',\n 'aiAssistant:description': 'レコード、関連性、レポート、データ傾向について質問できます。',\n 'aiAssistant:notConfigured.title': 'アシスタントが構成されていません',\n 'aiAssistant:notConfigured.description': '読み取り専用 AI アシスタントを有効にするには、設定で OpenRouter API キーを追加してください。',\n 'aiAssistant:notConfigured.openSettings': '設定を開く',\n 'aiAssistant:tryAsking': '質問例:',\n 'aiAssistant:tryAsking.example1': '投稿数が最も多い顧客は誰ですか?',\n 'aiAssistant:tryAsking.example2': 'リソースの最近作成されたレコードを表示してください。',\n 'aiAssistant:tryAsking.example3': '特定のレコード間の関連性を説明してください。',\n 'aiAssistant:thinking': '考え中',\n 'aiAssistant:thinkingProgress': '考え中 ({progress}%)',\n 'aiAssistant:input.placeholder': 'データについて質問してください…',\n 'aiAssistant:input.hint': 'Enterで送信 · Shift+Enterで改行',\n 'aiAssistant:send': 'メッセージを送信',\n 'aiAssistant:newChat': '新しいチャット',\n 'aiAssistant:history': 'チャット履歴',\n 'aiAssistant:history.empty': '以前のチャットはありません',\n 'aiAssistant:noText': '関連するレコードが見つかりました:',\n 'aiAssistant:fallback.noToolResult': 'リクエストは実行されましたが、モデルがテキスト回答を返しませんでした。質問を具体化するか、デバッグログを有効にしてツール結果を確認してください。',\n 'aiAssistant:fallback.noRows': 'このリクエストに一致するレコードは見つかりませんでした。',\n 'aiAssistant:fallback.rowsFound': '見つかった行数: {count}。',\n 'aiAssistant:taskFailed': 'AI アシスタントのタスクが失敗しました',\n 'aiAssistant:settings.title': 'AI アシスタント',\n 'aiAssistant:settings.description': 'フローティング AI チャットウィジェット、モデル、サーバー側アシスタントの動作を構成します。',\n 'aiAssistant:settings.enabled': '有効',\n 'aiAssistant:settings.disabled': '無効',\n 'aiAssistant:settings.configured': '構成済み',\n 'aiAssistant:settings.apiKeyRequired': 'API キーが必要です',\n 'aiAssistant:settings.readOnly': '読み取り専用',\n 'aiAssistant:settings.provider': 'プロバイダー: {provider}',\n 'aiAssistant:settings.enableLabel': 'アシスタントを有効化',\n 'aiAssistant:settings.enableHint': 'フローティングウィジェットとチャットエンドポイントの表示を制御します。',\n 'aiAssistant:settings.modelLabel': 'OpenRouter モデル',\n 'aiAssistant:settings.apiKeyLabel': 'OpenRouter API キー',\n 'aiAssistant:settings.apiKeyHint': 'サーバーに保存済みの既存キーを保持するには空のままにしてください。',\n 'aiAssistant:settings.systemPromptLabel': 'システムプロンプトの上書き',\n 'aiAssistant:settings.systemPromptPlaceholder': 'アシスタント向けのプロジェクト固有の指示(任意)',\n 'aiAssistant:settings.accessTitle': 'アクセスモデル',\n 'aiAssistant:settings.accessDescription': '現在のアシスタントは、管理リソースアクションを通じたレコードの読み取り専用検査に制限されています。',\n 'aiAssistant:settings.futureToolsReady': '将来のツール対応',\n 'aiAssistant:settings.save': '設定を保存',\n 'aiAssistant:settings.saving': '保存中…',\n 'aiAssistant:settings.saved': 'AI アシスタント設定を保存しました',\n 'aiAssistant:settings.empty': '利用可能な設定はありません。',\n 'aiFill:button': 'AI で入力',\n 'aiFill:dialogTitle': '写真からフォームを入力',\n 'aiFill:dialogDescription': '画像をアップロードしてください — AI が値を抽出してフォームに入力します。',\n 'aiFill:fillButton': '認識する',\n 'aiFill:processing': '画像を認識中\\u2026',\n 'aiFill:success': '{count} 個のフィールドが入力されました',\n 'aiFill:errorNoFields': 'このリソースには AI で入力可能なフィールドがありません。',\n 'aiFill:errorGeneric': 'AI による入力に失敗しました: {message}',\n 'aiFill:noValues': 'AI はこの画像から値を抽出できませんでした。',\n 'aiFill:applied': 'AI が {count} 件のフィールドを入力しました。以下で取り消せます。',\n 'filter:op.co': '含む',\n 'filter:op.nco': '含まない',\n 'filter:op.sw': 'で始まる',\n 'filter:op.ew': 'で終わる',\n 'filter:op.eq': '等しい',\n 'filter:op.neq': '等しくない',\n 'filter:op.empty': '空',\n 'filter:op.nempty': '空でない',\n 'filter:op.in': 'いずれか',\n 'filter:op.gt': 'より大きい',\n 'filter:op.lt': 'より小さい',\n 'filter:op.between': '範囲内',\n 'filter:searchValues': 'リスト内を検索…',\n 'filter:selectAll': 'すべて選択',\n 'filter:noValues': '値が見つかりません',\n 'common:newRecord': '新規 {name}',\n 'common:editRecord': '{name} #{id} を編集',\n 'common:themeLight': 'ライト',\n 'common:themeDark': 'ダーク',\n 'common:themeSystem': 'システム',\n 'common:ok': 'OK',\n 'common:select': '選択…',\n 'common:removeItem': '{title} を削除',\n 'common:nSelectedAddMore': '{count} 件選択中 — さらに追加',\n 'common:pickRecords': 'レコードを選択',\n 'common:managePickRecords': '選択を管理 ({count})',\n 'common:pickRecordsFrom': '{name} から選択',\n 'common:draftRestored': '未保存の下書きを復元しました',\n 'common:undoDraftRestore': '元に戻す',\n 'wizard:stepOf': 'ステップ {current} / {total}',\n 'wizard:products.step1': '基本情報',\n 'wizard:products.step2': '価格設定',\n 'wizard:products.step3': 'メディア & タグ',\n 'common:invalidValue': '無効な値です',\n 'common:collapseSidebar': 'サイドバーを折りたたむ',\n 'common:expandSidebar': 'サイドバーを展開する',\n 'common:toggleSidebar': 'サイドバーの切り替え',\n 'common:sidebarTitle': 'サイドバー',\n 'common:sidebarNavigation': 'ナビゲーションメニュー',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const pl: LocaleBundle = {\n code: 'pl',\n name: 'Polski',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Strona główna',\n 'common:search': 'Szukaj',\n 'common:loading': 'Ładowanie…',\n 'common:save': 'Zapisz',\n 'common:cancel': 'Anuluj',\n 'common:delete': 'Usuń',\n 'common:create': 'Utwórz',\n 'common:edit': 'Edytuj',\n 'common:show': 'Pokaż',\n 'common:back': 'Wstecz',\n 'common:noRecords': 'Nie znaleziono rekordów.',\n 'common:noRecordsHint': 'Zacznij od utworzenia nowego rekordu „{resource}\".',\n 'common:noMatchingRecords': 'Żaden rekord nie pasuje do filtrów.',\n 'common:clearFilters': 'Wyczyść filtry',\n 'common:confirmDelete': 'Usunąć ten rekord?',\n 'common:perPage': 'Na stronę',\n 'common:page': 'Strona',\n 'common:of': 'z',\n 'common:total': 'Razem',\n 'auth:login': 'Zaloguj się',\n 'auth:logout': 'Wyloguj się',\n 'auth:email': 'Email',\n 'auth:password': 'Hasło',\n 'auth:loginFailed': 'Nieprawidłowe dane logowania.',\n 'errors:notFound': 'Nie znaleziono.',\n 'errors:forbidden': 'Brak dostępu do tego zasobu.',\n 'errors:server': 'Coś poszło nie tak. Spróbuj ponownie.',\n 'common:resources': 'Zasoby',\n 'common:actions': 'Akcje',\n 'common:new': 'Nowy',\n 'common:rowsPerPage': 'Wierszy na stronę',\n 'common:filter': 'Filtruj {label}…',\n 'validation:required': 'Pole {label} jest wymagane',\n 'validation:invalidNumber': 'Pole {label} musi być prawidłową liczbą',\n 'validation:invalidInteger': 'Pole {label} musi być liczbą całkowitą',\n 'validation:invalidEmail': 'Pole {label} musi być prawidłowym e-mailem',\n 'validation:invalidUrl': 'Pole {label} musi być prawidłowym URL-em',\n 'validation:invalidDate': 'Pole {label} musi być prawidłową datą',\n 'validation:invalidUuid': 'Pole {label} musi być prawidłowym UUID',\n 'validation:tooShort': 'Pole {label} musi mieć co najmniej {min} znaków',\n 'validation:tooLong': 'Pole {label} może mieć co najwyżej {max} znaków',\n 'validation:notInList': 'Pole {label} ma nieprawidłową wartość',\n 'validation:emptySelection': 'Wybierz co najmniej jedną wartość dla {label}',\n 'toast:created': 'Pomyślnie utworzono',\n 'toast:saved': 'Pomyślnie zapisano',\n 'toast:deleted': 'Pomyślnie usunięto',\n 'toast:createFailed': 'Tworzenie nie powiodło się',\n 'toast:saveFailed': 'Zapis nie powiódł się',\n 'toast:deleteFailed': 'Usuwanie nie powiodło się',\n 'toast:loadFailed': 'Wczytywanie nie powiodło się',\n 'toast:validationFailed': 'Popraw błędy i spróbuj ponownie',\n 'common:close': 'Zamknij',\n 'common:export': 'Eksport',\n 'export:title': 'Eksport rekordów',\n 'export:description': 'Pobierz wszystkie pasujące rekordy zasobu {resource} w jednym pliku.',\n 'export:csvHint': 'Wartości oddzielone przecinkami',\n 'export:jsonHint': 'Strukturalna tablica JSON',\n 'export:downloading': 'Przygotowywanie pobierania…',\n 'export:progress': 'Wczytano {loaded} z {total}…',\n 'export:exported': 'Wyeksportowano rekordów: {count}',\n 'export:exportFailed': 'Nie udało się wyeksportować rekordów',\n 'common:apply': 'Zastosuj',\n 'common:clear': 'Wyczyść',\n 'common:filters': 'Filtry',\n 'common:columns': 'Kolumny',\n 'common:toggleColumns': 'Pokaż kolumny',\n 'common:openMenu': 'Otwórz menu',\n 'common:refresh': 'Odśwież',\n 'common:copy': 'Kopiuj',\n 'common:copied': 'Skopiowano!',\n 'common:applyFilters': 'Zastosuj filtry',\n 'common:clearAll': 'Wyczyść wszystko',\n 'common:any': 'Dowolne',\n 'common:yes': 'Tak',\n 'common:no': 'Nie',\n 'common:filterPlaceholder': 'Filtruj…',\n 'common:loadFailed': 'Błąd ładowania: {error}',\n 'common:theme': 'Motyw',\n 'common:language': 'Język',\n 'common:toggleTheme': 'Zmień motyw',\n 'common:clearSelection': 'Wyczyść wybór',\n 'common:searchPlaceholder': 'Szukaj…',\n 'globalSearch:title': 'Wyszukiwanie globalne',\n 'globalSearch:description': 'Wyszukaj we wszystkich zasobach i rekordach.',\n 'globalSearch:trigger': 'Szukaj…',\n 'globalSearch:placeholder': 'Szukaj we wszystkich zasobach…',\n 'globalSearch:hint': 'Zacznij pisać, aby przeszukać wszystkie zasoby.',\n 'globalSearch:noResults': 'Nie znaleziono pasujących rekordów.',\n 'globalSearch:error': 'Wyszukiwanie nie powiodło się. Spróbuj ponownie.',\n 'globalSearch:hotkey': 'Otwórz wyszukiwanie globalne',\n 'globalSearch:matchedIn': 'w {field}',\n 'globalSearch:recent': 'Ostatnie wyszukiwania',\n 'globalSearch:clearRecent': 'Wyczyść',\n 'globalSearch:showAllIn': 'Pokaż wszystko w {resource}',\n 'common:pageOf': 'Strona {page} z {total}',\n 'common:firstPage': 'Pierwsza strona',\n 'common:previousPage': 'Poprzednia strona',\n 'common:nextPage': 'Następna strona',\n 'common:lastPage': 'Ostatnia strona',\n 'common:recordsCount': 'Rekordów: {count}',\n 'common:selectedCount': 'Wybrano: {count}',\n 'common:selectRow': 'Zaznacz wiersz',\n 'common:selectAll': 'Zaznacz wszystkie',\n 'common:deleteSelected': 'Usuń zaznaczone',\n 'common:bulkDeleteConfirm': 'Usunąć {count} zaznaczonych rekordów?',\n 'toast:bulkDeleted': 'Usunięto rekordów: {count}',\n 'toast:bulkDeleteFailed': 'Nie udało się usunąć rekordów',\n 'common:from': 'Od',\n 'common:to': 'Do',\n 'common:sortBy': 'Sortuj według',\n 'common:next': 'Dalej',\n 'common:previous': 'Wstecz',\n 'common:relatedRecords': 'Powiązane rekordy',\n 'common:viewAll': 'Zobacz wszystkie',\n 'common:noRelatedRecords': 'Brak powiązanych rekordów.',\n 'common:preview': 'Podgląd',\n 'common:download': 'Pobierz',\n 'common:openInNewTab': 'Otwórz w nowej karcie',\n 'common:format': 'Sformatuj',\n 'common:invalidJson': 'Nieprawidłowy JSON',\n 'common:showPassword': 'Pokaż hasło',\n 'common:hidePassword': 'Ukryj hasło',\n 'common:shortcutsHelp': 'Skróty klawiszowe',\n 'common:shortcutsEmpty': 'Brak skrótów dostępnych na tym ekranie.',\n 'auth:title': 'Zaloguj się',\n 'auth:subtitle': 'Podaj email i hasło, aby się zalogować',\n 'auth:tagline': 'Nowoczesny panel administracyjny dla każdego stosu.',\n 'auth:orContinueWith': 'Lub kontynuuj przez',\n 'auth:continueWith': 'Kontynuuj przez {provider}',\n 'common:chooseFile': 'Wybierz plik',\n 'common:chooseFiles': 'Wybierz pliki',\n 'common:dragAndDrop': 'Przeciągnij i upuść lub',\n 'common:chooseAFile': 'wybierz plik',\n 'common:addMoreFiles': 'dodaj kolejne pliki',\n 'common:uploading': 'Przesyłanie…',\n 'common:uploadingFile': 'Przesyłanie {name}…',\n 'common:removeFile': 'Usuń plik',\n 'common:uploadFailed': 'Przesyłanie nie powiodło się',\n 'common:dismiss': 'Zamknij',\n 'common:openCalendar': 'Otwórz kalendarz',\n 'common:time': 'Godzina',\n 'common:downloadFailed': 'Pobieranie nie powiodło się',\n 'richtext:bold': 'Pogrubienie',\n 'richtext:italic': 'Kursywa',\n 'richtext:strikethrough': 'Przekreślenie',\n 'richtext:inlineCode': 'Kod wbudowany',\n 'richtext:heading': 'Nagłówek {level}',\n 'richtext:bulletList': 'Lista punktowana',\n 'richtext:numberedList': 'Lista numerowana',\n 'richtext:blockquote': 'Cytat blokowy',\n 'richtext:horizontalRule': 'Linia pozioma',\n 'richtext:insertLink': 'Wstaw link',\n 'richtext:undo': 'Cofnij',\n 'richtext:redo': 'Ponów',\n 'richtext:source': 'Źródło ({format})',\n 'richtext:splitView': 'Widok podzielony',\n 'richtext:visualEditor': 'Edytor wizualny',\n 'richtext:fullscreen': 'Pełny ekran',\n 'richtext:exitFullscreen': 'Wyjdź z pełnego ekranu',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Zapisywanie…',\n 'common:done': 'Gotowe',\n 'settings:menuItem': 'Ustawienia',\n 'settings:noSectionsConfigured': 'Dla tego wdrożenia nie są dostępne żadne sekcje ustawień.',\n 'settings:apiKeys.title': 'Klucze API',\n 'settings:apiKeys.description': 'Tokeny programowego dostępu do API administracyjnego. Każdy klucz ma zestaw uprawnień ograniczający, jakie zasoby i akcje może wywołać.',\n 'settings:apiKeys.actions.create': 'Nowy klucz',\n 'settings:apiKeys.actions.edit': 'Edytuj',\n 'settings:apiKeys.actions.revoke': 'Odwołaj',\n 'settings:apiKeys.empty.title': 'Brak kluczy API',\n 'settings:apiKeys.empty.description': 'Utwórz pierwszy klucz, aby przyznać dostęp programowy.',\n 'settings:apiKeys.columns.name': 'Nazwa',\n 'settings:apiKeys.columns.start': 'Prefiks',\n 'settings:apiKeys.columns.permissions': 'Uprawnienia',\n 'settings:apiKeys.columns.expiresAt': 'Wygasa',\n 'settings:apiKeys.columns.enabled': 'Aktywny',\n 'settings:apiKeys.columns.actions': 'Akcje',\n 'settings:apiKeys.lastUsed': 'Ostatnio użyty {date}',\n 'settings:apiKeys.expiresNever': 'Nigdy',\n 'settings:apiKeys.permissions.resource': 'Zasób',\n 'settings:apiKeys.permissions.actions': 'Akcje',\n 'settings:apiKeys.permissions.selectAll': 'Zaznacz wszystkie',\n 'settings:apiKeys.permissions.clearAll': 'Wyczyść wszystkie',\n 'settings:apiKeys.permissions.none': 'Brak uprawnień',\n 'settings:apiKeys.permissions.summary': '{resources} zasobów · {actions} akcji',\n 'settings:apiKeys.permissions.noResources': 'Brak zarejestrowanych zasobów.',\n 'settings:apiKeys.permissions.selectAllResources': 'Zaznacz wszystkie zasoby i akcje',\n 'settings:apiKeys.permissions.clearAllResources': 'Wyczyść wszystkie zasoby i akcje',\n 'settings:apiKeys.editor.titleCreate': 'Nowy klucz API',\n 'settings:apiKeys.editor.titleEdit': 'Edytuj klucz API',\n 'settings:apiKeys.editor.description': 'Wybierz opisową nazwę i nadaj tylko te zasoby i akcje, których ten klucz naprawdę potrzebuje.',\n 'settings:apiKeys.editor.name': 'Nazwa',\n 'settings:apiKeys.editor.namePlaceholder': 'np. bot wdrożeniowy CI',\n 'settings:apiKeys.editor.expiresInDays': 'Wygasa za (dni)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'nigdy',\n 'settings:apiKeys.editor.expiresHint': 'Pozostaw puste, aby klucz nie wygasał. Maksymalnie 3650 dni.',\n 'settings:apiKeys.editor.permissions': 'Uprawnienia',\n 'settings:apiKeys.editor.selectedActions': 'Zaznaczonych: {count}',\n 'settings:apiKeys.created.title': 'Klucz API utworzony',\n 'settings:apiKeys.created.description': 'Skopiuj klucz teraz — nie zostanie pokazany ponownie.',\n 'settings:apiKeys.created.warning': 'To jedyny raz, kiedy zobaczysz pełny klucz. Przechowuj go w bezpiecznym miejscu.',\n 'settings:apiKeys.created.reveal': 'Pokaż klucz',\n 'settings:apiKeys.created.hide': 'Ukryj klucz',\n 'settings:apiKeys.created.copy': 'Kopiuj',\n 'settings:apiKeys.created.copied': 'Skopiowano',\n 'settings:apiKeys.notice.revoked': 'Klucz API odwołany',\n 'settings:apiKeys.notice.updated': 'Klucz API zaktualizowany',\n 'settings:apiKeys.notice.copied': 'Skopiowano do schowka',\n 'settings:apiKeys.notice.copyFailed': 'Nie udało się skopiować do schowka',\n 'settings:apiKeys.confirmRevoke.title': 'Odwołaj klucz API',\n 'settings:apiKeys.confirmRevoke.description': 'Odwołać „{name}\"? Każda usługa korzystająca z tego klucza natychmiast przestanie działać.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'Panel',\n 'chart:addChart': 'Dodaj wykres',\n 'chart:newChart': 'Nowy wykres',\n 'chart:editChart': 'Edytuj wykres',\n 'chart:deleteChart': 'Usuń wykres',\n 'chart:noCharts': 'Brak wykresów',\n 'chart:noChartsHint': 'Dodaj wykres, aby zacząć monitorować dane.',\n 'chart:addGroup': 'Dodaj grupę',\n 'chart:newGroup': 'Nowa grupa',\n 'chart:editGroup': 'Edytuj grupę',\n 'chart:deleteGroup': 'Usuń grupę',\n 'chart:saveGroup': 'Zapisz grupę',\n 'chart:groupName': 'Nazwa grupy',\n 'chart:groupNamePlaceholder': 'np. Metryki sprzedaży',\n 'chart:groupNameRequired': 'Nazwa grupy jest wymagana',\n 'chart:groupOrder': 'Kolejność grupy',\n 'chart:order': 'Kolejność',\n 'chart:orderHint': 'Niższe wartości są wyświetlane jako pierwsze.',\n 'chart:moveToGroup': 'Przenieś do grupy',\n 'chart:moveChart': 'Przenieś wykres',\n 'chart:moveGroup': 'Grupa',\n 'chart:moveNoGroups': 'Brak grup.',\n 'chart:moveNoGroupsHint': 'Najpierw utwórz grupę, aby zorganizować wykresy.',\n 'chart:deleteChartConfirm': 'Usunąć ten wykres?',\n 'chart:deleteChartConfirmHint': 'Tej operacji nie można cofnąć.',\n 'chart:deleteGroupConfirm': 'Usunąć tę grupę?',\n 'chart:deleteGroupConfirmHint': 'Grupa oraz {count} wykres(ów) w niej zostaną trwale usunięte.',\n 'chart:title': 'Tytuł',\n 'chart:titlePlaceholder': 'np. Nowi użytkownicy dziennie',\n 'chart:untitled': 'Bez tytułu',\n 'chart:chartType': 'Typ wykresu',\n 'chart:resource': 'Zasób',\n 'chart:groupBy': 'Grupuj według',\n 'chart:step': 'Krok',\n 'chart:metric': 'Metryka',\n 'chart:aggregateField': 'Pole agregacji',\n 'chart:selectField': 'Wybierz pole…',\n 'chart:saveChart': 'Zapisz wykres',\n 'chart:typeLine': 'Liniowy',\n 'chart:typeArea': 'Obszarowy',\n 'chart:typeBar': 'Słupkowy',\n 'chart:typePie': 'Kołowy',\n 'chart:stepDay': 'Dzień',\n 'chart:stepWeek': 'Tydzień',\n 'chart:stepMonth': 'Miesiąc',\n 'chart:stepYear': 'Rok',\n 'chart:metricCount': 'Liczba',\n 'chart:metricSum': 'Suma',\n 'chart:metricAvg': 'Średnia',\n 'chart:noData': 'Brak danych dla wybranego okresu',\n 'chart:loadError': 'Nie udało się załadować danych wykresu',\n 'chart:value': 'Wartość',\n 'dashboard:vis': 'Wizualizacja',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Liniowy',\n 'dashboard:visArea': 'Obszarowy',\n 'dashboard:visBar': 'Słupkowy',\n 'dashboard:visPie': 'Kołowy',\n 'dashboard:metricCount': 'Liczba',\n 'dashboard:metricSum': 'Suma',\n 'dashboard:metricAvg': 'Średnia',\n 'dashboard:metricMin': 'Min',\n 'dashboard:metricMax': 'Maks',\n 'dashboard:builder.range': 'Zakres czasu',\n 'dashboard:builder.filters': 'Filtry',\n 'dashboard:builder.filtersHint': 'Zawęź zbiór danych przed agregacją. Zaznacz filtr, aby pokazać go nad wykresem.',\n 'dashboard:builder.quickFilterHint': 'Pokaż ten filtr nad wykresem na pulpicie.',\n 'dashboard:builder.quickFilterToggle': 'Pokaż {field} jako szybki filtr',\n 'dashboard:range.7d': '7d',\n 'dashboard:range.30d': '30d',\n 'dashboard:range.90d': '90d',\n 'dashboard:range.1y': '1r',\n 'dashboard:range.all': 'Wszystko',\n 'dashboard:range.custom': 'Niestandardowy',\n 'dashboard:widget.previousPeriod': 'vs. poprzedni okres',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Zmniejsz do połowy szerokości',\n 'dashboard:widget.expand': 'Rozwiń na cały wiersz',\n 'dashboard:widget.toggleSql': 'Pokaż SQL',\n 'dashboard:widget.unsupported': 'Wykresy nie są jeszcze obsługiwane dla Twojej bazy danych.',\n 'dashboard:widget.truncatedWarning': 'Wyświetlanie częściowych danych — zbyt wiele wierszy, aby zagregować cały zakres.',\n 'dashboard:widget.showAll': 'Pokaż wszystko',\n 'dashboard:widget.hideAll': 'Ukryj wszystko',\n 'dashboard:seriesTotal': 'Łącznie',\n 'dashboard:seriesOther': 'Inne',\n 'dashboard:seriesNull': 'Puste',\n 'dashboard:builder.dateField': 'Pole daty',\n 'dashboard:builder.dateFieldHint': 'Oś X grupowana jest po tym polu daty.',\n 'dashboard:builder.secondaryGroupBy': 'Podział',\n 'dashboard:builder.noBreakdown': 'Pojedyncza seria',\n 'dashboard:builder.topN': 'Maks. serii',\n 'dashboard:builder.width': 'Szerokość',\n 'dashboard:width.half': 'Połowa',\n 'dashboard:width.full': 'Cały wiersz',\n 'history:revisions': 'Rewizje',\n 'history:noRevisions': 'Brak rewizji',\n 'history:loadError': 'Nie udało się wczytać historii zmian',\n 'history:revert': 'Przywróć',\n 'history:confirmRevert': 'Przywrócić tę rewizję?',\n 'history:revertSuccess': 'Rewizja przywrócona',\n 'history:revertFailed': 'Nie udało się przywrócić rewizji',\n 'history:unknownUser': 'Nieznany użytkownik',\n 'history:changes': 'zmian',\n 'history:compareTo': 'Porównaj z',\n 'history:storedDiff': 'Diff zmiany',\n 'history:op.create': 'Utworzono',\n 'history:op.update': 'Zaktualizowano',\n 'history:op.delete': 'Usunięto',\n 'diff:added': 'Dodano',\n 'diff:changed': 'Zmieniono',\n 'diff:removed': 'Usunięto',\n 'diff:before': 'Przed',\n 'diff:after': 'Po',\n 'diff:noChanges': 'Nie zapisano zmian pól',\n 'audit:title': 'Aktywność',\n 'audit:resource': 'Zasób',\n 'audit:action': 'Akcja',\n 'audit:recordId': 'ID rekordu',\n 'audit:userId': 'ID użytkownika',\n 'audit:allResources': 'Wszystkie zasoby',\n 'audit:allActions': 'Wszystkie akcje',\n 'audit:noEvents': 'Brak aktywności',\n 'audit:records': 'rekordów',\n 'audit:loadError': 'Nie udało się wczytać aktywności',\n 'audit:by': 'autor: {user}',\n 'audit:viewRecord': 'Otwórz rekord',\n 'audit:viewChanges': 'Pokaż zmiany',\n 'audit:hideChanges': 'Ukryj zmiany',\n 'audit:noDiff': 'Szczegóły zmian niedostępne',\n 'audit:loadDiffError': 'Nie udało się wczytać zmian',\n 'audit:action.new': 'Rekord utworzony',\n 'audit:action.edit': 'Rekord zaktualizowany',\n 'audit:action.delete': 'Rekord usunięty',\n 'audit:action.bulkDelete': 'Rekordy usunięte',\n 'audit:action.login': 'Zalogowano',\n 'audit:action.apiKeyCreate': 'Klucz API utworzony',\n 'audit:action.apiKeyUpdate': 'Klucz API zaktualizowany',\n 'audit:action.apiKeyDelete': 'Klucz API usunięty',\n 'audit:virtualResource.auth': 'Uwierzytelnianie',\n 'audit:virtualResource.apiKeys': 'Klucze API',\n 'audit:prevPage': 'Poprzednia',\n 'audit:nextPage': 'Następna',\n 'audit:dateRangePlaceholder': 'Wybierz zakres dat',\n 'keyValue:noMatches': 'Brak dopasowań — naciśnij Enter, aby zachować „{value}\".',\n 'aiAssistant:queue.cancel': 'Usuń z kolejki',\n 'aiAssistant:title': 'Asystent AI',\n 'aiAssistant:fab.label': 'Otwórz asystenta AI',\n 'aiAssistant:fab.short': 'AI',\n 'aiAssistant:description': 'Zadawaj pytania o rekordy, relacje, raporty i trendy w danych.',\n 'aiAssistant:notConfigured.title': 'Asystent nie jest skonfigurowany',\n 'aiAssistant:notConfigured.description': 'Dodaj klucz API OpenRouter w ustawieniach, aby włączyć asystenta AI w trybie tylko do odczytu.',\n 'aiAssistant:notConfigured.openSettings': 'Otwórz ustawienia',\n 'aiAssistant:tryAsking': 'Spróbuj zapytać:',\n 'aiAssistant:tryAsking.example1': 'Którzy klienci mają najwięcej postów?',\n 'aiAssistant:tryAsking.example2': 'Pokaż ostatnio utworzone rekordy dla zasobu.',\n 'aiAssistant:tryAsking.example3': 'Wyjaśnij relacje między konkretnymi rekordami.',\n 'aiAssistant:thinking': 'Myślę',\n 'aiAssistant:thinkingProgress': 'Myślę ({progress}%)',\n 'aiAssistant:input.placeholder': 'Zapytaj o swoje dane…',\n 'aiAssistant:input.hint': 'Enter wysyła · Shift+Enter dodaje nowy wiersz',\n 'aiAssistant:send': 'Wyślij wiadomość',\n 'aiAssistant:newChat': 'Nowy czat',\n 'aiAssistant:history': 'Historia czatów',\n 'aiAssistant:history.empty': 'Brak wcześniejszych czatów',\n 'aiAssistant:noText': 'Oto znalezione powiązane rekordy:',\n 'aiAssistant:fallback.noToolResult': 'Żądanie zostało wykonane, ale model nie zwrócił odpowiedzi tekstowej. Doprecyzuj pytanie albo włącz logi debugowania, aby sprawdzić wynik narzędzia.',\n 'aiAssistant:fallback.noRows': 'Nie znaleziono rekordów dla tego żądania.',\n 'aiAssistant:fallback.rowsFound': 'Znalezione wiersze: {count}.',\n 'aiAssistant:taskFailed': 'Zadanie asystenta AI nie powiodło się',\n 'aiAssistant:settings.title': 'Asystent AI',\n 'aiAssistant:settings.description': 'Skonfiguruj pływający widżet czatu AI, model i zachowanie asystenta po stronie serwera.',\n 'aiAssistant:settings.enabled': 'Włączony',\n 'aiAssistant:settings.disabled': 'Wyłączony',\n 'aiAssistant:settings.configured': 'Skonfigurowano',\n 'aiAssistant:settings.apiKeyRequired': 'Wymagany klucz API',\n 'aiAssistant:settings.readOnly': 'Tylko do odczytu',\n 'aiAssistant:settings.provider': 'Dostawca: {provider}',\n 'aiAssistant:settings.enableLabel': 'Włącz asystenta',\n 'aiAssistant:settings.enableHint': 'Kontroluje widoczność pływającego widżetu i punktu końcowego czatu.',\n 'aiAssistant:settings.modelLabel': 'Model OpenRouter',\n 'aiAssistant:settings.apiKeyLabel': 'Klucz API OpenRouter',\n 'aiAssistant:settings.apiKeyHint': 'Pozostaw puste, aby zachować istniejący klucz zapisany na serwerze.',\n 'aiAssistant:settings.systemPromptLabel': 'Nadpisanie promptu systemowego',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Opcjonalne instrukcje dla asystenta specyficzne dla projektu',\n 'aiAssistant:settings.accessTitle': 'Model dostępu',\n 'aiAssistant:settings.accessDescription': 'Obecny asystent jest ograniczony do inspekcji rekordów tylko do odczytu poprzez akcje zasobów administracyjnych.',\n 'aiAssistant:settings.futureToolsReady': 'Przyszłe narzędzia gotowe',\n 'aiAssistant:settings.save': 'Zapisz ustawienia',\n 'aiAssistant:settings.saving': 'Zapisywanie…',\n 'aiAssistant:settings.saved': 'Ustawienia asystenta AI zapisane',\n 'aiAssistant:settings.empty': 'Brak dostępnych ustawień.',\n 'aiFill:button': 'Wypełnij AI',\n 'aiFill:dialogTitle': 'Wypełnij formularz ze zdjęcia',\n 'aiFill:dialogDescription': 'Prześlij obraz — AI wyodrębni wartości i wypełni formularz.',\n 'aiFill:fillButton': 'Rozpoznaj',\n 'aiFill:processing': 'Rozpoznawanie obrazu\\u2026',\n 'aiFill:success': 'Wypełniono {count} pole/pól',\n 'aiFill:errorNoFields': 'Ten zasób nie ma pól możliwych do wypełnienia przez AI.',\n 'aiFill:errorGeneric': 'Wypełnianie przez AI nie powiodło się: {message}',\n 'aiFill:noValues': 'AI nie mogła wyodrębnić żadnych wartości z tego obrazu.',\n 'aiFill:applied': 'AI wypełniło {count} pole(i). Możesz cofnąć poniżej.',\n 'filter:op.co': 'Zawiera',\n 'filter:op.nco': 'Nie zawiera',\n 'filter:op.sw': 'Zaczyna się od',\n 'filter:op.ew': 'Kończy się na',\n 'filter:op.eq': 'Jest równe',\n 'filter:op.neq': 'Nie jest równe',\n 'filter:op.empty': 'Jest puste',\n 'filter:op.nempty': 'Nie jest puste',\n 'filter:op.in': 'Jest jednym z',\n 'filter:op.gt': 'Większe niż',\n 'filter:op.lt': 'Mniejsze niż',\n 'filter:op.between': 'Między',\n 'filter:searchValues': 'Szukaj na liście…',\n 'filter:selectAll': 'Zaznacz wszystko',\n 'filter:noValues': 'Nie znaleziono wartości',\n 'common:newRecord': 'Nowy {name}',\n 'common:editRecord': 'Edytuj {name} #{id}',\n 'common:themeLight': 'Jasny',\n 'common:themeDark': 'Ciemny',\n 'common:themeSystem': 'System',\n 'common:ok': 'OK',\n 'common:select': 'Wybierz…',\n 'common:removeItem': 'Usuń {title}',\n 'common:nSelectedAddMore': '{count} zaznaczonych — dodaj więcej',\n 'common:pickRecords': 'Wybierz rekordy',\n 'common:managePickRecords': 'Zarządzaj wyborem ({count})',\n 'common:pickRecordsFrom': 'Wybierz z {name}',\n 'common:draftRestored': 'Przywrócono niezapisany szkic',\n 'common:undoDraftRestore': 'Cofnij',\n 'wizard:stepOf': 'Krok {current} z {total}',\n 'wizard:products.step1': 'Podstawowe informacje',\n 'wizard:products.step2': 'Ceny',\n 'wizard:products.step3': 'Media i tagi',\n 'common:invalidValue': 'Nieprawidłowa wartość',\n 'common:collapseSidebar': 'Zwiń pasek boczny',\n 'common:expandSidebar': 'Rozwiń pasek boczny',\n 'common:toggleSidebar': 'Przełącz pasek boczny',\n 'common:sidebarTitle': 'Pasek boczny',\n 'common:sidebarNavigation': 'Menu nawigacyjne',\n },\n}\n","import type { LocaleBundle } from '../types.js'\n\nexport const ptBR: LocaleBundle = {\n code: 'pt-BR',\n name: 'Português (Brasil)',\n dict: {\n 'common:appName': 'Modern Admin',\n 'common:home': 'Início',\n 'common:search': 'Pesquisar',\n 'common:loading': 'Carregando…',\n 'common:save': 'Salvar',\n 'common:cancel': 'Cancelar',\n 'common:delete': 'Excluir',\n 'common:create': 'Criar',\n 'common:edit': 'Editar',\n 'common:show': 'Visualizar',\n 'common:back': 'Voltar',\n 'common:noRecords': 'Nenhum registro encontrado.',\n 'common:noRecordsHint': 'Comece criando um novo {resource}.',\n 'common:noMatchingRecords': 'Nenhum registro corresponde aos seus filtros.',\n 'common:clearFilters': 'Limpar filtros',\n 'common:confirmDelete': 'Excluir este registro?',\n 'common:perPage': 'Por página',\n 'common:page': 'Página',\n 'common:of': 'de',\n 'common:total': 'Total',\n 'auth:login': 'Entrar',\n 'auth:logout': 'Sair',\n 'auth:email': 'Email',\n 'auth:password': 'Senha',\n 'auth:loginFailed': 'Credenciais inválidas.',\n 'errors:notFound': 'Não encontrado.',\n 'errors:forbidden': 'Você não tem acesso a este recurso.',\n 'errors:server': 'Algo deu errado. Tente novamente.',\n 'common:resources': 'Recursos',\n 'common:actions': 'Ações',\n 'common:new': 'Novo',\n 'common:rowsPerPage': 'Linhas por página',\n 'common:filter': 'Filtrar {label}…',\n 'validation:required': '{label} é obrigatório',\n 'validation:invalidNumber': '{label} deve ser um número válido',\n 'validation:invalidInteger': '{label} deve ser um inteiro',\n 'validation:invalidEmail': '{label} deve ser um e-mail válido',\n 'validation:invalidUrl': '{label} deve ser uma URL válida',\n 'validation:invalidDate': '{label} deve ser uma data válida',\n 'validation:invalidUuid': '{label} deve ser um UUID válido',\n 'validation:tooShort': '{label} deve ter pelo menos {min} caracteres',\n 'validation:tooLong': '{label} deve ter no máximo {max} caracteres',\n 'validation:notInList': '{label} tem um valor inválido',\n 'validation:emptySelection': 'Selecione pelo menos um valor para {label}',\n 'toast:created': 'Criado com sucesso',\n 'toast:saved': 'Salvo com sucesso',\n 'toast:deleted': 'Excluído com sucesso',\n 'toast:createFailed': 'Falha ao criar',\n 'toast:saveFailed': 'Falha ao salvar',\n 'toast:deleteFailed': 'Falha ao excluir',\n 'toast:loadFailed': 'Falha ao carregar',\n 'toast:validationFailed': 'Corrija os erros e tente novamente',\n 'common:close': 'Fechar',\n 'common:export': 'Exportar',\n 'export:title': 'Exportar registros',\n 'export:description': 'Baixar todos os registros correspondentes de {resource} em um único arquivo.',\n 'export:csvHint': 'Valores separados por vírgula',\n 'export:jsonHint': 'Array JSON estruturado',\n 'export:downloading': 'Preparando download…',\n 'export:progress': '{loaded} de {total} carregados…',\n 'export:exported': '{count} registros exportados',\n 'export:exportFailed': 'Falha ao exportar registros',\n 'common:apply': 'Aplicar',\n 'common:clear': 'Limpar',\n 'common:filters': 'Filtros',\n 'common:columns': 'Colunas',\n 'common:toggleColumns': 'Mostrar colunas',\n 'common:openMenu': 'Abrir menu',\n 'common:refresh': 'Atualizar',\n 'common:copy': 'Copiar',\n 'common:copied': 'Copiado!',\n 'common:applyFilters': 'Aplicar filtros',\n 'common:clearAll': 'Limpar tudo',\n 'common:any': 'Qualquer',\n 'common:yes': 'Sim',\n 'common:no': 'Não',\n 'common:filterPlaceholder': 'Filtrar…',\n 'common:loadFailed': 'Falha ao carregar: {error}',\n 'common:theme': 'Tema',\n 'common:language': 'Idioma',\n 'common:toggleTheme': 'Alternar tema',\n 'common:clearSelection': 'Limpar seleção',\n 'common:searchPlaceholder': 'Buscar…',\n 'globalSearch:title': 'Busca global',\n 'globalSearch:description': 'Buscar em todos os recursos e registros.',\n 'globalSearch:trigger': 'Buscar…',\n 'globalSearch:placeholder': 'Buscar em todos os recursos…',\n 'globalSearch:hint': 'Comece a digitar para buscar em todos os recursos.',\n 'globalSearch:noResults': 'Nenhum registro correspondente encontrado.',\n 'globalSearch:error': 'Falha na busca. Tente novamente.',\n 'globalSearch:hotkey': 'Abrir busca global',\n 'globalSearch:matchedIn': 'em {field}',\n 'globalSearch:recent': 'Buscas recentes',\n 'globalSearch:clearRecent': 'Limpar',\n 'globalSearch:showAllIn': 'Mostrar tudo em {resource}',\n 'common:pageOf': 'Página {page} de {total}',\n 'common:firstPage': 'Primeira página',\n 'common:previousPage': 'Página anterior',\n 'common:nextPage': 'Próxima página',\n 'common:lastPage': 'Última página',\n 'common:recordsCount': '{count} registros',\n 'common:selectedCount': '{count} selecionados',\n 'common:selectRow': 'Selecionar linha',\n 'common:selectAll': 'Selecionar tudo',\n 'common:deleteSelected': 'Excluir selecionados',\n 'common:bulkDeleteConfirm': 'Excluir {count} registros selecionados?',\n 'toast:bulkDeleted': '{count} registros excluídos',\n 'toast:bulkDeleteFailed': 'Falha ao excluir registros',\n 'common:from': 'De',\n 'common:to': 'Até',\n 'common:sortBy': 'Ordenar por',\n 'common:next': 'Próximo',\n 'common:previous': 'Anterior',\n 'common:relatedRecords': 'Registros relacionados',\n 'common:viewAll': 'Ver todos',\n 'common:noRelatedRecords': 'Sem registros relacionados.',\n 'common:preview': 'Pré-visualizar',\n 'common:download': 'Baixar',\n 'common:openInNewTab': 'Abrir em nova aba',\n 'common:format': 'Formatar',\n 'common:invalidJson': 'JSON inválido',\n 'common:showPassword': 'Mostrar senha',\n 'common:hidePassword': 'Ocultar senha',\n 'common:shortcutsHelp': 'Atalhos de teclado',\n 'common:shortcutsEmpty': 'Não há atalhos disponíveis nesta tela.',\n 'auth:title': 'Entrar',\n 'auth:subtitle': 'Insira seu e-mail e senha para entrar',\n 'auth:tagline': 'O painel de administração moderno para qualquer stack.',\n 'auth:orContinueWith': 'Ou continuar com',\n 'auth:continueWith': 'Continuar com {provider}',\n 'common:chooseFile': 'Escolher arquivo',\n 'common:chooseFiles': 'Escolher arquivos',\n 'common:dragAndDrop': 'Arraste e solte ou',\n 'common:chooseAFile': 'escolher um arquivo',\n 'common:addMoreFiles': 'adicionar mais arquivos',\n 'common:uploading': 'Enviando…',\n 'common:uploadingFile': 'Enviando {name}…',\n 'common:removeFile': 'Remover arquivo',\n 'common:uploadFailed': 'Falha ao enviar',\n 'common:dismiss': 'Fechar',\n 'common:openCalendar': 'Abrir calendário',\n 'common:time': 'Hora',\n 'common:downloadFailed': 'Falha ao baixar',\n 'richtext:bold': 'Negrito',\n 'richtext:italic': 'Itálico',\n 'richtext:strikethrough': 'Tachado',\n 'richtext:inlineCode': 'Código inline',\n 'richtext:heading': 'Título {level}',\n 'richtext:bulletList': 'Lista com marcadores',\n 'richtext:numberedList': 'Lista numerada',\n 'richtext:blockquote': 'Citação em bloco',\n 'richtext:horizontalRule': 'Linha horizontal',\n 'richtext:insertLink': 'Inserir link',\n 'richtext:undo': 'Desfazer',\n 'richtext:redo': 'Refazer',\n 'richtext:source': 'Fonte ({format})',\n 'richtext:splitView': 'Visão dividida',\n 'richtext:visualEditor': 'Editor visual',\n 'richtext:fullscreen': 'Tela cheia',\n 'richtext:exitFullscreen': 'Sair da tela cheia',\n 'richtext:urlPrompt': 'URL',\n 'common:saving': 'Salvando…',\n 'common:done': 'Concluído',\n 'settings:menuItem': 'Configurações',\n 'settings:noSectionsConfigured': 'Nenhuma seção de configurações está disponível para esta instalação.',\n 'settings:apiKeys.title': 'Chaves de API',\n 'settings:apiKeys.description': 'Tokens de acesso programático à API de administração. Cada chave traz um conjunto de permissões que limita os recursos e ações que ela pode invocar.',\n 'settings:apiKeys.actions.create': 'Nova chave',\n 'settings:apiKeys.actions.edit': 'Editar',\n 'settings:apiKeys.actions.revoke': 'Revogar',\n 'settings:apiKeys.empty.title': 'Ainda não há chaves de API',\n 'settings:apiKeys.empty.description': 'Crie a primeira chave para conceder acesso programático.',\n 'settings:apiKeys.columns.name': 'Nome',\n 'settings:apiKeys.columns.start': 'Prefixo',\n 'settings:apiKeys.columns.permissions': 'Permissões',\n 'settings:apiKeys.columns.expiresAt': 'Expira',\n 'settings:apiKeys.columns.enabled': 'Ativa',\n 'settings:apiKeys.columns.actions': 'Ações',\n 'settings:apiKeys.lastUsed': 'Último uso {date}',\n 'settings:apiKeys.expiresNever': 'Nunca',\n 'settings:apiKeys.permissions.resource': 'Recurso',\n 'settings:apiKeys.permissions.actions': 'Ações',\n 'settings:apiKeys.permissions.selectAll': 'Selecionar tudo',\n 'settings:apiKeys.permissions.clearAll': 'Limpar tudo',\n 'settings:apiKeys.permissions.none': 'Sem permissões',\n 'settings:apiKeys.permissions.summary': '{resources} recursos · {actions} ações',\n 'settings:apiKeys.permissions.noResources': 'Nenhum recurso registrado.',\n 'settings:apiKeys.permissions.selectAllResources': 'Selecionar todos os recursos e ações',\n 'settings:apiKeys.permissions.clearAllResources': 'Limpar todos os recursos e ações',\n 'settings:apiKeys.editor.titleCreate': 'Nova chave de API',\n 'settings:apiKeys.editor.titleEdit': 'Editar chave de API',\n 'settings:apiKeys.editor.description': 'Escolha um nome descritivo e conceda apenas os recursos e ações de que esta chave realmente precisa.',\n 'settings:apiKeys.editor.name': 'Nome',\n 'settings:apiKeys.editor.namePlaceholder': 'ex.: bot de deploy do CI',\n 'settings:apiKeys.editor.expiresInDays': 'Expira em (dias)',\n 'settings:apiKeys.editor.expiresPlaceholder': 'nunca',\n 'settings:apiKeys.editor.expiresHint': 'Deixe em branco para não expirar. Máximo de 3650 dias.',\n 'settings:apiKeys.editor.permissions': 'Permissões',\n 'settings:apiKeys.editor.selectedActions': '{count} selecionadas',\n 'settings:apiKeys.created.title': 'Chave de API criada',\n 'settings:apiKeys.created.description': 'Copie a chave agora — ela não será exibida novamente.',\n 'settings:apiKeys.created.warning': 'Esta é a única vez que você verá a chave completa. Guarde-a em local seguro.',\n 'settings:apiKeys.created.reveal': 'Mostrar chave',\n 'settings:apiKeys.created.hide': 'Ocultar chave',\n 'settings:apiKeys.created.copy': 'Copiar',\n 'settings:apiKeys.created.copied': 'Copiada',\n 'settings:apiKeys.notice.revoked': 'Chave de API revogada',\n 'settings:apiKeys.notice.updated': 'Chave de API atualizada',\n 'settings:apiKeys.notice.copied': 'Copiada para a área de transferência',\n 'settings:apiKeys.notice.copyFailed': 'Não foi possível copiar para a área de transferência',\n 'settings:apiKeys.confirmRevoke.title': 'Revogar chave de API',\n 'settings:apiKeys.confirmRevoke.description': 'Revogar \"{name}\"? Qualquer serviço que use esta chave deixará de funcionar imediatamente.',\n 'settings:webhooks.title': 'Webhooks',\n 'settings:webhooks.description': 'Send signed HTTP notifications when records are created, updated, or deleted.',\n 'settings:webhooks.actions.create': 'New webhook',\n 'settings:webhooks.actions.test': 'Test',\n 'settings:webhooks.notice.saved': 'Webhook saved',\n 'settings:webhooks.notice.deleted': 'Webhook deleted',\n 'settings:webhooks.notice.testQueued': 'Test notification queued',\n 'settings:webhooks.confirmDelete.title': 'Delete webhook',\n 'settings:webhooks.confirmDelete.description': 'Delete \"{name}\"? Delivery history for this webhook will also be removed.',\n 'settings:webhooks.empty.title': 'No webhooks yet',\n 'settings:webhooks.empty.description': 'Create a webhook to notify external systems about admin changes.',\n 'settings:webhooks.columns.name': 'Name',\n 'settings:webhooks.columns.resource': 'Resource',\n 'settings:webhooks.columns.events': 'Events',\n 'settings:webhooks.columns.enabled': 'Enabled',\n 'settings:webhooks.columns.actions': 'Actions',\n 'settings:webhooks.deliveries.title': 'Recent deliveries',\n 'settings:webhooks.deliveries.status': 'Status',\n 'settings:webhooks.deliveries.event': 'Event',\n 'settings:webhooks.deliveries.attempt': 'Attempt',\n 'settings:webhooks.deliveries.response': 'Response',\n 'settings:webhooks.deliveries.createdAt': 'Created',\n 'settings:webhooks.editor.titleCreate': 'New webhook',\n 'settings:webhooks.editor.titleEdit': 'Edit webhook',\n 'settings:webhooks.editor.description': 'Choose target URL, events, filters, and optional payload projection.',\n 'settings:webhooks.editor.name': 'Name',\n 'settings:webhooks.editor.url': 'URL',\n 'settings:webhooks.editor.resource': 'Resource',\n 'settings:webhooks.editor.allResources': 'All resources',\n 'settings:webhooks.editor.secret': 'Signing secret',\n 'settings:webhooks.editor.enabled': 'Enabled',\n 'settings:webhooks.editor.events': 'Events',\n 'settings:webhooks.editor.payloadFields': 'Payload fields',\n 'settings:webhooks.editor.payloadFieldsHint': 'Restrict the payload to specific fields. Leave all unchecked to include the full record. Useful to avoid sending sensitive columns.',\n 'settings:webhooks.editor.headers': 'Headers',\n 'settings:webhooks.editor.headersHint': 'Custom HTTP headers sent with every delivery.\\n\\nExample:\\n{\\n \"Authorization\": \"Bearer <token>\",\\n \"X-Source\": \"modern-admin\"\\n}\\n\\nUseful for auth tokens, Slack incoming webhook URLs stored as a header, or endpoint-specific signatures.',\n 'settings:webhooks.editor.filters': 'Filters',\n 'settings:webhooks.editor.filtersHint': 'Deliver only when the record matches all conditions (AND semantics). Leave empty to deliver for every matching event.\\n\\nExample:\\n{\\n \"status\": \"published\",\\n \"role\": \"admin\"\\n}\\n\\nNote: delete events bypass field filters because the record no longer exists.',\n 'settings:webhooks.editor.secretHint': 'Random string used to sign each delivery with HMAC-SHA256. Verify the X-Webhook-Signature header on your server to ensure the request is genuine.',\n 'chart:dashboard': 'Painel',\n 'chart:addChart': 'Adicionar gráfico',\n 'chart:newChart': 'Novo gráfico',\n 'chart:editChart': 'Editar gráfico',\n 'chart:deleteChart': 'Remover gráfico',\n 'chart:noCharts': 'Nenhum gráfico ainda',\n 'chart:noChartsHint': 'Adicione um gráfico para começar a monitorar seus dados.',\n 'chart:addGroup': 'Adicionar grupo',\n 'chart:newGroup': 'Novo grupo',\n 'chart:editGroup': 'Editar grupo',\n 'chart:deleteGroup': 'Remover grupo',\n 'chart:saveGroup': 'Salvar grupo',\n 'chart:groupName': 'Nome do grupo',\n 'chart:groupNamePlaceholder': 'ex. Métricas de vendas',\n 'chart:groupNameRequired': 'O nome do grupo é obrigatório',\n 'chart:groupOrder': 'Ordem do grupo',\n 'chart:order': 'Ordem',\n 'chart:orderHint': 'Valores menores aparecem primeiro.',\n 'chart:moveToGroup': 'Mover para grupo',\n 'chart:moveChart': 'Mover gráfico',\n 'chart:moveGroup': 'Grupo',\n 'chart:moveNoGroups': 'Nenhum grupo ainda.',\n 'chart:moveNoGroupsHint': 'Crie um grupo primeiro para organizar seus gráficos.',\n 'chart:deleteChartConfirm': 'Remover este gráfico?',\n 'chart:deleteChartConfirmHint': 'Esta ação não pode ser desfeita.',\n 'chart:deleteGroupConfirm': 'Remover este grupo?',\n 'chart:deleteGroupConfirmHint': 'O grupo e os {count} gráfico(s) que ele contém serão excluídos permanentemente.',\n 'chart:title': 'Título',\n 'chart:titlePlaceholder': 'ex. Novos usuários por dia',\n 'chart:untitled': 'Sem título',\n 'chart:chartType': 'Tipo de gráfico',\n 'chart:resource': 'Recurso',\n 'chart:groupBy': 'Agrupar por',\n 'chart:step': 'Passo',\n 'chart:metric': 'Métrica',\n 'chart:aggregateField': 'Campo de agregação',\n 'chart:selectField': 'Selecionar campo…',\n 'chart:saveChart': 'Salvar gráfico',\n 'chart:typeLine': 'Linha',\n 'chart:typeArea': 'Área',\n 'chart:typeBar': 'Barras',\n 'chart:typePie': 'Pizza',\n 'chart:stepDay': 'Dia',\n 'chart:stepWeek': 'Semana',\n 'chart:stepMonth': 'Mês',\n 'chart:stepYear': 'Ano',\n 'chart:metricCount': 'Contagem',\n 'chart:metricSum': 'Soma',\n 'chart:metricAvg': 'Média',\n 'chart:noData': 'Sem dados para o período selecionado',\n 'chart:loadError': 'Falha ao carregar dados do gráfico',\n 'chart:value': 'Valor',\n 'dashboard:vis': 'Visualização',\n 'dashboard:visKpi': 'KPI',\n 'dashboard:visLine': 'Linha',\n 'dashboard:visArea': 'Área',\n 'dashboard:visBar': 'Barras',\n 'dashboard:visPie': 'Pizza',\n 'dashboard:metricCount': 'Contagem',\n 'dashboard:metricSum': 'Soma',\n 'dashboard:metricAvg': 'Média',\n 'dashboard:metricMin': 'Mín',\n 'dashboard:metricMax': 'Máx',\n 'dashboard:builder.range': 'Período',\n 'dashboard:builder.filters': 'Filtros',\n 'dashboard:builder.filtersHint': 'Restringe o conjunto de dados antes da agregação. Marque um filtro para exibi-lo acima do gráfico.',\n 'dashboard:builder.quickFilterHint': 'Exibir este filtro acima do gráfico no painel.',\n 'dashboard:builder.quickFilterToggle': 'Expor {field} como filtro rápido',\n 'dashboard:range.7d': '7d',\n 'dashboard:range.30d': '30d',\n 'dashboard:range.90d': '90d',\n 'dashboard:range.1y': '1a',\n 'dashboard:range.all': 'Tudo',\n 'dashboard:range.custom': 'Personalizado',\n 'dashboard:widget.previousPeriod': 'vs. período anterior',\n 'dashboard:widget.deltaUp': '+{value} ({percent}%)',\n 'dashboard:widget.deltaDown': '−{value} ({percent}%)',\n 'dashboard:widget.deltaFlat': '{value} ({percent}%)',\n 'dashboard:widget.shrink': 'Reduzir para metade da largura',\n 'dashboard:widget.expand': 'Expandir para linha inteira',\n 'dashboard:widget.toggleSql': 'Mostrar SQL',\n 'dashboard:widget.unsupported': 'Gráficos ainda não são suportados para o seu banco de dados.',\n 'dashboard:widget.truncatedWarning': 'Exibindo dados parciais — muitas linhas para agregar todo o intervalo.',\n 'dashboard:widget.showAll': 'Mostrar tudo',\n 'dashboard:widget.hideAll': 'Ocultar tudo',\n 'dashboard:seriesTotal': 'Total',\n 'dashboard:seriesOther': 'Outros',\n 'dashboard:seriesNull': 'Vazio',\n 'dashboard:builder.dateField': 'Campo de data',\n 'dashboard:builder.dateFieldHint': 'O eixo X é agrupado por esta coluna de data.',\n 'dashboard:builder.secondaryGroupBy': 'Detalhamento',\n 'dashboard:builder.noBreakdown': 'Série única',\n 'dashboard:builder.topN': 'Máx. séries',\n 'dashboard:builder.width': 'Largura',\n 'dashboard:width.half': 'Metade',\n 'dashboard:width.full': 'Linha inteira',\n 'history:revisions': 'Revisões',\n 'history:noRevisions': 'Ainda não há revisões',\n 'history:loadError': 'Não foi possível carregar o histórico de alterações',\n 'history:revert': 'Reverter',\n 'history:confirmRevert': 'Reverter para esta revisão?',\n 'history:revertSuccess': 'Revisão restaurada',\n 'history:revertFailed': 'Não foi possível restaurar a revisão',\n 'history:unknownUser': 'Usuário desconhecido',\n 'history:changes': 'alterações',\n 'history:compareTo': 'Comparar com',\n 'history:storedDiff': 'Diff da alteração',\n 'history:op.create': 'Criado',\n 'history:op.update': 'Atualizado',\n 'history:op.delete': 'Removido',\n 'diff:added': 'Adicionado',\n 'diff:changed': 'Alterado',\n 'diff:removed': 'Removido',\n 'diff:before': 'Antes',\n 'diff:after': 'Depois',\n 'diff:noChanges': 'Nenhuma alteração de campo registrada',\n 'audit:title': 'Atividade',\n 'audit:resource': 'Recurso',\n 'audit:action': 'Ação',\n 'audit:recordId': 'ID do registro',\n 'audit:userId': 'ID do usuário',\n 'audit:allResources': 'Todos os recursos',\n 'audit:allActions': 'Todas as ações',\n 'audit:noEvents': 'Ainda não há atividade',\n 'audit:records': 'registros',\n 'audit:loadError': 'Não foi possível carregar a atividade',\n 'audit:by': 'por {user}',\n 'audit:viewRecord': 'Ver registro',\n 'audit:viewChanges': 'Ver alterações',\n 'audit:hideChanges': 'Ocultar alterações',\n 'audit:noDiff': 'Detalhes das alterações indisponíveis',\n 'audit:loadDiffError': 'Falha ao carregar alterações',\n 'audit:action.new': 'Registro criado',\n 'audit:action.edit': 'Registro atualizado',\n 'audit:action.delete': 'Registro removido',\n 'audit:action.bulkDelete': 'Registros removidos',\n 'audit:action.login': 'Login realizado',\n 'audit:action.apiKeyCreate': 'Chave de API criada',\n 'audit:action.apiKeyUpdate': 'Chave de API atualizada',\n 'audit:action.apiKeyDelete': 'Chave de API excluída',\n 'audit:virtualResource.auth': 'Autenticação',\n 'audit:virtualResource.apiKeys': 'Chaves de API',\n 'audit:prevPage': 'Anterior',\n 'audit:nextPage': 'Próxima',\n 'audit:dateRangePlaceholder': 'Selecionar período',\n 'keyValue:noMatches': 'Sem correspondências — pressione Enter para manter \"{value}\".',\n 'aiAssistant:queue.cancel': 'Remover da fila',\n 'aiAssistant:title': 'Assistente IA',\n 'aiAssistant:fab.label': 'Abrir assistente IA',\n 'aiAssistant:fab.short': 'IA',\n 'aiAssistant:description': 'Faça perguntas sobre registros, relacionamentos, relatórios e tendências de dados.',\n 'aiAssistant:notConfigured.title': 'Assistente não configurado',\n 'aiAssistant:notConfigured.description': 'Adicione a chave de API do OpenRouter nas configurações para ativar o assistente IA somente leitura.',\n 'aiAssistant:notConfigured.openSettings': 'Abrir configurações',\n 'aiAssistant:tryAsking': 'Experimente perguntar:',\n 'aiAssistant:tryAsking.example1': 'Quais clientes têm mais publicações?',\n 'aiAssistant:tryAsking.example2': 'Mostrar registros criados recentemente para um recurso.',\n 'aiAssistant:tryAsking.example3': 'Explique relacionamentos entre registros específicos.',\n 'aiAssistant:thinking': 'Pensando',\n 'aiAssistant:thinkingProgress': 'Pensando ({progress}%)',\n 'aiAssistant:input.placeholder': 'Pergunte sobre seus dados…',\n 'aiAssistant:input.hint': 'Enter para enviar · Shift+Enter para nova linha',\n 'aiAssistant:send': 'Enviar mensagem',\n 'aiAssistant:newChat': 'Novo chat',\n 'aiAssistant:history': 'Histórico de chats',\n 'aiAssistant:history.empty': 'Nenhum chat anterior',\n 'aiAssistant:noText': 'Aqui estão os registros relacionados encontrados:',\n 'aiAssistant:fallback.noToolResult': 'A solicitação foi executada, mas o modelo não retornou uma resposta em texto. Tente refinar a pergunta ou habilite os logs de debug para inspecionar o resultado da ferramenta.',\n 'aiAssistant:fallback.noRows': 'Nenhum registro foi encontrado para esta solicitação.',\n 'aiAssistant:fallback.rowsFound': 'Linhas encontradas: {count}.',\n 'aiAssistant:taskFailed': 'A tarefa do assistente IA falhou',\n 'aiAssistant:settings.title': 'Assistente IA',\n 'aiAssistant:settings.description': 'Configure o widget flutuante de chat IA, o modelo e o comportamento do assistente no servidor.',\n 'aiAssistant:settings.enabled': 'Ativado',\n 'aiAssistant:settings.disabled': 'Desativado',\n 'aiAssistant:settings.configured': 'Configurado',\n 'aiAssistant:settings.apiKeyRequired': 'Chave de API necessária',\n 'aiAssistant:settings.readOnly': 'Somente leitura',\n 'aiAssistant:settings.provider': 'Provedor: {provider}',\n 'aiAssistant:settings.enableLabel': 'Ativar assistente',\n 'aiAssistant:settings.enableHint': 'Controla a visibilidade do widget flutuante e do endpoint de chat.',\n 'aiAssistant:settings.modelLabel': 'Modelo OpenRouter',\n 'aiAssistant:settings.apiKeyLabel': 'Chave de API OpenRouter',\n 'aiAssistant:settings.apiKeyHint': 'Deixe em branco para manter a chave existente salva no servidor.',\n 'aiAssistant:settings.systemPromptLabel': 'Substituição do prompt do sistema',\n 'aiAssistant:settings.systemPromptPlaceholder': 'Instruções opcionais específicas do projeto para o assistente',\n 'aiAssistant:settings.accessTitle': 'Modelo de acesso',\n 'aiAssistant:settings.accessDescription': 'O assistente atual está limitado à inspeção somente leitura de registros por meio das ações de recursos de administração.',\n 'aiAssistant:settings.futureToolsReady': 'Ferramentas futuras prontas',\n 'aiAssistant:settings.save': 'Salvar configurações',\n 'aiAssistant:settings.saving': 'Salvando…',\n 'aiAssistant:settings.saved': 'Configurações do assistente IA salvas',\n 'aiAssistant:settings.empty': 'Nenhuma configuração disponível.',\n 'aiFill:button': 'Preencher com IA',\n 'aiFill:dialogTitle': 'Preencher formulário a partir de uma foto',\n 'aiFill:dialogDescription': 'Envie uma imagem — a IA extrairá os valores e preencherá o formulário.',\n 'aiFill:fillButton': 'Reconhecer',\n 'aiFill:processing': 'Reconhecendo imagem\\u2026',\n 'aiFill:success': '{count} campo(s) preenchido(s)',\n 'aiFill:errorNoFields': 'Este recurso não tem campos preenchíveis pela IA.',\n 'aiFill:errorGeneric': 'Falha no preenchimento pela IA: {message}',\n 'aiFill:noValues': 'A IA não conseguiu extrair valores desta imagem.',\n 'aiFill:applied': 'A IA preencheu {count} campo(s). Você pode desfazer abaixo.',\n 'filter:op.co': 'Contém',\n 'filter:op.nco': 'Não contém',\n 'filter:op.sw': 'Começa com',\n 'filter:op.ew': 'Termina com',\n 'filter:op.eq': 'É igual a',\n 'filter:op.neq': 'Não é igual a',\n 'filter:op.empty': 'Está vazio',\n 'filter:op.nempty': 'Não está vazio',\n 'filter:op.in': 'É um de',\n 'filter:op.gt': 'Maior que',\n 'filter:op.lt': 'Menor que',\n 'filter:op.between': 'Entre',\n 'filter:searchValues': 'Buscar na lista…',\n 'filter:selectAll': 'Selecionar tudo',\n 'filter:noValues': 'Nenhum valor encontrado',\n 'common:newRecord': 'Novo {name}',\n 'common:editRecord': 'Editar {name} #{id}',\n 'common:themeLight': 'Claro',\n 'common:themeDark': 'Escuro',\n 'common:themeSystem': 'Sistema',\n 'common:ok': 'OK',\n 'common:select': 'Selecionar…',\n 'common:removeItem': 'Remover {title}',\n 'common:nSelectedAddMore': '{count} selecionado(s) — adicionar mais',\n 'common:pickRecords': 'Escolher registros',\n 'common:managePickRecords': 'Gerenciar seleção ({count})',\n 'common:pickRecordsFrom': 'Escolher de {name}',\n 'common:draftRestored': 'Rascunho não salvo restaurado',\n 'common:undoDraftRestore': 'Desfazer',\n 'wizard:stepOf': 'Passo {current} de {total}',\n 'wizard:products.step1': 'Informações básicas',\n 'wizard:products.step2': 'Preços',\n 'wizard:products.step3': 'Mídia e tags',\n 'common:invalidValue': 'Valor inválido',\n 'common:collapseSidebar': 'Recolher barra lateral',\n 'common:expandSidebar': 'Expandir barra lateral',\n 'common:toggleSidebar': 'Alternar barra lateral',\n 'common:sidebarTitle': 'Barra lateral',\n 'common:sidebarNavigation': 'Menu de navegação',\n },\n}\n","// @modern-admin/i18n — small translation registry plus 9 packaged locales.\n// The runtime is intentionally minimal so consumers can swap it for i18next\n// or react-intl by re-implementing the `I18n` surface.\n\nexport { I18n, type I18nOptions } from './i18n.js'\nexport type { LocaleBundle, TranslationDict } from './types.js'\n\nexport { en } from './locales/en.js'\nexport { ru } from './locales/ru.js'\nexport { de } from './locales/de.js'\nexport { fr } from './locales/fr.js'\nexport { es } from './locales/es.js'\nexport { it } from './locales/it.js'\nexport { ja } from './locales/ja.js'\nexport { pl } from './locales/pl.js'\nexport { ptBR } from './locales/pt-BR.js'\n\nimport { en } from './locales/en.js'\nimport { ru } from './locales/ru.js'\nimport { de } from './locales/de.js'\nimport { fr } from './locales/fr.js'\nimport { es } from './locales/es.js'\nimport { it } from './locales/it.js'\nimport { ja } from './locales/ja.js'\nimport { pl } from './locales/pl.js'\nimport { ptBR } from './locales/pt-BR.js'\n\n/** All locales bundled with @modern-admin/i18n out of the box. */\nexport const builtinLocales = [en, ru, de, fr, es, it, ja, pl, ptBR]\n","// React bindings for @modern-admin/i18n. Wraps the I18n registry in a\n// provider, persists the active locale in localStorage, and exposes a\n// `useI18n()` hook that re-renders subscribers on locale changes.\n\nimport * as React from 'react'\nimport { I18n, builtinLocales, type LocaleBundle } from '@modern-admin/i18n'\nimport type { KeyValueFieldSpec, PropertyJSON, RelatedResource, ResourceJSON } from './types.js'\n\nconst STORAGE_KEY = 'modern-admin:locale'\n\nexport interface MetadataKeyValueFieldTranslations {\n label?: string\n description?: string\n placeholder?: string\n availableValues?: Record<string, string>\n}\n\nexport interface MetadataPropertyTranslations {\n label?: string\n description?: string\n availableValues?: Record<string, string>\n keyValueFields?: Record<string, MetadataKeyValueFieldTranslations>\n}\n\nexport interface MetadataActionTranslations {\n /** Display label shown in action menus, buttons, and tooltips. */\n label?: string\n}\n\nexport interface MetadataResourceTranslations {\n label?: string\n name?: string\n navigation?: {\n name?: string\n group?: string\n }\n properties?: Record<string, MetadataPropertyTranslations>\n /** Per-action overrides keyed by action name (e.g. `publish`, `archive`). */\n actions?: Record<string, MetadataActionTranslations>\n /**\n * Tab label overrides for related-resource tabs on the show page.\n * Key is the related resource's `resourceId`.\n */\n relatedResources?: Record<string, string>\n}\n\nexport interface MetadataLocaleTranslations {\n navigation?: {\n groups?: Record<string, string>\n }\n resources?: Record<string, MetadataResourceTranslations>\n properties?: Record<string, MetadataPropertyTranslations>\n}\n\nexport type MetadataTranslations = Record<string, MetadataLocaleTranslations>\n\nconst isDefined = <T,>(value: T | undefined): value is T => value !== undefined\n\nconst firstDefined = <T,>(...values: Array<T | undefined>): T | undefined =>\n values.find(isDefined)\n\nconst localizeAvailableValues = (\n availableValues: Array<{ value: string; label: string }> | null,\n ...maps: Array<Record<string, string> | undefined>\n): Array<{ value: string; label: string }> | null => {\n if (!availableValues) return availableValues\n return availableValues.map((option) => ({\n ...option,\n label: firstDefined(...maps.map((map) => map?.[option.value]), option.label) ?? option.label,\n }))\n}\n\nconst localizeKeyValueField = (\n field: KeyValueFieldSpec,\n ...translations: Array<MetadataKeyValueFieldTranslations | undefined>\n): KeyValueFieldSpec => ({\n ...field,\n label: firstDefined(...translations.map((translation) => translation?.label), field.label),\n description: firstDefined(...translations.map((translation) => translation?.description), field.description),\n placeholder: firstDefined(...translations.map((translation) => translation?.placeholder), field.placeholder),\n availableValues: field.availableValues?.map((option) => {\n if (typeof option === 'string') {\n const label =\n firstDefined(...translations.map((translation) => translation?.availableValues?.[option]), option) ??\n option\n return { value: option, label }\n }\n return {\n ...option,\n label:\n firstDefined(...translations.map((translation) => translation?.availableValues?.[option.value]), option.label) ??\n option.label,\n }\n }),\n})\n\n/**\n * Applies translated tab labels to `relatedResources`. Each translation map\n * is keyed by `resourceId`; the first map that has a matching entry wins.\n * Exported for unit testing.\n */\nexport const localizeRelatedResources = (\n relatedResources: RelatedResource[] | undefined,\n ...translations: Array<Record<string, string> | undefined>\n): RelatedResource[] | undefined => {\n if (!relatedResources) return relatedResources\n return relatedResources.map((r) => {\n const translatedLabel = firstDefined(...translations.map((map) => map?.[r.resourceId]))\n return translatedLabel !== undefined ? { ...r, label: translatedLabel } : r\n })\n}\n\nconst localizeProperty = (\n property: PropertyJSON,\n ...translations: Array<MetadataPropertyTranslations | undefined>\n): PropertyJSON => ({\n ...property,\n label: firstDefined(...translations.map((translation) => translation?.label), property.label) ?? property.label,\n description: firstDefined(...translations.map((translation) => translation?.description), property.description),\n availableValues: localizeAvailableValues(\n property.availableValues,\n ...translations.map((translation) => translation?.availableValues),\n ),\n keyValueFields: property.keyValueFields?.map((field) =>\n localizeKeyValueField(\n field,\n ...translations.map((translation) => translation?.keyValueFields?.[field.key]),\n ),\n ),\n})\n\ninterface I18nContextValue {\n locale: string\n setLocale(code: string): void\n t(key: string, params?: Record<string, unknown>): string\n availableLocales(): Array<{ code: string; name: string }>\n localizeResource(resource: ResourceJSON): ResourceJSON\n}\n\nconst I18nContext = React.createContext<I18nContextValue | null>(null)\n\nexport interface I18nProviderProps {\n children: React.ReactNode\n /** Override or extend the bundled locales. Defaults to all 9 built-ins. */\n locales?: LocaleBundle[]\n defaultLocale?: string\n fallbackLocale?: string\n metadataTranslations?: MetadataTranslations\n}\n\nexport function I18nProvider({\n children,\n locales = builtinLocales,\n defaultLocale,\n fallbackLocale = 'en',\n metadataTranslations,\n}: I18nProviderProps): React.ReactElement {\n const i18n = React.useMemo(() => {\n const initial =\n (typeof localStorage !== 'undefined' && localStorage.getItem(STORAGE_KEY)) ||\n defaultLocale ||\n locales[0]?.code\n return new I18n({ locales, defaultLocale: initial ?? undefined, fallbackLocale })\n }, [locales, defaultLocale, fallbackLocale])\n\n const [locale, setLocaleState] = React.useState(() => i18n.locale)\n\n const localizeResource = React.useCallback(\n (resource: ResourceJSON): ResourceJSON => {\n const localeMeta = metadataTranslations?.[locale]\n const fallbackMeta = metadataTranslations?.[fallbackLocale]\n const resourceLocale = localeMeta?.resources?.[resource.id]\n const resourceFallback = fallbackMeta?.resources?.[resource.id]\n const localizedName =\n firstDefined(resourceLocale?.label, resourceLocale?.name, resourceFallback?.label, resourceFallback?.name, resource.name) ??\n resource.name\n const group = resource.navigation?.group\n return {\n ...resource,\n name: localizedName,\n navigation:\n resource.navigation === null\n ? null\n : resource.navigation\n ? {\n ...resource.navigation,\n name: firstDefined(\n resourceLocale?.navigation?.name,\n resourceFallback?.navigation?.name,\n resource.navigation.name,\n ),\n group: firstDefined(\n resourceLocale?.navigation?.group,\n resourceFallback?.navigation?.group,\n group ? localeMeta?.navigation?.groups?.[group] : undefined,\n group ? fallbackMeta?.navigation?.groups?.[group] : undefined,\n resource.navigation.group,\n ),\n }\n : resource.navigation,\n properties: resource.properties.map((property) =>\n localizeProperty(\n property,\n resourceLocale?.properties?.[property.path],\n localeMeta?.properties?.[property.path],\n resourceFallback?.properties?.[property.path],\n fallbackMeta?.properties?.[property.path],\n ),\n ),\n actions: resource.actions.map((action) => {\n const localizedLabel = firstDefined(\n resourceLocale?.actions?.[action.name]?.label,\n resourceFallback?.actions?.[action.name]?.label,\n )\n if (localizedLabel === undefined) return action\n return {\n ...action,\n custom: { ...(action.custom ?? {}), label: localizedLabel },\n }\n }),\n relatedResources: localizeRelatedResources(\n resource.relatedResources,\n resourceLocale?.relatedResources,\n resourceFallback?.relatedResources,\n ),\n }\n },\n [fallbackLocale, locale, metadataTranslations],\n )\n\n const setLocale = React.useCallback(\n (code: string) => {\n i18n.setLocale(code)\n if (typeof localStorage !== 'undefined') localStorage.setItem(STORAGE_KEY, code)\n setLocaleState(i18n.locale)\n },\n [i18n],\n )\n\n const value = React.useMemo<I18nContextValue>(\n () => ({\n locale,\n setLocale,\n t: (key, params) => i18n.t(key, params),\n availableLocales: () => i18n.availableLocales(),\n localizeResource,\n }),\n [locale, setLocale, i18n, localizeResource],\n )\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>\n}\n\n/** Subscribe to the active locale + translations. Falls back to a no-op\n * implementation when no provider is mounted, so consumers can render\n * without forcing apps to install i18n. */\nexport function useI18n(): I18nContextValue {\n const ctx = React.useContext(I18nContext)\n if (ctx) return ctx\n return {\n locale: 'en',\n setLocale: () => {},\n t: (k) => k,\n availableLocales: () => [{ code: 'en', name: 'English' }],\n localizeResource: (resource) => resource,\n }\n}\n","// TanStack Query hooks that wrap AdminClient. Query keys are\n// `[resourceId, action, params?]` so cache invalidation is precise.\n\nimport * as React from 'react'\nimport {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type InfiniteData,\n type QueryClient,\n type UseInfiniteQueryResult,\n type UseMutationResult,\n type UseQueryResult,\n} from '@tanstack/react-query'\nimport { useAdminClient } from './provider.js'\nimport type {\n AdminConfig,\n AdminFeatures,\n CustomActionResponse,\n CurrentUser,\n ListQuery,\n ListResponse,\n RecordResponse,\n ResourceJSON,\n} from './types.js'\nimport { resolveFeatures } from './types.js'\nimport {\n AdminApiError,\n type AuthUiProps,\n type AuditLogQuery,\n type AuditLogResponse,\n type GlobalSearchResponse,\n type HistoryListResponse,\n type HistoryRevisionResponse,\n type TimeSeriesQuery,\n type TimeSeriesResponse,\n} from './client.js'\nimport { useI18n } from './i18n.js'\n\nconst KEY_CONFIG = ['modern-admin', 'config'] as const\nconst keyList = (resourceId: string, query?: ListQuery) =>\n ['modern-admin', resourceId, 'list', query ?? null] as const\nconst keyShow = (resourceId: string, recordId: string) =>\n ['modern-admin', resourceId, 'show', recordId] as const\nconst keyHistory = (resourceId: string, recordId: string) =>\n ['modern-admin', resourceId, 'history', recordId] as const\nconst keyHistoryRevision = (resourceId: string, recordId: string, revisionId: string) =>\n ['modern-admin', resourceId, 'history', recordId, revisionId] as const\nconst keyAuditLog = (query?: AuditLogQuery) =>\n ['modern-admin', 'audit-log', query ?? null] as const\n\n/**\n * Resources whose cached queries embed data of `resourceId` or aggregate\n * over it — computed from the bootstrap config's reference graph:\n *\n * * resources with a property referencing `resourceId` (their list rows\n * render its records via `populated`),\n * * resources that `resourceId` itself references (their show pages\n * surface child rows / counts through related-records tables).\n *\n * Mirrors the server-side dependents map in `ModernAdmin` so both cache\n * layers drop the same scopes on a mutation.\n */\nconst linkedResourceIds = (\n config: AdminConfig | undefined,\n resourceId: string,\n): Set<string> => {\n const linked = new Set<string>()\n for (const resource of config?.resources ?? []) {\n if (resource.id === resourceId) {\n for (const property of resource.properties) {\n if (property.reference) linked.add(property.reference)\n }\n } else if (resource.properties.some((p) => p.reference === resourceId)) {\n linked.add(resource.id)\n }\n }\n linked.delete(resourceId)\n return linked\n}\n\n/**\n * Central client-side invalidation for a mutation on `resourceId`. Marks\n * stale (active queries refetch immediately, inactive on next mount):\n *\n * * everything under `['modern-admin', <resourceId>]` — list/show/\n * values/search of the mutated resource,\n * * the same prefix for every linked resource (see `linkedResourceIds`)\n * so populated reference labels and related-record tables refresh,\n * * cross-resource aggregate caches that key a literal at index 1 and\n * therefore never prefix-match a resource id: field suggestions, the\n * user directory, global search, dashboard time series, audit log.\n *\n * Exported for realtime wiring and imperative call sites; the mutation\n * hooks below all route through it.\n */\nexport const invalidateResourceData = (qc: QueryClient, resourceId: string): void => {\n void qc.invalidateQueries({ queryKey: ['modern-admin', resourceId] })\n const config = qc.getQueryData<AdminConfig>(KEY_CONFIG)\n for (const linked of linkedResourceIds(config, resourceId)) {\n void qc.invalidateQueries({ queryKey: ['modern-admin', linked] })\n }\n void qc.invalidateQueries({ queryKey: ['modern-admin', 'fieldSuggestions', resourceId] })\n void qc.invalidateQueries({ queryKey: ['modern-admin', 'user-dir', resourceId] })\n void qc.invalidateQueries({ queryKey: ['modern-admin', 'global-search'] })\n void qc.invalidateQueries({ queryKey: ['modern-admin', 'timeseries'] })\n void qc.invalidateQueries({ queryKey: ['modern-admin', 'audit-log'] })\n void qc.invalidateQueries({ queryKey: ['modern-admin', 'audit-log-infinite'] })\n}\n\nexport const useAdminConfig = (): UseQueryResult<AdminConfig> => {\n const client = useAdminClient()\n return useQuery({ queryKey: KEY_CONFIG, queryFn: () => client.config(), staleTime: 60_000 })\n}\n\nexport const useResource = (resourceId: string | undefined): ResourceJSON | undefined => {\n const { data } = useAdminConfig()\n const { localizeResource } = useI18n()\n return React.useMemo(() => {\n const resource = data?.resources.find((r) => r.id === resourceId)\n return resource ? localizeResource(resource) : undefined\n }, [data?.resources, localizeResource, resourceId])\n}\n\n/**\n * Capability flags advertised by the backend via `/admin/api/config`.\n * Use to gate optional UI surfaces (audit-log link, settings sections,\n * revisions button, AI assistant widget) — every flag is `false` until\n * the bootstrap config is loaded, so consumers can render unconditionally\n * and the gating logic short-circuits during the initial paint.\n */\nexport const useFeatures = (): AdminFeatures => {\n const { data } = useAdminConfig()\n return React.useMemo(() => resolveFeatures(data?.features), [data?.features])\n}\n\nexport const useResources = (): ResourceJSON[] => {\n const { data } = useAdminConfig()\n const { localizeResource } = useI18n()\n return React.useMemo(\n () => (data?.resources ?? []).map((resource) => localizeResource(resource)),\n [data?.resources, localizeResource],\n )\n}\n\n/**\n * Fetch distinct values for a field, cached for 5 minutes.\n * Used by the filter value picker to offer multi-select when cardinality is low.\n * The `enabled` flag allows lazy loading only when the filter UI is open.\n */\nexport const useDistinctValues = (\n resourceId: string,\n field: string,\n options?: { search?: string; limit?: number; enabled?: boolean },\n): UseQueryResult<{ values: string[]; hasMore: boolean }> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: ['modern-admin', resourceId, 'values', field, options?.search ?? '', options?.limit ?? 100] as const,\n queryFn: () => client.distinctValues(resourceId, field, {\n search: options?.search,\n limit: options?.limit,\n }),\n staleTime: 5 * 60_000, // 5 min cache\n enabled: options?.enabled !== false,\n })\n}\n\nexport const useRecords = (\n resourceId: string,\n query?: ListQuery,\n): UseQueryResult<ListResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: keyList(resourceId, query),\n queryFn: () => client.list(resourceId, query),\n // Keep the previous page/sort/filter results on screen while the next\n // query loads (and during background invalidations) instead of blanking\n // the table to skeletons. Skeletons show only on the true first load\n // (`isPending`), where there is no prior data to hold.\n placeholderData: keepPreviousData,\n })\n}\n\nexport const useRecord = (\n resourceId: string,\n recordId: string | undefined,\n): UseQueryResult<RecordResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: keyShow(resourceId, recordId ?? ''),\n queryFn: () => client.show(resourceId, recordId!),\n enabled: !!recordId,\n })\n}\n\nexport const useCreateRecord = (\n resourceId: string,\n): UseMutationResult<RecordResponse, Error, Record<string, unknown>> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: (payload) => client.create(resourceId, payload),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nexport const useUpdateRecord = (\n resourceId: string,\n): UseMutationResult<\n RecordResponse,\n Error,\n { id: string; payload: Record<string, unknown> }\n> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({ id, payload }) => client.update(resourceId, id, payload),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nexport const useDeleteRecord = (\n resourceId: string,\n): UseMutationResult<void, Error, string> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: (id) => client.delete(resourceId, id),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nexport const useBulkDeleteRecords = (\n resourceId: string,\n): UseMutationResult<unknown, Error, ReadonlyArray<string>> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: (ids) => client.bulkDelete(resourceId, ids),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nconst keySearch = (resourceId: string, query: string) =>\n ['modern-admin', resourceId, 'search', query] as const\n\n/**\n * Live-search hook against a resource's `search` action. Used by reference\n * comboboxes — debounce the input on the call site.\n */\n// ─── Auth ─────────────────────────────────────────────────────────────────\n\nconst KEY_ME = ['modern-admin', 'auth', 'me'] as const\nconst KEY_AUTH_UI = ['modern-admin', 'auth', 'ui-props'] as const\n\nexport interface CurrentUserResult {\n user: CurrentUser | null\n isLoading: boolean\n isAuthenticated: boolean\n error: Error | null\n}\n\n/** Resolve the current admin via /admin/api/auth/me. A 401 response surfaces\n * as `user: null` (rather than an error) so callers can branch on it to\n * render the login screen. */\nexport const useCurrentUser = (): CurrentUserResult => {\n const client = useAdminClient()\n const query = useQuery<{ user: CurrentUser } | null, Error>({\n queryKey: KEY_ME,\n queryFn: async () => {\n try {\n return await client.me()\n } catch (err) {\n if (err instanceof AdminApiError && err.status === 401) return null\n throw err\n }\n },\n staleTime: 30_000,\n retry: (failureCount, err) => {\n if (err instanceof AdminApiError && err.status === 401) return false\n return failureCount < 1\n },\n })\n return {\n user: query.data?.user ?? null,\n isLoading: query.isLoading,\n isAuthenticated: !!query.data?.user,\n error: query.error,\n }\n}\n\n/** Fetch public auth UI metadata (enabled social providers, email/password flag).\n * Cached indefinitely — the provider list is static for a given deployment. */\nexport const useAuthUiProps = (): UseQueryResult<AuthUiProps> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: KEY_AUTH_UI,\n queryFn: () => client.getAuthUiProps(),\n staleTime: Infinity,\n })\n}\n\n/** Initiate OAuth social login. Navigates the browser away to the provider;\n * `isPending` is true while the redirect URL is being fetched. */\nexport const useSocialLogin = (): UseMutationResult<void, Error, string> => {\n const client = useAdminClient()\n return useMutation({\n mutationFn: (provider: string) => client.loginSocial(provider),\n })\n}\n\nexport const useLogin = (): UseMutationResult<\n void,\n Error,\n { email: string; password: string }\n> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({ email, password }) => client.login(email, password),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY_ME })\n qc.invalidateQueries({ queryKey: KEY_CONFIG })\n },\n })\n}\n\nexport const useLogout = (): UseMutationResult<void, Error, void> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: () => client.logout(),\n onSuccess: async () => {\n // Cancel any in-flight `me` refetch so it cannot overwrite the\n // optimistic null below and bounce the gate back to authenticated.\n await qc.cancelQueries({ queryKey: KEY_ME })\n // Flip the auth gate to \"logged out\" immediately. We deliberately\n // do NOT invalidate KEY_ME here — Better Auth has already deleted\n // the server-side session, but the Set-Cookie header may not be\n // applied to outgoing requests for a tick, and a refetch in that\n // window would return the still-valid user and cancel the logout\n // visually. The next mount/refresh will re-check freshly.\n qc.setQueryData(KEY_ME, null)\n // Drop every other cached resource so list/show data doesn't\n // linger behind the login form.\n qc.removeQueries({\n predicate: (q) => {\n const k = q.queryKey as readonly unknown[]\n return !(k[0] === 'modern-admin' && k[1] === 'auth' && k[2] === 'me')\n },\n })\n },\n })\n}\n\nexport const useInvokeRecordAction = (\n resourceId: string,\n): UseMutationResult<CustomActionResponse, Error, { recordId: string; actionName: string }> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({ recordId, actionName }) =>\n client.invokeRecordAction(resourceId, recordId, actionName),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nexport const useInvokeBulkAction = (\n resourceId: string,\n): UseMutationResult<CustomActionResponse, Error, { actionName: string; ids: string[] }> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({ actionName, ids }) => client.invokeBulkAction(resourceId, actionName, ids),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nexport const useInvokeResourceAction = (\n resourceId: string,\n): UseMutationResult<CustomActionResponse, Error, { actionName: string; payload?: Record<string, unknown> }> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({ actionName, payload }) => client.invokeResourceAction(resourceId, actionName, payload),\n onSuccess: () => {\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\n/**\n * Cross-resource search hook. Fires a single batched request that fans out\n * to every registered resource's `search` action; results are grouped by\n * resource. The empty-query case is handled by the caller (skip render);\n * `enabled` allows lazy activation while the dialog is closed.\n */\nexport const useGlobalSearch = (\n query: string,\n enabled = true,\n): UseQueryResult<GlobalSearchResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: ['modern-admin', 'global-search', query] as const,\n // Forward the AbortSignal TanStack Query attaches to each invocation.\n // The signal fires when the query key changes (next keystroke) or the\n // component unmounts, letting the server short-circuit stale work.\n queryFn: ({ signal }) => client.globalSearch(query, undefined, { signal }),\n enabled: enabled && query.trim().length > 0,\n staleTime: 30_000,\n })\n}\n\nexport const useSearchRecords = (\n resourceId: string | undefined,\n query: string,\n enabled = true,\n): UseQueryResult<ListResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: keySearch(resourceId ?? '', query),\n queryFn: () => client.search(resourceId!, query),\n enabled: !!resourceId && enabled,\n staleTime: 30_000,\n })\n}\n\n/**\n * Distinct (deduplicated, sorted) values pulled from a single field of a\n * resource — the data source for the autocomplete `suggestionsResource +\n * suggestionsField` binding on `KeyValueFieldSpec`. Loads up to `perPage`\n * records and projects `field` client-side; for typical admin resources\n * (hundreds–low thousands of rows) this is plenty cheap. For very large\n * tables, reach for a dedicated `distinct` endpoint.\n */\nexport const useFieldSuggestions = (\n resourceId: string | undefined,\n field: string | undefined,\n perPage = 200,\n): UseQueryResult<string[]> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: ['modern-admin', 'fieldSuggestions', resourceId ?? '', field ?? '', perPage],\n queryFn: async (): Promise<string[]> => {\n const res = await client.list(resourceId!, { perPage })\n const seen = new Set<string>()\n const out: string[] = []\n for (const r of res.records) {\n const raw = r.params?.[field!]\n if (raw == null || raw === '') continue\n const v = String(raw)\n if (seen.has(v)) continue\n seen.add(v)\n out.push(v)\n }\n out.sort((a, b) => a.localeCompare(b))\n return out\n },\n enabled: !!resourceId && !!field,\n staleTime: 60_000,\n })\n}\n\nexport const useTimeSeries = (\n query: TimeSeriesQuery | null,\n): UseQueryResult<TimeSeriesResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: ['modern-admin', 'timeseries', query],\n queryFn: () => client.timeseries(query!),\n enabled: query !== null && !!query.resource && !!query.dateField,\n staleTime: 60_000,\n })\n}\n\nexport const useRecordHistory = (\n resourceId: string,\n recordId: string | undefined,\n options: { limit?: number; offset?: number } = {},\n): UseQueryResult<HistoryListResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: [...keyHistory(resourceId, recordId ?? ''), options] as const,\n queryFn: () => client.listHistory(resourceId, recordId!, options),\n enabled: !!resourceId && !!recordId,\n staleTime: 30_000,\n })\n}\n\nexport const useHistoryRevision = (\n resourceId: string,\n recordId: string | undefined,\n revisionId: string | undefined,\n): UseQueryResult<HistoryRevisionResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: keyHistoryRevision(resourceId, recordId ?? '', revisionId ?? ''),\n queryFn: () => client.getHistoryRevision(resourceId, recordId!, revisionId!),\n enabled: !!resourceId && !!recordId && !!revisionId,\n staleTime: 30_000,\n })\n}\n\nexport const useRevertRevision = (\n resourceId: string,\n recordId: string,\n): UseMutationResult<RecordResponse, Error, { revisionId: string; reason?: string }> => {\n const client = useAdminClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({ revisionId, reason }) =>\n client.revertHistoryRevision(resourceId, recordId, revisionId, { reason }),\n onSuccess: () => {\n // `['modern-admin', resourceId]` already prefix-covers show/history/\n // revision keys of this record; the helper adds linked resources +\n // aggregate caches.\n invalidateResourceData(qc, resourceId)\n },\n })\n}\n\nexport const useAuditLog = (\n query: AuditLogQuery = {},\n): UseQueryResult<AuditLogResponse> => {\n const client = useAdminClient()\n return useQuery({\n queryKey: keyAuditLog(query),\n queryFn: () => client.listAuditLog(query),\n staleTime: 30_000,\n })\n}\n\n/**\n * Cursor-based infinite scroll variant of `useAuditLog`.\n * Each page passes the `at` timestamp of the last entry as the `before` cursor.\n * `pageSize` entries are requested; if the response is full, there are more pages.\n */\nexport const useInfiniteAuditLog = (\n filters: Omit<AuditLogQuery, 'before' | 'offset' | 'limit'>,\n pageSize: number,\n): UseInfiniteQueryResult<InfiniteData<AuditLogResponse>, Error> => {\n const client = useAdminClient()\n return useInfiniteQuery({\n queryKey: ['modern-admin', 'audit-log-infinite', filters],\n queryFn: ({ pageParam }) =>\n client.listAuditLog({\n ...filters,\n limit: pageSize + 1,\n before: pageParam as number | undefined,\n }),\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => {\n const events = lastPage.events\n if (events.length <= pageSize) return undefined\n return events[pageSize - 1]!.at\n },\n staleTime: 30_000,\n })\n}\n","import { isServer } from \"@tanstack/router-core/isServer\";\n//#region src/utils.ts\n/**\n* Return the last element of an array.\n* Intended for non-empty arrays used within router internals.\n*/\nfunction last(arr) {\n\treturn arr[arr.length - 1];\n}\nfunction isFunction(d) {\n\treturn typeof d === \"function\";\n}\n/**\n* Apply a value-or-updater to a previous value.\n* Accepts either a literal value or a function of the previous value.\n*/\nfunction functionalUpdate(updater, previous) {\n\tif (isFunction(updater)) return updater(previous);\n\treturn updater;\n}\nconst hasOwn = Object.prototype.hasOwnProperty;\nconst isEnumerable = Object.prototype.propertyIsEnumerable;\nfunction hasKeys(obj) {\n\tfor (const key in obj) if (hasOwn.call(obj, key)) return true;\n\treturn false;\n}\nconst createNull = () => Object.create(null);\nconst nullReplaceEqualDeep = (prev, next) => replaceEqualDeep(prev, next, createNull);\n/**\n* This function returns `prev` if `_next` is deeply equal.\n* If not, it will replace any deeply equal children of `b` with those of `a`.\n* This can be used for structural sharing between immutable JSON values for example.\n* Do not use this with signals\n*/\nfunction replaceEqualDeep(prev, _next, _makeObj = () => ({}), _depth = 0) {\n\tif (isServer) return _next;\n\tif (prev === _next) return prev;\n\tif (_depth > 500) return _next;\n\tconst next = _next;\n\tconst array = isPlainArray(prev) && isPlainArray(next);\n\tif (!array && !(isPlainObject(prev) && isPlainObject(next))) return next;\n\tconst prevItems = array ? prev : getEnumerableOwnKeys(prev);\n\tif (!prevItems) return next;\n\tconst nextItems = array ? next : getEnumerableOwnKeys(next);\n\tif (!nextItems) return next;\n\tconst prevSize = prevItems.length;\n\tconst nextSize = nextItems.length;\n\tconst copy = array ? new Array(nextSize) : _makeObj();\n\tlet equalItems = 0;\n\tfor (let i = 0; i < nextSize; i++) {\n\t\tconst key = array ? i : nextItems[i];\n\t\tconst p = prev[key];\n\t\tconst n = next[key];\n\t\tif (p === n) {\n\t\t\tcopy[key] = p;\n\t\t\tif (array ? i < prevSize : hasOwn.call(prev, key)) equalItems++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (p === null || n === null || typeof p !== \"object\" || typeof n !== \"object\") {\n\t\t\tcopy[key] = n;\n\t\t\tcontinue;\n\t\t}\n\t\tconst v = replaceEqualDeep(p, n, _makeObj, _depth + 1);\n\t\tcopy[key] = v;\n\t\tif (v === p) equalItems++;\n\t}\n\treturn prevSize === nextSize && equalItems === prevSize ? prev : copy;\n}\n/**\n* Equivalent to `Reflect.ownKeys`, but ensures that objects are \"clone-friendly\":\n* will return false if object has any non-enumerable properties.\n*\n* Optimized for the common case where objects have no symbol properties.\n*/\nfunction getEnumerableOwnKeys(o) {\n\tconst names = Object.getOwnPropertyNames(o);\n\tfor (const name of names) if (!isEnumerable.call(o, name)) return false;\n\tconst symbols = Object.getOwnPropertySymbols(o);\n\tif (symbols.length === 0) return names;\n\tconst keys = names;\n\tfor (const symbol of symbols) {\n\t\tif (!isEnumerable.call(o, symbol)) return false;\n\t\tkeys.push(symbol);\n\t}\n\treturn keys;\n}\nfunction isPlainObject(o) {\n\tif (!hasObjectPrototype(o)) return false;\n\tconst ctor = o.constructor;\n\tif (typeof ctor === \"undefined\") return true;\n\tconst prot = ctor.prototype;\n\tif (!hasObjectPrototype(prot)) return false;\n\tif (!prot.hasOwnProperty(\"isPrototypeOf\")) return false;\n\treturn true;\n}\nfunction hasObjectPrototype(o) {\n\treturn Object.prototype.toString.call(o) === \"[object Object]\";\n}\n/**\n* Check if a value is a \"plain\" array (no extra enumerable keys).\n*/\nfunction isPlainArray(value) {\n\treturn Array.isArray(value) && value.length === Object.keys(value).length;\n}\n/**\n* Perform a deep equality check with options for partial comparison and\n* ignoring `undefined` values. Optimized for router state comparisons.\n*/\nfunction deepEqual(a, b, opts) {\n\tif (a === b) return true;\n\tif (typeof a !== typeof b) return false;\n\tif (Array.isArray(a) && Array.isArray(b)) {\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0, l = a.length; i < l; i++) if (!deepEqual(a[i], b[i], opts)) return false;\n\t\treturn true;\n\t}\n\tif (isPlainObject(a) && isPlainObject(b)) {\n\t\tconst ignoreUndefined = opts?.ignoreUndefined ?? true;\n\t\tif (opts?.partial) {\n\t\t\tfor (const k in b) if (!ignoreUndefined || b[k] !== void 0) {\n\t\t\t\tif (!deepEqual(a[k], b[k], opts)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tlet aCount = 0;\n\t\tif (!ignoreUndefined) aCount = Object.keys(a).length;\n\t\telse for (const k in a) if (a[k] !== void 0) aCount++;\n\t\tlet bCount = 0;\n\t\tfor (const k in b) if (!ignoreUndefined || b[k] !== void 0) {\n\t\t\tbCount++;\n\t\t\tif (bCount > aCount || !deepEqual(a[k], b[k], opts)) return false;\n\t\t}\n\t\treturn aCount === bCount;\n\t}\n\treturn false;\n}\n/**\n* Create a promise with exposed resolve/reject and status fields.\n* Useful for coordinating async router lifecycle operations.\n*/\nfunction createControlledPromise(onResolve) {\n\tlet resolveLoadPromise;\n\tlet rejectLoadPromise;\n\tconst controlledPromise = new Promise((resolve, reject) => {\n\t\tresolveLoadPromise = resolve;\n\t\trejectLoadPromise = reject;\n\t});\n\tcontrolledPromise.status = \"pending\";\n\tcontrolledPromise.resolve = (value) => {\n\t\tcontrolledPromise.status = \"resolved\";\n\t\tcontrolledPromise.value = value;\n\t\tresolveLoadPromise(value);\n\t\tonResolve?.(value);\n\t};\n\tcontrolledPromise.reject = (e) => {\n\t\tcontrolledPromise.status = \"rejected\";\n\t\trejectLoadPromise(e);\n\t};\n\treturn controlledPromise;\n}\n/**\n* Heuristically detect dynamic import \"module not found\" errors\n* across major browsers for lazy route component handling.\n*/\nfunction isModuleNotFoundError(error) {\n\tif (typeof error?.message !== \"string\") return false;\n\treturn error.message.startsWith(\"Failed to fetch dynamically imported module\") || error.message.startsWith(\"error loading dynamically imported module\") || error.message.startsWith(\"Importing a module script failed\");\n}\nfunction isPromise(value) {\n\treturn Boolean(value && typeof value === \"object\" && typeof value.then === \"function\");\n}\nfunction findLast(array, predicate) {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tconst item = array[i];\n\t\tif (predicate(item)) return item;\n\t}\n}\n/**\n* Re-encode characters that are unsafe in URL paths.\n* Includes ASCII control characters (0x00-0x1F, 0x7F) and a subset of the\n* WHATWG URL \"path percent-encode set\" (\", <, >, `, {, }).\n*\n* Space (0x20) is intentionally excluded — decodeURI decodes %20 to space\n* and the router stores decoded spaces in location.pathname. The existing\n* encodePathLikeUrl already handles re-encoding spaces for outgoing URLs.\n*\n* These characters are decoded by decodeURI but must remain percent-encoded\n* in paths to match how upstream layers (CDNs, edge middleware, browsers)\n* interpret the URL, preventing infinite redirect loops and path mismatches.\n*/\nconst PATH_UNSAFE_RE = /[\\x00-\\x1f\\x7f\"<>`{}]/g;\nfunction sanitizePathSegment(segment) {\n\treturn segment.replace(PATH_UNSAFE_RE, (ch) => \"%\" + ch.charCodeAt(0).toString(16).toUpperCase().padStart(2, \"0\"));\n}\nfunction decodeSegment(segment) {\n\tlet decoded;\n\ttry {\n\t\tdecoded = decodeURI(segment);\n\t} catch {\n\t\tdecoded = segment.replaceAll(/%[0-9A-F]{2}/gi, (match) => {\n\t\t\ttry {\n\t\t\t\treturn decodeURI(match);\n\t\t\t} catch {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t});\n\t}\n\treturn sanitizePathSegment(decoded);\n}\n/**\n* Default list of URL protocols to allow in links, redirects, and navigation.\n* Any absolute URL protocol not in this list is treated as dangerous by default.\n*/\nconst DEFAULT_PROTOCOL_ALLOWLIST = [\n\t\"http:\",\n\t\"https:\",\n\t\"mailto:\",\n\t\"tel:\"\n];\n/**\n* Check if a URL string uses a protocol that is not in the allowlist.\n* Returns true for blocked protocols like javascript:, blob:, data:, etc.\n*\n* The URL constructor correctly normalizes:\n* - Mixed case (JavaScript: → javascript:)\n* - Whitespace/control characters (java\\nscript: → javascript:)\n* - Leading whitespace\n*\n* For relative URLs (no protocol), returns false (safe).\n*\n* @param url - The URL string to check\n* @param allowlist - Set of protocols to allow\n* @returns true if the URL uses a protocol that is not allowed\n*/\nfunction isDangerousProtocol(url, allowlist) {\n\tif (!url) return false;\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\treturn !allowlist.has(parsed.protocol);\n\t} catch {\n\t\treturn false;\n\t}\n}\nconst HTML_ESCAPE_LOOKUP = {\n\t\"&\": \"\\\\u0026\",\n\t\">\": \"\\\\u003e\",\n\t\"<\": \"\\\\u003c\",\n\t\"\\u2028\": \"\\\\u2028\",\n\t\"\\u2029\": \"\\\\u2029\"\n};\nconst HTML_ESCAPE_REGEX = /[&><\\u2028\\u2029]/g;\n/**\n* Escape HTML special characters in a string to prevent XSS attacks\n* when embedding strings in script tags during SSR.\n*\n* This is essential for preventing XSS vulnerabilities when user-controlled\n* content is embedded in inline scripts.\n*/\nfunction escapeHtml(str) {\n\treturn str.replace(HTML_ESCAPE_REGEX, (match) => HTML_ESCAPE_LOOKUP[match]);\n}\nfunction decodePath(path) {\n\tif (!path) return {\n\t\tpath,\n\t\thandledProtocolRelativeURL: false\n\t};\n\tif (!/[%\\\\\\x00-\\x1f\\x7f]/.test(path) && !path.startsWith(\"//\")) return {\n\t\tpath,\n\t\thandledProtocolRelativeURL: false\n\t};\n\tconst re = /%25|%5C/gi;\n\tlet cursor = 0;\n\tlet result = \"\";\n\tlet match;\n\twhile (null !== (match = re.exec(path))) {\n\t\tresult += decodeSegment(path.slice(cursor, match.index)) + match[0];\n\t\tcursor = re.lastIndex;\n\t}\n\tresult = result + decodeSegment(cursor ? path.slice(cursor) : path);\n\tlet handledProtocolRelativeURL = false;\n\tif (result.startsWith(\"//\")) {\n\t\thandledProtocolRelativeURL = true;\n\t\tresult = \"/\" + result.replace(/^\\/+/, \"\");\n\t}\n\treturn {\n\t\tpath: result,\n\t\thandledProtocolRelativeURL\n\t};\n}\n/**\n* Encodes a path the same way `new URL()` would, but without the overhead of full URL parsing.\n*\n* This function encodes:\n* - Whitespace characters (spaces → %20, tabs → %09, etc.)\n* - Non-ASCII/Unicode characters (emojis, accented characters, etc.)\n*\n* It preserves:\n* - Already percent-encoded sequences (won't double-encode %2F, %25, etc.)\n* - ASCII special characters valid in URL paths (@, $, &, +, etc.)\n* - Forward slashes as path separators\n*\n* Used to generate proper href values for SSR without constructing URL objects.\n*\n* @example\n* encodePathLikeUrl('/path/file name.pdf') // '/path/file%20name.pdf'\n* encodePathLikeUrl('/path/日本語') // '/path/%E6%97%A5%E6%9C%AC%E8%AA%9E'\n* encodePathLikeUrl('/path/already%20encoded') // '/path/already%20encoded' (preserved)\n*/\nfunction encodePathLikeUrl(path) {\n\tif (!/\\s|[^\\u0000-\\u007F]/.test(path)) return path;\n\treturn path.replace(/\\s|[^\\u0000-\\u007F]/gu, encodeURIComponent);\n}\n/**\n* Builds the dev-mode CSS styles URL for route-scoped CSS collection.\n* Used by HeadContent components in all framework implementations to construct\n* the URL for the `/@tanstack-start/styles.css` endpoint.\n*\n* @param basepath - The router's basepath (may or may not have leading slash)\n* @param routeIds - Array of matched route IDs to include in the CSS collection\n* @returns The full URL path for the dev styles CSS endpoint\n*/\nfunction buildDevStylesUrl(basepath, routeIds) {\n\tconst trimmedBasepath = basepath.replace(/^\\/+|\\/+$/g, \"\");\n\treturn `${trimmedBasepath === \"\" ? \"\" : `/${trimmedBasepath}`}/@tanstack-start/styles.css?routes=${encodeURIComponent(routeIds.join(\",\"))}`;\n}\nfunction arraysEqual(a, b) {\n\tif (a === b) return true;\n\tif (a.length !== b.length) return false;\n\tfor (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n\treturn true;\n}\n//#endregion\nexport { DEFAULT_PROTOCOL_ALLOWLIST, arraysEqual, buildDevStylesUrl, createControlledPromise, decodePath, deepEqual, encodePathLikeUrl, escapeHtml, findLast, functionalUpdate, hasKeys, hasOwn, isDangerousProtocol, isModuleNotFoundError, isPlainArray, isPlainObject, isPromise, last, nullReplaceEqualDeep, replaceEqualDeep };\n\n//# sourceMappingURL=utils.js.map","//#region src/invariant.ts\nfunction invariant() {\n\tthrow new Error(\"Invariant failed\");\n}\n//#endregion\nexport { invariant };\n\n//# sourceMappingURL=invariant.js.map","\"use client\";\nimport * as React$1 from \"react\";\n//#region src/routerContext.tsx\nvar routerContext = React$1.createContext(null);\n//#endregion\nexport { routerContext };\n\n//# sourceMappingURL=routerContext.js.map","\"use client\";\nimport { routerContext } from \"./routerContext.js\";\nimport * as React$1 from \"react\";\n//#region src/useRouter.tsx\n/**\n* Access the current TanStack Router instance from React context.\n* Must be used within a `RouterProvider`.\n*\n* Options:\n* - `warn`: Log a warning if no router context is found (default: true).\n*\n* @returns The registered router instance.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useRouterHook\n*/\nfunction useRouter(opts) {\n\tconst value = React$1.useContext(routerContext);\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tif ((opts?.warn ?? true) && !value) console.warn(\"Warning: useRouter must be used inside a <RouterProvider> component!\");\n\t}\n\treturn value;\n}\n//#endregion\nexport { useRouter };\n\n//# sourceMappingURL=useRouter.js.map","\"use client\";\nimport * as React$1 from \"react\";\n//#region src/matchContext.tsx\nvar matchContext = React$1.createContext(void 0);\nvar dummyMatchContext = React$1.createContext(void 0);\n//#endregion\nexport { dummyMatchContext, matchContext };\n\n//# sourceMappingURL=matchContext.js.map","import { useCallback } from \"react\";\nimport { useSyncExternalStoreWithSelector } from \"use-sync-external-store/shim/with-selector\";\nfunction defaultCompare(a, b) {\n return a === b;\n}\nfunction useStore(atom, selector, compare = defaultCompare) {\n const subscribe = useCallback(\n (handleStoreChange) => {\n if (!atom) {\n return () => {\n };\n }\n const { unsubscribe } = atom.subscribe(handleStoreChange);\n return unsubscribe;\n },\n [atom]\n );\n const boundGetSnapshot = useCallback(() => atom?.get(), [atom]);\n const selectedSnapshot = useSyncExternalStoreWithSelector(\n subscribe,\n boundGetSnapshot,\n boundGetSnapshot,\n selector,\n compare\n );\n return selectedSnapshot;\n}\nexport {\n useStore\n};\n//# sourceMappingURL=useStore.js.map\n","\"use client\";\nimport { dummyMatchContext, matchContext } from \"./matchContext.js\";\nimport { useRouter } from \"./useRouter.js\";\nimport { invariant, replaceEqualDeep } from \"@tanstack/router-core\";\nimport * as React$1 from \"react\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\n//#region src/useMatch.tsx\nvar dummyStore = {\n\tget() {},\n\tsubscribe() {\n\t\treturn { unsubscribe() {} };\n\t}\n};\nfunction useStructuralSharing(opts, router) {\n\tconst previousResult = React$1.useRef();\n\treturn (slice) => {\n\t\tconst selected = opts?.select ? opts.select(slice) : slice;\n\t\tif (opts?.structuralSharing ?? router.options.defaultStructuralSharing) return previousResult.current = replaceEqualDeep(previousResult.current, selected);\n\t\treturn selected;\n\t};\n}\n/**\n* Read and select the nearest or targeted route match.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useMatchHook\n*/\nfunction useMatch(opts) {\n\tconst router = useRouter();\n\tconst nearestMatchId = React$1.useContext(opts.from ? dummyMatchContext : matchContext);\n\tconst matchStore = opts.from ? router.stores.getRouteMatchStore(opts.from) : router.stores.matchStores.get(nearestMatchId);\n\tif (isServer ?? router.isServer) {\n\t\tconst match = matchStore?.get();\n\t\tif (!match) {\n\t\t\tif (opts.shouldThrow ?? true) {\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from \"${opts.from}\"` : \"a nearest match!\"}`);\n\t\t\t\tinvariant();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\treturn opts.select ? opts.select(match) : match;\n\t}\n\tconst selector = useStructuralSharing(opts, router);\n\tconst matchSelection = useStore(matchStore ?? dummyStore, (match) => match ? selector(match) : dummyStore);\n\tif (matchSelection !== dummyStore) return matchSelection;\n\tif (opts.shouldThrow ?? true) {\n\t\tif (process.env.NODE_ENV !== \"production\") throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from \"${opts.from}\"` : \"a nearest match!\"}`);\n\t\tinvariant();\n\t}\n}\n//#endregion\nexport { useMatch, useStructuralSharing };\n\n//# sourceMappingURL=useMatch.js.map","\"use client\";\nimport { useRouter } from \"./useRouter.js\";\nimport { useStructuralSharing } from \"./useMatch.js\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\n//#region src/useRouterState.tsx\n/**\n* Subscribe to the router's state store with optional selection and\n* structural sharing for render optimization.\n*\n* Options:\n* - `select`: Project the full router state to a derived slice\n* - `structuralSharing`: Replace-equal semantics for stable references\n* - `router`: Read state from a specific router instance instead of context\n*\n* @returns The selected router state (or the full state by default).\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useRouterStateHook\n*/\nfunction useRouterState(opts) {\n\tconst contextRouter = useRouter({ warn: opts?.router === void 0 });\n\tconst router = opts?.router || contextRouter;\n\tif (isServer ?? router.isServer) {\n\t\tconst state = router.stores.__store.get();\n\t\treturn opts?.select ? opts.select(state) : state;\n\t}\n\treturn useStore(router.stores.__store, useStructuralSharing(opts, router));\n}\n//#endregion\nexport { useRouterState };\n\n//# sourceMappingURL=useRouterState.js.map","// Routing engine compat layer over @tanstack/react-router with `createBrowserHistory()`.\n//\n// Why browser history? Clean, standard path-based URLs (`/resources/:id?page=2`).\n// Works with server-side analytics and deep links. Requires an SPA fallback rule\n// on the server (`try_files ... index.html` in nginx, `historyApiFallback` in\n// Vite preview). This is the one-line standard config for any modern static host\n// (Vercel, Netlify, nginx). No SSR is used — admin pages are auth-walled.\n//\n// Why TSR? Future-proof primitives — devtools, search-param schemas, per-route\n// loaders, code-splitting — without paying for SSR/Nitro (TanStack Start).\n//\n// Public API (Route discriminated union, `Link`, `useRoute`, `useNavigate`,\n// `buildHref`) is kept stable. `Route` is the canonical surface; the underlying\n// TSR state is mapped to it via `parseLocation`. Search params are kept\n// opaque to TSR (`parseSearch`/`stringifySearch` are no-ops in `admin-router`):\n// `ListQueryState` (with `filters[<key>]=<v>` keys) is parsed manually from\n// the raw `searchStr` so the URL format doesn't depend on TSR's JSON-search encoding.\n\nimport * as React from 'react'\nimport { useRouter, useRouterState } from '@tanstack/react-router'\n\n/**\n * Provides the SPA mount basepath (e.g. `/admin`) to all navigation\n * primitives (`Link`, `useNavigate`, `useRoute`). Set by\n * `AdminRouterProvider` from `window.__MODERN_ADMIN__.basePath`. Defaults\n * to `''` (root mount).\n */\nexport const BasepathContext = React.createContext<string>('')\n\n/** Returns the normalised basepath (never has a trailing slash; `''` at root). */\nexport const useBasepath = (): string => React.useContext(BasepathContext)\n\n/** URL-persisted state for the resource list page. */\nexport interface ListQueryState {\n page?: number\n perPage?: number\n sortBy?: string\n direction?: 'asc' | 'desc'\n /** Per-column filter values keyed by property path. */\n filters?: Record<string, string>\n}\n\nexport type Route =\n | { name: 'home' }\n | { name: 'audit-log' }\n | { name: 'list'; resourceId: string; query?: ListQueryState }\n | { name: 'show'; resourceId: string; recordId: string }\n | { name: 'edit'; resourceId: string; recordId: string }\n | { name: 'new'; resourceId: string }\n /** Settings hub. Sub-section selected via `section` (e.g. 'api-keys'). */\n | { name: 'settings'; section?: string }\n /**\n * Extension page registered by a Pro plugin via `registerExtensionRoute`.\n * Renders at `/ext/<key>` inside the authenticated admin shell.\n */\n | { name: 'extension'; key: string }\n\nconst parseListQuery = (search: string): ListQueryState | undefined => {\n if (!search) return undefined\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search)\n const out: ListQueryState = {}\n const page = params.get('page')\n if (page) {\n const n = Number(page)\n if (Number.isFinite(n) && n >= 1) out.page = n\n }\n const perPage = params.get('perPage')\n if (perPage) {\n const n = Number(perPage)\n if (Number.isFinite(n) && n >= 1) out.perPage = n\n }\n const sortBy = params.get('sortBy')\n if (sortBy) out.sortBy = sortBy\n const direction = params.get('direction')\n if (direction === 'asc' || direction === 'desc') out.direction = direction\n const filters: Record<string, string> = {}\n params.forEach((value, key) => {\n const m = key.match(/^filters\\[(.+)\\]$/)\n if (m && m[1] != null && value !== '') filters[m[1]] = value\n })\n if (Object.keys(filters).length > 0) out.filters = filters\n return Object.keys(out).length > 0 ? out : undefined\n}\n\nconst buildListQuery = (q: ListQueryState | undefined): string => {\n if (!q) return ''\n const params = new URLSearchParams()\n if (q.page != null && q.page !== 1) params.set('page', String(q.page))\n if (q.perPage != null && q.perPage !== 20) params.set('perPage', String(q.perPage))\n if (q.sortBy) params.set('sortBy', q.sortBy)\n if (q.direction) params.set('direction', q.direction)\n if (q.filters) {\n for (const [k, v] of Object.entries(q.filters)) {\n if (v != null && v !== '') params.set(`filters[${k}]`, v)\n }\n }\n const s = params.toString()\n return s ? `?${s}` : ''\n}\n\n/** Map a TSR location (pathname + raw searchStr) to the canonical `Route`\n * union the rest of the codebase consumes. Pure — used both at render\n * time (via `useRoute`) and outside the React tree if ever needed. */\nexport const parseLocation = (pathname: string, searchStr: string): Route => {\n const parts = pathname.split('/').filter(Boolean)\n if (parts.length === 0) return { name: 'home' }\n if (parts[0] === 'audit-log') return { name: 'audit-log' }\n if (parts[0] === 'settings') {\n const section = parts[1] ? decodeURIComponent(parts[1]) : undefined\n return section ? { name: 'settings', section } : { name: 'settings' }\n }\n if (parts[0] === 'ext' && parts[1]) {\n return { name: 'extension', key: decodeURIComponent(parts[1]) }\n }\n if (parts[0] === 'resources' && parts[1]) {\n const resourceId = decodeURIComponent(parts[1])\n if (parts[2] === 'new') return { name: 'new', resourceId }\n if (parts[2] && parts[3] === 'edit') {\n return { name: 'edit', resourceId, recordId: decodeURIComponent(parts[2]) }\n }\n if (parts[2]) return { name: 'show', resourceId, recordId: decodeURIComponent(parts[2]) }\n const query = parseListQuery(searchStr)\n return query ? { name: 'list', resourceId, query } : { name: 'list', resourceId }\n }\n return { name: 'home' }\n}\n\n/** Build a path URL for the given route. Pure — kept for tests and for\n * `<Link>` href generation. */\nexport const buildHref = (route: Route): string => {\n switch (route.name) {\n case 'home':\n return '/'\n case 'audit-log':\n return '/audit-log'\n case 'list':\n return `/resources/${encodeURIComponent(route.resourceId)}${buildListQuery(route.query)}`\n case 'show':\n return `/resources/${encodeURIComponent(route.resourceId)}/${encodeURIComponent(route.recordId)}`\n case 'edit':\n return `/resources/${encodeURIComponent(route.resourceId)}/${encodeURIComponent(route.recordId)}/edit`\n case 'new':\n return `/resources/${encodeURIComponent(route.resourceId)}/new`\n case 'settings':\n return route.section ? `/settings/${encodeURIComponent(route.section)}` : '/settings'\n case 'extension':\n return `/ext/${encodeURIComponent(route.key)}`\n }\n}\n\n/** Current canonical route, derived from the live TSR state.\n * When the router has a basepath, TSR strips it from `location.pathname`\n * before exposing it in state — so `parseLocation` sees only the\n * basepath-relative portion. */\nexport const useRoute = (): Route =>\n useRouterState({\n select: (s) => parseLocation(s.location.pathname, s.location.searchStr ?? ''),\n })\n\n/** Imperative navigator. Same signature as the legacy custom router so\n * call-sites don't change. Goes through TSR history → re-routing flows\n * through TSR's lifecycle. */\nexport const useNavigate = (): ((route: Route) => void) => {\n const router = useRouter()\n const basepath = useBasepath()\n return React.useCallback(\n (next: Route) => {\n router.history.push(basepath + buildHref(next))\n },\n [router, basepath],\n )\n}\n\n/** Open an in-app route in a new browser tab, honouring the admin's\n * `basepath`. `buildHref` returns a basepath-relative path, so we prepend\n * the basepath the same way `Link`/`useNavigate` do — otherwise the new tab\n * loads a URL outside the admin mount (e.g. `/resources/...` instead of\n * `/admin/resources/...`). */\nexport const useOpenInNewTab = (): ((route: Route) => void) => {\n const basepath = useBasepath()\n return React.useCallback((route: Route) => {\n if (typeof window === 'undefined') return\n window.open(basepath + buildHref(route), '_blank', 'noopener,noreferrer')\n }, [basepath])\n}\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n to: Route\n}\n\n/** Anchor with path href + client-side navigation on plain left-click.\n * Modifier clicks (cmd/ctrl/shift/alt, middle button) fall through to\n * default browser behaviour so \"open in new tab\" keeps working. */\nexport const Link = ({ to, onClick, ...rest }: LinkProps): React.ReactElement => {\n const router = useRouter()\n const basepath = useBasepath()\n const href = basepath + buildHref(to)\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (event.button !== 0) return\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return\n if (rest.target && rest.target !== '_self') return\n event.preventDefault()\n router.history.push(href)\n },\n [onClick, router, href, rest.target],\n )\n return <a href={href} onClick={handleClick} {...rest} />\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,67,68,69,70,71,72,73,74],"mappings":"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"}
|