@semiont/browser 0.5.32 → 0.5.34
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/assets/{CookiePreferences-CWZIFYNC.js → CookiePreferences--yB7lQIF.js} +2 -2
- package/dist/assets/{CookiePreferences-CWZIFYNC.js.map → CookiePreferences--yB7lQIF.js.map} +1 -1
- package/dist/assets/{KeyboardShortcutsContext-CSFk3vP6.js → KeyboardShortcutsContext-Bb3ZQ4QP.js} +2 -2
- package/dist/assets/{KeyboardShortcutsContext-CSFk3vP6.js.map → KeyboardShortcutsContext-Bb3ZQ4QP.js.map} +1 -1
- package/dist/assets/{PdfAnnotationCanvas.client-LSH3PZPY-D-7UQNP4.js → PdfAnnotationCanvas.client-7EYCQF6V-DjhntiNY.js} +2 -2
- package/dist/assets/{PdfAnnotationCanvas.client-LSH3PZPY-D-7UQNP4.js.map → PdfAnnotationCanvas.client-7EYCQF6V-DjhntiNY.js.map} +1 -1
- package/dist/assets/{ToolbarPanels-CbF3qEos.js → ToolbarPanels-DMK1LAo0.js} +2 -2
- package/dist/assets/{ToolbarPanels-CbF3qEos.js.map → ToolbarPanels-DMK1LAo0.js.map} +1 -1
- package/dist/assets/ar-PYOTZERT-CXqLatkw.js +2 -0
- package/dist/assets/ar-PYOTZERT-CXqLatkw.js.map +1 -0
- package/dist/assets/{bn-CCEW6AOS-BCI1FG86.js → bn-5SYTY67O-Dv_vM9LW.js} +2 -2
- package/dist/assets/bn-5SYTY67O-Dv_vM9LW.js.map +1 -0
- package/dist/assets/{client-CXKycZZZ.js → client-Bb60uCwR.js} +2 -2
- package/dist/assets/{client-CXKycZZZ.js.map → client-Bb60uCwR.js.map} +1 -1
- package/dist/assets/{client-CiXdSyqF.js → client-CBa3uasO.js} +2 -2
- package/dist/assets/{client-CiXdSyqF.js.map → client-CBa3uasO.js.map} +1 -1
- package/dist/assets/cs-BCA77OVY-rF_afyOb.js +2 -0
- package/dist/assets/cs-BCA77OVY-rF_afyOb.js.map +1 -0
- package/dist/assets/da-LFLFOUMU-4AyVJTUL.js +2 -0
- package/dist/assets/da-LFLFOUMU-4AyVJTUL.js.map +1 -0
- package/dist/assets/de-55TAX5Q2-C6iRza4E.js +2 -0
- package/dist/assets/de-55TAX5Q2-C6iRza4E.js.map +1 -0
- package/dist/assets/el-PZ7OBJZD-gTMe4-os.js +2 -0
- package/dist/assets/el-PZ7OBJZD-gTMe4-os.js.map +1 -0
- package/dist/assets/{en-R5XA26NF-BxJGw0oZ.js → en-H4MQUZWO-BbOPkiNi.js} +1 -1
- package/dist/assets/es-PSVJOIBC-Clv0XkZb.js +2 -0
- package/dist/assets/es-PSVJOIBC-Clv0XkZb.js.map +1 -0
- package/dist/assets/{fa-G7HN6B32-DdDi1TG_.js → fa-CFR54IER-CEInmDtD.js} +2 -2
- package/dist/assets/fa-CFR54IER-CEInmDtD.js.map +1 -0
- package/dist/assets/fi-E7YPW5B3-DmqNh-vH.js +2 -0
- package/dist/assets/fi-E7YPW5B3-DmqNh-vH.js.map +1 -0
- package/dist/assets/fr-4OOHYZSV-B95joHYO.js +2 -0
- package/dist/assets/fr-4OOHYZSV-B95joHYO.js.map +1 -0
- package/dist/assets/he-TWJR3AKD-qwzE23x8.js +2 -0
- package/dist/assets/he-TWJR3AKD-qwzE23x8.js.map +1 -0
- package/dist/assets/hi-F6RRLYIK-iRKIq5ZZ.js +2 -0
- package/dist/assets/hi-F6RRLYIK-iRKIq5ZZ.js.map +1 -0
- package/dist/assets/id-JRC3ZLJW-1KAIhpsi.js +2 -0
- package/dist/assets/id-JRC3ZLJW-1KAIhpsi.js.map +1 -0
- package/dist/assets/{index-C6tZC9XN.css → index-DUd0z7O4.css} +1 -1
- package/dist/assets/{index-cHWd4mGO.js → index-Ojc52FmW.js} +50 -50
- package/dist/assets/index-Ojc52FmW.js.map +1 -0
- package/dist/assets/it-IWYDLO43-BP5ovqTQ.js +2 -0
- package/dist/assets/it-IWYDLO43-BP5ovqTQ.js.map +1 -0
- package/dist/assets/ja-YETT5V5B-CeAre0UH.js +2 -0
- package/dist/assets/ja-YETT5V5B-CeAre0UH.js.map +1 -0
- package/dist/assets/ko-YX5NVOG4-BecWz7kN.js +2 -0
- package/dist/assets/ko-YX5NVOG4-BecWz7kN.js.map +1 -0
- package/dist/assets/{layout-B4A7CIsE.js → layout-B20iBPm-.js} +2 -2
- package/dist/assets/{layout-B4A7CIsE.js.map → layout-B20iBPm-.js.map} +1 -1
- package/dist/assets/{layout-CGq5doN0.js → layout-CneiUXGM.js} +2 -2
- package/dist/assets/{layout-CGq5doN0.js.map → layout-CneiUXGM.js.map} +1 -1
- package/dist/assets/{layout-3T2CwuLU.js → layout-DhqPRPc7.js} +2 -2
- package/dist/assets/{layout-3T2CwuLU.js.map → layout-DhqPRPc7.js.map} +1 -1
- package/dist/assets/{layout-DSvS5iO0.js → layout-YkO4-GqS.js} +2 -2
- package/dist/assets/{layout-DSvS5iO0.js.map → layout-YkO4-GqS.js.map} +1 -1
- package/dist/assets/ms-3FAOUVYS-B5WSIC5e.js +2 -0
- package/dist/assets/ms-3FAOUVYS-B5WSIC5e.js.map +1 -0
- package/dist/assets/nl-UYCI5TXI-oz-H334v.js +2 -0
- package/dist/assets/nl-UYCI5TXI-oz-H334v.js.map +1 -0
- package/dist/assets/no-ZR3EQ2NI-DFXui17p.js +2 -0
- package/dist/assets/no-ZR3EQ2NI-DFXui17p.js.map +1 -0
- package/dist/assets/{not-found-k9OeYO0z.js → not-found-D1Vs29Pd.js} +2 -2
- package/dist/assets/{not-found-k9OeYO0z.js.map → not-found-D1Vs29Pd.js.map} +1 -1
- package/dist/assets/{page-BhPjX09z.js → page--ktG80Hk.js} +2 -2
- package/dist/assets/{page-BhPjX09z.js.map → page--ktG80Hk.js.map} +1 -1
- package/dist/assets/{page-CJnENX8F.js → page-B06y4XtB.js} +2 -2
- package/dist/assets/{page-CJnENX8F.js.map → page-B06y4XtB.js.map} +1 -1
- package/dist/assets/{page-bR7KMw9p.js → page-B7Vp80w2.js} +2 -2
- package/dist/assets/{page-bR7KMw9p.js.map → page-B7Vp80w2.js.map} +1 -1
- package/dist/assets/{page-DLiS_avb.js → page-BD2asFxe.js} +2 -2
- package/dist/assets/{page-DLiS_avb.js.map → page-BD2asFxe.js.map} +1 -1
- package/dist/assets/{page-DS47DLy5.js → page-BJnX_yAg.js} +2 -2
- package/dist/assets/{page-DS47DLy5.js.map → page-BJnX_yAg.js.map} +1 -1
- package/dist/assets/{page-DYcAqNIR.js → page-BXynYvhE.js} +2 -2
- package/dist/assets/{page-DYcAqNIR.js.map → page-BXynYvhE.js.map} +1 -1
- package/dist/assets/{page-Bk2UhTqA.js → page-BgzC_t5l.js} +2 -2
- package/dist/assets/{page-Bk2UhTqA.js.map → page-BgzC_t5l.js.map} +1 -1
- package/dist/assets/{page-OhVx5cMH.js → page-BuW3aSm_.js} +2 -2
- package/dist/assets/{page-OhVx5cMH.js.map → page-BuW3aSm_.js.map} +1 -1
- package/dist/assets/{page-BfbTxteF.js → page-C0dhB8e1.js} +2 -2
- package/dist/assets/{page-BfbTxteF.js.map → page-C0dhB8e1.js.map} +1 -1
- package/dist/assets/{page-XISoI7Ji.js → page-C6IDcAg_.js} +2 -2
- package/dist/assets/{page-XISoI7Ji.js.map → page-C6IDcAg_.js.map} +1 -1
- package/dist/assets/{page-Ct7GNMjQ.js → page-CB1Zkhf_.js} +2 -2
- package/dist/assets/{page-Ct7GNMjQ.js.map → page-CB1Zkhf_.js.map} +1 -1
- package/dist/assets/{page-De7BG-0h.js → page-COYp-fvx.js} +2 -2
- package/dist/assets/{page-De7BG-0h.js.map → page-COYp-fvx.js.map} +1 -1
- package/dist/assets/{page-DYqW4iWr.js → page-CW0mYluf.js} +2 -2
- package/dist/assets/{page-DYqW4iWr.js.map → page-CW0mYluf.js.map} +1 -1
- package/dist/assets/{page-BWTL-Lea.js → page-CZj-I3Ya.js} +2 -2
- package/dist/assets/{page-BWTL-Lea.js.map → page-CZj-I3Ya.js.map} +1 -1
- package/dist/assets/{page-BNXN9uWs.js → page-DNCSUWUQ.js} +2 -2
- package/dist/assets/{page-BNXN9uWs.js.map → page-DNCSUWUQ.js.map} +1 -1
- package/dist/assets/{page-DwyBQfbg.js → page-DVjeBr3D.js} +2 -2
- package/dist/assets/{page-DwyBQfbg.js.map → page-DVjeBr3D.js.map} +1 -1
- package/dist/assets/{page-CywSuXyN.js → page-IQiRcQOl.js} +2 -2
- package/dist/assets/{page-CywSuXyN.js.map → page-IQiRcQOl.js.map} +1 -1
- package/dist/assets/{page-D-_kPKxI.js → page-Ln_Qh0ju.js} +2 -2
- package/dist/assets/{page-D-_kPKxI.js.map → page-Ln_Qh0ju.js.map} +1 -1
- package/dist/assets/pl-FPLBWLWX-DIXNldJ9.js +2 -0
- package/dist/assets/pl-FPLBWLWX-DIXNldJ9.js.map +1 -0
- package/dist/assets/pt-JOJPVHDL-Eea3ZrF_.js +2 -0
- package/dist/assets/pt-JOJPVHDL-Eea3ZrF_.js.map +1 -0
- package/dist/assets/ro-WHNIABHY-BPaTMqDU.js +2 -0
- package/dist/assets/{ro-3CGVMOC6-wdwqXMaO.js.map → ro-WHNIABHY-BPaTMqDU.js.map} +1 -1
- package/dist/assets/{routing-D-GkAfgE.js → routing-CjmlBUw_.js} +2 -2
- package/dist/assets/{routing-D-GkAfgE.js.map → routing-CjmlBUw_.js.map} +1 -1
- package/dist/assets/{routing-D5d0e59H.js → routing-DMkxvd2j.js} +2 -2
- package/dist/assets/{routing-D5d0e59H.js.map → routing-DMkxvd2j.js.map} +1 -1
- package/dist/assets/sv-KWSW2ERR-DegRdizd.js +2 -0
- package/dist/assets/sv-KWSW2ERR-DegRdizd.js.map +1 -0
- package/dist/assets/{th-NZ4G352Z-ZMBwAbgb.js → th-5OOFP4VL-7EmxRgfL.js} +2 -2
- package/dist/assets/th-5OOFP4VL-7EmxRgfL.js.map +1 -0
- package/dist/assets/tr-NJUOJ2KQ-B4Wv3rtO.js +2 -0
- package/dist/assets/tr-NJUOJ2KQ-B4Wv3rtO.js.map +1 -0
- package/dist/assets/uk-MFJCRRB2-rFn4flwH.js +2 -0
- package/dist/assets/uk-MFJCRRB2-rFn4flwH.js.map +1 -0
- package/dist/assets/vi-TFR4NPYP-DR0dbrnV.js +2 -0
- package/dist/assets/vi-TFR4NPYP-DR0dbrnV.js.map +1 -0
- package/dist/assets/{web-DWjmWGs5.js → web-UYBXFOwL.js} +2 -2
- package/dist/assets/{web-DWjmWGs5.js.map → web-UYBXFOwL.js.map} +1 -1
- package/dist/assets/zh-47SIEPEL-D2lz0Gi3.js +2 -0
- package/dist/assets/zh-47SIEPEL-D2lz0Gi3.js.map +1 -0
- package/dist/index.html +2 -2
- package/dist/messages/ar.json +5 -2
- package/dist/messages/bn.json +5 -2
- package/dist/messages/cs.json +5 -2
- package/dist/messages/da.json +5 -2
- package/dist/messages/de.json +5 -2
- package/dist/messages/el.json +5 -2
- package/dist/messages/en.json +5 -2
- package/dist/messages/es.json +5 -2
- package/dist/messages/fa.json +5 -2
- package/dist/messages/fi.json +5 -2
- package/dist/messages/fr.json +5 -2
- package/dist/messages/he.json +5 -2
- package/dist/messages/hi.json +5 -2
- package/dist/messages/id.json +5 -2
- package/dist/messages/it.json +5 -2
- package/dist/messages/ja.json +5 -2
- package/dist/messages/ko.json +5 -2
- package/dist/messages/ms.json +5 -2
- package/dist/messages/nl.json +5 -2
- package/dist/messages/no.json +5 -2
- package/dist/messages/pl.json +5 -2
- package/dist/messages/pt.json +5 -2
- package/dist/messages/ro.json +5 -2
- package/dist/messages/sv.json +5 -2
- package/dist/messages/th.json +5 -2
- package/dist/messages/tr.json +5 -2
- package/dist/messages/uk.json +5 -2
- package/dist/messages/vi.json +5 -2
- package/dist/messages/zh.json +5 -2
- package/package.json +1 -1
- package/dist/assets/ar-AZBRADEB-CvnkaLQS.js +0 -2
- package/dist/assets/ar-AZBRADEB-CvnkaLQS.js.map +0 -1
- package/dist/assets/bn-CCEW6AOS-BCI1FG86.js.map +0 -1
- package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js +0 -2
- package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js.map +0 -1
- package/dist/assets/da-K5NTK7LH-D2rWDXq3.js +0 -2
- package/dist/assets/da-K5NTK7LH-D2rWDXq3.js.map +0 -1
- package/dist/assets/de-GMRQEDZI-CVlSEip_.js +0 -2
- package/dist/assets/de-GMRQEDZI-CVlSEip_.js.map +0 -1
- package/dist/assets/el-EUB4CI4G-C80i0753.js +0 -2
- package/dist/assets/el-EUB4CI4G-C80i0753.js.map +0 -1
- package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js +0 -2
- package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js.map +0 -1
- package/dist/assets/fa-G7HN6B32-DdDi1TG_.js.map +0 -1
- package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js +0 -2
- package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js.map +0 -1
- package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js +0 -2
- package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js.map +0 -1
- package/dist/assets/he-WQQEY26B-2RRJq7To.js +0 -2
- package/dist/assets/he-WQQEY26B-2RRJq7To.js.map +0 -1
- package/dist/assets/hi-HJZ6W4JB-DPflxelg.js +0 -2
- package/dist/assets/hi-HJZ6W4JB-DPflxelg.js.map +0 -1
- package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js +0 -2
- package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js.map +0 -1
- package/dist/assets/index-cHWd4mGO.js.map +0 -1
- package/dist/assets/it-DT6UW66F-B7ZzCBm1.js +0 -2
- package/dist/assets/it-DT6UW66F-B7ZzCBm1.js.map +0 -1
- package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js +0 -2
- package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js.map +0 -1
- package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js +0 -2
- package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js.map +0 -1
- package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js +0 -2
- package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js.map +0 -1
- package/dist/assets/nl-OQEWIXNA-DiHanxnO.js +0 -2
- package/dist/assets/nl-OQEWIXNA-DiHanxnO.js.map +0 -1
- package/dist/assets/no-KPAYJZWY-DdGouMG_.js +0 -2
- package/dist/assets/no-KPAYJZWY-DdGouMG_.js.map +0 -1
- package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js +0 -2
- package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js.map +0 -1
- package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js +0 -2
- package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js.map +0 -1
- package/dist/assets/ro-3CGVMOC6-wdwqXMaO.js +0 -2
- package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js +0 -2
- package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js.map +0 -1
- package/dist/assets/th-NZ4G352Z-ZMBwAbgb.js.map +0 -1
- package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js +0 -2
- package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js.map +0 -1
- package/dist/assets/uk-AIX536L4-cREJjolM.js +0 -2
- package/dist/assets/uk-AIX536L4-cREJjolM.js.map +0 -1
- package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js +0 -2
- package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js.map +0 -1
- package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js +0 -2
- package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-
|
|
1
|
+
{"version":3,"file":"layout-CneiUXGM.js","names":[],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/UsersIcon.js","../../src/components/admin/AdminNavigation.tsx","../../src/app/[locale]/admin/layout.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction UsersIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(UsersIcon);\nexport default ForwardRef;","import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '@/i18n/routing';\nimport { usePathname } from '@/i18n/routing';\nimport { SimpleNavigation, useEventSubscriptions } from '@semiont/react-ui';\nimport type { SimpleNavigationItem } from '@semiont/react-ui';\nimport {\n UsersIcon,\n ShieldCheckIcon,\n CommandLineIcon,\n ChevronLeftIcon,\n Bars3Icon\n} from '@heroicons/react/24/outline';\n\ninterface AdminNavigationProps {\n isCollapsed: boolean;\n toggleCollapsed: () => void;\n navigationMenu?: (onClose: () => void) => React.ReactNode;\n}\n\n// Adapter: SimpleNavigation passes href, but our Link uses `to`\nfunction HrefLink({ href, to: _to, ...props }: React.ComponentProps<typeof Link> & { href?: string }) {\n return <Link to={(href ?? '') as string} {...props} />;\n}\n\nexport function AdminNavigation({ isCollapsed, toggleCollapsed, navigationMenu }: AdminNavigationProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Administration.${k}`, p as any) as string;\n const { t: _tSidebar } = useTranslation();\n const tSidebar = (k: string, p?: Record<string, unknown>) => _tSidebar(`Sidebar.${k}`, p as any) as string;\n const pathname = usePathname();\n\n // Handle sidebar toggle events\n const handleSidebarToggle = useCallback(() => {\n toggleCollapsed();\n }, [toggleCollapsed]);\n\n // Subscribe to sidebar toggle events\n useEventSubscriptions({\n 'shell:sidebar-toggle': handleSidebarToggle,\n });\n\n const navigation: SimpleNavigationItem[] = [\n {\n name: t('users'),\n href: '/admin/users',\n icon: UsersIcon,\n description: t('usersDescription')\n },\n {\n name: t('oauthSettings'),\n href: '/admin/security',\n icon: ShieldCheckIcon,\n description: t('oauthSettingsDescription')\n },\n {\n name: t('devops'),\n href: '/admin/devops',\n icon: CommandLineIcon,\n description: t('devopsDescription')\n },\n ];\n\n return (\n <SimpleNavigation\n title={t('title')}\n items={navigation}\n currentPath={pathname}\n LinkComponent={HrefLink as any}\n {...(navigationMenu && { dropdownContent: navigationMenu })}\n isCollapsed={isCollapsed}\n icons={{\n chevronLeft: ChevronLeftIcon as React.ComponentType<{ className?: string }>,\n bars: Bars3Icon as React.ComponentType<{ className?: string }>\n }}\n collapseSidebarLabel={tSidebar('collapseSidebar')}\n expandSidebarLabel={tSidebar('expandSidebar')}\n />\n );\n}","import { useContext } from 'react';\nimport { Outlet } from 'react-router';\nimport { useTranslation } from 'react-i18next';\nimport { AdminNavigation } from '@/components/admin/AdminNavigation';\nimport {\n LeftSidebar,\n Footer,\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { Link, routes } from '@/lib/routing';\nimport { useRouter } from '@/i18n/routing';\n\nfunction AdminLayoutBody() {\n const { t } = useTranslation();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n const semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$);\n const activeKnowledgeBase = session?.kb ?? null;\n const router = useRouter();\n\n if (!activeKnowledgeBase) {\n router.push('/know');\n return null;\n }\n\n const isAuthenticated = !!user;\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n\n return (\n <div className=\"min-h-screen bg-gray-50 dark:bg-gray-900 flex flex-col\">\n <div className=\"flex flex-1\">\n <LeftSidebar\n Link={Link}\n routes={routes}\n t={(key: string) => t(`Navigation.${key}`)}\n tHome={(key: string) => t(`Home.${key}`)}\n brandingLink=\"/\"\n collapsible={true}\n storageKey=\"admin-sidebar-collapsed\"\n isAuthenticated={isAuthenticated}\n isAdmin={isAdmin}\n isModerator={isModerator}\n >\n {(isCollapsed, toggleCollapsed, navigationMenu) => (\n <AdminNavigation\n isCollapsed={isCollapsed}\n toggleCollapsed={toggleCollapsed}\n navigationMenu={navigationMenu}\n />\n )}\n </LeftSidebar>\n <main className=\"flex-1 p-6 flex flex-col\">\n <div className=\"max-w-7xl mx-auto flex-1 flex flex-col w-full\">\n <Outlet />\n </div>\n </main>\n </div>\n <Footer\n Link={Link}\n routes={routes}\n t={(key: string, params?: Record<string, unknown>) => t(`Footer.${key}`, params as any) as string}\n CookiePreferences={CookiePreferences}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n />\n </div>\n );\n}\n\nexport default function AdminLayout() {\n // AuthShell is mounted by the parent ProtectedLayout in App.tsx so it\n // survives navigation between know/, admin/, and moderate/ sections.\n return <AdminLayoutBody />;\n}\n"],"x_google_ignoreList":[0],"mappings":"ojBACA,SAAS,EAAU,CACjB,QACA,UACA,GAAG,GACF,EAAQ,CACT,OAAoB,EAAM,cAAc,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAK,EACL,kBAAmB,CACrB,EAAG,CAAK,EAAG,EAAqB,EAAM,cAAc,QAAS,CAC3D,GAAI,CACN,EAAG,CAAK,EAAI,KAAmB,EAAM,cAAc,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,2XACL,CAAC,CAAC,CACJ,CACA,IAAM,EAA2B,EAAM,WAAW,CAAS,QCH3D,SAAS,EAAS,CAAE,OAAM,GAAI,EAAK,GAAG,GAAgE,CACpG,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAK,GAAQ,GAAe,GAAI,CAAQ,CAAA,CACvD,CAEA,SAAgB,EAAgB,CAAE,cAAa,kBAAiB,kBAAwC,CACtG,GAAM,CAAE,EAAG,GAAO,EAAe,EAC3B,GAAK,EAAW,IAAgC,EAAG,kBAAkB,IAAK,CAAQ,EAClF,CAAE,EAAG,GAAc,EAAe,EAClC,GAAY,EAAW,IAAgC,EAAU,WAAW,IAAK,CAAQ,EACzF,EAAW,EAAY,EAGvB,GAAA,EAAsB,EAAA,YAAA,KAAkB,CAC5C,EAAgB,CAClB,EAAG,CAAC,CAAe,CAAC,EAGpB,EAAsB,CACpB,uBAAwB,CAC1B,CAAC,EAED,IAAM,EAAqC,CACzC,CACE,KAAM,EAAE,OAAO,EACf,KAAM,eACN,KAAM,EACN,YAAa,EAAE,kBAAkB,CACnC,EACA,CACE,KAAM,EAAE,eAAe,EACvB,KAAM,kBACN,KAAM,EACN,YAAa,EAAE,0BAA0B,CAC3C,EACA,CACE,KAAM,EAAE,QAAQ,EAChB,KAAM,gBACN,KAAM,EACN,YAAa,EAAE,mBAAmB,CACpC,CACF,EAEA,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAE,OAAO,EAChB,MAAO,EACP,YAAa,EACb,cAAe,EACf,GAAK,GAAkB,CAAE,gBAAiB,CAAe,EAC5C,cACb,MAAO,CACL,YAAa,EACb,KAAM,CACR,EACA,qBAAsB,EAAS,iBAAiB,EAChD,mBAAoB,EAAS,eAAe,CAC7C,CAAA,CAEL,CChEA,SAAS,GAAkB,CACzB,GAAM,CAAE,KAAM,EAAe,EACvB,GAAA,EAAkB,EAAA,WAAA,CAAW,CAAwB,EACrD,EAAU,EAAW,EACrB,EAAU,EAAc,EAAQ,cAAc,EAC9C,EAAO,EAAc,GAAS,KAAK,EACnC,EAAsB,GAAS,IAAM,KACrC,EAAS,EAAU,EAEzB,GAAI,CAAC,EAEH,OADA,EAAO,KAAK,OAAO,EACZ,KAGT,IAAM,EAAkB,CAAC,CAAC,EACpB,EAAU,GAAM,SAAW,GAC3B,EAAc,GAAM,aAAe,GAEzC,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yDAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,KAAA,EACE,SACR,EAAI,GAAgB,EAAE,cAAc,GAAK,EACzC,MAAQ,GAAgB,EAAE,QAAQ,GAAK,EACvC,aAAa,IACb,YAAa,GACb,WAAW,0BACM,kBACR,UACI,cAEX,UAAA,EAAa,EAAiB,KAC9B,EAAA,EAAA,IAAA,CAAC,EAAD,CACe,cACI,kBACD,gBACjB,CAAA,CAEQ,CAAA,GACb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2BACd,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,gDACb,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,CAAA,CACN,CAAA,CACD,CAAA,CACH,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,KAAA,EACE,SACR,GAAI,EAAa,IAAqC,EAAE,UAAU,IAAO,CAAa,EACnE,oBACnB,GAAK,GAAiB,kBAAoB,CAAE,mBAAoB,EAAgB,gBAAiB,CAClG,CAAA,CACE,GAET,CAEA,SAAwB,GAAc,CAGpC,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,CAAA,CAC3B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-CywLsdxn.js";import{s as r,t as i}from"./vendor-vK2W55bZ.js";import{A as a,D as o,Dt as s,Et as c,G as l,Ot as u,f as d,tt as f}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-CywLsdxn.js";import{s as r,t as i}from"./vendor-vK2W55bZ.js";import{A as a,D as o,Dt as s,Et as c,G as l,Ot as u,f as d,tt as f}from"./index-Ojc52FmW.js";import{a as p,c as m,l as h,n as g,o as _,u as v}from"./KeyboardShortcutsContext-Bb3ZQ4QP.js";import{i as y}from"./routing-CjmlBUw_.js";var b=e(t());function x({title:e,titleId:t,...n},r){return b.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?b.createElement(`title`,{id:t},e):null,b.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m19.5 8.25-7.5 7.5-7.5-7.5`}))}var S=b.forwardRef(x);function C({title:e,titleId:t,...n},r){return b.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?b.createElement(`title`,{id:t},e):null,b.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m4.5 15.75 7.5-7.5 7.5 7.5`}))}var w=b.forwardRef(C);function T(){let e=y(),t=(0,b.useCallback)(({url:t,cancelFallback:n})=>{n(),e.push(t)},[e]),n=(0,b.useCallback)(({path:t})=>{e.push(t)},[e]);return l({"nav:external":t,"nav:push":n}),null}function E(e,t){let n=e.match(/\{(\w+),\s*plural,\s*/);if(!n)return e;let r=t[n[1]];if(r===void 0)return e;let i=n[0].length+n.index,a=1,o=i;for(let t=i;t<e.length;t++)if(e[t]===`{`)a++;else if(e[t]===`}`&&(a--,a===0)){o=t;break}let s=e.substring(i,o),c={},l=/(?:=(\d+)|(\w+))\s*\{([^}]+)\}/g,u;for(;(u=l.exec(s))!==null;){let[,e,t,n]=u,r=e===void 0?t:`=${e}`;c[r]=n}let d=c[`=${r}`];if(d!==void 0){let t=d.replace(/#/g,String(r));return e.substring(0,n.index)+t+e.substring(o+1)}let f=c.other;if(f!==void 0){let t=f.replace(/#/g,String(r));return e.substring(0,n.index)+t+e.substring(o+1)}return e}function D(e,t){let n=E(e,t);return Object.entries(t).forEach(([e,t])=>{n=n.replace(RegExp(`\\{\\{${e}\\}\\}`,`g`),String(t))}),n}function O(){let{i18n:e}=n();return(0,b.useMemo)(()=>({t:(t,n,r)=>{let i=e.getResourceBundle(e.language,`translation`)?.[t]?.[n];return i?r&&typeof i==`string`?D(i,r):i:`${t}.${n}`}}),[e,e.language])}var k=i();function A({children:e}){let t=O();return(0,k.jsx)(f,{translationManager:t,children:(0,k.jsx)(s,{children:(0,k.jsx)(u,{children:(0,k.jsx)(d,{children:(0,k.jsx)(g,{children:(0,k.jsx)(a,{children:(0,k.jsxs)(c,{children:[(0,k.jsx)(T,{}),e]})})})})})})})}function j({className:e=``}){let{t}=n(),r=(e,n)=>t(`CookieBanner.${e}`,n),[i,a]=(0,b.useState)(!1),[o,s]=(0,b.useState)(!1),[c,l]=(0,b.useState)(!1),[u,d]=(0,b.useState)(`GENERAL`),[f,g]=(0,b.useState)({necessary:!0,analytics:!1,marketing:!1,preferences:!1});(0,b.useEffect)(()=>{(async()=>{if(h()){a(!0);try{let[e,t]=await Promise.all([_(),p()]);d(e?`GDPR`:t?`CCPA`:`GENERAL`)}catch(e){console.error(`Failed to detect region:`,e),d(`GENERAL`)}}})()},[]);let y=async()=>{l(!0);try{await Promise.resolve(m({necessary:!0,analytics:!0,marketing:!0,preferences:!0})),a(!1)}catch(e){console.error(`Failed to save cookie consent:`,e)}finally{l(!1)}},x=async()=>{l(!0);try{await Promise.resolve(m({necessary:!0,analytics:!1,marketing:!1,preferences:!1})),a(!1)}catch(e){console.error(`Failed to save cookie consent:`,e)}finally{l(!1)}},C=async()=>{l(!0);try{await Promise.resolve(m(f)),a(!1)}catch(e){console.error(`Failed to save cookie consent:`,e)}finally{l(!1)}},T=e=>{e!==`necessary`&&g(t=>({...t,[e]:!t[e]}))},E=()=>{switch(u){case`GDPR`:return{title:r(`gdprTitle`),description:r(`gdprDescription`),learnMore:r(`gdprLearnMore`)};case`CCPA`:return{title:r(`ccpaTitle`),description:r(`ccpaDescription`),learnMore:r(`ccpaLearnMore`)};default:return{title:r(`generalTitle`),description:r(`generalDescription`),learnMore:r(`generalLearnMore`)}}};if(!i)return null;let D=E();return(0,k.jsx)(`div`,{className:e,style:{position:`fixed`,bottom:0,left:0,right:0,zIndex:50,backgroundColor:`var(--semiont-bg-primary)`,borderTop:`1px solid var(--semiont-border-primary)`,boxShadow:`var(--semiont-shadow-lg)`},children:(0,k.jsx)(`div`,{style:{maxWidth:`80rem`,margin:`0 auto`,padding:`1rem 1.5rem`},children:(0,k.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`1rem`},children:[(0,k.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,gap:`1.5rem`,flexWrap:`wrap`},children:[(0,k.jsxs)(`div`,{style:{flex:1,minWidth:`300px`},children:[(0,k.jsx)(`h3`,{style:{fontSize:`1.125rem`,fontWeight:600,color:`var(--semiont-text-primary)`,marginBottom:`0.5rem`},children:D.title}),(0,k.jsx)(`p`,{style:{fontSize:`var(--semiont-text-sm, 0.875rem)`,color:`var(--semiont-text-secondary)`,marginBottom:`0.25rem`},children:D.description}),(0,k.jsx)(`p`,{style:{fontSize:`var(--semiont-text-xs, 0.75rem)`,color:`var(--semiont-text-tertiary)`},children:D.learnMore})]}),(0,k.jsxs)(`div`,{style:{display:`flex`,gap:`0.75rem`,alignItems:`center`,flexWrap:`wrap`},children:[(0,k.jsxs)(`button`,{type:`button`,onClick:()=>s(!o),className:`semiont-button--secondary`,style:{display:`flex`,alignItems:`center`,gap:`0.25rem`},children:[r(`customize`),o?(0,k.jsx)(w,{style:{width:`1rem`,height:`1rem`}}):(0,k.jsx)(S,{style:{width:`1rem`,height:`1rem`}})]}),u!==`GDPR`&&(0,k.jsx)(`button`,{type:`button`,onClick:x,disabled:c,className:`semiont-button--secondary`,children:r(c?`saving`:`rejectAll`)}),(0,k.jsx)(`button`,{type:`button`,onClick:y,disabled:c,className:`semiont-button--primary`,children:r(c?`saving`:`acceptAll`)})]})]}),o&&(0,k.jsx)(`div`,{style:{borderTop:`1px solid var(--semiont-border-primary)`,paddingTop:`1rem`},children:(0,k.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`1rem`},children:[(0,k.jsx)(`h4`,{style:{fontSize:`1rem`,fontWeight:500,color:`var(--semiont-text-primary)`},children:r(`cookiePreferences`)}),(0,k.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`0.75rem`},children:v.map(e=>(0,k.jsxs)(`div`,{style:{display:`flex`,alignItems:`flex-start`,gap:`0.75rem`},children:[(0,k.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,height:`1.25rem`},children:(0,k.jsx)(`input`,{id:`cookie-${e.id}`,type:`checkbox`,checked:f[e.id]||!1,onChange:()=>T(e.id),disabled:e.required||c,style:{accentColor:`var(--semiont-color-primary-600, #2563eb)`}})}),(0,k.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,k.jsxs)(`label`,{htmlFor:`cookie-${e.id}`,style:{fontSize:`var(--semiont-text-sm, 0.875rem)`,fontWeight:500,color:`var(--semiont-text-primary)`,cursor:`pointer`},children:[e.name,e.required&&(0,k.jsx)(`span`,{style:{fontSize:`var(--semiont-text-xs, 0.75rem)`,color:`var(--semiont-text-tertiary)`,marginLeft:`0.25rem`},children:r(`required`)})]}),(0,k.jsx)(`p`,{style:{fontSize:`var(--semiont-text-xs, 0.75rem)`,color:`var(--semiont-text-secondary)`,marginTop:`0.25rem`},children:e.description}),(0,k.jsxs)(`details`,{style:{marginTop:`0.25rem`},children:[(0,k.jsx)(`summary`,{style:{fontSize:`var(--semiont-text-xs, 0.75rem)`,color:`var(--semiont-color-primary-600, #2563eb)`,cursor:`pointer`},children:r(`viewCookies`)}),(0,k.jsx)(`div`,{style:{marginTop:`0.25rem`,fontSize:`var(--semiont-text-xs, 0.75rem)`,color:`var(--semiont-text-tertiary)`},children:e.cookies.join(`, `)})]})]})]},e.id))}),(0,k.jsxs)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,gap:`0.75rem`,paddingTop:`1rem`},children:[(0,k.jsx)(`button`,{type:`button`,onClick:()=>s(!1),className:`semiont-button--secondary`,children:r(`cancel`)}),(0,k.jsx)(`button`,{type:`button`,onClick:C,disabled:c,className:`semiont-button--primary`,children:r(c?`saving`:`savePreferences`)})]})]})})]})})})}function M(){return(0,k.jsxs)(A,{children:[(0,k.jsx)(o,{}),(0,k.jsx)(r,{}),(0,k.jsx)(j,{})]})}export{M as default};
|
|
2
|
+
//# sourceMappingURL=layout-DhqPRPc7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-3T2CwuLU.js","names":["ForwardRef"],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronUpIcon.js","../../src/components/knowledge/NavigationHandler.tsx","../../src/hooks/useMergedTranslationManager.ts","../../src/app/providers.tsx","../../src/components/CookieBanner.tsx","../../src/app/[locale]/layout.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m19.5 8.25-7.5 7.5-7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronDownIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronUpIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 15.75 7.5-7.5 7.5 7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronUpIcon);\nexport default ForwardRef;","import { useCallback } from 'react';\nimport { useRouter } from '@/i18n/routing';\nimport { useEventSubscriptions } from '@semiont/react-ui';\n\n/**\n * NavigationHandler - Connects NavigationEventBus to Next.js router\n *\n * This component subscribes to navigation events from @semiont/react-ui\n * components and handles them using Next.js client-side routing.\n *\n * Benefits:\n * - Client-side navigation (no page reload)\n * - Preserves React state\n * - Faster navigation\n * - Better UX\n *\n * Must be mounted in app layout to handle all navigation requests.\n */\nexport function NavigationHandler() {\n const router = useRouter();\n\n // Handle external navigation events\n const handleExternalNavigate = useCallback(({ url, cancelFallback }: { url: string; resourceId?: string; cancelFallback: () => void }) => {\n cancelFallback(); // Prevent window.location fallback since we're handling with client-side routing\n router.push(url);\n }, [router]);\n\n // Handle router push events\n const handleRouterPush = useCallback(({ path }: { path: string; reason?: string }) => {\n router.push(path);\n }, [router]);\n\n useEventSubscriptions({\n 'nav:external': handleExternalNavigate,\n 'nav:push': handleRouterPush,\n });\n\n // This component only manages navigation, doesn't render anything\n return null;\n}\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { TranslationManager } from '@semiont/react-ui';\n\ntype Messages = Record<string, Record<string, string>>;\n\n/**\n * Process ICU MessageFormat plural syntax.\n * Supports: `{count, plural, =0 {text} =1 {text} other {text}}` with `#` as\n * the count placeholder inside each branch.\n *\n * Mirrors the reference implementation in\n * `packages/react-ui/src/contexts/TranslationContext.tsx`. Kept in sync\n * deliberately — diverging the two managers is what produced the\n * literal-plural-format render bug in the Tags panel.\n */\nexport function processPluralFormat(text: string, params: Record<string, unknown>): string {\n const pluralMatch = text.match(/\\{(\\w+),\\s*plural,\\s*/);\n if (!pluralMatch) return text;\n\n const paramName = pluralMatch[1]!;\n const count = params[paramName];\n if (count === undefined) return text;\n\n // Find the matching closing brace by counting nested pairs.\n const startPos = pluralMatch[0].length + pluralMatch.index!;\n let braceCount = 1;\n let endPos = startPos;\n for (let i = startPos; i < text.length; i++) {\n if (text[i] === '{') braceCount++;\n else if (text[i] === '}') {\n braceCount--;\n if (braceCount === 0) { endPos = i; break; }\n }\n }\n\n const pluralCases = text.substring(startPos, endPos);\n const cases: Record<string, string> = {};\n const caseRegex = /(?:=(\\d+)|(\\w+))\\s*\\{([^}]+)\\}/g;\n let caseMatch;\n while ((caseMatch = caseRegex.exec(pluralCases)) !== null) {\n const [, exactNumber, keyword, textContent] = caseMatch;\n const key = exactNumber !== undefined ? `=${exactNumber}` : keyword!;\n cases[key] = textContent!;\n }\n\n const exactMatch = cases[`=${count}`];\n if (exactMatch !== undefined) {\n const replaced = exactMatch.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + replaced + text.substring(endPos + 1);\n }\n const otherCase = cases['other'];\n if (otherCase !== undefined) {\n const replaced = otherCase.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + replaced + text.substring(endPos + 1);\n }\n return text;\n}\n\n/**\n * Run a translation string through the standard interpolation pipeline:\n * plural format first (since it may consume more of the string), then\n * `{{paramKey}}` parameter substitution. Exported for unit testing.\n */\nexport function interpolateTranslation(\n translation: string,\n params: Record<string, unknown>,\n): string {\n let result = processPluralFormat(translation, params);\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n}\n\n/**\n * Translation Manager for Frontend\n *\n * Wraps react-i18next. The messages JSON (loaded by i18next-http-backend) has\n * the same flat namespace structure: { \"Namespace\": { \"key\": \"value\" } }.\n * TranslationManager.t(namespace, key) maps directly to this structure.\n *\n * Interpolation supports two syntaxes, in this precedence order:\n *\n * 1. ICU MessageFormat plural — `{count, plural, =0 {…} =1 {…} other {…}}`\n * — used for count-sensitive strings like \"1 category selected\" /\n * \"3 categories selected\".\n * 2. Double-brace parameter substitution — `{{paramKey}}` — used for\n * everything else (`{{mode}}`, `{{delay}}`, etc.).\n *\n * The two managers (this one and the reference in\n * `@semiont/react-ui/contexts/TranslationContext`) implement the same\n * interpolation contract; keep them aligned when changing either.\n */\nexport function useMergedTranslationManager(): TranslationManager {\n const { i18n } = useTranslation();\n\n return useMemo(() => {\n return {\n t: (namespace: string, key: string, params?: Record<string, unknown>): string => {\n const messages = i18n.getResourceBundle(i18n.language, 'translation') as Messages | undefined;\n const translation = messages?.[namespace]?.[key];\n\n if (!translation) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`Translation not found: ${namespace}.${key} (locale: ${i18n.language})`);\n }\n return `${namespace}.${key}`;\n }\n\n if (params && typeof translation === 'string') {\n return interpolateTranslation(translation, params);\n }\n\n return translation;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [i18n, i18n.language]);\n}\n","import React from 'react';\nimport {\n ToastProvider,\n LiveRegionProvider,\n TranslationProvider,\n ThemeProvider,\n LineNumbersProvider,\n SemiontProvider,\n} from '@semiont/react-ui';\nimport { KeyboardShortcutsProvider } from '@/contexts/KeyboardShortcutsContext';\nimport { NavigationHandler } from '@/components/knowledge/NavigationHandler';\nimport { useMergedTranslationManager } from '@/hooks/useMergedTranslationManager';\n\n/**\n * Root Provider Composition for Semiont Frontend.\n *\n * Wires up GLOBAL contexts that every page needs.\n *\n * The module-scoped `SemiontBrowser` singleton (KB list, active KB,\n * per-KB SemiontSession) is made available via `<SemiontProvider>` at\n * the app root — mounting it here is cheap because the singleton itself\n * survives every React re-render and route change.\n *\n * Auth-dependent UI (ProtectedErrorBoundary, SessionExpiredModal,\n * PermissionDeniedModal) is bundled in `AuthShell` and mounted only in\n * protected layouts (know/, admin/, moderate/, auth/welcome/). Pre-app\n * routes (landing, OAuth flow) intentionally do NOT mount AuthShell —\n * they have no session UI.\n *\n * The `SemiontClient` is owned by the per-KB `SemiontSession`, which\n * `SemiontBrowser` constructs on demand. Components read\n * `useObservable(useSemiont().activeSession$)?.client`.\n *\n * The event bus lives inside the client (owned by `SemiontSession`).\n * Components emit via `session?.emit(...)` and subscribe via\n * `useEventSubscription[s]`.\n *\n * Provider order — outer to inner:\n * 1. TranslationProvider — i18n\n * 2. SemiontProvider — SemiontBrowser singleton\n * 3. ToastProvider — toast notifications\n * 4. LiveRegionProvider — a11y live region\n * 5. KeyboardShortcutsProvider — keyboard shortcuts\n * 6. ThemeProvider — theme\n * 7. LineNumbersProvider — line-numbers display (shared, like theme)\n * + NavigationHandler\n */\nexport function Providers({ children }: { children: React.ReactNode }) {\n const translationManager = useMergedTranslationManager();\n\n return (\n <TranslationProvider translationManager={translationManager}>\n <SemiontProvider>\n <ToastProvider>\n <LiveRegionProvider>\n <KeyboardShortcutsProvider>\n <ThemeProvider>\n <LineNumbersProvider>\n <NavigationHandler />\n {children}\n </LineNumbersProvider>\n </ThemeProvider>\n </KeyboardShortcutsProvider>\n </LiveRegionProvider>\n </ToastProvider>\n </SemiontProvider>\n </TranslationProvider>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n setCookieConsent,\n shouldShowBanner,\n COOKIE_CATEGORIES,\n CookieConsent,\n isCCPAApplicable,\n isGDPRApplicable,\n type CookieCategory\n} from '@/lib/cookies';\nimport { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline';\n\ninterface CookieBannerProps {\n className?: string;\n}\n\nexport function CookieBanner({ className = '' }: CookieBannerProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`CookieBanner.${k}`, p as any) as string;\n const [isVisible, setIsVisible] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [region, setRegion] = useState<'GDPR' | 'CCPA' | 'GENERAL'>('GENERAL');\n const [consent, setConsent] = useState<Partial<CookieConsent>>({\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n });\n\n useEffect(() => {\n const checkVisibility = async () => {\n if (shouldShowBanner()) {\n setIsVisible(true);\n\n try {\n // Determine applicable regulation\n const [isGDPR, isCCPA] = await Promise.all([\n isGDPRApplicable(),\n isCCPAApplicable()\n ]);\n\n if (isGDPR) {\n setRegion('GDPR');\n } else if (isCCPA) {\n setRegion('CCPA');\n } else {\n setRegion('GENERAL');\n }\n } catch (error) {\n // If region detection fails, default to GENERAL\n console.error('Failed to detect region:', error);\n setRegion('GENERAL');\n }\n }\n };\n\n checkVisibility();\n }, []);\n\n const handleAcceptAll = async () => {\n setIsLoading(true);\n\n try {\n const fullConsent = {\n necessary: true,\n analytics: true,\n marketing: true,\n preferences: true\n };\n\n await Promise.resolve(setCookieConsent(fullConsent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleRejectAll = async () => {\n setIsLoading(true);\n\n try {\n const minimalConsent = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n };\n\n await Promise.resolve(setCookieConsent(minimalConsent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSavePreferences = async () => {\n setIsLoading(true);\n\n try {\n await Promise.resolve(setCookieConsent(consent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleCategoryToggle = (categoryId: keyof Omit<CookieConsent, 'timestamp' | 'version'>) => {\n if (categoryId === 'necessary') return; // Can't toggle necessary cookies\n\n setConsent(prev => ({\n ...prev,\n [categoryId]: !prev[categoryId]\n }));\n };\n\n const getBannerText = () => {\n switch (region) {\n case 'GDPR':\n return {\n title: t('gdprTitle'),\n description: t('gdprDescription'),\n learnMore: t('gdprLearnMore')\n };\n case 'CCPA':\n return {\n title: t('ccpaTitle'),\n description: t('ccpaDescription'),\n learnMore: t('ccpaLearnMore')\n };\n default:\n return {\n title: t('generalTitle'),\n description: t('generalDescription'),\n learnMore: t('generalLearnMore')\n };\n }\n };\n\n if (!isVisible) return null;\n\n const bannerText = getBannerText();\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 50,\n backgroundColor: 'var(--semiont-bg-primary)',\n borderTop: '1px solid var(--semiont-border-primary)',\n boxShadow: 'var(--semiont-shadow-lg)',\n }}\n >\n <div style={{ maxWidth: '80rem', margin: '0 auto', padding: '1rem 1.5rem' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Main banner content */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '1.5rem', flexWrap: 'wrap' }}>\n <div style={{ flex: 1, minWidth: '300px' }}>\n <h3 style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n color: 'var(--semiont-text-primary)',\n marginBottom: '0.5rem',\n }}>\n {bannerText.title}\n </h3>\n <p style={{\n fontSize: 'var(--semiont-text-sm, 0.875rem)',\n color: 'var(--semiont-text-secondary)',\n marginBottom: '0.25rem',\n }}>\n {bannerText.description}\n </p>\n <p style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n }}>\n {bannerText.learnMore}\n </p>\n </div>\n\n {/* Action buttons */}\n <div style={{ display: 'flex', gap: '0.75rem', alignItems: 'center', flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n onClick={() => setShowDetails(!showDetails)}\n className=\"semiont-button--secondary\"\n style={{ display: 'flex', alignItems: 'center', gap: '0.25rem' }}\n >\n {t('customize')}\n {showDetails ? (\n <ChevronUpIcon style={{ width: '1rem', height: '1rem' }} />\n ) : (\n <ChevronDownIcon style={{ width: '1rem', height: '1rem' }} />\n )}\n </button>\n\n {region !== 'GDPR' && (\n <button\n type=\"button\"\n onClick={handleRejectAll}\n disabled={isLoading}\n className=\"semiont-button--secondary\"\n >\n {isLoading ? t('saving') : t('rejectAll')}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleAcceptAll}\n disabled={isLoading}\n className=\"semiont-button--primary\"\n >\n {isLoading ? t('saving') : t('acceptAll')}\n </button>\n </div>\n </div>\n\n {/* Detailed preferences */}\n {showDetails && (\n <div style={{\n borderTop: '1px solid var(--semiont-border-primary)',\n paddingTop: '1rem',\n }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <h4 style={{\n fontSize: '1rem',\n fontWeight: 500,\n color: 'var(--semiont-text-primary)',\n }}>\n {t('cookiePreferences')}\n </h4>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {COOKIE_CATEGORIES.map((category: CookieCategory) => (\n <div key={category.id} style={{ display: 'flex', alignItems: 'flex-start', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', height: '1.25rem' }}>\n <input\n id={`cookie-${category.id}`}\n type=\"checkbox\"\n checked={consent[category.id] || false}\n onChange={() => handleCategoryToggle(category.id)}\n disabled={category.required || isLoading}\n style={{ accentColor: 'var(--semiont-color-primary-600, #2563eb)' }}\n />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <label\n htmlFor={`cookie-${category.id}`}\n style={{\n fontSize: 'var(--semiont-text-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--semiont-text-primary)',\n cursor: 'pointer',\n }}\n >\n {category.name}\n {category.required && (\n <span style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n marginLeft: '0.25rem',\n }}>\n {t('required')}\n </span>\n )}\n </label>\n <p style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-secondary)',\n marginTop: '0.25rem',\n }}>\n {category.description}\n </p>\n <details style={{ marginTop: '0.25rem' }}>\n <summary style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-color-primary-600, #2563eb)',\n cursor: 'pointer',\n }}>\n {t('viewCookies')}\n </summary>\n <div style={{\n marginTop: '0.25rem',\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n }}>\n {category.cookies.join(', ')}\n </div>\n </details>\n </div>\n </div>\n ))}\n </div>\n\n <div style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '0.75rem',\n paddingTop: '1rem',\n }}>\n <button\n type=\"button\"\n onClick={() => setShowDetails(false)}\n className=\"semiont-button--secondary\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n disabled={isLoading}\n className=\"semiont-button--primary\"\n >\n {isLoading ? t('saving') : t('savePreferences')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default CookieBanner;\n","import { Outlet } from 'react-router';\nimport { Providers } from '../providers';\nimport { CookieBanner } from '@/components/CookieBanner';\nimport { SkipLinks } from '@semiont/react-ui';\n\n/**\n * Locale Layout — root layout for all /:locale/* routes.\n *\n * Mounts only auth-independent providers. Auth-dependent providers\n * (KnowledgeBaseProvider, AuthProvider, SessionProvider, modals)\n * are mounted via AuthShell in protected layouts (know/, admin/,\n * moderate/, auth/welcome/).\n */\nexport default function LocaleLayout() {\n return (\n <Providers>\n <SkipLinks />\n <Outlet />\n <CookieBanner />\n </Providers>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout-DhqPRPc7.js","names":["ForwardRef"],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronUpIcon.js","../../src/components/knowledge/NavigationHandler.tsx","../../src/hooks/useMergedTranslationManager.ts","../../src/app/providers.tsx","../../src/components/CookieBanner.tsx","../../src/app/[locale]/layout.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m19.5 8.25-7.5 7.5-7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronDownIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronUpIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 15.75 7.5-7.5 7.5 7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronUpIcon);\nexport default ForwardRef;","import { useCallback } from 'react';\nimport { useRouter } from '@/i18n/routing';\nimport { useEventSubscriptions } from '@semiont/react-ui';\n\n/**\n * NavigationHandler - Connects NavigationEventBus to Next.js router\n *\n * This component subscribes to navigation events from @semiont/react-ui\n * components and handles them using Next.js client-side routing.\n *\n * Benefits:\n * - Client-side navigation (no page reload)\n * - Preserves React state\n * - Faster navigation\n * - Better UX\n *\n * Must be mounted in app layout to handle all navigation requests.\n */\nexport function NavigationHandler() {\n const router = useRouter();\n\n // Handle external navigation events\n const handleExternalNavigate = useCallback(({ url, cancelFallback }: { url: string; resourceId?: string; cancelFallback: () => void }) => {\n cancelFallback(); // Prevent window.location fallback since we're handling with client-side routing\n router.push(url);\n }, [router]);\n\n // Handle router push events\n const handleRouterPush = useCallback(({ path }: { path: string; reason?: string }) => {\n router.push(path);\n }, [router]);\n\n useEventSubscriptions({\n 'nav:external': handleExternalNavigate,\n 'nav:push': handleRouterPush,\n });\n\n // This component only manages navigation, doesn't render anything\n return null;\n}\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { TranslationManager } from '@semiont/react-ui';\n\ntype Messages = Record<string, Record<string, string>>;\n\n/**\n * Process ICU MessageFormat plural syntax.\n * Supports: `{count, plural, =0 {text} =1 {text} other {text}}` with `#` as\n * the count placeholder inside each branch.\n *\n * Mirrors the reference implementation in\n * `packages/react-ui/src/contexts/TranslationContext.tsx`. Kept in sync\n * deliberately — diverging the two managers is what produced the\n * literal-plural-format render bug in the Tags panel.\n */\nexport function processPluralFormat(text: string, params: Record<string, unknown>): string {\n const pluralMatch = text.match(/\\{(\\w+),\\s*plural,\\s*/);\n if (!pluralMatch) return text;\n\n const paramName = pluralMatch[1]!;\n const count = params[paramName];\n if (count === undefined) return text;\n\n // Find the matching closing brace by counting nested pairs.\n const startPos = pluralMatch[0].length + pluralMatch.index!;\n let braceCount = 1;\n let endPos = startPos;\n for (let i = startPos; i < text.length; i++) {\n if (text[i] === '{') braceCount++;\n else if (text[i] === '}') {\n braceCount--;\n if (braceCount === 0) { endPos = i; break; }\n }\n }\n\n const pluralCases = text.substring(startPos, endPos);\n const cases: Record<string, string> = {};\n const caseRegex = /(?:=(\\d+)|(\\w+))\\s*\\{([^}]+)\\}/g;\n let caseMatch;\n while ((caseMatch = caseRegex.exec(pluralCases)) !== null) {\n const [, exactNumber, keyword, textContent] = caseMatch;\n const key = exactNumber !== undefined ? `=${exactNumber}` : keyword!;\n cases[key] = textContent!;\n }\n\n const exactMatch = cases[`=${count}`];\n if (exactMatch !== undefined) {\n const replaced = exactMatch.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + replaced + text.substring(endPos + 1);\n }\n const otherCase = cases['other'];\n if (otherCase !== undefined) {\n const replaced = otherCase.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + replaced + text.substring(endPos + 1);\n }\n return text;\n}\n\n/**\n * Run a translation string through the standard interpolation pipeline:\n * plural format first (since it may consume more of the string), then\n * `{{paramKey}}` parameter substitution. Exported for unit testing.\n */\nexport function interpolateTranslation(\n translation: string,\n params: Record<string, unknown>,\n): string {\n let result = processPluralFormat(translation, params);\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n}\n\n/**\n * Translation Manager for Frontend\n *\n * Wraps react-i18next. The messages JSON (loaded by i18next-http-backend) has\n * the same flat namespace structure: { \"Namespace\": { \"key\": \"value\" } }.\n * TranslationManager.t(namespace, key) maps directly to this structure.\n *\n * Interpolation supports two syntaxes, in this precedence order:\n *\n * 1. ICU MessageFormat plural — `{count, plural, =0 {…} =1 {…} other {…}}`\n * — used for count-sensitive strings like \"1 category selected\" /\n * \"3 categories selected\".\n * 2. Double-brace parameter substitution — `{{paramKey}}` — used for\n * everything else (`{{mode}}`, `{{delay}}`, etc.).\n *\n * The two managers (this one and the reference in\n * `@semiont/react-ui/contexts/TranslationContext`) implement the same\n * interpolation contract; keep them aligned when changing either.\n */\nexport function useMergedTranslationManager(): TranslationManager {\n const { i18n } = useTranslation();\n\n return useMemo(() => {\n return {\n t: (namespace: string, key: string, params?: Record<string, unknown>): string => {\n const messages = i18n.getResourceBundle(i18n.language, 'translation') as Messages | undefined;\n const translation = messages?.[namespace]?.[key];\n\n if (!translation) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`Translation not found: ${namespace}.${key} (locale: ${i18n.language})`);\n }\n return `${namespace}.${key}`;\n }\n\n if (params && typeof translation === 'string') {\n return interpolateTranslation(translation, params);\n }\n\n return translation;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [i18n, i18n.language]);\n}\n","import React from 'react';\nimport {\n ToastProvider,\n LiveRegionProvider,\n TranslationProvider,\n ThemeProvider,\n LineNumbersProvider,\n SemiontProvider,\n} from '@semiont/react-ui';\nimport { KeyboardShortcutsProvider } from '@/contexts/KeyboardShortcutsContext';\nimport { NavigationHandler } from '@/components/knowledge/NavigationHandler';\nimport { useMergedTranslationManager } from '@/hooks/useMergedTranslationManager';\n\n/**\n * Root Provider Composition for Semiont Frontend.\n *\n * Wires up GLOBAL contexts that every page needs.\n *\n * The module-scoped `SemiontBrowser` singleton (KB list, active KB,\n * per-KB SemiontSession) is made available via `<SemiontProvider>` at\n * the app root — mounting it here is cheap because the singleton itself\n * survives every React re-render and route change.\n *\n * Auth-dependent UI (ProtectedErrorBoundary, SessionExpiredModal,\n * PermissionDeniedModal) is bundled in `AuthShell` and mounted only in\n * protected layouts (know/, admin/, moderate/, auth/welcome/). Pre-app\n * routes (landing, OAuth flow) intentionally do NOT mount AuthShell —\n * they have no session UI.\n *\n * The `SemiontClient` is owned by the per-KB `SemiontSession`, which\n * `SemiontBrowser` constructs on demand. Components read\n * `useObservable(useSemiont().activeSession$)?.client`.\n *\n * The event bus lives inside the client (owned by `SemiontSession`).\n * Components emit via `session?.emit(...)` and subscribe via\n * `useEventSubscription[s]`.\n *\n * Provider order — outer to inner:\n * 1. TranslationProvider — i18n\n * 2. SemiontProvider — SemiontBrowser singleton\n * 3. ToastProvider — toast notifications\n * 4. LiveRegionProvider — a11y live region\n * 5. KeyboardShortcutsProvider — keyboard shortcuts\n * 6. ThemeProvider — theme\n * 7. LineNumbersProvider — line-numbers display (shared, like theme)\n * + NavigationHandler\n */\nexport function Providers({ children }: { children: React.ReactNode }) {\n const translationManager = useMergedTranslationManager();\n\n return (\n <TranslationProvider translationManager={translationManager}>\n <SemiontProvider>\n <ToastProvider>\n <LiveRegionProvider>\n <KeyboardShortcutsProvider>\n <ThemeProvider>\n <LineNumbersProvider>\n <NavigationHandler />\n {children}\n </LineNumbersProvider>\n </ThemeProvider>\n </KeyboardShortcutsProvider>\n </LiveRegionProvider>\n </ToastProvider>\n </SemiontProvider>\n </TranslationProvider>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n setCookieConsent,\n shouldShowBanner,\n COOKIE_CATEGORIES,\n CookieConsent,\n isCCPAApplicable,\n isGDPRApplicable,\n type CookieCategory\n} from '@/lib/cookies';\nimport { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline';\n\ninterface CookieBannerProps {\n className?: string;\n}\n\nexport function CookieBanner({ className = '' }: CookieBannerProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`CookieBanner.${k}`, p as any) as string;\n const [isVisible, setIsVisible] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [region, setRegion] = useState<'GDPR' | 'CCPA' | 'GENERAL'>('GENERAL');\n const [consent, setConsent] = useState<Partial<CookieConsent>>({\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n });\n\n useEffect(() => {\n const checkVisibility = async () => {\n if (shouldShowBanner()) {\n setIsVisible(true);\n\n try {\n // Determine applicable regulation\n const [isGDPR, isCCPA] = await Promise.all([\n isGDPRApplicable(),\n isCCPAApplicable()\n ]);\n\n if (isGDPR) {\n setRegion('GDPR');\n } else if (isCCPA) {\n setRegion('CCPA');\n } else {\n setRegion('GENERAL');\n }\n } catch (error) {\n // If region detection fails, default to GENERAL\n console.error('Failed to detect region:', error);\n setRegion('GENERAL');\n }\n }\n };\n\n checkVisibility();\n }, []);\n\n const handleAcceptAll = async () => {\n setIsLoading(true);\n\n try {\n const fullConsent = {\n necessary: true,\n analytics: true,\n marketing: true,\n preferences: true\n };\n\n await Promise.resolve(setCookieConsent(fullConsent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleRejectAll = async () => {\n setIsLoading(true);\n\n try {\n const minimalConsent = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n };\n\n await Promise.resolve(setCookieConsent(minimalConsent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSavePreferences = async () => {\n setIsLoading(true);\n\n try {\n await Promise.resolve(setCookieConsent(consent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleCategoryToggle = (categoryId: keyof Omit<CookieConsent, 'timestamp' | 'version'>) => {\n if (categoryId === 'necessary') return; // Can't toggle necessary cookies\n\n setConsent(prev => ({\n ...prev,\n [categoryId]: !prev[categoryId]\n }));\n };\n\n const getBannerText = () => {\n switch (region) {\n case 'GDPR':\n return {\n title: t('gdprTitle'),\n description: t('gdprDescription'),\n learnMore: t('gdprLearnMore')\n };\n case 'CCPA':\n return {\n title: t('ccpaTitle'),\n description: t('ccpaDescription'),\n learnMore: t('ccpaLearnMore')\n };\n default:\n return {\n title: t('generalTitle'),\n description: t('generalDescription'),\n learnMore: t('generalLearnMore')\n };\n }\n };\n\n if (!isVisible) return null;\n\n const bannerText = getBannerText();\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 50,\n backgroundColor: 'var(--semiont-bg-primary)',\n borderTop: '1px solid var(--semiont-border-primary)',\n boxShadow: 'var(--semiont-shadow-lg)',\n }}\n >\n <div style={{ maxWidth: '80rem', margin: '0 auto', padding: '1rem 1.5rem' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Main banner content */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '1.5rem', flexWrap: 'wrap' }}>\n <div style={{ flex: 1, minWidth: '300px' }}>\n <h3 style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n color: 'var(--semiont-text-primary)',\n marginBottom: '0.5rem',\n }}>\n {bannerText.title}\n </h3>\n <p style={{\n fontSize: 'var(--semiont-text-sm, 0.875rem)',\n color: 'var(--semiont-text-secondary)',\n marginBottom: '0.25rem',\n }}>\n {bannerText.description}\n </p>\n <p style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n }}>\n {bannerText.learnMore}\n </p>\n </div>\n\n {/* Action buttons */}\n <div style={{ display: 'flex', gap: '0.75rem', alignItems: 'center', flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n onClick={() => setShowDetails(!showDetails)}\n className=\"semiont-button--secondary\"\n style={{ display: 'flex', alignItems: 'center', gap: '0.25rem' }}\n >\n {t('customize')}\n {showDetails ? (\n <ChevronUpIcon style={{ width: '1rem', height: '1rem' }} />\n ) : (\n <ChevronDownIcon style={{ width: '1rem', height: '1rem' }} />\n )}\n </button>\n\n {region !== 'GDPR' && (\n <button\n type=\"button\"\n onClick={handleRejectAll}\n disabled={isLoading}\n className=\"semiont-button--secondary\"\n >\n {isLoading ? t('saving') : t('rejectAll')}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleAcceptAll}\n disabled={isLoading}\n className=\"semiont-button--primary\"\n >\n {isLoading ? t('saving') : t('acceptAll')}\n </button>\n </div>\n </div>\n\n {/* Detailed preferences */}\n {showDetails && (\n <div style={{\n borderTop: '1px solid var(--semiont-border-primary)',\n paddingTop: '1rem',\n }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <h4 style={{\n fontSize: '1rem',\n fontWeight: 500,\n color: 'var(--semiont-text-primary)',\n }}>\n {t('cookiePreferences')}\n </h4>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {COOKIE_CATEGORIES.map((category: CookieCategory) => (\n <div key={category.id} style={{ display: 'flex', alignItems: 'flex-start', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', height: '1.25rem' }}>\n <input\n id={`cookie-${category.id}`}\n type=\"checkbox\"\n checked={consent[category.id] || false}\n onChange={() => handleCategoryToggle(category.id)}\n disabled={category.required || isLoading}\n style={{ accentColor: 'var(--semiont-color-primary-600, #2563eb)' }}\n />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <label\n htmlFor={`cookie-${category.id}`}\n style={{\n fontSize: 'var(--semiont-text-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--semiont-text-primary)',\n cursor: 'pointer',\n }}\n >\n {category.name}\n {category.required && (\n <span style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n marginLeft: '0.25rem',\n }}>\n {t('required')}\n </span>\n )}\n </label>\n <p style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-secondary)',\n marginTop: '0.25rem',\n }}>\n {category.description}\n </p>\n <details style={{ marginTop: '0.25rem' }}>\n <summary style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-color-primary-600, #2563eb)',\n cursor: 'pointer',\n }}>\n {t('viewCookies')}\n </summary>\n <div style={{\n marginTop: '0.25rem',\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n }}>\n {category.cookies.join(', ')}\n </div>\n </details>\n </div>\n </div>\n ))}\n </div>\n\n <div style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '0.75rem',\n paddingTop: '1rem',\n }}>\n <button\n type=\"button\"\n onClick={() => setShowDetails(false)}\n className=\"semiont-button--secondary\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n disabled={isLoading}\n className=\"semiont-button--primary\"\n >\n {isLoading ? t('saving') : t('savePreferences')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default CookieBanner;\n","import { Outlet } from 'react-router';\nimport { Providers } from '../providers';\nimport { CookieBanner } from '@/components/CookieBanner';\nimport { SkipLinks } from '@semiont/react-ui';\n\n/**\n * Locale Layout — root layout for all /:locale/* routes.\n *\n * Mounts only auth-independent providers. Auth-dependent providers\n * (KnowledgeBaseProvider, AuthProvider, SessionProvider, modals)\n * are mounted via AuthShell in protected layouts (know/, admin/,\n * moderate/, auth/welcome/).\n */\nexport default function LocaleLayout() {\n return (\n <Providers>\n <SkipLinks />\n <Outlet />\n <CookieBanner />\n </Providers>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-CywLsdxn.js";import{s as r,t as i}from"./vendor-vK2W55bZ.js";import{$ as a,At as o,G as s,Y as c,d as l,et as u,g as d,j as f,l as p,o as m,q as h}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-CywLsdxn.js";import{s as r,t as i}from"./vendor-vK2W55bZ.js";import{$ as a,At as o,G as s,Y as c,d as l,et as u,g as d,j as f,l as p,o as m,q as h}from"./index-Ojc52FmW.js";import{t as g}from"./KeyboardShortcutsContext-Bb3ZQ4QP.js";import{t as _}from"./CookiePreferences--yB7lQIF.js";import{n as v,t as y}from"./ToolbarPanels-DMK1LAo0.js";import{n as b,t as x}from"./ChevronLeftIcon-ikKcEfM5.js";import{t as S}from"./XMarkIcon-Dt8lUQLh.js";import{i as C,r as w,t as T}from"./routing-CjmlBUw_.js";import{n as E,t as D}from"./routing-DMkxvd2j.js";var O=e(t()),k=i(),A=({className:e})=>(0,k.jsx)(`span`,{className:e,style:{fontSize:`1.25rem`,lineHeight:`1`},children:`🔭`});function j({href:e,to:t,...n}){return(0,k.jsx)(T,{to:e??``,...n})}function M({isCollapsed:e,toggleCollapsed:t,navigationMenu:r}){let{t:i}=n(),a=(e,t)=>i(`Sidebar.${e}`,t),l=w(),u=C(),d=o(),f=c(d.openResources$)??[],p=d.removeOpenResource.bind(d),h=d.reorderOpenResources.bind(d),g=[{name:a(`discover`),href:`/know/discover`,icon:A,description:a(`searchAndBrowse`)},{name:a(`compose`),href:`/know/compose`,icon:v,description:a(`composeNewResource`)}],_=(0,O.useCallback)(()=>{t()},[t]),y=(0,O.useCallback)(({resourceId:e})=>{p(e),l===`/know/resource/${e}`&&u.push(`/know/discover`)},[p,l,u]),T=(0,O.useCallback)(({oldIndex:e,newIndex:t})=>{h(e,t)},[h]);return s({"shell:sidebar-toggle":_,"tabs:close":y,"tabs:reorder":T}),(0,k.jsx)(`div`,{className:`flex flex-col h-full`,children:(0,k.jsx)(`div`,{className:`flex-1 min-h-0 overflow-y-auto`,children:(0,k.jsx)(m,{fixedItems:g,resources:f,isCollapsed:e,currentPath:l,LinkComponent:j,onNavigate:e=>{u.push(e)},getResourceHref:e=>`/know/resource/${e}`,className:`knowledge-navigation`,translations:{title:a(`title`)},icons:{chevronLeft:x,bars:b,close:S},navigationMenu:r})})})}function N(){let{t:e}=n(),t=(t,n)=>e(`Navigation.${t}`,n),{t:r}=n(),i=(e,t)=>r(`Home.${e}`,t),a=c(o().activeSession$),s=c(a?.user$),u=!!s,d=s?.isAdmin??!1,f=s?.isModerator??!1;return(0,k.jsx)(l,{Link:D,routes:E,t,tHome:i,brandingLink:`/`,collapsible:!0,storageKey:`knowledgeNavCollapsed`,isAuthenticated:u,isAdmin:d,isModerator:f,children:(e,t,n)=>(0,k.jsx)(M,{isCollapsed:e,toggleCollapsed:t,navigationMenu:n})})}function P(e,t){let n=(0,O.useRef)(!1);(0,O.useEffect)(()=>{e&&!n.current&&t.emit(`panel:open`,{panel:`knowledge-base`}),n.current=e},[e,t])}function F(){return null}function I(){let{t:e}=n(),t=(t,n)=>n===void 0?e(`DiscoverEmptyState.${t}`):e(`DiscoverEmptyState.${t}`,n),r=o(),i=c(r.kbs$)??[],{kbs:a}=h(),s=c(r.activeSession$)?.kb??null,l=s?r.getKbSessionStatus(s.id):null;return i.length===0?(0,k.jsxs)(`div`,{style:{textAlign:`center`,maxWidth:`28rem`},children:[(0,k.jsx)(`h2`,{style:{fontSize:`1.1rem`,fontWeight:600,marginBottom:`0.5rem`},children:t(`noKnowledgeBases`)}),(0,k.jsx)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5,marginBottom:`0.75rem`},children:t(`noKnowledgeBasesHint`)}),a.length>0&&(0,k.jsx)(`p`,{style:{color:`var(--semiont-color-primary-500)`,fontSize:`0.85rem`,lineHeight:1.5,marginBottom:`0.75rem`},children:t(`discoveredOnMachine`,{count:a.length})}),(0,k.jsxs)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:[(0,k.jsx)(`a`,{href:`https://github.com/The-AI-Alliance/semiont/blob/main/docs/KNOWLEDGE-BASES.md`,target:`_blank`,rel:`noopener noreferrer`,style:{color:`var(--semiont-color-primary-500)`},children:t(`findKnowledgeBases`)}),` · `,(0,k.jsx)(`a`,{href:`https://github.com/The-AI-Alliance/semiont-template-kb`,target:`_blank`,rel:`noopener noreferrer`,style:{color:`var(--semiont-color-primary-500)`},children:t(`createNew`)})]})]}):l===`authenticated`?null:(0,k.jsxs)(`div`,{style:{textAlign:`center`,maxWidth:`24rem`},children:[(0,k.jsx)(`h2`,{style:{fontSize:`1.1rem`,fontWeight:600,marginBottom:`0.5rem`},children:s?.label??``}),(0,k.jsxs)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:[t(l===`expired`?`sessionExpired`:`signedOut`),` `,t(`signInHint`)]})]})}function L({t:e,keyboardContext:t}){let n=a(),r=c(n.activePanel$)??null,{theme:i}=u(),o=(0,O.useRef)(!1);return(0,O.useEffect)(()=>{o.current||r===null||(o.current=!0,r===`user`&&n.openPanel(`knowledge-base`))},[r,n]),(0,k.jsxs)(`div`,{className:`h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden`,children:[(0,k.jsxs)(`div`,{className:`flex flex-1 overflow-hidden`,children:[(0,k.jsx)(`main`,{className:`flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden`,children:(0,k.jsx)(`div`,{className:`w-full mx-auto flex-1 flex flex-col h-full overflow-hidden items-center justify-center`,children:(0,k.jsx)(I,{})})}),(0,k.jsx)(y,{activePanel:r,theme:i}),(0,k.jsx)(f,{activePanel:r,context:`simple`})]}),(0,k.jsx)(p,{Link:D,routes:E,t:(t,n)=>e(`Footer.${t}`,n),CookiePreferences:_,showPolicyLinks:!(`__TAURI_INTERNALS__`in window),...t?.openKeyboardHelp&&{onOpenKeyboardHelp:t.openKeyboardHelp}})]})}function R(){let{t:e}=n(),t=(0,O.useContext)(g),i=o(),a=c(i.activeKbId$),s=c(i.activeSession$),l=c(i.sessionActivating$),u=c(s?.token$),f=s?.kb??null,m=a!=null&&s==null&&l;return P(!!(f&&u),i),m?(0,k.jsx)(`div`,{className:`h-screen flex items-center justify-center`,children:(0,k.jsxs)(`div`,{className:`text-center`,children:[(0,k.jsx)(`div`,{className:`animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4`}),(0,k.jsx)(`p`,{className:`text-gray-600 dark:text-gray-400`,children:`Loading...`})]})}):!f||!u?(0,k.jsx)(L,{t:(t,n)=>e(t,n),keyboardContext:t}):(0,k.jsxs)(d,{children:[(0,k.jsx)(F,{}),(0,k.jsxs)(`div`,{className:`h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden`,children:[(0,k.jsxs)(`div`,{className:`flex flex-1 overflow-hidden`,children:[(0,k.jsx)(N,{}),(0,k.jsx)(`main`,{className:`flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden`,children:(0,k.jsx)(`div`,{className:`w-full mx-auto flex-1 flex flex-col h-full overflow-hidden`,children:(0,k.jsx)(r,{})})})]}),(0,k.jsx)(p,{Link:D,routes:E,t:(t,n)=>e(`Footer.${t}`,n),CookiePreferences:_,showPolicyLinks:!(`__TAURI_INTERNALS__`in window),...t?.openKeyboardHelp&&{onOpenKeyboardHelp:t.openKeyboardHelp}})]})]})}function z(){return(0,k.jsx)(R,{})}export{I as DiscoverEmptyState,z as default};
|
|
2
|
+
//# sourceMappingURL=layout-YkO4-GqS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-DSvS5iO0.js","names":[],"sources":["../../src/components/knowledge/KnowledgeNavigation.tsx","../../src/components/knowledge/KnowledgeSidebarWrapper.tsx","../../src/hooks/useKbPanelOnLogin.ts","../../src/app/[locale]/know/layout.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { PlusIcon, ChevronLeftIcon, Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline';\nimport {\n useSemiont,\n useObservable,\n useEventSubscriptions,\n CollapsibleResourceNavigation,\n type NavigationItem,\n} from '@semiont/react-ui';\nimport type { OpenResource } from '@semiont/sdk';\n// Custom telescope icon component\nconst TelescopeIcon = ({ className }: { className?: string }) => (\n <span className={className} style={{ fontSize: '1.25rem', lineHeight: '1' }}>🔭</span>\n);\n\ninterface KnowledgeNavigationProps {\n isCollapsed: boolean;\n toggleCollapsed: () => void;\n navigationMenu?: (onClose: () => void) => React.ReactNode;\n}\n\n// Adapter: CollapsibleResourceNavigation passes href, but our Link uses `to`\nfunction HrefLink({ href, to: _to, ...props }: React.ComponentProps<typeof Link> & { href?: string }) {\n return <Link to={(href ?? '') as string} {...props} />;\n}\n\nexport function KnowledgeNavigation({ isCollapsed, toggleCollapsed, navigationMenu }: KnowledgeNavigationProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Sidebar.${k}`, p as any) as string;\n const pathname = usePathname();\n const router = useRouter();\n const semiont = useSemiont();\n const openResources = useObservable(semiont.openResources$) ?? [];\n const removeResource = semiont.removeOpenResource.bind(semiont);\n const reorderResources = semiont.reorderOpenResources.bind(semiont);\n\n const fixedNavigation: NavigationItem[] = [\n {\n name: t('discover'),\n href: '/know/discover',\n icon: TelescopeIcon,\n description: t('searchAndBrowse')\n },\n {\n name: t('compose'),\n href: '/know/compose',\n icon: PlusIcon,\n description: t('composeNewResource')\n }\n ];\n\n // Handle sidebar toggle events\n const handleSidebarToggle = useCallback(() => {\n toggleCollapsed();\n }, [toggleCollapsed]);\n\n // Handle resource close events\n const handleResourceClose = useCallback(({ resourceId }: { resourceId: string }) => {\n removeResource(resourceId);\n\n // If we're closing the currently viewed document, navigate to Discover\n if (pathname === `/know/resource/${resourceId}`) {\n router.push('/know/discover');\n }\n }, [removeResource, pathname, router]);\n\n // Handle resource reorder events\n const handleResourceReorder = useCallback(({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {\n reorderResources(oldIndex, newIndex);\n }, [reorderResources]);\n\n // Subscribe to navigation events\n useEventSubscriptions({\n 'shell:sidebar-toggle': handleSidebarToggle,\n 'tabs:close': handleResourceClose,\n 'tabs:reorder': handleResourceReorder,\n });\n\n // Handle navigation\n const handleNavigate = (path: string) => {\n router.push(path);\n };\n\n // Build resource href\n const getResourceHref = (resourceId: string) => {\n return `/know/resource/${resourceId}`;\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n <CollapsibleResourceNavigation\n fixedItems={fixedNavigation}\n resources={openResources as OpenResource[]}\n isCollapsed={isCollapsed}\n currentPath={pathname}\n LinkComponent={HrefLink as any}\n onNavigate={handleNavigate}\n getResourceHref={getResourceHref}\n className=\"knowledge-navigation\"\n translations={{\n title: t('title')\n }}\n icons={{\n chevronLeft: ChevronLeftIcon,\n bars: Bars3Icon,\n close: XMarkIcon\n }}\n navigationMenu={navigationMenu}\n />\n </div>\n </div>\n );\n}","import { useTranslation } from 'react-i18next';\nimport { LeftSidebar, useSemiont, useObservable } from '@semiont/react-ui';\nimport { KnowledgeNavigation } from './KnowledgeNavigation';\nimport { Link, routes } from '@/lib/routing';\n\nexport function KnowledgeSidebarWrapper() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Navigation.${k}`, p as any) as string;\n const { t: _tHome } = useTranslation();\n const tHome = (k: string, p?: Record<string, unknown>) => _tHome(`Home.${k}`, p as any) as string;\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n\n return (\n <LeftSidebar\n Link={Link}\n routes={routes}\n t={t}\n tHome={tHome}\n brandingLink=\"/\"\n collapsible={true}\n storageKey=\"knowledgeNavCollapsed\"\n isAuthenticated={isAuthenticated}\n isAdmin={isAdmin}\n isModerator={isModerator}\n >\n {(isCollapsed, toggleCollapsed, navigationMenu) => (\n <KnowledgeNavigation\n isCollapsed={isCollapsed}\n toggleCollapsed={toggleCollapsed}\n navigationMenu={navigationMenu}\n />\n )}\n </LeftSidebar>\n );\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { SemiontBrowser } from '@semiont/sdk';\n\n/**\n * A newly live session opens the Knowledge Base panel.\n *\n * The panel is restored from `localStorage` and the ShellStateUnit is app-scoped,\n * so it survived the signed-out → signed-in transition untouched — nothing in the\n * app reacted to a session appearing. Signing in interactively hid that, because\n * you reach the sign-in control through the KB panel and so happen to already be\n * on it. A session restored at launch never touches it, and lands you on whatever\n * panel you closed the app with.\n *\n * Fires on the transition into a session, which covers both: the first render of\n * an already-restored session, and a later sign-in. Not on every render while\n * signed in — that would fight the resource viewer, which opens the annotations\n * panel on its own.\n *\n * Emits on the bus rather than taking a `ShellStateUnit`, because that is all\n * `openPanel` does and every unit mirrors the bus — so this needs no unit of its\n * own, and the layout does not have to construct one it would otherwise not use.\n */\nexport function useKbPanelOnLogin(signedIn: boolean, browser: SemiontBrowser): void {\n const wasSignedIn = useRef(false);\n useEffect(() => {\n if (signedIn && !wasSignedIn.current) browser.emit('panel:open', { panel: 'knowledge-base' });\n wasSignedIn.current = signedIn;\n }, [signedIn, browser]);\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport { Outlet } from 'react-router';\nimport { useTranslation } from 'react-i18next';\nimport { KnowledgeSidebarWrapper } from '@/components/knowledge/KnowledgeSidebarWrapper';\nimport {\n Footer,\n ResourceAnnotationsProvider,\n Toolbar,\n useSemiont,\n useShellStateUnit,\n useObservable,\n useTheme,\n useKBDiscovery,\n} from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { useKbPanelOnLogin } from '@/hooks/useKbPanelOnLogin';\nimport { Link, routes } from '@/lib/routing';\n\nfunction GlobalEventsConnector() {\n return null;\n}\n\n/**\n * Empty state for the main content area when no KB is connected or authenticated.\n * Shows contextual guidance based on whether any KBs exist.\n */\nexport function DiscoverEmptyState() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) =>\n (p !== undefined ? _t(`DiscoverEmptyState.${k}`, p) : _t(`DiscoverEmptyState.${k}`)) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n // Launcher discovery: with zero registered KBs, say what's running on this\n // machine instead of only linking docs (BROWSER-KB-DISCOVERY follow-up).\n const { kbs: discoveredKbs } = useKBDiscovery();\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const status = activeKnowledgeBase\n ? semiont.getKbSessionStatus(activeKnowledgeBase.id)\n : null;\n\n if (knowledgeBases.length === 0) {\n return (\n <div style={{ textAlign: 'center', maxWidth: '28rem' }}>\n <h2 style={{ fontSize: '1.1rem', fontWeight: 600, marginBottom: '0.5rem' }}>{t('noKnowledgeBases')}</h2>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5, marginBottom: '0.75rem' }}>\n {t('noKnowledgeBasesHint')}\n </p>\n {discoveredKbs.length > 0 && (\n <p style={{ color: 'var(--semiont-color-primary-500)', fontSize: '0.85rem', lineHeight: 1.5, marginBottom: '0.75rem' }}>\n {t('discoveredOnMachine', { count: discoveredKbs.length })}\n </p>\n )}\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n <a href=\"https://github.com/The-AI-Alliance/semiont/blob/main/docs/KNOWLEDGE-BASES.md\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--semiont-color-primary-500)' }}>{t('findKnowledgeBases')}</a>\n {' · '}\n <a href=\"https://github.com/The-AI-Alliance/semiont-template-kb\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--semiont-color-primary-500)' }}>{t('createNew')}</a>\n </p>\n </div>\n );\n }\n\n if (status === 'authenticated') {\n return null;\n }\n\n return (\n <div style={{ textAlign: 'center', maxWidth: '24rem' }}>\n <h2 style={{ fontSize: '1.1rem', fontWeight: 600, marginBottom: '0.5rem' }}>\n {activeKnowledgeBase?.label ?? ''}\n </h2>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {status === 'expired' ? t('sessionExpired') : t('signedOut')}\n {' '}{t('signInHint')}\n </p>\n </div>\n );\n}\n\nfunction UnauthenticatedKnowledgeLayout({ t, keyboardContext }: { t: (key: string, params?: Record<string, unknown>) => string; keyboardContext: { openKeyboardHelp?: () => void } | null }) {\n const browseStateUnit = useShellStateUnit();\n const activePanel = useObservable(browseStateUnit.activePanel$) ?? null;\n const { theme } = useTheme();\n\n // The Account panel needs a session. Restored from a previous signed-in visit it\n // is a dead end — \"Sign in to a knowledge base to view your account\" — while the\n // empty state beside it says to sign in using the Knowledge Base panel. Open the\n // panel we are pointing at. Decided once, not reactively: a deliberate click on\n // Account while signed out should still show its message, not snap away.\n const panelCorrected = useRef(false);\n useEffect(() => {\n // useObservable yields null on the first render, before the BehaviorSubject's\n // current value arrives. Spending the one-shot on that null would let the\n // restored panel through on the render that actually carries it.\n if (panelCorrected.current || activePanel === null) return;\n panelCorrected.current = true;\n if (activePanel === 'user') browseStateUnit.openPanel('knowledge-base');\n }, [activePanel, browseStateUnit]);\n\n return (\n <div className=\"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden\">\n <div className=\"flex flex-1 overflow-hidden\">\n <main className=\"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden\">\n <div className=\"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden items-center justify-center\">\n <DiscoverEmptyState />\n </div>\n </main>\n <ToolbarPanels\n activePanel={activePanel}\n theme={theme}\n />\n <Toolbar activePanel={activePanel} context=\"simple\" />\n </div>\n <Footer\n Link={Link}\n routes={routes}\n t={(key: string, params?: Record<string, unknown>) => t(`Footer.${key}`, params as any) as string}\n CookiePreferences={CookiePreferences}\n showPolicyLinks={!('__TAURI_INTERNALS__' in window)}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n />\n </div>\n );\n}\n\nfunction KnowledgeLayoutBody() {\n const { t } = useTranslation();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n const semiont = useSemiont();\n const activeKbId = useObservable(semiont.activeKbId$);\n const session = useObservable(semiont.activeSession$);\n const sessionActivating = useObservable(semiont.sessionActivating$);\n const token = useObservable(session?.token$);\n const activeKnowledgeBase = session?.kb ?? null;\n // \"Loading\" = a session construction is actively in flight. Without\n // the `sessionActivating` guard we'd sit on the spinner forever after\n // any `signOut`, which also leaves `activeKbId` set but `session`\n // null.\n const isLoading = activeKbId != null && session == null && sessionActivating;\n\n // A session that has just become live — restored at launch or signed in just\n // now — opens the Knowledge Base panel, whatever panel was showing before.\n useKbPanelOnLogin(Boolean(activeKnowledgeBase && token), semiont);\n\n if (isLoading) {\n return (\n <div className=\"h-screen flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4\"></div>\n <p className=\"text-gray-600 dark:text-gray-400\">Loading...</p>\n </div>\n </div>\n );\n }\n\n if (!activeKnowledgeBase || !token) {\n return (\n <UnauthenticatedKnowledgeLayout t={(key: string, params?: Record<string, unknown>) => t(key, params as any) as string} keyboardContext={keyboardContext} />\n );\n }\n\n return (\n <ResourceAnnotationsProvider>\n <GlobalEventsConnector />\n <div className=\"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden\">\n <div className=\"flex flex-1 overflow-hidden\">\n <KnowledgeSidebarWrapper />\n <main className=\"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden\">\n <div className=\"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden\">\n <Outlet />\n </div>\n </main>\n </div>\n <Footer\n Link={Link}\n routes={routes}\n t={(key: string, params?: Record<string, unknown>) => t(`Footer.${key}`, params as any) as string}\n CookiePreferences={CookiePreferences}\n showPolicyLinks={!('__TAURI_INTERNALS__' in window)}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n />\n </div>\n </ResourceAnnotationsProvider>\n );\n}\n\nexport default function KnowledgeLayout() {\n // AuthShell is mounted by the parent ProtectedLayout in App.tsx so it\n // survives navigation between know/, admin/, and moderate/ sections.\n return <KnowledgeLayoutBody />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout-YkO4-GqS.js","names":[],"sources":["../../src/components/knowledge/KnowledgeNavigation.tsx","../../src/components/knowledge/KnowledgeSidebarWrapper.tsx","../../src/hooks/useKbPanelOnLogin.ts","../../src/app/[locale]/know/layout.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { PlusIcon, ChevronLeftIcon, Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline';\nimport {\n useSemiont,\n useObservable,\n useEventSubscriptions,\n CollapsibleResourceNavigation,\n type NavigationItem,\n} from '@semiont/react-ui';\nimport type { OpenResource } from '@semiont/sdk';\n// Custom telescope icon component\nconst TelescopeIcon = ({ className }: { className?: string }) => (\n <span className={className} style={{ fontSize: '1.25rem', lineHeight: '1' }}>🔭</span>\n);\n\ninterface KnowledgeNavigationProps {\n isCollapsed: boolean;\n toggleCollapsed: () => void;\n navigationMenu?: (onClose: () => void) => React.ReactNode;\n}\n\n// Adapter: CollapsibleResourceNavigation passes href, but our Link uses `to`\nfunction HrefLink({ href, to: _to, ...props }: React.ComponentProps<typeof Link> & { href?: string }) {\n return <Link to={(href ?? '') as string} {...props} />;\n}\n\nexport function KnowledgeNavigation({ isCollapsed, toggleCollapsed, navigationMenu }: KnowledgeNavigationProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Sidebar.${k}`, p as any) as string;\n const pathname = usePathname();\n const router = useRouter();\n const semiont = useSemiont();\n const openResources = useObservable(semiont.openResources$) ?? [];\n const removeResource = semiont.removeOpenResource.bind(semiont);\n const reorderResources = semiont.reorderOpenResources.bind(semiont);\n\n const fixedNavigation: NavigationItem[] = [\n {\n name: t('discover'),\n href: '/know/discover',\n icon: TelescopeIcon,\n description: t('searchAndBrowse')\n },\n {\n name: t('compose'),\n href: '/know/compose',\n icon: PlusIcon,\n description: t('composeNewResource')\n }\n ];\n\n // Handle sidebar toggle events\n const handleSidebarToggle = useCallback(() => {\n toggleCollapsed();\n }, [toggleCollapsed]);\n\n // Handle resource close events\n const handleResourceClose = useCallback(({ resourceId }: { resourceId: string }) => {\n removeResource(resourceId);\n\n // If we're closing the currently viewed document, navigate to Discover\n if (pathname === `/know/resource/${resourceId}`) {\n router.push('/know/discover');\n }\n }, [removeResource, pathname, router]);\n\n // Handle resource reorder events\n const handleResourceReorder = useCallback(({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {\n reorderResources(oldIndex, newIndex);\n }, [reorderResources]);\n\n // Subscribe to navigation events\n useEventSubscriptions({\n 'shell:sidebar-toggle': handleSidebarToggle,\n 'tabs:close': handleResourceClose,\n 'tabs:reorder': handleResourceReorder,\n });\n\n // Handle navigation\n const handleNavigate = (path: string) => {\n router.push(path);\n };\n\n // Build resource href\n const getResourceHref = (resourceId: string) => {\n return `/know/resource/${resourceId}`;\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n <CollapsibleResourceNavigation\n fixedItems={fixedNavigation}\n resources={openResources as OpenResource[]}\n isCollapsed={isCollapsed}\n currentPath={pathname}\n LinkComponent={HrefLink as any}\n onNavigate={handleNavigate}\n getResourceHref={getResourceHref}\n className=\"knowledge-navigation\"\n translations={{\n title: t('title')\n }}\n icons={{\n chevronLeft: ChevronLeftIcon,\n bars: Bars3Icon,\n close: XMarkIcon\n }}\n navigationMenu={navigationMenu}\n />\n </div>\n </div>\n );\n}","import { useTranslation } from 'react-i18next';\nimport { LeftSidebar, useSemiont, useObservable } from '@semiont/react-ui';\nimport { KnowledgeNavigation } from './KnowledgeNavigation';\nimport { Link, routes } from '@/lib/routing';\n\nexport function KnowledgeSidebarWrapper() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Navigation.${k}`, p as any) as string;\n const { t: _tHome } = useTranslation();\n const tHome = (k: string, p?: Record<string, unknown>) => _tHome(`Home.${k}`, p as any) as string;\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n\n return (\n <LeftSidebar\n Link={Link}\n routes={routes}\n t={t}\n tHome={tHome}\n brandingLink=\"/\"\n collapsible={true}\n storageKey=\"knowledgeNavCollapsed\"\n isAuthenticated={isAuthenticated}\n isAdmin={isAdmin}\n isModerator={isModerator}\n >\n {(isCollapsed, toggleCollapsed, navigationMenu) => (\n <KnowledgeNavigation\n isCollapsed={isCollapsed}\n toggleCollapsed={toggleCollapsed}\n navigationMenu={navigationMenu}\n />\n )}\n </LeftSidebar>\n );\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { SemiontBrowser } from '@semiont/sdk';\n\n/**\n * A newly live session opens the Knowledge Base panel.\n *\n * The panel is restored from `localStorage` and the ShellStateUnit is app-scoped,\n * so it survived the signed-out → signed-in transition untouched — nothing in the\n * app reacted to a session appearing. Signing in interactively hid that, because\n * you reach the sign-in control through the KB panel and so happen to already be\n * on it. A session restored at launch never touches it, and lands you on whatever\n * panel you closed the app with.\n *\n * Fires on the transition into a session, which covers both: the first render of\n * an already-restored session, and a later sign-in. Not on every render while\n * signed in — that would fight the resource viewer, which opens the annotations\n * panel on its own.\n *\n * Emits on the bus rather than taking a `ShellStateUnit`, because that is all\n * `openPanel` does and every unit mirrors the bus — so this needs no unit of its\n * own, and the layout does not have to construct one it would otherwise not use.\n */\nexport function useKbPanelOnLogin(signedIn: boolean, browser: SemiontBrowser): void {\n const wasSignedIn = useRef(false);\n useEffect(() => {\n if (signedIn && !wasSignedIn.current) browser.emit('panel:open', { panel: 'knowledge-base' });\n wasSignedIn.current = signedIn;\n }, [signedIn, browser]);\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport { Outlet } from 'react-router';\nimport { useTranslation } from 'react-i18next';\nimport { KnowledgeSidebarWrapper } from '@/components/knowledge/KnowledgeSidebarWrapper';\nimport {\n Footer,\n ResourceAnnotationsProvider,\n Toolbar,\n useSemiont,\n useShellStateUnit,\n useObservable,\n useTheme,\n useKBDiscovery,\n} from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { useKbPanelOnLogin } from '@/hooks/useKbPanelOnLogin';\nimport { Link, routes } from '@/lib/routing';\n\nfunction GlobalEventsConnector() {\n return null;\n}\n\n/**\n * Empty state for the main content area when no KB is connected or authenticated.\n * Shows contextual guidance based on whether any KBs exist.\n */\nexport function DiscoverEmptyState() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) =>\n (p !== undefined ? _t(`DiscoverEmptyState.${k}`, p) : _t(`DiscoverEmptyState.${k}`)) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n // Launcher discovery: with zero registered KBs, say what's running on this\n // machine instead of only linking docs (BROWSER-KB-DISCOVERY follow-up).\n const { kbs: discoveredKbs } = useKBDiscovery();\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const status = activeKnowledgeBase\n ? semiont.getKbSessionStatus(activeKnowledgeBase.id)\n : null;\n\n if (knowledgeBases.length === 0) {\n return (\n <div style={{ textAlign: 'center', maxWidth: '28rem' }}>\n <h2 style={{ fontSize: '1.1rem', fontWeight: 600, marginBottom: '0.5rem' }}>{t('noKnowledgeBases')}</h2>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5, marginBottom: '0.75rem' }}>\n {t('noKnowledgeBasesHint')}\n </p>\n {discoveredKbs.length > 0 && (\n <p style={{ color: 'var(--semiont-color-primary-500)', fontSize: '0.85rem', lineHeight: 1.5, marginBottom: '0.75rem' }}>\n {t('discoveredOnMachine', { count: discoveredKbs.length })}\n </p>\n )}\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n <a href=\"https://github.com/The-AI-Alliance/semiont/blob/main/docs/KNOWLEDGE-BASES.md\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--semiont-color-primary-500)' }}>{t('findKnowledgeBases')}</a>\n {' · '}\n <a href=\"https://github.com/The-AI-Alliance/semiont-template-kb\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--semiont-color-primary-500)' }}>{t('createNew')}</a>\n </p>\n </div>\n );\n }\n\n if (status === 'authenticated') {\n return null;\n }\n\n return (\n <div style={{ textAlign: 'center', maxWidth: '24rem' }}>\n <h2 style={{ fontSize: '1.1rem', fontWeight: 600, marginBottom: '0.5rem' }}>\n {activeKnowledgeBase?.label ?? ''}\n </h2>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {status === 'expired' ? t('sessionExpired') : t('signedOut')}\n {' '}{t('signInHint')}\n </p>\n </div>\n );\n}\n\nfunction UnauthenticatedKnowledgeLayout({ t, keyboardContext }: { t: (key: string, params?: Record<string, unknown>) => string; keyboardContext: { openKeyboardHelp?: () => void } | null }) {\n const browseStateUnit = useShellStateUnit();\n const activePanel = useObservable(browseStateUnit.activePanel$) ?? null;\n const { theme } = useTheme();\n\n // The Account panel needs a session. Restored from a previous signed-in visit it\n // is a dead end — \"Sign in to a knowledge base to view your account\" — while the\n // empty state beside it says to sign in using the Knowledge Base panel. Open the\n // panel we are pointing at. Decided once, not reactively: a deliberate click on\n // Account while signed out should still show its message, not snap away.\n const panelCorrected = useRef(false);\n useEffect(() => {\n // useObservable yields null on the first render, before the BehaviorSubject's\n // current value arrives. Spending the one-shot on that null would let the\n // restored panel through on the render that actually carries it.\n if (panelCorrected.current || activePanel === null) return;\n panelCorrected.current = true;\n if (activePanel === 'user') browseStateUnit.openPanel('knowledge-base');\n }, [activePanel, browseStateUnit]);\n\n return (\n <div className=\"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden\">\n <div className=\"flex flex-1 overflow-hidden\">\n <main className=\"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden\">\n <div className=\"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden items-center justify-center\">\n <DiscoverEmptyState />\n </div>\n </main>\n <ToolbarPanels\n activePanel={activePanel}\n theme={theme}\n />\n <Toolbar activePanel={activePanel} context=\"simple\" />\n </div>\n <Footer\n Link={Link}\n routes={routes}\n t={(key: string, params?: Record<string, unknown>) => t(`Footer.${key}`, params as any) as string}\n CookiePreferences={CookiePreferences}\n showPolicyLinks={!('__TAURI_INTERNALS__' in window)}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n />\n </div>\n );\n}\n\nfunction KnowledgeLayoutBody() {\n const { t } = useTranslation();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n const semiont = useSemiont();\n const activeKbId = useObservable(semiont.activeKbId$);\n const session = useObservable(semiont.activeSession$);\n const sessionActivating = useObservable(semiont.sessionActivating$);\n const token = useObservable(session?.token$);\n const activeKnowledgeBase = session?.kb ?? null;\n // \"Loading\" = a session construction is actively in flight. Without\n // the `sessionActivating` guard we'd sit on the spinner forever after\n // any `signOut`, which also leaves `activeKbId` set but `session`\n // null.\n const isLoading = activeKbId != null && session == null && sessionActivating;\n\n // A session that has just become live — restored at launch or signed in just\n // now — opens the Knowledge Base panel, whatever panel was showing before.\n useKbPanelOnLogin(Boolean(activeKnowledgeBase && token), semiont);\n\n if (isLoading) {\n return (\n <div className=\"h-screen flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4\"></div>\n <p className=\"text-gray-600 dark:text-gray-400\">Loading...</p>\n </div>\n </div>\n );\n }\n\n if (!activeKnowledgeBase || !token) {\n return (\n <UnauthenticatedKnowledgeLayout t={(key: string, params?: Record<string, unknown>) => t(key, params as any) as string} keyboardContext={keyboardContext} />\n );\n }\n\n return (\n <ResourceAnnotationsProvider>\n <GlobalEventsConnector />\n <div className=\"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden\">\n <div className=\"flex flex-1 overflow-hidden\">\n <KnowledgeSidebarWrapper />\n <main className=\"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden\">\n <div className=\"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden\">\n <Outlet />\n </div>\n </main>\n </div>\n <Footer\n Link={Link}\n routes={routes}\n t={(key: string, params?: Record<string, unknown>) => t(`Footer.${key}`, params as any) as string}\n CookiePreferences={CookiePreferences}\n showPolicyLinks={!('__TAURI_INTERNALS__' in window)}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n />\n </div>\n </ResourceAnnotationsProvider>\n );\n}\n\nexport default function KnowledgeLayout() {\n // AuthShell is mounted by the parent ProtectedLayout in App.tsx so it\n // survives navigation between know/, admin/, and moderate/ sections.\n return <KnowledgeLayoutBody />;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e={close:`Tutup`,codeLoading:`Memuatkan…`,codeAnalyzing:`Menanda…`,codeAnalyzingTags:`Menanda tag…`,codeDetectingEntities:`Menanda…`,codeCreatingAnnotations:`Mencipta {{count}} anotasi…`,codeCreatingTagAnnotations:`Mencipta {{count}} tag…`,codeCompleteCreated:`{{count}} {{kind}} dicipta`,codeGeneratingResource:`Menjana…`,codeCreatingResource:`Mencipta sumber…`,codeCompleteGenerated:`Sumber dicipta`,codeCompleteGeneratedTruncated:`Sumber dicipta — terpotong pada had panjang`,kindHighlight:`sorotan`,kindComment:`komen`,kindAssessment:`penilaian`,kindReference:`rujukan`,kindTag:`tag`,subject:`{{kind}}: {{label}}`,subjectWithPosition:`{{kind}}: {{label}} ({{done}} daripada {{total}})`,paramEntityTypes:`Jenis Entiti`,paramInstructions:`Arahan`,paramTone:`Nada`,paramDensity:`Ketumpatan`,subjectKindEntityType:`Jenis entiti`,subjectKindCategory:`Kategori`,cancel:`Batal`,inProgress:`Menganotasi...`},t={loadFailed:`Gagal memuatkan PDF`,loading:`Memuatkan PDF...`,next:`Seterusnya`,pageLoadFailed:`Gagal memuatkan halaman`,pageOf:`Halaman {{page}} daripada {{total}}`,pagination:`Navigasi halaman`,previous:`Sebelumnya`,viewerLoading:`Memuatkan pemapar PDF...`},n={annotations:`Anotasi`,history:`Sejarah`,resourceInfo:`Maklumat Sumber`,collaboration:`Kolaborasi`,userAccount:`Akaun Pengguna`,settings:`Tetapan`,knowledgeBase:`Pangkalan Pengetahuan`},r={title:`Maklumat Sumber`,locale:`Lokasi`,notSpecified:`Tidak dinyatakan`,entityTypeTags:`Tag Jenis Entiti`,representation:`Perwakilan`,mediaType:`Jenis Media`,byteSize:`Saiz`,storageUri:`Storan`,clone:`Klon`,cloneDescription:`Jana pautan klon yang boleh dikongsi untuk sumber ini`,generate:`Jana`,generateDescription:`Jana sumber baharu daripada konteks sumber ini`,archive:`Arkib`,archiveDescription:`Alihkan sumber ini ke status diarkibkan`,unarchive:`Nyaharkib`,unarchiveDescription:`Pulihkan sumber ini ke status aktif`,provenance:`Asal-usul`,createdAt:`Dicipta`,modifiedAt:`Diubah suai`,attributedTo:`Dikaitkan dengan`,derivedFrom:`Diperoleh daripada`},i={title:`Kolaborasi`,connectionStatus:`Status Sambungan`,live:`Langsung`,disconnected:`Terputus`,events:`{{count}} peristiwa`,lastSync:`Penyegerakan terakhir:`,noActivity:`Tiada aktiviti lagi`,justNow:`Baru sahaja`,secondsAgo:`{{count}} saat yang lalu`,minuteAgo:`1 minit yang lalu`,minutesAgo:`{{count}} minit yang lalu`,hourAgo:`1 jam yang lalu`,hoursAgo:`{{count}} jam yang lalu`,realtimeActive:`Kemas kini masa nyata sedang aktif`,reconnecting:`Menyambung semula ke pelayan...`,sharing:`Perkongsian`,collaborationComingSoon:`Ciri kolaborasi akan datang tidak lama lagi`,collaborators:`Kolaborator`,ceilings:`{{contextTokens}} masuk / {{maxOutputTokens}} keluar`,sharedWindow:`Tetingkap {{contextTokens}}`},a={history:`Sejarah`,loading:`Memuatkan...`,user:`Pengguna`,viewOriginal:`Lihat asal`,viewAnnotation:`Lihat anotasi: {{content}}`,resourceCreated:`Sumber Dicipta`,resourceCloned:`Diklon`,resourceArchived:`Diarkibkan`,resourceUnarchived:`Dinyaharkibkan`,highlightAdded:`Sorotan Ditambah`,highlightRemoved:`Sorotan Dibuang`,referenceCreated:`Rujukan Dicipta`,referenceResolved:`Rujukan Diselesaikan`,referenceDeleted:`Rujukan Dipadam`,entitytagAdded:`Tag Ditambah`,entitytagRemoved:`Tag Dibuang`,assessmentAdded:`Penilaian Ditambah`,assessmentRemoved:`Penilaian Dibuang`,annotationAdded:`Anotasi Ditambah`,annotationRemoved:`Anotasi Dibuang`,annotationBodyUpdated:`Anotasi Dikemas Kini`,jobEvent:`Peristiwa Tugas`,embeddingComputed:`Embedding dikira`,justNow:`baru sahaja`,minutesAgo:`{{count}}m lalu`,hoursAgo:`{{count}}j lalu`,daysAgo:`{{count}}h lalu`,failed:`Tidak dapat memuatkan sejarah.`,retry:`Cuba lagi`},o={title:`Ulasan`,noComments:`Tiada ulasan lagi. Pilih teks dan klik Ulasan untuk menambah satu.`,commentPlaceholder:`Taip ulasan anda di sini...`,save:`Simpan`,cancel:`Batal`,edit:`Sunting`,annotateComments:`Anotasi Ulasan`,instructions:`Arahan`,optional:`(pilihan)`,instructionsPlaceholder:`cth., Fokus pada istilah teknikal...`,annotate:`Anotasi`,annotating:`Menganotasi...`,toneLabel:`Nada`,toneOptional:`(pilihan)`,toneScholarly:`Ilmiah`,toneExplanatory:`Penjelasan`,toneConversational:`Perbualan`,toneTechnical:`Teknikal`,densityLabel:`Ketumpatan`,densitySparse:`Jarang`,densityDense:`Padat`,fragmentSelected:`Fragmen dipilih`,imageRegionSelected:`Kawasan imej dipilih`,complete:`Anotasi selesai!`,failed:`Anotasi gagal`,densityPerWords:`{{density}} setiap 2000 perkataan`},s={title:`Sorotan`,noHighlights:`Tiada sorotan lagi. Gunakan anotasi AI untuk mencari petikan penting.`,annotateHighlights:`Anotasi Sorotan`,instructions:`Arahan`,optional:`(pilihan)`,instructionsPlaceholder:`cth., Fokus pada konsep teknikal utama...`,annotate:`Anotasi`,annotating:`Menganotasi...`,cancel:`Batal`,densityLabel:`Ketumpatan`,densitySparse:`Jarang`,densityDense:`Padat`,complete:`Anotasi selesai!`,failed:`Anotasi gagal`,densityPerWords:`{{density}} setiap 2000 perkataan`},c={title:`Penilaian`,noAssessments:`Tiada penilaian lagi. Gunakan anotasi AI untuk menilai petikan.`,assessmentPlaceholder:`Taip penilaian anda di sini...`,save:`Simpan`,cancel:`Batal`,annotateAssessments:`Anotasi Penilaian`,instructions:`Arahan`,optional:`(pilihan)`,instructionsPlaceholder:`cth., Nilai dakwaan untuk ketepatan dan bukti...`,annotate:`Anotasi`,annotating:`Menganotasi...`,toneLabel:`Nada`,toneOptional:`(pilihan)`,toneAnalytical:`Analitikal`,toneCritical:`Kritikal`,toneBalanced:`Seimbang`,toneConstructive:`Konstruktif`,densityLabel:`Ketumpatan`,densitySparse:`Jarang`,densityDense:`Padat`,fragmentSelected:`Fragmen dipilih`,imageRegionSelected:`Kawasan imej dipilih`,complete:`Anotasi selesai!`,failed:`Anotasi gagal`,densityPerWords:`{{density}} setiap 2000 perkataan`},l={title:`Tag`,noTags:`Tiada tag lagi. Gunakan anotasi AI untuk mengenal pasti peranan struktur.`,noSchemas:"Tiada skema tag didaftarkan untuk pangkalan pengetahuan ini. Pentadbir KB mesti mendaftarkan sekurang-kurangnya satu skema analisis struktur (cth. melalui kemahiran `register-tag-schemas`) sebelum penandaan boleh digunakan.",annotateTags:`Anotasi Tag`,selectSchema:`Pilih Rangka Kerja`,selectCategories:`Pilih Kategori`,annotate:`Anotasi`,annotating:`Menganotasi...`,cancel:`Batal`,selectAll:`Pilih Semua`,deselectAll:`Nyahpilih Semua`,categoriesSelected:`{count, plural, =0 {Tiada kategori dipilih} =1 {1 kategori dipilih} other {# kategori dipilih}}`,createTagForSelection:`Cipta Tag untuk Pilihan`,selectCategory:`Pilih Kategori`,chooseCategory:`Pilih kategori...`,fragmentSelected:`Fragmen dipilih`,imageRegionSelected:`Kawasan imej dipilih`,complete:`Anotasi selesai!`,failed:`Anotasi gagal`},u={title:`Anotasi`,statistics:`Statistik`,highlight:`Sorotan`,reference:`Rujukan`,assessment:`Penilaian`,comment:`Ulasan`,tag:`Tag`,annotationsFailed:`Tidak dapat memuatkan anotasi.`,retry:`Cuba lagi`},d={title:`Statistik`,highlights:`Sorotan`,comments:`Ulasan`,assessments:`Penilaian`,tags:`Tag`,references:`Rujukan`,stub:`Stub`,resolved:`Diselesaikan`,entityTypes:`Jenis Entiti`},f={title:`Rujukan`,noReferences:`Tiada rujukan lagi. Pilih teks untuk mencipta rujukan ke sumber lain.`,outgoingReferences:`Rujukan Keluar`,incomingReferences:`Rujukan Masuk`,noIncomingReferences:`Tiada rujukan masuk`,stub:`Rujukan stub (tidak dipautkan)`,resolved:`Rujukan diselesaikan (dipautkan)`,derived:`Terbitan`,open:`Buka`,unlink:`Nyahpaut`,resolve:`Selesaikan rujukan`,cancel:`Batal`,createReference:`Cipta Rujukan`,entityTypesOptional:`Jenis Entiti (Pilihan)`,fragmentSelected:`Fragmen dipilih`,annotateReferences:`Anotasi Rujukan`,selectEntityTypes:`Jenis entiti:`,select:`Pilih`,deselect:`Nyahpilih`,noEntityTypes:`Tiada jenis entiti tersedia`,typesSelected:`{count, plural, =1 {1 jenis dipilih} other {# jenis dipilih}}`,annotate:`Anotasi`,annotating:`Menganotasi...`,includeDescriptiveReferences:`Sertakan rujukan deskriptif`,descriptiveReferencesTooltip:`Cari juga frasa seperti 'CEO tersebut', 'gergasi teknologi tersebut', 'ahli fizik tersebut' (selain nama)`,found:`{{count}} ditemui`,complete:`Anotasi selesai!`,failed:`Anotasi gagal`,current:`Semasa: {{entityType}}`,loading:`memuatkan...`,loadingEllipsis:`Memuatkan...`,untitledResource:`Sumber Tanpa Tajuk`,noText:`Tiada teks`,incomingReferencesFailed:`Tidak dapat memuatkan rujukan masuk.`,retry:`Cuba lagi`,entityTypesFailed:`Tidak dapat memuatkan jenis entiti.`,tally:`{{found}} daripada ~{{expected}} entiti`},p={title:`Pintasan Papan Kekunci`,closeDialog:`Tutup dialog`,or:`atau`,navigationTitle:`Navigasi`,navOpenSearch:`Buka carian global`,navOpenSearchAlt:`Buka carian global (alternatif)`,navCreateResource:`Cipta sumber baharu`,navCloseOverlays:`Tutup semua tindanan (tekan dua kali)`,navShowHelp:`Tunjukkan bantuan pintasan papan kekunci`,sidebarTitle:`Bar Sisi Pengetahuan`,sidebarCollapse:`Kecilkan bar sisi`,sidebarExpand:`Kembangkan bar sisi`,sidebarPickup:`Angkat tab sumber (apabila difokuskan)`,sidebarMove:`Alihkan tab sumber (apabila menyeret)`,sidebarDrop:`Lepaskan tab sumber (apabila menyeret)`,sidebarCancel:`Batalkan operasi seret`,annotationsTitle:`Anotasi Sumber`,annotHighlight:`Cipta sorotan daripada anotasi (terus)`,annotReference:`Buka tetingkap timbul rujukan untuk anotasi`,annotDelete:`Padam anotasi yang difokuskan`,annotNavigate:`Navigasi melalui anotasi`,annotNavigateBack:`Navigasi anotasi ke belakang`,listsTitle:`Senarai & Grid`,listsFilterNav:`Navigasi penapis jenis entiti`,listsGridNav:`Navigasi grid sumber`,listsJumpFirst:`Lompat ke item pertama`,listsJumpLast:`Lompat ke item terakhir`,searchModalTitle:`Dalam Modal Carian`,searchNav:`Navigasi hasil carian`,searchSelect:`Pilih hasil`,searchClose:`Tutup carian`,modalTitle:`Kawalan Modal`,modalClose:`Tutup modal aktif`,modalNavForward:`Navigasi ke hadapan melalui butang`,modalNavBackward:`Navigasi ke belakang melalui butang`,modalActivate:`Aktifkan butang yang difokuskan`,accessibilityTitle:`Kebolehcapaian`,a11ySkipLinks:`Navigasi ke pautan langkau (apabila di permulaan halaman)`,a11yFollowLink:`Ikuti pautan langkau`,macNote:`Menggunakan pintasan papan kekunci Mac. ⌘ ialah kekunci Command.`,windowsNote:`Menggunakan pintasan papan kekunci Windows/Linux. Ctrl ialah kekunci Control.`,footerHint:`Tekan {{key}} pada bila-bila masa untuk menunjukkan bantuan ini`,close:`Tutup`},m={modeGroup:`Mod`,browse:`Layari`,annotate:`Anotasi`,selectionGroup:`Motivasi`,clickGroup:`Klik`,shapeGroup:`Bentuk`,none:`Tiada`,linking:`Rujukan`,highlighting:`Sorotan`,assessing:`Nilai`,commenting:`Ulasan`,tagging:`Tag`,detail:`Perincian`,follow:`Ikuti`,deleting:`Padam`,jsonld:`JSON-LD`,rectangle:`Segi Empat Tepat`,circle:`Bulatan`,polygon:`Poligon`},h={title:`Navigasi`,collapseSidebar:`Kecilkan bar sisi`,expandSidebar:`Kembangkan bar sisi`,dragToReorder:`Seret untuk menyusun semula`,dragToReorderDoc:`Seret untuk menyusun semula {{name}}`,closeResource:`Tutup sumber`,dragInstructions:`Untuk menyusun semula sumber: Gunakan Tab untuk navigasi ke sumber. Tekan Alt+Anak panah atas untuk bergerak ke atas atau Alt+Anak panah bawah untuk bergerak ke bawah. Untuk seret dan lepas: Tekan bar ruang untuk mengangkat item. Gunakan kekunci anak panah untuk mengalihkannya. Tekan bar ruang sekali lagi untuk melepaskan.`},g={deleteConfirmationTitle:`Padam Anotasi`,deleteConfirmationMessage:`Adakah anda pasti mahu memadam anotasi ini? Tindakan ini tidak boleh dibatalkan.`,deleteConfirmationCancel:`Batal`,deleteConfirmationDelete:`Padam`},_={title:`Tetapan`,lineNumbers:`Nombor Baris`,lineNumbersVisible:`Kelihatan`,lineNumbersHidden:`Tersembunyi`,theme:`Tema`,themeLight:`Cerah`,themeDark:`Gelap`,themeSystem:`Sistem`,themeSystemActive:`Sistem ({{mode}})`,themeModeActive:`Menggunakan mod {{mode}}`,language:`Bahasa`,languageHint:`Tukar bahasa dalam navigasi utama`,languageChanging:`Menukar bahasa...`,hoverDelay:`Kelewatan Terapung`,hoverDelayFast:`Pantas`,hoverDelaySlow:`Perlahan`,hoverDelayDescription:`Kelewatan {{delay}}ms sebelum kesan terapung muncul`},v={},y={gatherIntro:`Pilih perkara yang hendak disertakan dalam konteks yang dikumpul.`,includeContent:`Sertakan kandungan sumber`,includeSummary:`Sertakan ringkasan`,gatherDepth:`Kedalaman`,gatherMaxResources:`Sumber Maksimum`,gatherButton:`Kumpul`,editGather:`Tukar tetapan kumpulan`,recallLabel:`Termasuk dalam imbasan — nyahpilih untuk mengecualikan`,loadingContext:`Mengumpul konteks...`,failedContext:`Gagal mengumpul konteks`,sourceContextLabel:`Sumber`,connectionsLabel:`Sambungan`,citedByLabel:`Dipetik oleh`,resourceTitle:`Tajuk sumber baharu`,resourceTitlePlaceholder:`Tajuk untuk sumber yang dijana...`,additionalInstructions:`Arahan Tambahan`,additionalInstructionsPlaceholder:`Panduan pilihan untuk penjanaan...`,language:`Bahasa`,languageHelp:`Bahasa untuk sumber yang dijana`,creativity:`Kreativiti`,creativityFocused:`Tertumpu`,creativityCreative:`Kreatif`,maxLength:`Panjang Maksimum`,maxLengthHelp:`Bilangan maksimum token`,generate:`Jana`,maxLengthCeiling:`Dihadkan kepada {{maxOutputTokens}} token oleh {{model}}.`,outputFormat:`Format`,formatExtensionMismatch:`Lokasi simpanan mesti berakhir dengan {{extension}} supaya sepadan dengan format yang dipilih.`,graphPaneTitle:`Kejiranan`,graphEmpty:`Belum ada pautan.`,resourceLinkLabel:`Pautan sumber`,corpusPaneTitle:`Petikan serupa`,corpusEmpty:`Tiada petikan serupa ditemui.`,excludedReceipt:`{{types}} dikecualikan daripada dapatan ini`,machineRead:`OCR`,score:`Skor`,saveLocation:`Lokasi simpanan`,discardDraftPrompt:`Buang draf ini?`,discardDraft:`Buang`,keepEditing:`Terus menyunting`,title:`Jana daripada sumber ini`},b={sourceContextLabel:`Konteks anotasi dalam sumber`,connectionsLabel:`Anotasi rakan sebaya`,citedByLabel:`Sumber dipetik oleh`,userHintLabel:`Petunjuk`,userHintPlaceholder:`Terangkan apa yang dirujuk oleh anotasi ini...`,loadingContext:`Mengumpul konteks...`,failedContext:`Gagal mengumpul konteks`,generate:`Jana`,compose:`Karang`,resolutionStrategyLabel:`Strategi resolusi`,back:`Kembali`,link:`Pautan`,score:`Skor`,noResults:`Tiada hasil ditemui`,resourceTitle:`Tajuk Sumber`,resourceTitlePlaceholder:`Masukkan tajuk sumber...`,additionalInstructions:`Arahan Tambahan`,additionalInstructionsPlaceholder:`Masukkan arahan tambahan...`,language:`Bahasa`,languageHelp:`Bahasa untuk kandungan yang dijana`,creativity:`Kreativiti`,creativityFocused:`Tertumpu`,creativityCreative:`Kreatif`,maxLength:`Panjang Maksimum`,maxLengthHelp:`Bilangan maksimum token`,maxResults:`Hasil Maksimum`,semanticScoring:`Pemarkahan Semantik`,semanticScoringHelp:`Gunakan AI untuk menilai hasil mengikut kerelevanan semantik`,searching:`Mencari...`,searchFailed:`Carian gagal`,search:`Cari`,maxLengthCeiling:`Dihadkan kepada {{maxOutputTokens}} token oleh {{model}}.`,outputFormat:`Format`,formatExtensionMismatch:`Lokasi simpanan mesti berakhir dengan {{extension}} supaya sepadan dengan format yang dipilih.`,graphPaneTitle:`Kejiranan`,graphEmpty:`Belum ada pautan — menyelesaikan rujukan ini mencipta yang pertama.`,resourceLinkLabel:`Pautan sumber`,corpusPaneTitle:`Petikan serupa`,corpusEmpty:`Tiada petikan serupa ditemui — carian berkemungkinan tidak berhasil.`,excludedReceipt:`{{types}} dikecualikan daripada dapatan ini`,machineRead:`OCR`,userHintEffect:`memandu carian dan penjanaan`,saveLocation:`Lokasi simpanan`,entityTypes:`Jenis entiti`,contentLabel:`Kandungan`,createAndLink:`Cipta & Paut`,creatingAndLinking:`Mencipta & memaut…`,discardDraftPrompt:`Buang draf ini?`,discardDraft:`Buang`,keepEditing:`Terus menyunting`,resolveTitle:`Selesaikan rujukan`},x={createFailed:`Tidak dapat mencipta anotasi: {{detail}}`,deleteFailed:`Tidak dapat memadam anotasi: {{detail}}`,referenceUpdateFailed:`Tidak dapat mengemas kini rujukan: {{detail}}`,unknownError:`ralat tidak diketahui`,assistQuiet:`Masih berjalan — tiada kemas kini selama beberapa minit`,resourceCreatedNamed:`“{{name}}” dicipta`,resourceCreated:`Sumber dicipta`,annotationComplete:`Anotasi selesai`,annotationFailed:`Anotasi gagal`,generationFailed:`Penjanaan gagal: {{detail}}`,"decline_no-text-layer":`PDF ini ialah imbasan yang teksnya tidak dapat dikenali.`,decline_encrypted:`PDF ini dilindungi kata laluan, teksnya tidak boleh dibaca.`,decline_corrupt:`PDF ini tidak dapat dibaca — fail mungkin rosak.`,"decline_too-large":`Dokumen ini terlalu besar untuk mengekstrak teks.`,decline_empty:`Dokumen ini tiada teks untuk dianotasi.`,annotationCompletePartial:`Pengesanan tamat tidak lengkap — {{pieces}} bahagian kurang dilaporkan`,annotationFailedPartial:`Pengesanan gagal — penemuan daripada {{kept}} jenis yang selesai dikekalkan`},S={AssistProgress:e,PdfViewer:t,Toolbar:n,ResourceInfoPanel:r,CollaborationPanel:i,AnnotationHistory:a,CommentsPanel:o,HighlightPanel:s,AssessmentPanel:c,TaggingPanel:l,UnifiedAnnotationsPanel:u,StatisticsPanel:d,ReferencesPanel:f,KeyboardShortcuts:p,AnnotateToolbar:m,CollapsibleResourceNavigation:h,ResourceViewer:g,Settings:_,AnnotateView:v,ResourceGenerate:y,ReferenceWizard:b,OutcomeToasts:x};export{m as AnnotateToolbar,v as AnnotateView,a as AnnotationHistory,c as AssessmentPanel,e as AssistProgress,i as CollaborationPanel,h as CollapsibleResourceNavigation,o as CommentsPanel,s as HighlightPanel,p as KeyboardShortcuts,x as OutcomeToasts,t as PdfViewer,b as ReferenceWizard,f as ReferencesPanel,y as ResourceGenerate,r as ResourceInfoPanel,g as ResourceViewer,_ as Settings,d as StatisticsPanel,l as TaggingPanel,n as Toolbar,u as UnifiedAnnotationsPanel,S as default};
|
|
2
|
+
//# sourceMappingURL=ms-3FAOUVYS-B5WSIC5e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ms-3FAOUVYS-B5WSIC5e.js","names":[],"sources":["../../../../packages/react-ui/dist/ms-3FAOUVYS.js"],"sourcesContent":["'use client';\nimport \"./chunk-O23TLLXW.js\";\n\n// translations/ms.json\nvar AssistProgress = {\n close: \"Tutup\",\n codeLoading: \"Memuatkan\\u2026\",\n codeAnalyzing: \"Menanda\\u2026\",\n codeAnalyzingTags: \"Menanda tag\\u2026\",\n codeDetectingEntities: \"Menanda\\u2026\",\n codeCreatingAnnotations: \"Mencipta {{count}} anotasi\\u2026\",\n codeCreatingTagAnnotations: \"Mencipta {{count}} tag\\u2026\",\n codeCompleteCreated: \"{{count}} {{kind}} dicipta\",\n codeGeneratingResource: \"Menjana\\u2026\",\n codeCreatingResource: \"Mencipta sumber\\u2026\",\n codeCompleteGenerated: \"Sumber dicipta\",\n codeCompleteGeneratedTruncated: \"Sumber dicipta \\u2014 terpotong pada had panjang\",\n kindHighlight: \"sorotan\",\n kindComment: \"komen\",\n kindAssessment: \"penilaian\",\n kindReference: \"rujukan\",\n kindTag: \"tag\",\n subject: \"{{kind}}: {{label}}\",\n subjectWithPosition: \"{{kind}}: {{label}} ({{done}} daripada {{total}})\",\n paramEntityTypes: \"Jenis Entiti\",\n paramInstructions: \"Arahan\",\n paramTone: \"Nada\",\n paramDensity: \"Ketumpatan\",\n subjectKindEntityType: \"Jenis entiti\",\n subjectKindCategory: \"Kategori\",\n cancel: \"Batal\",\n inProgress: \"Menganotasi...\"\n};\nvar PdfViewer = {\n loadFailed: \"Gagal memuatkan PDF\",\n loading: \"Memuatkan PDF...\",\n next: \"Seterusnya\",\n pageLoadFailed: \"Gagal memuatkan halaman\",\n pageOf: \"Halaman {{page}} daripada {{total}}\",\n pagination: \"Navigasi halaman\",\n previous: \"Sebelumnya\",\n viewerLoading: \"Memuatkan pemapar PDF...\"\n};\nvar Toolbar = {\n annotations: \"Anotasi\",\n history: \"Sejarah\",\n resourceInfo: \"Maklumat Sumber\",\n collaboration: \"Kolaborasi\",\n userAccount: \"Akaun Pengguna\",\n settings: \"Tetapan\",\n knowledgeBase: \"Pangkalan Pengetahuan\"\n};\nvar ResourceInfoPanel = {\n title: \"Maklumat Sumber\",\n locale: \"Lokasi\",\n notSpecified: \"Tidak dinyatakan\",\n entityTypeTags: \"Tag Jenis Entiti\",\n representation: \"Perwakilan\",\n mediaType: \"Jenis Media\",\n byteSize: \"Saiz\",\n storageUri: \"Storan\",\n clone: \"Klon\",\n cloneDescription: \"Jana pautan klon yang boleh dikongsi untuk sumber ini\",\n generate: \"Jana\",\n generateDescription: \"Jana sumber baharu daripada konteks sumber ini\",\n archive: \"Arkib\",\n archiveDescription: \"Alihkan sumber ini ke status diarkibkan\",\n unarchive: \"Nyaharkib\",\n unarchiveDescription: \"Pulihkan sumber ini ke status aktif\",\n provenance: \"Asal-usul\",\n createdAt: \"Dicipta\",\n modifiedAt: \"Diubah suai\",\n attributedTo: \"Dikaitkan dengan\",\n derivedFrom: \"Diperoleh daripada\"\n};\nvar CollaborationPanel = {\n title: \"Kolaborasi\",\n connectionStatus: \"Status Sambungan\",\n live: \"Langsung\",\n disconnected: \"Terputus\",\n events: \"{{count}} peristiwa\",\n lastSync: \"Penyegerakan terakhir:\",\n noActivity: \"Tiada aktiviti lagi\",\n justNow: \"Baru sahaja\",\n secondsAgo: \"{{count}} saat yang lalu\",\n minuteAgo: \"1 minit yang lalu\",\n minutesAgo: \"{{count}} minit yang lalu\",\n hourAgo: \"1 jam yang lalu\",\n hoursAgo: \"{{count}} jam yang lalu\",\n realtimeActive: \"Kemas kini masa nyata sedang aktif\",\n reconnecting: \"Menyambung semula ke pelayan...\",\n sharing: \"Perkongsian\",\n collaborationComingSoon: \"Ciri kolaborasi akan datang tidak lama lagi\",\n collaborators: \"Kolaborator\",\n ceilings: \"{{contextTokens}} masuk / {{maxOutputTokens}} keluar\",\n sharedWindow: \"Tetingkap {{contextTokens}}\"\n};\nvar AnnotationHistory = {\n history: \"Sejarah\",\n loading: \"Memuatkan...\",\n user: \"Pengguna\",\n viewOriginal: \"Lihat asal\",\n viewAnnotation: \"Lihat anotasi: {{content}}\",\n resourceCreated: \"Sumber Dicipta\",\n resourceCloned: \"Diklon\",\n resourceArchived: \"Diarkibkan\",\n resourceUnarchived: \"Dinyaharkibkan\",\n highlightAdded: \"Sorotan Ditambah\",\n highlightRemoved: \"Sorotan Dibuang\",\n referenceCreated: \"Rujukan Dicipta\",\n referenceResolved: \"Rujukan Diselesaikan\",\n referenceDeleted: \"Rujukan Dipadam\",\n entitytagAdded: \"Tag Ditambah\",\n entitytagRemoved: \"Tag Dibuang\",\n assessmentAdded: \"Penilaian Ditambah\",\n assessmentRemoved: \"Penilaian Dibuang\",\n annotationAdded: \"Anotasi Ditambah\",\n annotationRemoved: \"Anotasi Dibuang\",\n annotationBodyUpdated: \"Anotasi Dikemas Kini\",\n jobEvent: \"Peristiwa Tugas\",\n embeddingComputed: \"Embedding dikira\",\n justNow: \"baru sahaja\",\n minutesAgo: \"{{count}}m lalu\",\n hoursAgo: \"{{count}}j lalu\",\n daysAgo: \"{{count}}h lalu\",\n failed: \"Tidak dapat memuatkan sejarah.\",\n retry: \"Cuba lagi\"\n};\nvar CommentsPanel = {\n title: \"Ulasan\",\n noComments: \"Tiada ulasan lagi. Pilih teks dan klik Ulasan untuk menambah satu.\",\n commentPlaceholder: \"Taip ulasan anda di sini...\",\n save: \"Simpan\",\n cancel: \"Batal\",\n edit: \"Sunting\",\n annotateComments: \"Anotasi Ulasan\",\n instructions: \"Arahan\",\n optional: \"(pilihan)\",\n instructionsPlaceholder: \"cth., Fokus pada istilah teknikal...\",\n annotate: \"Anotasi\",\n annotating: \"Menganotasi...\",\n toneLabel: \"Nada\",\n toneOptional: \"(pilihan)\",\n toneScholarly: \"Ilmiah\",\n toneExplanatory: \"Penjelasan\",\n toneConversational: \"Perbualan\",\n toneTechnical: \"Teknikal\",\n densityLabel: \"Ketumpatan\",\n densitySparse: \"Jarang\",\n densityDense: \"Padat\",\n fragmentSelected: \"Fragmen dipilih\",\n imageRegionSelected: \"Kawasan imej dipilih\",\n complete: \"Anotasi selesai!\",\n failed: \"Anotasi gagal\",\n densityPerWords: \"{{density}} setiap 2000 perkataan\"\n};\nvar HighlightPanel = {\n title: \"Sorotan\",\n noHighlights: \"Tiada sorotan lagi. Gunakan anotasi AI untuk mencari petikan penting.\",\n annotateHighlights: \"Anotasi Sorotan\",\n instructions: \"Arahan\",\n optional: \"(pilihan)\",\n instructionsPlaceholder: \"cth., Fokus pada konsep teknikal utama...\",\n annotate: \"Anotasi\",\n annotating: \"Menganotasi...\",\n cancel: \"Batal\",\n densityLabel: \"Ketumpatan\",\n densitySparse: \"Jarang\",\n densityDense: \"Padat\",\n complete: \"Anotasi selesai!\",\n failed: \"Anotasi gagal\",\n densityPerWords: \"{{density}} setiap 2000 perkataan\"\n};\nvar AssessmentPanel = {\n title: \"Penilaian\",\n noAssessments: \"Tiada penilaian lagi. Gunakan anotasi AI untuk menilai petikan.\",\n assessmentPlaceholder: \"Taip penilaian anda di sini...\",\n save: \"Simpan\",\n cancel: \"Batal\",\n annotateAssessments: \"Anotasi Penilaian\",\n instructions: \"Arahan\",\n optional: \"(pilihan)\",\n instructionsPlaceholder: \"cth., Nilai dakwaan untuk ketepatan dan bukti...\",\n annotate: \"Anotasi\",\n annotating: \"Menganotasi...\",\n toneLabel: \"Nada\",\n toneOptional: \"(pilihan)\",\n toneAnalytical: \"Analitikal\",\n toneCritical: \"Kritikal\",\n toneBalanced: \"Seimbang\",\n toneConstructive: \"Konstruktif\",\n densityLabel: \"Ketumpatan\",\n densitySparse: \"Jarang\",\n densityDense: \"Padat\",\n fragmentSelected: \"Fragmen dipilih\",\n imageRegionSelected: \"Kawasan imej dipilih\",\n complete: \"Anotasi selesai!\",\n failed: \"Anotasi gagal\",\n densityPerWords: \"{{density}} setiap 2000 perkataan\"\n};\nvar TaggingPanel = {\n title: \"Tag\",\n noTags: \"Tiada tag lagi. Gunakan anotasi AI untuk mengenal pasti peranan struktur.\",\n noSchemas: \"Tiada skema tag didaftarkan untuk pangkalan pengetahuan ini. Pentadbir KB mesti mendaftarkan sekurang-kurangnya satu skema analisis struktur (cth. melalui kemahiran `register-tag-schemas`) sebelum penandaan boleh digunakan.\",\n annotateTags: \"Anotasi Tag\",\n selectSchema: \"Pilih Rangka Kerja\",\n selectCategories: \"Pilih Kategori\",\n annotate: \"Anotasi\",\n annotating: \"Menganotasi...\",\n cancel: \"Batal\",\n selectAll: \"Pilih Semua\",\n deselectAll: \"Nyahpilih Semua\",\n categoriesSelected: \"{count, plural, =0 {Tiada kategori dipilih} =1 {1 kategori dipilih} other {# kategori dipilih}}\",\n createTagForSelection: \"Cipta Tag untuk Pilihan\",\n selectCategory: \"Pilih Kategori\",\n chooseCategory: \"Pilih kategori...\",\n fragmentSelected: \"Fragmen dipilih\",\n imageRegionSelected: \"Kawasan imej dipilih\",\n complete: \"Anotasi selesai!\",\n failed: \"Anotasi gagal\"\n};\nvar UnifiedAnnotationsPanel = {\n title: \"Anotasi\",\n statistics: \"Statistik\",\n highlight: \"Sorotan\",\n reference: \"Rujukan\",\n assessment: \"Penilaian\",\n comment: \"Ulasan\",\n tag: \"Tag\",\n annotationsFailed: \"Tidak dapat memuatkan anotasi.\",\n retry: \"Cuba lagi\"\n};\nvar StatisticsPanel = {\n title: \"Statistik\",\n highlights: \"Sorotan\",\n comments: \"Ulasan\",\n assessments: \"Penilaian\",\n tags: \"Tag\",\n references: \"Rujukan\",\n stub: \"Stub\",\n resolved: \"Diselesaikan\",\n entityTypes: \"Jenis Entiti\"\n};\nvar ReferencesPanel = {\n title: \"Rujukan\",\n noReferences: \"Tiada rujukan lagi. Pilih teks untuk mencipta rujukan ke sumber lain.\",\n outgoingReferences: \"Rujukan Keluar\",\n incomingReferences: \"Rujukan Masuk\",\n noIncomingReferences: \"Tiada rujukan masuk\",\n stub: \"Rujukan stub (tidak dipautkan)\",\n resolved: \"Rujukan diselesaikan (dipautkan)\",\n derived: \"Terbitan\",\n open: \"Buka\",\n unlink: \"Nyahpaut\",\n resolve: \"Selesaikan rujukan\",\n cancel: \"Batal\",\n createReference: \"Cipta Rujukan\",\n entityTypesOptional: \"Jenis Entiti (Pilihan)\",\n fragmentSelected: \"Fragmen dipilih\",\n annotateReferences: \"Anotasi Rujukan\",\n selectEntityTypes: \"Jenis entiti:\",\n select: \"Pilih\",\n deselect: \"Nyahpilih\",\n noEntityTypes: \"Tiada jenis entiti tersedia\",\n typesSelected: \"{count, plural, =1 {1 jenis dipilih} other {# jenis dipilih}}\",\n annotate: \"Anotasi\",\n annotating: \"Menganotasi...\",\n includeDescriptiveReferences: \"Sertakan rujukan deskriptif\",\n descriptiveReferencesTooltip: \"Cari juga frasa seperti 'CEO tersebut', 'gergasi teknologi tersebut', 'ahli fizik tersebut' (selain nama)\",\n found: \"{{count}} ditemui\",\n complete: \"Anotasi selesai!\",\n failed: \"Anotasi gagal\",\n current: \"Semasa: {{entityType}}\",\n loading: \"memuatkan...\",\n loadingEllipsis: \"Memuatkan...\",\n untitledResource: \"Sumber Tanpa Tajuk\",\n noText: \"Tiada teks\",\n incomingReferencesFailed: \"Tidak dapat memuatkan rujukan masuk.\",\n retry: \"Cuba lagi\",\n entityTypesFailed: \"Tidak dapat memuatkan jenis entiti.\",\n tally: \"{{found}} daripada ~{{expected}} entiti\"\n};\nvar KeyboardShortcuts = {\n title: \"Pintasan Papan Kekunci\",\n closeDialog: \"Tutup dialog\",\n or: \"atau\",\n navigationTitle: \"Navigasi\",\n navOpenSearch: \"Buka carian global\",\n navOpenSearchAlt: \"Buka carian global (alternatif)\",\n navCreateResource: \"Cipta sumber baharu\",\n navCloseOverlays: \"Tutup semua tindanan (tekan dua kali)\",\n navShowHelp: \"Tunjukkan bantuan pintasan papan kekunci\",\n sidebarTitle: \"Bar Sisi Pengetahuan\",\n sidebarCollapse: \"Kecilkan bar sisi\",\n sidebarExpand: \"Kembangkan bar sisi\",\n sidebarPickup: \"Angkat tab sumber (apabila difokuskan)\",\n sidebarMove: \"Alihkan tab sumber (apabila menyeret)\",\n sidebarDrop: \"Lepaskan tab sumber (apabila menyeret)\",\n sidebarCancel: \"Batalkan operasi seret\",\n annotationsTitle: \"Anotasi Sumber\",\n annotHighlight: \"Cipta sorotan daripada anotasi (terus)\",\n annotReference: \"Buka tetingkap timbul rujukan untuk anotasi\",\n annotDelete: \"Padam anotasi yang difokuskan\",\n annotNavigate: \"Navigasi melalui anotasi\",\n annotNavigateBack: \"Navigasi anotasi ke belakang\",\n listsTitle: \"Senarai & Grid\",\n listsFilterNav: \"Navigasi penapis jenis entiti\",\n listsGridNav: \"Navigasi grid sumber\",\n listsJumpFirst: \"Lompat ke item pertama\",\n listsJumpLast: \"Lompat ke item terakhir\",\n searchModalTitle: \"Dalam Modal Carian\",\n searchNav: \"Navigasi hasil carian\",\n searchSelect: \"Pilih hasil\",\n searchClose: \"Tutup carian\",\n modalTitle: \"Kawalan Modal\",\n modalClose: \"Tutup modal aktif\",\n modalNavForward: \"Navigasi ke hadapan melalui butang\",\n modalNavBackward: \"Navigasi ke belakang melalui butang\",\n modalActivate: \"Aktifkan butang yang difokuskan\",\n accessibilityTitle: \"Kebolehcapaian\",\n a11ySkipLinks: \"Navigasi ke pautan langkau (apabila di permulaan halaman)\",\n a11yFollowLink: \"Ikuti pautan langkau\",\n macNote: \"Menggunakan pintasan papan kekunci Mac. \\u2318 ialah kekunci Command.\",\n windowsNote: \"Menggunakan pintasan papan kekunci Windows/Linux. Ctrl ialah kekunci Control.\",\n footerHint: \"Tekan {{key}} pada bila-bila masa untuk menunjukkan bantuan ini\",\n close: \"Tutup\"\n};\nvar AnnotateToolbar = {\n modeGroup: \"Mod\",\n browse: \"Layari\",\n annotate: \"Anotasi\",\n selectionGroup: \"Motivasi\",\n clickGroup: \"Klik\",\n shapeGroup: \"Bentuk\",\n none: \"Tiada\",\n linking: \"Rujukan\",\n highlighting: \"Sorotan\",\n assessing: \"Nilai\",\n commenting: \"Ulasan\",\n tagging: \"Tag\",\n detail: \"Perincian\",\n follow: \"Ikuti\",\n deleting: \"Padam\",\n jsonld: \"JSON-LD\",\n rectangle: \"Segi Empat Tepat\",\n circle: \"Bulatan\",\n polygon: \"Poligon\"\n};\nvar CollapsibleResourceNavigation = {\n title: \"Navigasi\",\n collapseSidebar: \"Kecilkan bar sisi\",\n expandSidebar: \"Kembangkan bar sisi\",\n dragToReorder: \"Seret untuk menyusun semula\",\n dragToReorderDoc: \"Seret untuk menyusun semula {{name}}\",\n closeResource: \"Tutup sumber\",\n dragInstructions: \"Untuk menyusun semula sumber: Gunakan Tab untuk navigasi ke sumber. Tekan Alt+Anak panah atas untuk bergerak ke atas atau Alt+Anak panah bawah untuk bergerak ke bawah. Untuk seret dan lepas: Tekan bar ruang untuk mengangkat item. Gunakan kekunci anak panah untuk mengalihkannya. Tekan bar ruang sekali lagi untuk melepaskan.\"\n};\nvar ResourceViewer = {\n deleteConfirmationTitle: \"Padam Anotasi\",\n deleteConfirmationMessage: \"Adakah anda pasti mahu memadam anotasi ini? Tindakan ini tidak boleh dibatalkan.\",\n deleteConfirmationCancel: \"Batal\",\n deleteConfirmationDelete: \"Padam\"\n};\nvar Settings = {\n title: \"Tetapan\",\n lineNumbers: \"Nombor Baris\",\n lineNumbersVisible: \"Kelihatan\",\n lineNumbersHidden: \"Tersembunyi\",\n theme: \"Tema\",\n themeLight: \"Cerah\",\n themeDark: \"Gelap\",\n themeSystem: \"Sistem\",\n themeSystemActive: \"Sistem ({{mode}})\",\n themeModeActive: \"Menggunakan mod {{mode}}\",\n language: \"Bahasa\",\n languageHint: \"Tukar bahasa dalam navigasi utama\",\n languageChanging: \"Menukar bahasa...\",\n hoverDelay: \"Kelewatan Terapung\",\n hoverDelayFast: \"Pantas\",\n hoverDelaySlow: \"Perlahan\",\n hoverDelayDescription: \"Kelewatan {{delay}}ms sebelum kesan terapung muncul\"\n};\nvar AnnotateView = {};\nvar ResourceGenerate = {\n gatherIntro: \"Pilih perkara yang hendak disertakan dalam konteks yang dikumpul.\",\n includeContent: \"Sertakan kandungan sumber\",\n includeSummary: \"Sertakan ringkasan\",\n gatherDepth: \"Kedalaman\",\n gatherMaxResources: \"Sumber Maksimum\",\n gatherButton: \"Kumpul\",\n editGather: \"Tukar tetapan kumpulan\",\n recallLabel: \"Termasuk dalam imbasan \\u2014 nyahpilih untuk mengecualikan\",\n loadingContext: \"Mengumpul konteks...\",\n failedContext: \"Gagal mengumpul konteks\",\n sourceContextLabel: \"Sumber\",\n connectionsLabel: \"Sambungan\",\n citedByLabel: \"Dipetik oleh\",\n resourceTitle: \"Tajuk sumber baharu\",\n resourceTitlePlaceholder: \"Tajuk untuk sumber yang dijana...\",\n additionalInstructions: \"Arahan Tambahan\",\n additionalInstructionsPlaceholder: \"Panduan pilihan untuk penjanaan...\",\n language: \"Bahasa\",\n languageHelp: \"Bahasa untuk sumber yang dijana\",\n creativity: \"Kreativiti\",\n creativityFocused: \"Tertumpu\",\n creativityCreative: \"Kreatif\",\n maxLength: \"Panjang Maksimum\",\n maxLengthHelp: \"Bilangan maksimum token\",\n generate: \"Jana\",\n maxLengthCeiling: \"Dihadkan kepada {{maxOutputTokens}} token oleh {{model}}.\",\n outputFormat: \"Format\",\n formatExtensionMismatch: \"Lokasi simpanan mesti berakhir dengan {{extension}} supaya sepadan dengan format yang dipilih.\",\n graphPaneTitle: \"Kejiranan\",\n graphEmpty: \"Belum ada pautan.\",\n resourceLinkLabel: \"Pautan sumber\",\n corpusPaneTitle: \"Petikan serupa\",\n corpusEmpty: \"Tiada petikan serupa ditemui.\",\n excludedReceipt: \"{{types}} dikecualikan daripada dapatan ini\",\n machineRead: \"OCR\",\n score: \"Skor\",\n saveLocation: \"Lokasi simpanan\",\n discardDraftPrompt: \"Buang draf ini?\",\n discardDraft: \"Buang\",\n keepEditing: \"Terus menyunting\",\n title: \"Jana daripada sumber ini\"\n};\nvar ReferenceWizard = {\n sourceContextLabel: \"Konteks anotasi dalam sumber\",\n connectionsLabel: \"Anotasi rakan sebaya\",\n citedByLabel: \"Sumber dipetik oleh\",\n userHintLabel: \"Petunjuk\",\n userHintPlaceholder: \"Terangkan apa yang dirujuk oleh anotasi ini...\",\n loadingContext: \"Mengumpul konteks...\",\n failedContext: \"Gagal mengumpul konteks\",\n generate: \"Jana\",\n compose: \"Karang\",\n resolutionStrategyLabel: \"Strategi resolusi\",\n back: \"Kembali\",\n link: \"Pautan\",\n score: \"Skor\",\n noResults: \"Tiada hasil ditemui\",\n resourceTitle: \"Tajuk Sumber\",\n resourceTitlePlaceholder: \"Masukkan tajuk sumber...\",\n additionalInstructions: \"Arahan Tambahan\",\n additionalInstructionsPlaceholder: \"Masukkan arahan tambahan...\",\n language: \"Bahasa\",\n languageHelp: \"Bahasa untuk kandungan yang dijana\",\n creativity: \"Kreativiti\",\n creativityFocused: \"Tertumpu\",\n creativityCreative: \"Kreatif\",\n maxLength: \"Panjang Maksimum\",\n maxLengthHelp: \"Bilangan maksimum token\",\n maxResults: \"Hasil Maksimum\",\n semanticScoring: \"Pemarkahan Semantik\",\n semanticScoringHelp: \"Gunakan AI untuk menilai hasil mengikut kerelevanan semantik\",\n searching: \"Mencari...\",\n searchFailed: \"Carian gagal\",\n search: \"Cari\",\n maxLengthCeiling: \"Dihadkan kepada {{maxOutputTokens}} token oleh {{model}}.\",\n outputFormat: \"Format\",\n formatExtensionMismatch: \"Lokasi simpanan mesti berakhir dengan {{extension}} supaya sepadan dengan format yang dipilih.\",\n graphPaneTitle: \"Kejiranan\",\n graphEmpty: \"Belum ada pautan \\u2014 menyelesaikan rujukan ini mencipta yang pertama.\",\n resourceLinkLabel: \"Pautan sumber\",\n corpusPaneTitle: \"Petikan serupa\",\n corpusEmpty: \"Tiada petikan serupa ditemui \\u2014 carian berkemungkinan tidak berhasil.\",\n excludedReceipt: \"{{types}} dikecualikan daripada dapatan ini\",\n machineRead: \"OCR\",\n userHintEffect: \"memandu carian dan penjanaan\",\n saveLocation: \"Lokasi simpanan\",\n entityTypes: \"Jenis entiti\",\n contentLabel: \"Kandungan\",\n createAndLink: \"Cipta & Paut\",\n creatingAndLinking: \"Mencipta & memaut\\u2026\",\n discardDraftPrompt: \"Buang draf ini?\",\n discardDraft: \"Buang\",\n keepEditing: \"Terus menyunting\",\n resolveTitle: \"Selesaikan rujukan\"\n};\nvar OutcomeToasts = {\n createFailed: \"Tidak dapat mencipta anotasi: {{detail}}\",\n deleteFailed: \"Tidak dapat memadam anotasi: {{detail}}\",\n referenceUpdateFailed: \"Tidak dapat mengemas kini rujukan: {{detail}}\",\n unknownError: \"ralat tidak diketahui\",\n assistQuiet: \"Masih berjalan \\u2014 tiada kemas kini selama beberapa minit\",\n resourceCreatedNamed: \"\\u201C{{name}}\\u201D dicipta\",\n resourceCreated: \"Sumber dicipta\",\n annotationComplete: \"Anotasi selesai\",\n annotationFailed: \"Anotasi gagal\",\n generationFailed: \"Penjanaan gagal: {{detail}}\",\n \"decline_no-text-layer\": \"PDF ini ialah imbasan yang teksnya tidak dapat dikenali.\",\n decline_encrypted: \"PDF ini dilindungi kata laluan, teksnya tidak boleh dibaca.\",\n decline_corrupt: \"PDF ini tidak dapat dibaca \\u2014 fail mungkin rosak.\",\n \"decline_too-large\": \"Dokumen ini terlalu besar untuk mengekstrak teks.\",\n decline_empty: \"Dokumen ini tiada teks untuk dianotasi.\",\n annotationCompletePartial: \"Pengesanan tamat tidak lengkap \\u2014 {{pieces}} bahagian kurang dilaporkan\",\n annotationFailedPartial: \"Pengesanan gagal \\u2014 penemuan daripada {{kept}} jenis yang selesai dikekalkan\"\n};\nvar ms_default = {\n AssistProgress,\n PdfViewer,\n Toolbar,\n ResourceInfoPanel,\n CollaborationPanel,\n AnnotationHistory,\n CommentsPanel,\n HighlightPanel,\n AssessmentPanel,\n TaggingPanel,\n UnifiedAnnotationsPanel,\n StatisticsPanel,\n ReferencesPanel,\n KeyboardShortcuts,\n AnnotateToolbar,\n CollapsibleResourceNavigation,\n ResourceViewer,\n Settings,\n AnnotateView,\n ResourceGenerate,\n ReferenceWizard,\n OutcomeToasts\n};\nexport {\n AnnotateToolbar,\n AnnotateView,\n AnnotationHistory,\n AssessmentPanel,\n AssistProgress,\n CollaborationPanel,\n CollapsibleResourceNavigation,\n CommentsPanel,\n HighlightPanel,\n KeyboardShortcuts,\n OutcomeToasts,\n PdfViewer,\n ReferenceWizard,\n ReferencesPanel,\n ResourceGenerate,\n ResourceInfoPanel,\n ResourceViewer,\n Settings,\n StatisticsPanel,\n TaggingPanel,\n Toolbar,\n UnifiedAnnotationsPanel,\n ms_default as default\n};\n//# sourceMappingURL=ms-3FAOUVYS.js.map"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e={close:`Sluiten`,codeLoading:`Laden…`,codeAnalyzing:`Annoteren…`,codeAnalyzingTags:`Tags annoteren…`,codeDetectingEntities:`Annoteren…`,codeCreatingAnnotations:`{{count}} annotaties maken…`,codeCreatingTagAnnotations:`{{count}} tags maken…`,codeCompleteCreated:`{{count}} {{kind}} gemaakt`,codeGeneratingResource:`Genereren…`,codeCreatingResource:`Bron maken…`,codeCompleteGenerated:`Bron gemaakt`,codeCompleteGeneratedTruncated:`Bron gemaakt — afgekapt bij de lengtelimiet`,kindHighlight:`markeringen`,kindComment:`opmerkingen`,kindAssessment:`beoordelingen`,kindReference:`verwijzingen`,kindTag:`tags`,subject:`{{kind}}: {{label}}`,subjectWithPosition:`{{kind}}: {{label}} ({{done}} van {{total}})`,paramEntityTypes:`Entiteitstypen`,paramInstructions:`Instructies`,paramTone:`Toon`,paramDensity:`Dichtheid`,subjectKindEntityType:`Entiteitstype`,subjectKindCategory:`Categorie`,cancel:`Annuleren`,inProgress:`Annoteren...`},t={loadFailed:`Kan de PDF niet laden`,loading:`PDF laden...`,next:`Volgende`,pageLoadFailed:`Kan de pagina niet laden`,pageOf:`Pagina {{page}} van {{total}}`,pagination:`Paginanavigatie`,previous:`Vorige`,viewerLoading:`PDF-viewer laden...`},n={annotations:`Annotaties`,history:`Geschiedenis`,resourceInfo:`Broninformatie`,collaboration:`Samenwerking`,userAccount:`Gebruikersaccount`,settings:`Instellingen`,knowledgeBase:`Kennisbank`},r={title:`Broninformatie`,locale:`Taalregio`,notSpecified:`Niet gespecificeerd`,entityTypeTags:`Entiteitstypelabels`,representation:`Representatie`,mediaType:`Mediatype`,byteSize:`Grootte`,storageUri:`Opslag`,clone:`Klonen`,cloneDescription:`Genereer een deelbare kloonlink voor deze bron`,generate:`Genereren`,generateDescription:`Genereer een nieuwe bron op basis van de context van deze bron`,archive:`Archiveren`,archiveDescription:`Verplaats deze bron naar gearchiveerde status`,unarchive:`Dearchiveren`,unarchiveDescription:`Herstel deze bron naar actieve status`,provenance:`Herkomst`,createdAt:`Aangemaakt`,modifiedAt:`Gewijzigd`,attributedTo:`Toegeschreven aan`,derivedFrom:`Afgeleid van`},i={title:`Samenwerking`,connectionStatus:`Verbindingsstatus`,live:`Live`,disconnected:`Verbroken`,events:`{{count}} gebeurtenissen`,lastSync:`Laatste synchronisatie:`,noActivity:`Nog geen activiteit`,justNow:`Zojuist`,secondsAgo:`{{count}} seconden geleden`,minuteAgo:`1 minuut geleden`,minutesAgo:`{{count}} minuten geleden`,hourAgo:`1 uur geleden`,hoursAgo:`{{count}} uur geleden`,realtimeActive:`Realtime-updates zijn actief`,reconnecting:`Opnieuw verbinden met server...`,sharing:`Delen`,collaborationComingSoon:`Samenwerkingsfuncties komen binnenkort`,collaborators:`Medewerkers`,ceilings:`{{contextTokens}} in / {{maxOutputTokens}} uit`,sharedWindow:`{{contextTokens}} venster`},a={history:`Geschiedenis`,loading:`Laden...`,user:`Gebruiker`,viewOriginal:`Origineel bekijken`,viewAnnotation:`Annotatie bekijken: {{content}}`,resourceCreated:`Bron aangemaakt`,resourceCloned:`Gekloond`,resourceArchived:`Gearchiveerd`,resourceUnarchived:`Gedearchiveerd`,highlightAdded:`Markering toegevoegd`,highlightRemoved:`Markering verwijderd`,referenceCreated:`Referentie aangemaakt`,referenceResolved:`Referentie opgelost`,referenceDeleted:`Referentie verwijderd`,entitytagAdded:`Label toegevoegd`,entitytagRemoved:`Label verwijderd`,assessmentAdded:`Beoordeling toegevoegd`,assessmentRemoved:`Beoordeling verwijderd`,annotationAdded:`Annotatie toegevoegd`,annotationRemoved:`Annotatie verwijderd`,annotationBodyUpdated:`Annotatie bijgewerkt`,jobEvent:`Taakgebeurtenis`,embeddingComputed:`Embedding berekend`,justNow:`zojuist`,minutesAgo:`{{count}}m geleden`,hoursAgo:`{{count}}u geleden`,daysAgo:`{{count}}d geleden`,failed:`Kan de geschiedenis niet laden.`,retry:`Opnieuw proberen`},o={title:`Opmerkingen`,noComments:`Nog geen opmerkingen. Selecteer tekst en klik op Opmerking om er een toe te voegen.`,commentPlaceholder:`Typ hier je opmerking...`,save:`Opslaan`,cancel:`Annuleren`,edit:`Bewerken`,annotateComments:`Opmerkingen annoteren`,instructions:`Instructies`,optional:`(optioneel)`,instructionsPlaceholder:`bijv. Focus op technische terminologie...`,annotate:`Annoteren`,annotating:`Annoteren...`,toneLabel:`Toon`,toneOptional:`(optioneel)`,toneScholarly:`Wetenschappelijk`,toneExplanatory:`Verklarend`,toneConversational:`Conversationeel`,toneTechnical:`Technisch`,densityLabel:`Dichtheid`,densitySparse:`Schaars`,densityDense:`Dicht`,fragmentSelected:`Fragment geselecteerd`,imageRegionSelected:`Afbeeldingsgebied geselecteerd`,complete:`Annotatie voltooid!`,failed:`Annotatie mislukt`,densityPerWords:`{{density}} per 2000 woorden`},s={title:`Markeringen`,noHighlights:`Nog geen markeringen. Gebruik AI-annotatie om belangrijke passages te vinden.`,annotateHighlights:`Markeringen annoteren`,instructions:`Instructies`,optional:`(optioneel)`,instructionsPlaceholder:`bijv. Focus op belangrijke technische concepten...`,annotate:`Annoteren`,annotating:`Annoteren...`,cancel:`Annuleren`,densityLabel:`Dichtheid`,densitySparse:`Schaars`,densityDense:`Dicht`,complete:`Annotatie voltooid!`,failed:`Annotatie mislukt`,densityPerWords:`{{density}} per 2000 woorden`},c={title:`Beoordelingen`,noAssessments:`Nog geen beoordelingen. Gebruik AI-annotatie om passages te evalueren.`,assessmentPlaceholder:`Typ hier je beoordeling...`,save:`Opslaan`,cancel:`Annuleren`,annotateAssessments:`Beoordelingen annoteren`,instructions:`Instructies`,optional:`(optioneel)`,instructionsPlaceholder:`bijv. Evalueer beweringen op nauwkeurigheid en bewijs...`,annotate:`Annoteren`,annotating:`Annoteren...`,toneLabel:`Toon`,toneOptional:`(optioneel)`,toneAnalytical:`Analytisch`,toneCritical:`Kritisch`,toneBalanced:`Evenwichtig`,toneConstructive:`Constructief`,densityLabel:`Dichtheid`,densitySparse:`Schaars`,densityDense:`Dicht`,fragmentSelected:`Fragment geselecteerd`,imageRegionSelected:`Afbeeldingsgebied geselecteerd`,complete:`Annotatie voltooid!`,failed:`Annotatie mislukt`,densityPerWords:`{{density}} per 2000 woorden`},l={title:`Labels`,noTags:`Nog geen labels. Gebruik AI-annotatie om structurele rollen te identificeren.`,noSchemas:"Geen tagschema's geregistreerd voor deze kennisbasis. Een KB-beheerder moet ten minste één structureel-analyseschema registreren (bv. via de `register-tag-schemas`-skill) voordat tagging gebruikt kan worden.",annotateTags:`Labels annoteren`,selectSchema:`Framework selecteren`,selectCategories:`Categorieën selecteren`,annotate:`Annoteren`,annotating:`Annoteren...`,cancel:`Annuleren`,selectAll:`Alles selecteren`,deselectAll:`Alles deselecteren`,categoriesSelected:`{count, plural, =0 {Geen categorieën geselecteerd} =1 {1 categorie geselecteerd} other {# categorieën geselecteerd}}`,createTagForSelection:`Label maken voor selectie`,selectCategory:`Categorie selecteren`,chooseCategory:`Kies een categorie...`,fragmentSelected:`Fragment geselecteerd`,imageRegionSelected:`Afbeeldingsgebied geselecteerd`,complete:`Annotatie voltooid!`,failed:`Annotatie mislukt`},u={title:`Annotaties`,statistics:`Statistieken`,highlight:`Markeringen`,reference:`Referenties`,assessment:`Beoordelingen`,comment:`Opmerkingen`,tag:`Labels`,annotationsFailed:`Kan de annotaties niet laden.`,retry:`Opnieuw proberen`},d={title:`Statistieken`,highlights:`Markeringen`,comments:`Opmerkingen`,assessments:`Beoordelingen`,tags:`Labels`,references:`Referenties`,stub:`Stub`,resolved:`Opgelost`,entityTypes:`Entiteitstypen`},f={title:`Referenties`,noReferences:`Nog geen referenties. Selecteer tekst om referenties naar andere bronnen te maken.`,outgoingReferences:`Uitgaande referenties`,incomingReferences:`Inkomende referenties`,noIncomingReferences:`Geen inkomende referenties`,stub:`Stubreferentie (niet gekoppeld)`,resolved:`Opgeloste referentie (gekoppeld)`,derived:`Afgeleid`,open:`Openen`,unlink:`Ontkoppelen`,resolve:`Referentie oplossen`,cancel:`Annuleren`,createReference:`Referentie maken`,entityTypesOptional:`Entiteitstypen (optioneel)`,fragmentSelected:`Fragment geselecteerd`,annotateReferences:`Referenties annoteren`,selectEntityTypes:`Entiteitstypen:`,select:`Selecteren`,deselect:`Deselecteren`,noEntityTypes:`Geen entiteitstypen beschikbaar`,typesSelected:`{count, plural, =1 {1 type geselecteerd} other {# typen geselecteerd}}`,annotate:`Annoteren`,annotating:`Annoteren...`,includeDescriptiveReferences:`Beschrijvende referenties opnemen`,descriptiveReferencesTooltip:`Zoek ook naar zinnen zoals 'de CEO', 'de techgigant', 'de fysicus' (naast namen)`,found:`{{count}} gevonden`,complete:`Annotatie voltooid!`,failed:`Annotatie mislukt`,current:`Huidig: {{entityType}}`,loading:`laden...`,loadingEllipsis:`Laden...`,untitledResource:`Naamloze bron`,noText:`Geen tekst`,incomingReferencesFailed:`Kan de inkomende referenties niet laden.`,retry:`Opnieuw proberen`,entityTypesFailed:`Kan de entiteitstypen niet laden.`,tally:`{{found}} van ~{{expected}} entiteiten`},p={title:`Sneltoetsen`,closeDialog:`Dialoogvenster sluiten`,or:`of`,navigationTitle:`Navigatie`,navOpenSearch:`Globale zoekopdracht openen`,navOpenSearchAlt:`Globale zoekopdracht openen (alternatief)`,navCreateResource:`Nieuwe bron aanmaken`,navCloseOverlays:`Alle overlays sluiten (dubbel drukken)`,navShowHelp:`Sneltoetshulp tonen`,sidebarTitle:`Kenniszijbalk`,sidebarCollapse:`Zijbalk inklappen`,sidebarExpand:`Zijbalk uitklappen`,sidebarPickup:`Brontabblad oppakken (bij focus)`,sidebarMove:`Brontabblad verplaatsen (bij slepen)`,sidebarDrop:`Brontabblad neerzetten (bij slepen)`,sidebarCancel:`Sleepbewerking annuleren`,annotationsTitle:`Bronannotaties`,annotHighlight:`Markering maken van annotatie (direct)`,annotReference:`Referentiepopup openen voor annotatie`,annotDelete:`Gefocuste annotatie verwijderen`,annotNavigate:`Door annotaties navigeren`,annotNavigateBack:`Achterwaarts door annotaties navigeren`,listsTitle:`Lijsten & rasters`,listsFilterNav:`Door entiteitstypefilters navigeren`,listsGridNav:`Door bronnenraster navigeren`,listsJumpFirst:`Naar eerste item springen`,listsJumpLast:`Naar laatste item springen`,searchModalTitle:`In zoekvenster`,searchNav:`Door zoekresultaten navigeren`,searchSelect:`Resultaat selecteren`,searchClose:`Zoekvenster sluiten`,modalTitle:`Vensterbediening`,modalClose:`Actief venster sluiten`,modalNavForward:`Voorwaarts door knoppen navigeren`,modalNavBackward:`Achterwaarts door knoppen navigeren`,modalActivate:`Gefocuste knop activeren`,accessibilityTitle:`Toegankelijkheid`,a11ySkipLinks:`Naar skiplinks navigeren (bij begin van pagina)`,a11yFollowLink:`Skiplink volgen`,macNote:`Mac-sneltoetsen worden gebruikt. Command is de Command-toets.`,windowsNote:`Windows/Linux-sneltoetsen worden gebruikt. Ctrl is de Control-toets.`,footerHint:`Druk op {{key}} om deze hulp op elk moment te tonen`,close:`Sluiten`},m={modeGroup:`Modus`,browse:`Bladeren`,annotate:`Annoteren`,selectionGroup:`Motivatie`,clickGroup:`Klik`,shapeGroup:`Vorm`,none:`Geen`,linking:`Referentie`,highlighting:`Markering`,assessing:`Beoordelen`,commenting:`Opmerking`,tagging:`Labelen`,detail:`Detail`,follow:`Volgen`,deleting:`Verwijderen`,jsonld:`JSON-LD`,rectangle:`Rechthoek`,circle:`Cirkel`,polygon:`Polygoon`},h={title:`Navigatie`,collapseSidebar:`Zijbalk inklappen`,expandSidebar:`Zijbalk uitklappen`,dragToReorder:`Slepen om te herordenen`,dragToReorderDoc:`Slepen om {{name}} te herordenen`,closeResource:`Bron sluiten`,dragInstructions:`Om bronnen te herordenen: Gebruik Tab om naar een bron te navigeren. Druk op Alt+pijl omhoog om omhoog te verplaatsen of Alt+pijl omlaag om omlaag te verplaatsen. Voor slepen en neerzetten: Druk op de spatiebalk om het item op te pakken. Gebruik pijltoetsen om het te verplaatsen. Druk nogmaals op de spatiebalk om het neer te zetten.`},g={deleteConfirmationTitle:`Annotatie verwijderen`,deleteConfirmationMessage:`Weet je zeker dat je deze annotatie wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.`,deleteConfirmationCancel:`Annuleren`,deleteConfirmationDelete:`Verwijderen`},_={title:`Instellingen`,lineNumbers:`Regelnummers`,lineNumbersVisible:`Zichtbaar`,lineNumbersHidden:`Verborgen`,theme:`Thema`,themeLight:`Licht`,themeDark:`Donker`,themeSystem:`Systeem`,themeSystemActive:`Systeem ({{mode}})`,themeModeActive:`{{mode}}-modus gebruiken`,language:`Taal`,languageHint:`Wijzig de taal in de hoofdnavigatie`,languageChanging:`Taal wijzigen...`,hoverDelay:`Zweefvertraging`,hoverDelayFast:`Snel`,hoverDelaySlow:`Langzaam`,hoverDelayDescription:`{{delay}}ms vertraging voordat zweefeffecten verschijnen`},v={},y={gatherIntro:`Kies wat je wilt opnemen in de verzamelde context.`,includeContent:`Broninhoud opnemen`,includeSummary:`Samenvatting opnemen`,gatherDepth:`Diepte`,gatherMaxResources:`Maximale bronnen`,gatherButton:`Verzamelen`,editGather:`Verzamelinstellingen wijzigen`,recallLabel:`Opgenomen in het ophalen — deselecteer om uit te sluiten`,loadingContext:`Context wordt verzameld...`,failedContext:`Context verzamelen mislukt`,sourceContextLabel:`Bron`,connectionsLabel:`Verbindingen`,citedByLabel:`Geciteerd door`,resourceTitle:`Titel nieuwe bron`,resourceTitlePlaceholder:`Titel voor de gegenereerde bron...`,additionalInstructions:`Aanvullende instructies`,additionalInstructionsPlaceholder:`Optionele richtlijnen voor de generatie...`,language:`Taal`,languageHelp:`Taal voor de gegenereerde bron`,creativity:`Creativiteit`,creativityFocused:`Gericht`,creativityCreative:`Creatief`,maxLength:`Maximale lengte`,maxLengthHelp:`Maximaal aantal tokens`,generate:`Genereren`,maxLengthCeiling:`Beperkt tot {{maxOutputTokens}} tokens door {{model}}.`,outputFormat:`Formaat`,formatExtensionMismatch:`De opslaglocatie moet eindigen op {{extension}} om overeen te komen met het gekozen formaat.`,graphPaneTitle:`Omgeving`,graphEmpty:`Nog geen koppelingen.`,resourceLinkLabel:`Bronkoppeling`,corpusPaneTitle:`Vergelijkbare passages`,corpusEmpty:`Geen vergelijkbare passages gevonden.`,excludedReceipt:`{{types}} uitgesloten van deze zoekronde`,machineRead:`OCR`,score:`Score`,saveLocation:`Opslaglocatie`,discardDraftPrompt:`Dit concept verwerpen?`,discardDraft:`Verwerpen`,keepEditing:`Doorgaan met bewerken`,title:`Genereren vanuit deze bron`},b={sourceContextLabel:`Annotatiecontext in resource`,connectionsLabel:`Peer-annotaties`,citedByLabel:`Resource geciteerd door`,userHintLabel:`Hint`,userHintPlaceholder:`Beschrijf waar deze annotatie naar verwijst...`,loadingContext:`Context wordt verzameld...`,failedContext:`Context verzamelen mislukt`,generate:`Genereren`,compose:`Opstellen`,resolutionStrategyLabel:`Resolutiestrategie`,back:`Terug`,link:`Link`,score:`Score`,noResults:`Geen resultaten gevonden`,resourceTitle:`Brontitel`,resourceTitlePlaceholder:`Voer brontitel in...`,additionalInstructions:`Aanvullende instructies`,additionalInstructionsPlaceholder:`Voer aanvullende instructies in...`,language:`Taal`,languageHelp:`Taal voor gegenereerde inhoud`,creativity:`Creativiteit`,creativityFocused:`Gericht`,creativityCreative:`Creatief`,maxLength:`Maximale lengte`,maxLengthHelp:`Maximaal aantal tokens`,maxResults:`Maximale resultaten`,semanticScoring:`Semantische beoordeling`,semanticScoringHelp:`Gebruik AI om resultaten te beoordelen op semantische relevantie`,searching:`Zoeken...`,searchFailed:`Zoeken mislukt`,search:`Zoeken`,maxLengthCeiling:`Beperkt tot {{maxOutputTokens}} tokens door {{model}}.`,outputFormat:`Formaat`,formatExtensionMismatch:`De opslaglocatie moet eindigen op {{extension}} om overeen te komen met het gekozen formaat.`,graphPaneTitle:`Omgeving`,graphEmpty:`Nog geen koppelingen — deze referentie oplossen maakt de eerste.`,resourceLinkLabel:`Bronkoppeling`,corpusPaneTitle:`Vergelijkbare passages`,corpusEmpty:`Geen vergelijkbare passages gevonden — zoeken levert waarschijnlijk niets op.`,excludedReceipt:`{{types}} uitgesloten van deze zoekronde`,machineRead:`OCR`,userHintEffect:`stuurt zoeken en genereren`,saveLocation:`Opslaglocatie`,entityTypes:`Entiteitstypen`,contentLabel:`Inhoud`,createAndLink:`Maken & Koppelen`,creatingAndLinking:`Bezig met maken & koppelen…`,discardDraftPrompt:`Dit concept verwerpen?`,discardDraft:`Verwerpen`,keepEditing:`Doorgaan met bewerken`,resolveTitle:`Referentie oplossen`},x={createFailed:`Kon de annotatie niet maken: {{detail}}`,deleteFailed:`Kon de annotatie niet verwijderen: {{detail}}`,referenceUpdateFailed:`Kon de verwijzing niet bijwerken: {{detail}}`,unknownError:`onbekende fout`,assistQuiet:`Nog bezig — al enkele minuten geen update`,resourceCreatedNamed:`“{{name}}” gemaakt`,resourceCreated:`Bron gemaakt`,annotationComplete:`Annotatie voltooid`,annotationFailed:`Annotatie mislukt`,generationFailed:`Genereren mislukt: {{detail}}`,"decline_no-text-layer":`Deze PDF is een scan waarvan de tekst niet herkend kon worden.`,decline_encrypted:`Deze PDF is met een wachtwoord beveiligd; de tekst is onleesbaar.`,decline_corrupt:`Deze PDF kon niet gelezen worden — het bestand is mogelijk beschadigd.`,"decline_too-large":`Dit document is te groot om tekst uit te halen.`,decline_empty:`Dit document bevat geen tekst om te annoteren.`,annotationCompletePartial:`Detectie onvolledig beëindigd — {{pieces}} deel/delen ondergerapporteerd`,annotationFailedPartial:`Detectie mislukt — resultaten van {{kept}} voltooide typen zijn bewaard`},S={AssistProgress:e,PdfViewer:t,Toolbar:n,ResourceInfoPanel:r,CollaborationPanel:i,AnnotationHistory:a,CommentsPanel:o,HighlightPanel:s,AssessmentPanel:c,TaggingPanel:l,UnifiedAnnotationsPanel:u,StatisticsPanel:d,ReferencesPanel:f,KeyboardShortcuts:p,AnnotateToolbar:m,CollapsibleResourceNavigation:h,ResourceViewer:g,Settings:_,AnnotateView:v,ResourceGenerate:y,ReferenceWizard:b,OutcomeToasts:x};export{m as AnnotateToolbar,v as AnnotateView,a as AnnotationHistory,c as AssessmentPanel,e as AssistProgress,i as CollaborationPanel,h as CollapsibleResourceNavigation,o as CommentsPanel,s as HighlightPanel,p as KeyboardShortcuts,x as OutcomeToasts,t as PdfViewer,b as ReferenceWizard,f as ReferencesPanel,y as ResourceGenerate,r as ResourceInfoPanel,g as ResourceViewer,_ as Settings,d as StatisticsPanel,l as TaggingPanel,n as Toolbar,u as UnifiedAnnotationsPanel,S as default};
|
|
2
|
+
//# sourceMappingURL=nl-UYCI5TXI-oz-H334v.js.map
|