@semiont/cli 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +394 -287
- package/dist/frontend/dist/assets/{CookiePreferences-CPbRK2Nf.js → CookiePreferences-D5wgmVC7.js} +2 -2
- package/dist/frontend/dist/assets/{CookiePreferences-CPbRK2Nf.js.map → CookiePreferences-D5wgmVC7.js.map} +1 -1
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-5QESNO5H-CprYrfHh.js → PdfAnnotationCanvas.client-5QESNO5H-B7UjwjIX.js} +2 -2
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-5QESNO5H-CprYrfHh.js.map → PdfAnnotationCanvas.client-5QESNO5H-B7UjwjIX.js.map} +1 -1
- package/dist/frontend/dist/assets/{ToolbarPanels-CPoZvoTB.js → ToolbarPanels-CjWlSOUC.js} +2 -2
- package/dist/frontend/dist/assets/{ToolbarPanels-CPoZvoTB.js.map → ToolbarPanels-CjWlSOUC.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-kS15_T5U.js → client-B-MtBLP9.js} +2 -2
- package/dist/frontend/dist/assets/{client-kS15_T5U.js.map → client-B-MtBLP9.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-CPOjL49o.js → client-DX1ckM1P.js} +2 -2
- package/dist/frontend/dist/assets/{client-CPOjL49o.js.map → client-DX1ckM1P.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-CCxdaxo8.js → client-Dh9ak8Fa.js} +2 -2
- package/dist/frontend/dist/assets/{client-CCxdaxo8.js.map → client-Dh9ak8Fa.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-D04WIU14.js → client-DsP3tx7D.js} +2 -2
- package/dist/frontend/dist/assets/{client-D04WIU14.js.map → client-DsP3tx7D.js.map} +1 -1
- package/dist/frontend/dist/assets/{index-fHqJXd_A.css → index-Dg-Pampr.css} +1 -1
- package/dist/frontend/dist/assets/{index-Bsr9DJ3G.js → index-DoPpOINE.js} +57 -57
- package/dist/frontend/dist/assets/index-DoPpOINE.js.map +1 -0
- package/dist/frontend/dist/assets/{layout-w9wtEpkI.js → layout-BNfHKiGS.js} +2 -2
- package/dist/frontend/dist/assets/{layout-w9wtEpkI.js.map → layout-BNfHKiGS.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-DqFHhLVw.js → layout-CMpievJ_.js} +2 -2
- package/dist/frontend/dist/assets/{layout-DqFHhLVw.js.map → layout-CMpievJ_.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-BWesrQWr.js → layout-Delbhxmy.js} +2 -2
- package/dist/frontend/dist/assets/{layout-BWesrQWr.js.map → layout-Delbhxmy.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-B-lufx1s.js → layout-G6HeeKIH.js} +2 -2
- package/dist/frontend/dist/assets/{layout-B-lufx1s.js.map → layout-G6HeeKIH.js.map} +1 -1
- package/dist/frontend/dist/assets/{not-found-C0HTZoKU.js → not-found-CtwZrTVU.js} +2 -2
- package/dist/frontend/dist/assets/{not-found-C0HTZoKU.js.map → not-found-CtwZrTVU.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BS88Xh4W.js → page-7nyyO6Jy.js} +2 -2
- package/dist/frontend/dist/assets/{page-BS88Xh4W.js.map → page-7nyyO6Jy.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-JI9gNkHU.js → page-BEhfXGas.js} +2 -2
- package/dist/frontend/dist/assets/{page-JI9gNkHU.js.map → page-BEhfXGas.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CryPHwXI.js → page-Bb5SB6_Q.js} +2 -2
- package/dist/frontend/dist/assets/{page-CryPHwXI.js.map → page-Bb5SB6_Q.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BIyG0SOs.js → page-CI8oLbhf.js} +2 -2
- package/dist/frontend/dist/assets/{page-BIyG0SOs.js.map → page-CI8oLbhf.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-C43cKrO_.js → page-CV0h_zZE.js} +2 -2
- package/dist/frontend/dist/assets/{page-C43cKrO_.js.map → page-CV0h_zZE.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BoFYscYi.js → page-C_fIdKsk.js} +2 -2
- package/dist/frontend/dist/assets/{page-BoFYscYi.js.map → page-C_fIdKsk.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CPL87vBZ.js → page-CjI_QXry.js} +2 -2
- package/dist/frontend/dist/assets/{page-CPL87vBZ.js.map → page-CjI_QXry.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BMeXKClk.js → page-CkiQdVlI.js} +2 -2
- package/dist/frontend/dist/assets/{page-BMeXKClk.js.map → page-CkiQdVlI.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CU11Rd_F.js → page-D5qkLwSn.js} +2 -2
- package/dist/frontend/dist/assets/{page-CU11Rd_F.js.map → page-D5qkLwSn.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-Dvw2I_gp.js → page-DBYS9qIU.js} +2 -2
- package/dist/frontend/dist/assets/{page-Dvw2I_gp.js.map → page-DBYS9qIU.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DYOj954J.js → page-DBlue8Rh.js} +2 -2
- package/dist/frontend/dist/assets/{page-DYOj954J.js.map → page-DBlue8Rh.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-haUujHsJ.js → page-DSW3JQF2.js} +2 -2
- package/dist/frontend/dist/assets/{page-haUujHsJ.js.map → page-DSW3JQF2.js.map} +1 -1
- package/dist/frontend/dist/assets/page-DU909Np3.js +2 -0
- package/dist/frontend/dist/assets/{page-Du1JP0jA.js.map → page-DU909Np3.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BzkBmeDS.js → page-DV9q0oju.js} +2 -2
- package/dist/frontend/dist/assets/{page-BzkBmeDS.js.map → page-DV9q0oju.js.map} +1 -1
- package/dist/frontend/dist/assets/{page--QmNUvGH.js → page-D_6K1M4j.js} +2 -2
- package/dist/frontend/dist/assets/{page--QmNUvGH.js.map → page-D_6K1M4j.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CHCWv8gH.js → page-RgfG8Fre.js} +2 -2
- package/dist/frontend/dist/assets/{page-CHCWv8gH.js.map → page-RgfG8Fre.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CN1zC8Ky.js → page-VPeYeXi6.js} +2 -2
- package/dist/frontend/dist/assets/{page-CN1zC8Ky.js.map → page-VPeYeXi6.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BkEdFy5p.js → page-kVSb0jfm.js} +2 -2
- package/dist/frontend/dist/assets/{page-BkEdFy5p.js.map → page-kVSb0jfm.js.map} +1 -1
- package/dist/frontend/dist/assets/{privacy-CZ8NTWnp.js → privacy-NaGU1hj4.js} +2 -2
- package/dist/frontend/dist/assets/{privacy-CZ8NTWnp.js.map → privacy-NaGU1hj4.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-D4iNsc7y.js → routing-BybXhU8X.js} +2 -2
- package/dist/frontend/dist/assets/{routing-D4iNsc7y.js.map → routing-BybXhU8X.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-DCIgrT7s.js → routing-o1npPvOW.js} +2 -2
- package/dist/frontend/dist/assets/{routing-DCIgrT7s.js.map → routing-o1npPvOW.js.map} +1 -1
- package/dist/frontend/dist/assets/{web-Ua5dIRkZ.js → web-DAOI6EsG.js} +2 -2
- package/dist/frontend/dist/assets/{web-Ua5dIRkZ.js.map → web-DAOI6EsG.js.map} +1 -1
- package/dist/frontend/dist/index.html +2 -2
- package/dist/frontend/package.json +1 -1
- package/package.json +8 -8
- package/dist/frontend/dist/assets/index-Bsr9DJ3G.js.map +0 -1
- package/dist/frontend/dist/assets/page-Du1JP0jA.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as p,c as u,k as $,j as e,K,M as A,N as H,O as j,g as _,h as T,i as F,T as I}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{u as p,c as u,k as $,j as e,K,M as A,N as H,O as j,g as _,h as T,i as F,T as I}from"./index-DoPpOINE.js";import{r as x,O as B}from"./vendor-DJo4KD8w.js";import{b as E,u as O,L as P}from"./routing-o1npPvOW.js";import{u as f}from"./i18n-BbpF47i1.js";import{F as z,T as M}from"./ToolbarPanels-CjWlSOUC.js";import{F as C}from"./XMarkIcon-KMKD47CF.js";import{F as W,a as D}from"./ChevronLeftIcon-BLyRNZuL.js";import{r as w,L as b}from"./routing-BybXhU8X.js";import{C as y}from"./CookiePreferences-D5wgmVC7.js";import{K as U}from"./privacy-NaGU1hj4.js";const V=({className:r})=>e.jsx("span",{className:r,style:{fontSize:"1.25rem",lineHeight:"1"},children:"🔭"});function G({href:r,to:s,...t}){return e.jsx(P,{to:r??"",...t})}function q({isCollapsed:r,toggleCollapsed:s,navigationMenu:t}){const{t:d}=f(),o=(m,g)=>d(`Sidebar.${m}`,g),n=E(),l=O(),i=p(),h=u(i.openResources$)??[],a=i.removeOpenResource.bind(i),c=i.reorderOpenResources.bind(i),v=[{name:o("discover"),href:"/know/discover",icon:V,description:o("searchAndBrowse")},{name:o("compose"),href:"/know/compose",icon:z,description:o("composeNewResource")}],N=x.useCallback(()=>{s()},[s]),k=x.useCallback(({resourceId:m})=>{a(m),n===`/know/resource/${m}`&&l.push("/know/discover")},[a,n,l]),L=x.useCallback(({oldIndex:m,newIndex:g})=>{c(m,g)},[c]);$({"shell:sidebar-toggle":N,"tabs:close":k,"tabs:reorder":L});const R=m=>{l.push(m)},S=m=>`/know/resource/${m}`;return e.jsx("div",{className:"flex flex-col h-full",children:e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:e.jsx(K,{fixedItems:v,resources:h,isCollapsed:r,currentPath:n,LinkComponent:G,onNavigate:R,getResourceHref:S,className:"knowledge-navigation",translations:{title:o("title")},icons:{chevronLeft:D,bars:W,close:C},navigationMenu:t})})})}function J(){const{t:r}=f(),s=(a,c)=>r(`Navigation.${a}`,c),{t}=f(),d=(a,c)=>t(`Home.${a}`,c),o=u(p().activeSession$),n=u(o==null?void 0:o.user$),l=!!n,i=(n==null?void 0:n.isAdmin)??!1,h=(n==null?void 0:n.isModerator)??!1;return e.jsx(A,{Link:b,routes:w,t:s,tHome:d,brandingLink:"/",collapsible:!0,storageKey:"knowledgeNavCollapsed",isAuthenticated:l,isAdmin:i,isModerator:h,children:(a,c,v)=>e.jsx(q,{isCollapsed:a,toggleCollapsed:c,navigationMenu:v})})}function Q(){return null}function X(){var l;const{t:r}=f(),s=i=>r(`DiscoverEmptyState.${i}`),t=p(),d=u(t.kbs$)??[],o=((l=u(t.activeSession$))==null?void 0:l.kb)??null,n=o?t.getKbSessionStatus(o.id):null;return d.length===0?e.jsxs("div",{style:{textAlign:"center",maxWidth:"28rem"},children:[e.jsx("h2",{style:{fontSize:"1.1rem",fontWeight:600,marginBottom:"0.5rem"},children:s("noKnowledgeBases")}),e.jsx("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5,marginBottom:"0.75rem"},children:s("noKnowledgeBasesHint")}),e.jsxs("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:[e.jsx("a",{href:"https://github.com/The-AI-Alliance/semiont",target:"_blank",rel:"noopener noreferrer",style:{color:"var(--semiont-color-primary-500)"},children:s("findKnowledgeBases")})," · ",e.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:s("createNew")})]})]}):n==="authenticated"?null:e.jsxs("div",{style:{textAlign:"center",maxWidth:"24rem"},children:[e.jsx("h2",{style:{fontSize:"1.1rem",fontWeight:600,marginBottom:"0.5rem"},children:(o==null?void 0:o.label)??""}),e.jsxs("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:[s(n==="expired"?"sessionExpired":"signedOut")," ",s("signInHint")]})]})}function Y({t:r,keyboardContext:s}){const t=_(),d=u(t.activePanel$)??null,{theme:o}=T(),{showLineNumbers:n}=F();return e.jsxs("div",{className:"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[e.jsx("main",{className:"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden",children:e.jsx("div",{className:"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden items-center justify-center",children:e.jsx(X,{})})}),e.jsx(M,{activePanel:d,showLineNumbers:n,theme:o,hoverDelayMs:150}),e.jsx(I,{activePanel:d,context:"simple"})]}),e.jsx(j,{Link:b,routes:w,t:(l,i)=>r(`Footer.${l}`,i),CookiePreferences:y,showPolicyLinks:!("__TAURI_INTERNALS__"in window),...(s==null?void 0:s.openKeyboardHelp)&&{onOpenKeyboardHelp:s.openKeyboardHelp}})]})}function Z(){const{t:r}=f(),s=x.useContext(U),t=p(),d=u(t.activeKbId$),o=u(t.activeSession$),n=u(t.sessionActivating$),l=u(o==null?void 0:o.token$),i=(o==null?void 0:o.kb)??null;return d!=null&&o==null&&n?e.jsx("div",{className:"h-screen flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Loading..."})]})}):!i||!l?e.jsx(Y,{t:(a,c)=>r(a,c),keyboardContext:s}):e.jsxs(H,{children:[e.jsx(Q,{}),e.jsxs("div",{className:"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[e.jsx(J,{}),e.jsx("main",{className:"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden",children:e.jsx("div",{className:"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden",children:e.jsx(B,{})})})]}),e.jsx(j,{Link:b,routes:w,t:(a,c)=>r(`Footer.${a}`,c),CookiePreferences:y,showPolicyLinks:!("__TAURI_INTERNALS__"in window),...(s==null?void 0:s.openKeyboardHelp)&&{onOpenKeyboardHelp:s.openKeyboardHelp}})]})]})}function de(){return e.jsx(Z,{})}export{de as default};
|
|
2
|
+
//# sourceMappingURL=layout-BNfHKiGS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-w9wtEpkI.js","sources":["../../src/components/knowledge/KnowledgeNavigation.tsx","../../src/components/knowledge/KnowledgeSidebarWrapper.tsx","../../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 React from 'react';\nimport { 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","import { useContext } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { KnowledgeSidebarWrapper } from '@/components/knowledge/KnowledgeSidebarWrapper';\nimport {\n Footer,\n ResourceAnnotationsProvider,\n Toolbar,\n useSemiont,\n useShellVM,\n useObservable,\n useTheme,\n useLineNumbers,\n} from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\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 */\nfunction DiscoverEmptyState() {\n const { t: _t } = useTranslation();\n const t = (k: string) => _t(`DiscoverEmptyState.${k}`) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\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 <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n <a href=\"https://github.com/The-AI-Alliance/semiont\" 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 browseVM = useShellVM();\n const activePanel = useObservable(browseVM.activePanel$) ?? null;\n const { theme } = useTheme();\n const { showLineNumbers } = useLineNumbers();\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 showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={150}\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 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"],"names":["TelescopeIcon","className","jsx","HrefLink","href","_to","props","Link","KnowledgeNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","t","k","p","pathname","usePathname","router","useRouter","semiont","useSemiont","openResources","useObservable","removeResource","reorderResources","fixedNavigation","PlusIcon","handleSidebarToggle","useCallback","handleResourceClose","resourceId","handleResourceReorder","oldIndex","newIndex","useEventSubscriptions","handleNavigate","path","getResourceHref","CollapsibleResourceNavigation","ChevronLeftIcon","Bars3Icon","XMarkIcon","KnowledgeSidebarWrapper","_tHome","tHome","session","user","isAuthenticated","isAdmin","isModerator","LeftSidebar","routes","GlobalEventsConnector","DiscoverEmptyState","knowledgeBases","activeKnowledgeBase","_a","status","jsxs","UnauthenticatedKnowledgeLayout","keyboardContext","browseVM","useShellVM","activePanel","theme","useTheme","showLineNumbers","useLineNumbers","ToolbarPanels","Toolbar","Footer","key","params","CookiePreferences","KnowledgeLayoutBody","useContext","KeyboardShortcutsContext","activeKbId","sessionActivating","token","ResourceAnnotationsProvider","Outlet","KnowledgeLayout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout-BNfHKiGS.js","sources":["../../src/components/knowledge/KnowledgeNavigation.tsx","../../src/components/knowledge/KnowledgeSidebarWrapper.tsx","../../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 React from 'react';\nimport { 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","import { useContext } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { KnowledgeSidebarWrapper } from '@/components/knowledge/KnowledgeSidebarWrapper';\nimport {\n Footer,\n ResourceAnnotationsProvider,\n Toolbar,\n useSemiont,\n useShellVM,\n useObservable,\n useTheme,\n useLineNumbers,\n} from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\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 */\nfunction DiscoverEmptyState() {\n const { t: _t } = useTranslation();\n const t = (k: string) => _t(`DiscoverEmptyState.${k}`) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\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 <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n <a href=\"https://github.com/The-AI-Alliance/semiont\" 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 browseVM = useShellVM();\n const activePanel = useObservable(browseVM.activePanel$) ?? null;\n const { theme } = useTheme();\n const { showLineNumbers } = useLineNumbers();\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 showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={150}\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 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"],"names":["TelescopeIcon","className","jsx","HrefLink","href","_to","props","Link","KnowledgeNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","t","k","p","pathname","usePathname","router","useRouter","semiont","useSemiont","openResources","useObservable","removeResource","reorderResources","fixedNavigation","PlusIcon","handleSidebarToggle","useCallback","handleResourceClose","resourceId","handleResourceReorder","oldIndex","newIndex","useEventSubscriptions","handleNavigate","path","getResourceHref","CollapsibleResourceNavigation","ChevronLeftIcon","Bars3Icon","XMarkIcon","KnowledgeSidebarWrapper","_tHome","tHome","session","user","isAuthenticated","isAdmin","isModerator","LeftSidebar","routes","GlobalEventsConnector","DiscoverEmptyState","knowledgeBases","activeKnowledgeBase","_a","status","jsxs","UnauthenticatedKnowledgeLayout","keyboardContext","browseVM","useShellVM","activePanel","theme","useTheme","showLineNumbers","useLineNumbers","ToolbarPanels","Toolbar","Footer","key","params","CookiePreferences","KnowledgeLayoutBody","useContext","KeyboardShortcutsContext","activeKbId","sessionActivating","token","ResourceAnnotationsProvider","Outlet","KnowledgeLayout"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{k as S,j as e,ad as E,ae as R,af as T,ag as L,ah as A,ai as D}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{k as S,j as e,ad as E,ae as R,af as T,ag as L,ah as A,ai as D}from"./index-DoPpOINE.js";import{a as z,C as M,b as N,i as W,c as B,s as h}from"./privacy-NaGU1hj4.js";import{r as n,O as G}from"./vendor-DJo4KD8w.js";import{u as I}from"./routing-o1npPvOW.js";import{u as g}from"./i18n-BbpF47i1.js";function O(){const s=I(),i=n.useCallback(({url:o,cancelFallback:l})=>{l(),s.push(o)},[s]),t=n.useCallback(({path:o})=>{s.push(o)},[s]);return S({"nav:external":i,"nav:push":t}),null}function F(){const{i18n:s}=g();return n.useMemo(()=>({t:(i,t,o)=>{var u;const l=s.getResourceBundle(s.language,"translation");let c=(u=l==null?void 0:l[i])==null?void 0:u[t];if(!c)return`${i}.${t}`;if(o&&typeof c=="string"){let a=c;return Object.entries(o).forEach(([d,p])=>{a=a.replace(new RegExp(`\\{${d}\\}`,"g"),String(p))}),a}return c}}),[s,s.language])}function $({children:s}){const i=F();return e.jsx(E,{translationManager:i,children:e.jsx(R,{children:e.jsx(T,{children:e.jsx(L,{children:e.jsx(z,{children:e.jsxs(A,{children:[e.jsx(O,{}),s]})})})})})})}function V({title:s,titleId:i,...t},o){return n.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:o,"aria-labelledby":i},t),s?n.createElement("title",{id:i},s):null,n.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5"}))}const q=n.forwardRef(V);function K({title:s,titleId:i,...t},o){return n.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:o,"aria-labelledby":i},t),s?n.createElement("title",{id:i},s):null,n.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5"}))}const _=n.forwardRef(K);function H({className:s=""}){const{t:i}=g(),t=(r,m)=>i(`CookieBanner.${r}`,m),[o,l]=n.useState(!1),[c,u]=n.useState(!1),[a,d]=n.useState(!1),[p,x]=n.useState("GENERAL"),[y,v]=n.useState({necessary:!0,analytics:!1,marketing:!1,preferences:!1});n.useEffect(()=>{(async()=>{if(N()){l(!0);try{const[m,P]=await Promise.all([W(),B()]);x(m?"GDPR":P?"CCPA":"GENERAL")}catch(m){console.error("Failed to detect region:",m),x("GENERAL")}}})()},[]);const j=async()=>{d(!0);try{const r={necessary:!0,analytics:!0,marketing:!0,preferences:!0};await Promise.resolve(h(r)),l(!1)}catch(r){console.error("Failed to save cookie consent:",r)}finally{d(!1)}},b=async()=>{d(!0);try{const r={necessary:!0,analytics:!1,marketing:!1,preferences:!1};await Promise.resolve(h(r)),l(!1)}catch(r){console.error("Failed to save cookie consent:",r)}finally{d(!1)}},k=async()=>{d(!0);try{await Promise.resolve(h(y)),l(!1)}catch(r){console.error("Failed to save cookie consent:",r)}finally{d(!1)}},C=r=>{r!=="necessary"&&v(m=>({...m,[r]:!m[r]}))},w=()=>{switch(p){case"GDPR":return{title:t("gdprTitle"),description:t("gdprDescription"),learnMore:t("gdprLearnMore")};case"CCPA":return{title:t("ccpaTitle"),description:t("ccpaDescription"),learnMore:t("ccpaLearnMore")};default:return{title:t("generalTitle"),description:t("generalDescription"),learnMore:t("generalLearnMore")}}};if(!o)return null;const f=w();return e.jsx("div",{className:s,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:e.jsx("div",{style:{maxWidth:"80rem",margin:"0 auto",padding:"1rem 1.5rem"},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"1.5rem",flexWrap:"wrap"},children:[e.jsxs("div",{style:{flex:1,minWidth:"300px"},children:[e.jsx("h3",{style:{fontSize:"1.125rem",fontWeight:600,color:"var(--semiont-text-primary)",marginBottom:"0.5rem"},children:f.title}),e.jsx("p",{style:{fontSize:"var(--semiont-text-sm, 0.875rem)",color:"var(--semiont-text-secondary)",marginBottom:"0.25rem"},children:f.description}),e.jsx("p",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)"},children:f.learnMore})]}),e.jsxs("div",{style:{display:"flex",gap:"0.75rem",alignItems:"center",flexWrap:"wrap"},children:[e.jsxs("button",{type:"button",onClick:()=>u(!c),className:"semiont-button--secondary",style:{display:"flex",alignItems:"center",gap:"0.25rem"},children:[t("customize"),c?e.jsx(_,{style:{width:"1rem",height:"1rem"}}):e.jsx(q,{style:{width:"1rem",height:"1rem"}})]}),p!=="GDPR"&&e.jsx("button",{type:"button",onClick:b,disabled:a,className:"semiont-button--secondary",children:t(a?"saving":"rejectAll")}),e.jsx("button",{type:"button",onClick:j,disabled:a,className:"semiont-button--primary",children:t(a?"saving":"acceptAll")})]})]}),c&&e.jsx("div",{style:{borderTop:"1px solid var(--semiont-border-primary)",paddingTop:"1rem"},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e.jsx("h4",{style:{fontSize:"1rem",fontWeight:500,color:"var(--semiont-text-primary)"},children:t("cookiePreferences")}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:M.map(r=>e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"0.75rem"},children:[e.jsx("div",{style:{display:"flex",alignItems:"center",height:"1.25rem"},children:e.jsx("input",{id:`cookie-${r.id}`,type:"checkbox",checked:y[r.id]||!1,onChange:()=>C(r.id),disabled:r.required||a,style:{accentColor:"var(--semiont-color-primary-600, #2563eb)"}})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("label",{htmlFor:`cookie-${r.id}`,style:{fontSize:"var(--semiont-text-sm, 0.875rem)",fontWeight:500,color:"var(--semiont-text-primary)",cursor:"pointer"},children:[r.name,r.required&&e.jsx("span",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)",marginLeft:"0.25rem"},children:t("required")})]}),e.jsx("p",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-secondary)",marginTop:"0.25rem"},children:r.description}),e.jsxs("details",{style:{marginTop:"0.25rem"},children:[e.jsx("summary",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-color-primary-600, #2563eb)",cursor:"pointer"},children:t("viewCookies")}),e.jsx("div",{style:{marginTop:"0.25rem",fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)"},children:r.cookies.join(", ")})]})]})]},r.id))}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.75rem",paddingTop:"1rem"},children:[e.jsx("button",{type:"button",onClick:()=>u(!1),className:"semiont-button--secondary",children:t("cancel")}),e.jsx("button",{type:"button",onClick:k,disabled:a,className:"semiont-button--primary",children:t(a?"saving":"savePreferences")})]})]})})]})})})}function Z(){return e.jsxs($,{children:[e.jsx(D,{}),e.jsx(G,{}),e.jsx(H,{})]})}export{Z as default};
|
|
2
|
+
//# sourceMappingURL=layout-CMpievJ_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-DqFHhLVw.js","sources":["../../src/components/knowledge/NavigationHandler.tsx","../../src/hooks/useMergedTranslationManager.ts","../../src/app/providers.tsx","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronUpIcon.js","../../src/components/CookieBanner.tsx","../../src/app/[locale]/layout.tsx"],"sourcesContent":["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 * 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 */\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 let 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 let result = translation;\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, 'g'), String(paramValue));\n });\n return result;\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 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 * + 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 <NavigationHandler />\n {children}\n </ThemeProvider>\n </KeyboardShortcutsProvider>\n </LiveRegionProvider>\n </ToastProvider>\n </SemiontProvider>\n </TranslationProvider>\n );\n}\n","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;","\"use client\";\n\nimport React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n getCookieConsent,\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-dom';\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"],"names":["NavigationHandler","router","useRouter","handleExternalNavigate","useCallback","url","cancelFallback","handleRouterPush","path","useEventSubscriptions","useMergedTranslationManager","i18n","useTranslation","useMemo","namespace","key","params","messages","translation","_a","result","paramKey","paramValue","Providers","children","translationManager","jsx","TranslationProvider","SemiontProvider","ToastProvider","LiveRegionProvider","KeyboardShortcutsProvider","jsxs","ThemeProvider","ChevronDownIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","ChevronUpIcon","CookieBanner","className","_t","k","p","isVisible","setIsVisible","useState","showDetails","setShowDetails","isLoading","setIsLoading","region","setRegion","consent","setConsent","useEffect","shouldShowBanner","isGDPR","isCCPA","isGDPRApplicable","isCCPAApplicable","error","handleAcceptAll","fullConsent","setCookieConsent","handleRejectAll","minimalConsent","handleSavePreferences","handleCategoryToggle","categoryId","prev","getBannerText","bannerText","COOKIE_CATEGORIES","category","LocaleLayout","SkipLinks","Outlet"],"mappings":"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","x_google_ignoreList":[3,4]}
|
|
1
|
+
{"version":3,"file":"layout-CMpievJ_.js","sources":["../../src/components/knowledge/NavigationHandler.tsx","../../src/hooks/useMergedTranslationManager.ts","../../src/app/providers.tsx","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronUpIcon.js","../../src/components/CookieBanner.tsx","../../src/app/[locale]/layout.tsx"],"sourcesContent":["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 * 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 */\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 let 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 let result = translation;\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, 'g'), String(paramValue));\n });\n return result;\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 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 * + 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 <NavigationHandler />\n {children}\n </ThemeProvider>\n </KeyboardShortcutsProvider>\n </LiveRegionProvider>\n </ToastProvider>\n </SemiontProvider>\n </TranslationProvider>\n );\n}\n","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;","\"use client\";\n\nimport React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n getCookieConsent,\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-dom';\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"],"names":["NavigationHandler","router","useRouter","handleExternalNavigate","useCallback","url","cancelFallback","handleRouterPush","path","useEventSubscriptions","useMergedTranslationManager","i18n","useTranslation","useMemo","namespace","key","params","messages","translation","_a","result","paramKey","paramValue","Providers","children","translationManager","jsx","TranslationProvider","SemiontProvider","ToastProvider","LiveRegionProvider","KeyboardShortcutsProvider","jsxs","ThemeProvider","ChevronDownIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","ChevronUpIcon","CookieBanner","className","_t","k","p","isVisible","setIsVisible","useState","showDetails","setShowDetails","isLoading","setIsLoading","region","setRegion","consent","setConsent","useEffect","shouldShowBanner","isGDPR","isCCPA","isGDPRApplicable","isCCPAApplicable","error","handleAcceptAll","fullConsent","setCookieConsent","handleRejectAll","minimalConsent","handleSavePreferences","handleCategoryToggle","categoryId","prev","getBannerText","bannerText","COOKIE_CATEGORIES","category","LocaleLayout","SkipLinks","Outlet"],"mappings":"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","x_google_ignoreList":[3,4]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{k,j as i,Q as w,u as v,c as h,M as L,O as j}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{k,j as i,Q as w,u as v,c as h,M as L,O as j}from"./index-DoPpOINE.js";import{r,O as S}from"./vendor-DJo4KD8w.js";import{b as y,L as E,u as R}from"./routing-o1npPvOW.js";import{u as p}from"./i18n-BbpF47i1.js";import{F as $}from"./ArrowsRightLeftIcon-BzLgl5o9.js";import{F,a as M}from"./ChevronLeftIcon-BLyRNZuL.js";import{C}from"./CookiePreferences-D5wgmVC7.js";import{K as O}from"./privacy-NaGU1hj4.js";import{r as x,L as b}from"./routing-BybXhU8X.js";import"./XMarkIcon-KMKD47CF.js";function A({title:o,titleId:e,...a},n){return r.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:n,"aria-labelledby":e},a),o?r.createElement("title",{id:e},o):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25"}))}const H=r.forwardRef(A);function K({title:o,titleId:e,...a},n){return r.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:n,"aria-labelledby":e},a),o?r.createElement("title",{id:e},o):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"}))}const N=r.forwardRef(K);function B({title:o,titleId:e,...a},n){return r.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:n,"aria-labelledby":e},a),o?r.createElement("title",{id:e},o):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.568 3H5.25A2.25 2.25 0 0 0 3 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 0 0 5.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 0 0 9.568 3Z"}),r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 6h.008v.008H6V6Z"}))}const D=r.forwardRef(B);function T({href:o,to:e,...a}){return i.jsx(E,{to:o??"",...a})}function P({isCollapsed:o,toggleCollapsed:e,navigationMenu:a}){const{t:n}=p(),t=(s,c)=>n(`Moderation.${s}`,c),{t:d}=p(),l=(s,c)=>d(`Sidebar.${s}`,c),m=y(),u=r.useCallback(()=>{e()},[e]);k({"shell:sidebar-toggle":u});const f=[{name:t("recentResources"),href:"/moderate/recent",icon:N,description:t("recentResourcesDescription")},{name:t("entityTags"),href:"/moderate/entity-tags",icon:D,description:t("entityTagsDescription")},{name:t("tagSchemas"),href:"/moderate/tag-schemas",icon:H,description:t("tagSchemasDescription")},{name:t("linkedData"),href:"/moderate/linked-data",icon:$,description:t("linkedDataDescription")}];return i.jsx(w,{title:t("title"),items:f,currentPath:m,LinkComponent:T,...a&&{dropdownContent:a},isCollapsed:o,icons:{chevronLeft:M,bars:F},collapseSidebarLabel:l("collapseSidebar"),expandSidebarLabel:l("expandSidebar")})}function W(){const{t:o}=p(),e=r.useContext(O),a=v(),n=h(a.activeSession$),t=h(n==null?void 0:n.user$),d=(n==null?void 0:n.kb)??null,l=R();if(!d)return l.push("/know"),null;const m=!!t,u=(t==null?void 0:t.isAdmin)??!1,f=(t==null?void 0:t.isModerator)??!1;return i.jsxs("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900 flex flex-col",children:[i.jsxs("div",{className:"flex flex-1",children:[i.jsx(L,{Link:b,routes:x,t:s=>o(`Navigation.${s}`),tHome:s=>o(`Home.${s}`),brandingLink:"/",collapsible:!0,storageKey:"moderation-sidebar-collapsed",isAuthenticated:m,isAdmin:u,isModerator:f,children:(s,c,g)=>i.jsx(P,{isCollapsed:s,toggleCollapsed:c,navigationMenu:g})}),i.jsx("main",{className:"flex-1 p-6 flex flex-col",children:i.jsx("div",{className:"max-w-7xl mx-auto flex-1 flex flex-col w-full",children:i.jsx(S,{})})})]}),i.jsx(j,{Link:b,routes:x,t:(s,c)=>o(`Footer.${s}`,c),CookiePreferences:C,...(e==null?void 0:e.openKeyboardHelp)&&{onOpenKeyboardHelp:e.openKeyboardHelp}})]})}function X(){return i.jsx(W,{})}export{X as default};
|
|
2
|
+
//# sourceMappingURL=layout-Delbhxmy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-BWesrQWr.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ClockIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/TagIcon.js","../../src/components/moderation/ModerationNavigation.tsx","../../src/app/[locale]/moderate/layout.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction BookOpenIcon({\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: \"M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(BookOpenIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ClockIcon({\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: \"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ClockIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction TagIcon({\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: \"M9.568 3H5.25A2.25 2.25 0 0 0 3 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 0 0 5.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 0 0 9.568 3Z\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6 6h.008v.008H6V6Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(TagIcon);\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 ClockIcon,\n TagIcon,\n BookOpenIcon,\n ArrowsRightLeftIcon,\n ChevronLeftIcon,\n Bars3Icon\n} from '@heroicons/react/24/outline';\n\ninterface ModerationNavigationProps {\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 ModerationNavigation({ isCollapsed, toggleCollapsed, navigationMenu }: ModerationNavigationProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Moderation.${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('recentResources'),\n href: '/moderate/recent',\n icon: ClockIcon,\n description: t('recentResourcesDescription')\n },\n {\n name: t('entityTags'),\n href: '/moderate/entity-tags',\n icon: TagIcon,\n description: t('entityTagsDescription')\n },\n {\n name: t('tagSchemas'),\n href: '/moderate/tag-schemas',\n icon: BookOpenIcon,\n description: t('tagSchemasDescription')\n },\n {\n name: t('linkedData'),\n href: '/moderate/linked-data',\n icon: ArrowsRightLeftIcon,\n description: t('linkedDataDescription')\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-dom';\nimport { useTranslation } from 'react-i18next';\nimport {\n LeftSidebar,\n Footer,\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\nimport { ModerationNavigation } from '@/components/moderation/ModerationNavigation';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { Link, routes } from '@/lib/routing';\nimport { useRouter } from '@/i18n/routing';\n\nfunction ModerateLayoutBody() {\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=\"moderation-sidebar-collapsed\"\n isAuthenticated={isAuthenticated}\n isAdmin={isAdmin}\n isModerator={isModerator}\n >\n {(isCollapsed, toggleCollapsed, navigationMenu) => (\n <ModerationNavigation\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 ModerateLayout() {\n // AuthShell is mounted by the parent ProtectedLayout in App.tsx so it\n // survives navigation between know/, admin/, and moderate/ sections.\n return <ModerateLayoutBody />;\n}\n"],"names":["BookOpenIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","ClockIcon","TagIcon","HrefLink","href","_to","Link","ModerationNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","k","p","_tSidebar","tSidebar","pathname","usePathname","handleSidebarToggle","useCallback","useEventSubscriptions","navigation","ArrowsRightLeftIcon","jsx","SimpleNavigation","ChevronLeftIcon","Bars3Icon","ModerateLayoutBody","t","keyboardContext","useContext","KeyboardShortcutsContext","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","router","useRouter","isAuthenticated","isAdmin","isModerator","jsxs","LeftSidebar","routes","key","Outlet","Footer","params","CookiePreferences","ModerateLayout"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"layout-Delbhxmy.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ClockIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/TagIcon.js","../../src/components/moderation/ModerationNavigation.tsx","../../src/app/[locale]/moderate/layout.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction BookOpenIcon({\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: \"M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(BookOpenIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ClockIcon({\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: \"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ClockIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction TagIcon({\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: \"M9.568 3H5.25A2.25 2.25 0 0 0 3 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 0 0 5.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 0 0 9.568 3Z\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6 6h.008v.008H6V6Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(TagIcon);\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 ClockIcon,\n TagIcon,\n BookOpenIcon,\n ArrowsRightLeftIcon,\n ChevronLeftIcon,\n Bars3Icon\n} from '@heroicons/react/24/outline';\n\ninterface ModerationNavigationProps {\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 ModerationNavigation({ isCollapsed, toggleCollapsed, navigationMenu }: ModerationNavigationProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Moderation.${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('recentResources'),\n href: '/moderate/recent',\n icon: ClockIcon,\n description: t('recentResourcesDescription')\n },\n {\n name: t('entityTags'),\n href: '/moderate/entity-tags',\n icon: TagIcon,\n description: t('entityTagsDescription')\n },\n {\n name: t('tagSchemas'),\n href: '/moderate/tag-schemas',\n icon: BookOpenIcon,\n description: t('tagSchemasDescription')\n },\n {\n name: t('linkedData'),\n href: '/moderate/linked-data',\n icon: ArrowsRightLeftIcon,\n description: t('linkedDataDescription')\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-dom';\nimport { useTranslation } from 'react-i18next';\nimport {\n LeftSidebar,\n Footer,\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\nimport { ModerationNavigation } from '@/components/moderation/ModerationNavigation';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { Link, routes } from '@/lib/routing';\nimport { useRouter } from '@/i18n/routing';\n\nfunction ModerateLayoutBody() {\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=\"moderation-sidebar-collapsed\"\n isAuthenticated={isAuthenticated}\n isAdmin={isAdmin}\n isModerator={isModerator}\n >\n {(isCollapsed, toggleCollapsed, navigationMenu) => (\n <ModerationNavigation\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 ModerateLayout() {\n // AuthShell is mounted by the parent ProtectedLayout in App.tsx so it\n // survives navigation between know/, admin/, and moderate/ sections.\n return <ModerateLayoutBody />;\n}\n"],"names":["BookOpenIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","ClockIcon","TagIcon","HrefLink","href","_to","Link","ModerationNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","k","p","_tSidebar","tSidebar","pathname","usePathname","handleSidebarToggle","useCallback","useEventSubscriptions","navigation","ArrowsRightLeftIcon","jsx","SimpleNavigation","ChevronLeftIcon","Bars3Icon","ModerateLayoutBody","t","keyboardContext","useContext","KeyboardShortcutsContext","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","router","useRouter","isAuthenticated","isAdmin","isModerator","jsxs","LeftSidebar","routes","key","Outlet","Footer","params","CookiePreferences","ModerateLayout"],"mappings":"2eACA,SAASA,EAAa,CACpB,MAAAC,EACA,QAAAC,EACA,GAAGC,CACL,EAAGC,EAAQ,CACT,OAAoBC,gBAAoB,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAKD,EACL,kBAAmBF,CACvB,EAAKC,CAAK,EAAGF,EAAqBI,EAAAA,cAAoB,QAAS,CAC3D,GAAIH,CACR,EAAKD,CAAK,EAAI,KAAmBI,EAAAA,cAAoB,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,oPACP,CAAG,CAAC,CACJ,CACA,MAAMC,EAA2BC,EAAAA,WAAiBP,CAAY,ECvB9D,SAASQ,EAAU,CACjB,MAAAP,EACA,QAAAC,EACA,GAAGC,CACL,EAAGC,EAAQ,CACT,OAAoBC,gBAAoB,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAKD,EACL,kBAAmBF,CACvB,EAAKC,CAAK,EAAGF,EAAqBI,EAAAA,cAAoB,QAAS,CAC3D,GAAIH,CACR,EAAKD,CAAK,EAAI,KAAmBI,EAAAA,cAAoB,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,kDACP,CAAG,CAAC,CACJ,CACA,MAAMC,EAA2BC,EAAAA,WAAiBC,CAAS,ECvB3D,SAASC,EAAQ,CACf,MAAAR,EACA,QAAAC,EACA,GAAGC,CACL,EAAGC,EAAQ,CACT,OAAoBC,gBAAoB,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAKD,EACL,kBAAmBF,CACvB,EAAKC,CAAK,EAAGF,EAAqBI,EAAAA,cAAoB,QAAS,CAC3D,GAAIH,CACR,EAAKD,CAAK,EAAI,KAAmBI,EAAAA,cAAoB,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,+MACP,CAAG,EAAgBA,EAAAA,cAAoB,OAAQ,CAC3C,cAAe,QACf,eAAgB,QAChB,EAAG,qBACP,CAAG,CAAC,CACJ,CACA,MAAMC,EAA2BC,EAAAA,WAAiBE,CAAO,ECNzD,SAASC,EAAS,CAAE,KAAAC,EAAM,GAAIC,EAAK,GAAGT,GAAgE,CACpG,aAAQU,EAAA,CAAK,GAAKF,GAAQ,GAAgB,GAAGR,EAAO,CACtD,CAEO,SAASW,EAAqB,CAAE,YAAAC,EAAa,gBAAAC,EAAiB,eAAAC,GAA6C,CAChH,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZ,EAAI,CAACC,EAAWC,IAAgCH,EAAG,cAAcE,CAAC,GAAIC,CAAQ,EAC9E,CAAE,EAAGC,CAAA,EAAcH,EAAA,EACnBI,EAAW,CAACH,EAAWC,IAAgCC,EAAU,WAAWF,CAAC,GAAIC,CAAQ,EACzFG,EAAWC,EAAA,EAGXC,EAAsBC,EAAAA,YAAY,IAAM,CAC5CX,EAAA,CACF,EAAG,CAACA,CAAe,CAAC,EAGpBY,EAAsB,CACpB,uBAAwBF,CAAA,CACzB,EAED,MAAMG,EAAqC,CACzC,CACE,KAAM,EAAE,iBAAiB,EACzB,KAAM,mBACN,KAAMrB,EACN,YAAa,EAAE,4BAA4B,CAAA,EAE7C,CACE,KAAM,EAAE,YAAY,EACpB,KAAM,wBACN,KAAMC,EACN,YAAa,EAAE,uBAAuB,CAAA,EAExC,CACE,KAAM,EAAE,YAAY,EACpB,KAAM,wBACN,KAAMT,EACN,YAAa,EAAE,uBAAuB,CAAA,EAExC,CACE,KAAM,EAAE,YAAY,EACpB,KAAM,wBACN,KAAM8B,EACN,YAAa,EAAE,uBAAuB,CAAA,CACxC,EAGF,OACEC,EAAAA,IAACC,EAAA,CACC,MAAO,EAAE,OAAO,EAChB,MAAOH,EACP,YAAaL,EACb,cAAed,EACd,GAAIO,GAAkB,CAAE,gBAAiBA,CAAA,EAC1C,YAAAF,EACA,MAAO,CACL,YAAakB,EACb,KAAMC,CAAA,EAER,qBAAsBX,EAAS,iBAAiB,EAChD,mBAAoBA,EAAS,eAAe,CAAA,CAAA,CAGlD,CCvEA,SAASY,GAAqB,CAC5B,KAAM,CAAE,EAAAC,CAAA,EAAMjB,EAAA,EACRkB,EAAkBC,EAAAA,WAAWC,CAAwB,EACrDC,EAAUC,EAAA,EACVC,EAAUC,EAAcH,EAAQ,cAAc,EAC9CI,EAAOD,EAAcD,GAAA,YAAAA,EAAS,KAAK,EACnCG,GAAsBH,GAAA,YAAAA,EAAS,KAAM,KACrCI,EAASC,EAAA,EAEf,GAAI,CAACF,EACH,OAAAC,EAAO,KAAK,OAAO,EACZ,KAGT,MAAME,EAAkB,CAAC,CAACJ,EACpBK,GAAUL,GAAA,YAAAA,EAAM,UAAW,GAC3BM,GAAcN,GAAA,YAAAA,EAAM,cAAe,GAEzC,OACEO,EAAAA,KAAC,MAAA,CAAI,UAAU,yDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAApB,EAAAA,IAACqB,EAAA,CAAA,KACCvC,EACA,OAAAwC,EACA,EAAIC,GAAgBlB,EAAE,cAAckB,CAAG,EAAE,EACzC,MAAQA,GAAgBlB,EAAE,QAAQkB,CAAG,EAAE,EACvC,aAAa,IACb,YAAa,GACb,WAAW,+BACX,gBAAAN,EACA,QAAAC,EACA,YAAAC,EAEC,SAAA,CAACnC,EAAaC,EAAiBC,IAC9Bc,EAAAA,IAACjB,EAAA,CACC,YAAAC,EACA,gBAAAC,EACA,eAAAC,CAAA,CAAA,CACF,CAAA,EAGJc,EAAAA,IAAC,OAAA,CAAK,UAAU,2BACd,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,gDACb,SAAAA,EAAAA,IAACwB,EAAA,CAAA,CAAO,CAAA,CACV,CAAA,CACF,CAAA,EACF,EACAxB,EAAAA,IAACyB,EAAA,CAAA,KACC3C,EACA,OAAAwC,EACA,EAAG,CAACC,EAAaG,IAAqCrB,EAAE,UAAUkB,CAAG,GAAIG,CAAa,EACtF,kBAAAC,EACC,IAAIrB,GAAA,YAAAA,EAAiB,mBAAoB,CAAE,mBAAoBA,EAAgB,gBAAA,CAAiB,CAAA,CACnG,EACF,CAEJ,CAEA,SAAwBsB,GAAiB,CAGvC,aAAQxB,EAAA,EAAmB,CAC7B","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{k as v,j as r,Q as w,u as L,c as x,M as k,O as S}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{k as v,j as r,Q as w,u as L,c as x,M as k,O as S}from"./index-DoPpOINE.js";import{r as c,O as j}from"./vendor-DJo4KD8w.js";import{b as $,L as F,u as y}from"./routing-o1npPvOW.js";import{u as p}from"./i18n-BbpF47i1.js";import{F as R,C as A}from"./CookiePreferences-D5wgmVC7.js";import{F as K}from"./ArrowsRightLeftIcon-BzLgl5o9.js";import{F as N}from"./CommandLineIcon-Ba4gpk8e.js";import{F as C,a as E}from"./ChevronLeftIcon-BLyRNZuL.js";import{K as H}from"./privacy-NaGU1hj4.js";import{r as b,L as h}from"./routing-BybXhU8X.js";import"./XMarkIcon-KMKD47CF.js";function M({title:n,titleId:o,...s},a){return c.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:a,"aria-labelledby":o},s),n?c.createElement("title",{id:o},n):null,c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",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"}))}const O=c.forwardRef(M);function D({href:n,to:o,...s}){return r.jsx(F,{to:n??"",...s})}function B({isCollapsed:n,toggleCollapsed:o,navigationMenu:s}){const{t:a}=p(),e=(t,i)=>a(`Administration.${t}`,i),{t:d}=p(),l=(t,i)=>d(`Sidebar.${t}`,i),m=$(),f=c.useCallback(()=>{o()},[o]);v({"shell:sidebar-toggle":f});const u=[{name:e("users"),href:"/admin/users",icon:O,description:e("usersDescription")},{name:e("oauthSettings"),href:"/admin/security",icon:R,description:e("oauthSettingsDescription")},{name:e("exchange"),href:"/admin/exchange",icon:K,description:e("exchangeDescription")},{name:e("devops"),href:"/admin/devops",icon:N,description:e("devopsDescription")}];return r.jsx(w,{title:e("title"),items:u,currentPath:m,LinkComponent:D,...s&&{dropdownContent:s},isCollapsed:n,icons:{chevronLeft:E,bars:C},collapseSidebarLabel:l("collapseSidebar"),expandSidebarLabel:l("expandSidebar")})}function P(){const{t:n}=p(),o=c.useContext(H),s=L(),a=x(s.activeSession$),e=x(a==null?void 0:a.user$),d=(a==null?void 0:a.kb)??null,l=y();if(!d)return l.push("/know"),null;const m=!!e,f=(e==null?void 0:e.isAdmin)??!1,u=(e==null?void 0:e.isModerator)??!1;return r.jsxs("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900 flex flex-col",children:[r.jsxs("div",{className:"flex flex-1",children:[r.jsx(k,{Link:h,routes:b,t:t=>n(`Navigation.${t}`),tHome:t=>n(`Home.${t}`),brandingLink:"/",collapsible:!0,storageKey:"admin-sidebar-collapsed",isAuthenticated:m,isAdmin:f,isModerator:u,children:(t,i,g)=>r.jsx(B,{isCollapsed:t,toggleCollapsed:i,navigationMenu:g})}),r.jsx("main",{className:"flex-1 p-6 flex flex-col",children:r.jsx("div",{className:"max-w-7xl mx-auto flex-1 flex flex-col w-full",children:r.jsx(j,{})})})]}),r.jsx(S,{Link:h,routes:b,t:(t,i)=>n(`Footer.${t}`,i),CookiePreferences:A,...(o==null?void 0:o.openKeyboardHelp)&&{onOpenKeyboardHelp:o.openKeyboardHelp}})]})}function V(){return r.jsx(P,{})}export{V as default};
|
|
2
|
+
//# sourceMappingURL=layout-G6HeeKIH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-B-lufx1s.js","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 ArrowsRightLeftIcon,\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('exchange'),\n href: '/admin/exchange',\n icon: ArrowsRightLeftIcon,\n description: t('exchangeDescription')\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-dom';\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"],"names":["UsersIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","HrefLink","href","_to","Link","AdminNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","t","k","p","_tSidebar","tSidebar","pathname","usePathname","handleSidebarToggle","useCallback","useEventSubscriptions","navigation","ShieldCheckIcon","ArrowsRightLeftIcon","CommandLineIcon","jsx","SimpleNavigation","ChevronLeftIcon","Bars3Icon","AdminLayoutBody","keyboardContext","useContext","KeyboardShortcutsContext","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","router","useRouter","isAuthenticated","isAdmin","isModerator","jsxs","LeftSidebar","routes","key","Outlet","Footer","params","CookiePreferences","AdminLayout"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"layout-G6HeeKIH.js","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 ArrowsRightLeftIcon,\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('exchange'),\n href: '/admin/exchange',\n icon: ArrowsRightLeftIcon,\n description: t('exchangeDescription')\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-dom';\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"],"names":["UsersIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","HrefLink","href","_to","Link","AdminNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","t","k","p","_tSidebar","tSidebar","pathname","usePathname","handleSidebarToggle","useCallback","useEventSubscriptions","navigation","ShieldCheckIcon","ArrowsRightLeftIcon","CommandLineIcon","jsx","SimpleNavigation","ChevronLeftIcon","Bars3Icon","AdminLayoutBody","keyboardContext","useContext","KeyboardShortcutsContext","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","router","useRouter","isAuthenticated","isAdmin","isModerator","jsxs","LeftSidebar","routes","key","Outlet","Footer","params","CookiePreferences","AdminLayout"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=not-found-
|
|
1
|
+
import{j as e}from"./index-DoPpOINE.js";import{a as n,L as l}from"./routing-o1npPvOW.js";import{u as i}from"./i18n-BbpF47i1.js";import"./vendor-DJo4KD8w.js";function g(){const{t:s}=i(),t=(r,o)=>s(`NotFound.${r}`,o),a=n();return e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-gray-50 dark:bg-gray-900",children:e.jsxs("div",{className:"text-center px-4",children:[e.jsx("h1",{className:"text-6xl font-bold text-gray-900 dark:text-white mb-4",children:t("title")}),e.jsx("h2",{className:"text-2xl font-semibold text-gray-700 dark:text-gray-300 mb-4",children:t("heading")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-8",children:t("message")}),e.jsx(l,{to:`/${a}`,className:"inline-block px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",children:t("goHome")})]})})}export{g as default};
|
|
2
|
+
//# sourceMappingURL=not-found-CtwZrTVU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found-
|
|
1
|
+
{"version":3,"file":"not-found-CtwZrTVU.js","sources":["../../src/app/[locale]/not-found.tsx"],"sourcesContent":["import React from 'react';\nimport { Link } from '@/i18n/routing';\nimport { useTranslation } from 'react-i18next';\nimport { useLocale } from '@/i18n/routing';\n\nexport default function NotFound() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`NotFound.${k}`, p as any) as string;\n const locale = useLocale();\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-gray-50 dark:bg-gray-900\">\n <div className=\"text-center px-4\">\n <h1 className=\"text-6xl font-bold text-gray-900 dark:text-white mb-4\">{t('title')}</h1>\n <h2 className=\"text-2xl font-semibold text-gray-700 dark:text-gray-300 mb-4\">\n {t('heading')}\n </h2>\n <p className=\"text-gray-600 dark:text-gray-400 mb-8\">\n {t('message')}\n </p>\n <Link\n to={`/${locale}`}\n className=\"inline-block px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n >\n {t('goHome')}\n </Link>\n </div>\n </div>\n );\n}\n"],"names":["NotFound","_t","useTranslation","k","p","locale","useLocale","jsxs","jsx","Link"],"mappings":"6JAKA,SAAwBA,GAAW,CACjC,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZ,EAAI,CAACC,EAAWC,IAAgCH,EAAG,YAAYE,CAAC,GAAIC,CAAQ,EAC5EC,EAASC,EAAA,EAEf,aACG,MAAA,CAAI,UAAU,4EACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wDAAyD,SAAA,EAAE,OAAO,EAAE,QACjF,KAAA,CAAG,UAAU,+DACX,SAAA,EAAE,SAAS,EACd,QACC,IAAA,CAAE,UAAU,wCACV,SAAA,EAAE,SAAS,EACd,EACAA,EAAAA,IAACC,EAAA,CACC,GAAI,IAAIJ,CAAM,GACd,UAAU,+FAET,WAAE,QAAQ,CAAA,CAAA,CACb,CAAA,CACF,CAAA,CACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as a,C as v,u as K,c as o,d as _,g as H,e as q,m as z,h as B,i as G,n as J,k as Q,o as W,T as X}from"./index-
|
|
2
|
-
//# sourceMappingURL=page-
|
|
1
|
+
import{j as a,C as v,u as K,c as o,d as _,g as H,e as q,m as z,h as B,i as G,n as J,k as Q,o as W,T as X}from"./index-DoPpOINE.js";import{r as C,u as Y}from"./vendor-DJo4KD8w.js";import{a as Z,u as P}from"./routing-o1npPvOW.js";import{T as ee}from"./ToolbarPanels-CjWlSOUC.js";import{u as y}from"./i18n-BbpF47i1.js";import"./XMarkIcon-KMKD47CF.js";function te(){const{t:d}=y(),e=(i,r)=>d(`Compose.${i}`,r),g=Z(),c=P(),[t]=Y(),p=K(),h=o(p.activeKbId$),n=o(p.activeSession$),R=o(n==null?void 0:n.user$),b=o(n==null?void 0:n.token$),m=!!R,l=h!=null&&n==null,{showError:k,showSuccess:T}=_(),w=n==null?void 0:n.client;C.useEffect(()=>{l||m||c.push("/")},[l,m,c]);const x=H(),u=t!=null&&t.get("annotationUri")?`gather-context:${t.get("annotationUri")}`:null,f=u&&typeof sessionStorage<"u"?sessionStorage.getItem(u)??void 0:void 0;u&&f&&typeof sessionStorage<"u"&&sessionStorage.removeItem(u);const s=q(()=>z(w,x,{mode:(t==null?void 0:t.get("mode"))??void 0,token:(t==null?void 0:t.get("token"))??void 0,annotationUri:(t==null?void 0:t.get("annotationUri"))??void 0,sourceDocumentId:(t==null?void 0:t.get("sourceDocumentId"))??void 0,name:(t==null?void 0:t.get("name"))??void 0,entityTypes:(t==null?void 0:t.get("entityTypes"))??void 0,storedContext:f},b??void 0)),S=o(s.browse.activePanel$)??null,$=o(s.mode$)??"new",D=o(s.loading$)??!0,L=o(s.cloneData$)??null,E=o(s.referenceData$)??null,F=o(s.gatheredContext$)??null,N=o(s.entityTypes$)??[],{theme:oe,setTheme:I,resolvedTheme:j}=B(),{showLineNumbers:M,toggleLineNumbers:U}=G(),{hoverDelayMs:A}=J();Q({"settings:theme-changed":({theme:i})=>I(i),"settings:line-numbers-toggled":()=>U()});const O=async i=>{try{const r=await s.save(i);i.mode==="reference"&&i.annotationUri&&T("Reference successfully linked to the new resource"),c.push(`/know/resource/${encodeURIComponent(r)}`)}catch(r){const V=r instanceof Error?r.message:"Failed to save resource. Please try again.";throw k(V),r}};return l||D?a.jsx(v,{message:l?"Checking authentication...":"Loading cloned resource..."}):m?a.jsx(W,{mode:$,cloneData:L,referenceData:E,gatheredContext:F,availableEntityTypes:N,initialLocale:g,theme:j,showLineNumbers:M,hoverDelayMs:A,activePanel:S,onSaveResource:O,onCancel:()=>c.push("/know/discover"),translations:{title:e("title"),titleEditClone:e("titleEditClone"),titleCompleteReference:e("titleCompleteReference"),subtitleClone:e("subtitleClone"),subtitleReference:e("subtitleReference"),linkedNoticePrefix:e("linkedNoticePrefix"),resourceName:e("resourceName"),resourceNamePlaceholder:e("resourceNamePlaceholder"),entityTypes:e("entityTypes"),language:e("language"),contentSource:e("contentSource"),uploadFile:e("uploadFile"),uploadFileDescription:e("uploadFileDescription"),writeContent:e("writeContent"),writeContentDescription:e("writeContentDescription"),dropFileOrClick:e("dropFileOrClick"),supportedFormats:e("supportedFormats"),mediaType:e("mediaType"),autoDetected:e("autoDetected"),format:e("format"),content:e("content"),resourceContent:e("resourceContent"),encoding:e("encoding"),archiveOriginal:e("archiveOriginal"),cancel:e("cancel"),saving:e("saving"),creating:e("creating"),creatingAndLinking:e("creatingAndLinking"),saveClonedResource:e("saveClonedResource"),createAndLinkResource:e("createAndLinkResource"),createResource:e("createResource")},ToolbarPanels:ee,Toolbar:X}):null}function le(){const{t:d}=y(),e=(g,c)=>d(`Compose.${g}`,c);return a.jsx(C.Suspense,{fallback:a.jsx(v,{message:e("loading")}),children:a.jsx(te,{})})}export{le as default};
|
|
2
|
+
//# sourceMappingURL=page-7nyyO6Jy.js.map
|