@semiont/cli 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +234 -134
- package/dist/frontend/dist/assets/{CookiePreferences-D5wgmVC7.js → CookiePreferences-5feiOAX4.js} +2 -2
- package/dist/frontend/dist/assets/{CookiePreferences-D5wgmVC7.js.map → CookiePreferences-5feiOAX4.js.map} +1 -1
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-5QESNO5H-B7UjwjIX.js → PdfAnnotationCanvas.client-5QESNO5H-Cxm4Es_X.js} +2 -2
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-5QESNO5H-B7UjwjIX.js.map → PdfAnnotationCanvas.client-5QESNO5H-Cxm4Es_X.js.map} +1 -1
- package/dist/frontend/dist/assets/ToolbarPanels-D5L18Wxk.js +2 -0
- package/dist/frontend/dist/assets/ToolbarPanels-D5L18Wxk.js.map +1 -0
- package/dist/frontend/dist/assets/client-BmABw25x.js +2 -0
- package/dist/frontend/dist/assets/client-BmABw25x.js.map +1 -0
- package/dist/frontend/dist/assets/client-CTyYgbIC.js +2 -0
- package/dist/frontend/dist/assets/client-CTyYgbIC.js.map +1 -0
- package/dist/frontend/dist/assets/client-Cjf1Te8y.js +2 -0
- package/dist/frontend/dist/assets/client-Cjf1Te8y.js.map +1 -0
- package/dist/frontend/dist/assets/client-D7w_vlsg.js +2 -0
- package/dist/frontend/dist/assets/client-D7w_vlsg.js.map +1 -0
- package/dist/frontend/dist/assets/index-BVOR3arc.js +169 -0
- package/dist/frontend/dist/assets/index-BVOR3arc.js.map +1 -0
- package/dist/frontend/dist/assets/{layout-BNfHKiGS.js → layout-B1HJjFMW.js} +2 -2
- package/dist/frontend/dist/assets/layout-B1HJjFMW.js.map +1 -0
- package/dist/frontend/dist/assets/layout-B7mIcfJU.js +2 -0
- package/dist/frontend/dist/assets/layout-B7mIcfJU.js.map +1 -0
- package/dist/frontend/dist/assets/{layout-G6HeeKIH.js → layout-BK6OF3Hx.js} +2 -2
- package/dist/frontend/dist/assets/{layout-G6HeeKIH.js.map → layout-BK6OF3Hx.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-Delbhxmy.js → layout-Cw-T4GPy.js} +2 -2
- package/dist/frontend/dist/assets/{layout-Delbhxmy.js.map → layout-Cw-T4GPy.js.map} +1 -1
- package/dist/frontend/dist/assets/{not-found-CtwZrTVU.js → not-found-uRBdv-bF.js} +2 -2
- package/dist/frontend/dist/assets/{not-found-CtwZrTVU.js.map → not-found-uRBdv-bF.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DSW3JQF2.js → page-5wC1as95.js} +2 -2
- package/dist/frontend/dist/assets/{page-DSW3JQF2.js.map → page-5wC1as95.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-VPeYeXi6.js → page-B6XEk2Ue.js} +2 -2
- package/dist/frontend/dist/assets/{page-VPeYeXi6.js.map → page-B6XEk2Ue.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CkiQdVlI.js → page-BLt9SJto.js} +2 -2
- package/dist/frontend/dist/assets/page-BLt9SJto.js.map +1 -0
- package/dist/frontend/dist/assets/{page-DBlue8Rh.js → page-BNaAGnc3.js} +2 -2
- package/dist/frontend/dist/assets/{page-DBlue8Rh.js.map → page-BNaAGnc3.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CjI_QXry.js → page-Bcljtfsa.js} +2 -2
- package/dist/frontend/dist/assets/{page-CjI_QXry.js.map → page-Bcljtfsa.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DBYS9qIU.js → page-Bf4MMijQ.js} +2 -2
- package/dist/frontend/dist/assets/{page-DBYS9qIU.js.map → page-Bf4MMijQ.js.map} +1 -1
- package/dist/frontend/dist/assets/page-BlU7QK_-.js +2 -0
- package/dist/frontend/dist/assets/page-BlU7QK_-.js.map +1 -0
- package/dist/frontend/dist/assets/{page-CI8oLbhf.js → page-Bnawjb1Y.js} +2 -2
- package/dist/frontend/dist/assets/{page-CI8oLbhf.js.map → page-Bnawjb1Y.js.map} +1 -1
- package/dist/frontend/dist/assets/page-C7vfVcap.js +2 -0
- package/dist/frontend/dist/assets/{page-DU909Np3.js.map → page-C7vfVcap.js.map} +1 -1
- package/dist/frontend/dist/assets/page-CBL0MuAo.js +2 -0
- package/dist/frontend/dist/assets/page-CBL0MuAo.js.map +1 -0
- package/dist/frontend/dist/assets/page-CKCKmPQO.js +2 -0
- package/dist/frontend/dist/assets/page-CKCKmPQO.js.map +1 -0
- package/dist/frontend/dist/assets/page-CdqGKYBH.js +2 -0
- package/dist/frontend/dist/assets/page-CdqGKYBH.js.map +1 -0
- package/dist/frontend/dist/assets/{page-Bb5SB6_Q.js → page-CfMLSllg.js} +2 -2
- package/dist/frontend/dist/assets/{page-Bb5SB6_Q.js.map → page-CfMLSllg.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-C_fIdKsk.js → page-D7w7NNd7.js} +2 -2
- package/dist/frontend/dist/assets/{page-C_fIdKsk.js.map → page-D7w7NNd7.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-kVSb0jfm.js → page-DAH06BM4.js} +2 -2
- package/dist/frontend/dist/assets/{page-kVSb0jfm.js.map → page-DAH06BM4.js.map} +1 -1
- package/dist/frontend/dist/assets/page-Dgqi9Orl.js +2 -0
- package/dist/frontend/dist/assets/page-Dgqi9Orl.js.map +1 -0
- package/dist/frontend/dist/assets/{page-RgfG8Fre.js → page-SrDV7XYv.js} +2 -2
- package/dist/frontend/dist/assets/{page-RgfG8Fre.js.map → page-SrDV7XYv.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-D_6K1M4j.js → page-wxqWVnqc.js} +2 -2
- package/dist/frontend/dist/assets/page-wxqWVnqc.js.map +1 -0
- package/dist/frontend/dist/assets/{privacy-NaGU1hj4.js → privacy-Kk_oWnpO.js} +2 -2
- package/dist/frontend/dist/assets/{privacy-NaGU1hj4.js.map → privacy-Kk_oWnpO.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-o1npPvOW.js → routing-CGghUc0N.js} +2 -2
- package/dist/frontend/dist/assets/{routing-o1npPvOW.js.map → routing-CGghUc0N.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-BybXhU8X.js → routing-CKNCPdYO.js} +2 -2
- package/dist/frontend/dist/assets/{routing-BybXhU8X.js.map → routing-CKNCPdYO.js.map} +1 -1
- package/dist/frontend/dist/assets/{web-DAOI6EsG.js → web-DdXPBk3h.js} +2 -2
- package/dist/frontend/dist/assets/{web-DAOI6EsG.js.map → web-DdXPBk3h.js.map} +1 -1
- package/dist/frontend/dist/index.html +1 -1
- package/dist/frontend/package.json +1 -1
- package/package.json +8 -8
- package/dist/frontend/dist/assets/ToolbarPanels-CjWlSOUC.js +0 -2
- package/dist/frontend/dist/assets/ToolbarPanels-CjWlSOUC.js.map +0 -1
- package/dist/frontend/dist/assets/client-B-MtBLP9.js +0 -2
- package/dist/frontend/dist/assets/client-B-MtBLP9.js.map +0 -1
- package/dist/frontend/dist/assets/client-DX1ckM1P.js +0 -2
- package/dist/frontend/dist/assets/client-DX1ckM1P.js.map +0 -1
- package/dist/frontend/dist/assets/client-Dh9ak8Fa.js +0 -2
- package/dist/frontend/dist/assets/client-Dh9ak8Fa.js.map +0 -1
- package/dist/frontend/dist/assets/client-DsP3tx7D.js +0 -2
- package/dist/frontend/dist/assets/client-DsP3tx7D.js.map +0 -1
- package/dist/frontend/dist/assets/index-DoPpOINE.js +0 -169
- package/dist/frontend/dist/assets/index-DoPpOINE.js.map +0 -1
- package/dist/frontend/dist/assets/layout-BNfHKiGS.js.map +0 -1
- package/dist/frontend/dist/assets/layout-CMpievJ_.js +0 -2
- package/dist/frontend/dist/assets/layout-CMpievJ_.js.map +0 -1
- package/dist/frontend/dist/assets/page-7nyyO6Jy.js +0 -2
- package/dist/frontend/dist/assets/page-7nyyO6Jy.js.map +0 -1
- package/dist/frontend/dist/assets/page-BEhfXGas.js +0 -2
- package/dist/frontend/dist/assets/page-BEhfXGas.js.map +0 -1
- package/dist/frontend/dist/assets/page-CV0h_zZE.js +0 -2
- package/dist/frontend/dist/assets/page-CV0h_zZE.js.map +0 -1
- package/dist/frontend/dist/assets/page-CkiQdVlI.js.map +0 -1
- package/dist/frontend/dist/assets/page-D5qkLwSn.js +0 -2
- package/dist/frontend/dist/assets/page-D5qkLwSn.js.map +0 -1
- package/dist/frontend/dist/assets/page-DU909Np3.js +0 -2
- package/dist/frontend/dist/assets/page-DV9q0oju.js +0 -2
- package/dist/frontend/dist/assets/page-DV9q0oju.js.map +0 -1
- package/dist/frontend/dist/assets/page-D_6K1M4j.js.map +0 -1
|
@@ -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-BVOR3arc.js";import{r as x,O as B}from"./vendor-DJo4KD8w.js";import{b as E,u as O,L as P}from"./routing-CGghUc0N.js";import{u as f}from"./i18n-BbpF47i1.js";import{F as z,T as C}from"./ToolbarPanels-D5L18Wxk.js";import{F as U}from"./XMarkIcon-KMKD47CF.js";import{F as W,a as M}from"./ChevronLeftIcon-BLyRNZuL.js";import{r as w,L as b}from"./routing-CKNCPdYO.js";import{C as y}from"./CookiePreferences-5feiOAX4.js";import{K as D}from"./privacy-Kk_oWnpO.js";const G=({className:r})=>e.jsx("span",{className:r,style:{fontSize:"1.25rem",lineHeight:"1"},children:"🔭"});function q({href:r,to:s,...t}){return e.jsx(P,{to:r??"",...t})}function J({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:G,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]),S=x.useCallback(({oldIndex:m,newIndex:g})=>{c(m,g)},[c]);$({"shell:sidebar-toggle":N,"tabs:close":k,"tabs:reorder":S});const L=m=>{l.push(m)},R=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:q,onNavigate:L,getResourceHref:R,className:"knowledge-navigation",translations:{title:o("title")},icons:{chevronLeft:M,bars:W,close:U},navigationMenu:t})})})}function Q(){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(J,{isCollapsed:a,toggleCollapsed:c,navigationMenu:v})})}function V(){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(C,{activePanel:d,showLineNumbers:n,theme:o}),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(D),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(V,{}),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(Q,{}),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-B1HJjFMW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-B1HJjFMW.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 useShellStateUnit,\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 browseStateUnit = useShellStateUnit();\n const activePanel = useObservable(browseStateUnit.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 />\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","browseStateUnit","useShellStateUnit","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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"}
|
|
@@ -0,0 +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-BVOR3arc.js";import{a as M,C as N,b as z,i as W,c as B,s as k}from"./privacy-Kk_oWnpO.js";import{r as o,O as G}from"./vendor-DJo4KD8w.js";import{u as $}from"./routing-CGghUc0N.js";import{u as w}from"./i18n-BbpF47i1.js";function F(){const t=$(),s=o.useCallback(({url:a,cancelFallback:i})=>{i(),t.push(a)},[t]),r=o.useCallback(({path:a})=>{t.push(a)},[t]);return S({"nav:external":s,"nav:push":r}),null}function I(t,s){const r=t.match(/\{(\w+),\s*plural,\s*/);if(!r)return t;const a=r[1],i=s[a];if(i===void 0)return t;const c=r[0].length+r.index;let m=1,d=c;for(let l=c;l<t.length;l++)if(t[l]==="{")m++;else if(t[l]==="}"&&(m--,m===0)){d=l;break}const u=t.substring(c,d),f={},h=/(?:=(\d+)|(\w+))\s*\{([^}]+)\}/g;let x;for(;(x=h.exec(u))!==null;){const[,l,v,b]=x,j=l!==void 0?`=${l}`:v;f[j]=b}const g=f[`=${i}`];if(g!==void 0){const l=g.replace(/#/g,String(i));return t.substring(0,r.index)+l+t.substring(d+1)}const y=f.other;if(y!==void 0){const l=y.replace(/#/g,String(i));return t.substring(0,r.index)+l+t.substring(d+1)}return t}function O(t,s){let r=I(t,s);return Object.entries(s).forEach(([a,i])=>{r=r.replace(new RegExp(`\\{\\{${a}\\}\\}`,"g"),String(i))}),r}function V(){const{i18n:t}=w();return o.useMemo(()=>({t:(s,r,a)=>{var m;const i=t.getResourceBundle(t.language,"translation"),c=(m=i==null?void 0:i[s])==null?void 0:m[r];return c?a&&typeof c=="string"?O(c,a):c:`${s}.${r}`}}),[t,t.language])}function q({children:t}){const s=V();return e.jsx(E,{translationManager:s,children:e.jsx(R,{children:e.jsx(T,{children:e.jsx(L,{children:e.jsx(M,{children:e.jsxs(A,{children:[e.jsx(F,{}),t]})})})})})})}function K({title:t,titleId:s,...r},a){return o.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":s},r),t?o.createElement("title",{id:s},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5"}))}const _=o.forwardRef(K);function H({title:t,titleId:s,...r},a){return o.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":s},r),t?o.createElement("title",{id:s},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5"}))}const U=o.forwardRef(H);function J({className:t=""}){const{t:s}=w(),r=(n,p)=>s(`CookieBanner.${n}`,p),[a,i]=o.useState(!1),[c,m]=o.useState(!1),[d,u]=o.useState(!1),[f,h]=o.useState("GENERAL"),[x,g]=o.useState({necessary:!0,analytics:!1,marketing:!1,preferences:!1});o.useEffect(()=>{(async()=>{if(z()){i(!0);try{const[p,P]=await Promise.all([W(),B()]);h(p?"GDPR":P?"CCPA":"GENERAL")}catch(p){console.error("Failed to detect region:",p),h("GENERAL")}}})()},[]);const y=async()=>{u(!0);try{const n={necessary:!0,analytics:!0,marketing:!0,preferences:!0};await Promise.resolve(k(n)),i(!1)}catch(n){console.error("Failed to save cookie consent:",n)}finally{u(!1)}},l=async()=>{u(!0);try{const n={necessary:!0,analytics:!1,marketing:!1,preferences:!1};await Promise.resolve(k(n)),i(!1)}catch(n){console.error("Failed to save cookie consent:",n)}finally{u(!1)}},v=async()=>{u(!0);try{await Promise.resolve(k(x)),i(!1)}catch(n){console.error("Failed to save cookie consent:",n)}finally{u(!1)}},b=n=>{n!=="necessary"&&g(p=>({...p,[n]:!p[n]}))},j=()=>{switch(f){case"GDPR":return{title:r("gdprTitle"),description:r("gdprDescription"),learnMore:r("gdprLearnMore")};case"CCPA":return{title:r("ccpaTitle"),description:r("ccpaDescription"),learnMore:r("ccpaLearnMore")};default:return{title:r("generalTitle"),description:r("generalDescription"),learnMore:r("generalLearnMore")}}};if(!a)return null;const C=j();return e.jsx("div",{className:t,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:C.title}),e.jsx("p",{style:{fontSize:"var(--semiont-text-sm, 0.875rem)",color:"var(--semiont-text-secondary)",marginBottom:"0.25rem"},children:C.description}),e.jsx("p",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)"},children:C.learnMore})]}),e.jsxs("div",{style:{display:"flex",gap:"0.75rem",alignItems:"center",flexWrap:"wrap"},children:[e.jsxs("button",{type:"button",onClick:()=>m(!c),className:"semiont-button--secondary",style:{display:"flex",alignItems:"center",gap:"0.25rem"},children:[r("customize"),c?e.jsx(U,{style:{width:"1rem",height:"1rem"}}):e.jsx(_,{style:{width:"1rem",height:"1rem"}})]}),f!=="GDPR"&&e.jsx("button",{type:"button",onClick:l,disabled:d,className:"semiont-button--secondary",children:r(d?"saving":"rejectAll")}),e.jsx("button",{type:"button",onClick:y,disabled:d,className:"semiont-button--primary",children:r(d?"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:r("cookiePreferences")}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:N.map(n=>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-${n.id}`,type:"checkbox",checked:x[n.id]||!1,onChange:()=>b(n.id),disabled:n.required||d,style:{accentColor:"var(--semiont-color-primary-600, #2563eb)"}})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("label",{htmlFor:`cookie-${n.id}`,style:{fontSize:"var(--semiont-text-sm, 0.875rem)",fontWeight:500,color:"var(--semiont-text-primary)",cursor:"pointer"},children:[n.name,n.required&&e.jsx("span",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)",marginLeft:"0.25rem"},children:r("required")})]}),e.jsx("p",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-secondary)",marginTop:"0.25rem"},children:n.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:r("viewCookies")}),e.jsx("div",{style:{marginTop:"0.25rem",fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)"},children:n.cookies.join(", ")})]})]})]},n.id))}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.75rem",paddingTop:"1rem"},children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"semiont-button--secondary",children:r("cancel")}),e.jsx("button",{type:"button",onClick:v,disabled:d,className:"semiont-button--primary",children:r(d?"saving":"savePreferences")})]})]})})]})})})}function re(){return e.jsxs(q,{children:[e.jsx(D,{}),e.jsx(G,{}),e.jsx(J,{})]})}export{re as default};
|
|
2
|
+
//# sourceMappingURL=layout-B7mIcfJU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-B7mIcfJU.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 * Process ICU MessageFormat plural syntax.\n * Supports: `{count, plural, =0 {text} =1 {text} other {text}}` with `#` as\n * the count placeholder inside each branch.\n *\n * Mirrors the reference implementation in\n * `packages/react-ui/src/contexts/TranslationContext.tsx`. Kept in sync\n * deliberately — diverging the two managers is what produced the\n * literal-plural-format render bug in the Tags panel.\n */\nexport function processPluralFormat(text: string, params: Record<string, unknown>): string {\n const pluralMatch = text.match(/\\{(\\w+),\\s*plural,\\s*/);\n if (!pluralMatch) return text;\n\n const paramName = pluralMatch[1]!;\n const count = params[paramName];\n if (count === undefined) return text;\n\n // Find the matching closing brace by counting nested pairs.\n const startPos = pluralMatch[0].length + pluralMatch.index!;\n let braceCount = 1;\n let endPos = startPos;\n for (let i = startPos; i < text.length; i++) {\n if (text[i] === '{') braceCount++;\n else if (text[i] === '}') {\n braceCount--;\n if (braceCount === 0) { endPos = i; break; }\n }\n }\n\n const pluralCases = text.substring(startPos, endPos);\n const cases: Record<string, string> = {};\n const caseRegex = /(?:=(\\d+)|(\\w+))\\s*\\{([^}]+)\\}/g;\n let caseMatch;\n while ((caseMatch = caseRegex.exec(pluralCases)) !== null) {\n const [, exactNumber, keyword, textContent] = caseMatch;\n const key = exactNumber !== undefined ? `=${exactNumber}` : keyword!;\n cases[key] = textContent!;\n }\n\n const exactMatch = cases[`=${count}`];\n if (exactMatch !== undefined) {\n const replaced = exactMatch.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + replaced + text.substring(endPos + 1);\n }\n const otherCase = cases['other'];\n if (otherCase !== undefined) {\n const replaced = otherCase.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + replaced + text.substring(endPos + 1);\n }\n return text;\n}\n\n/**\n * Run a translation string through the standard interpolation pipeline:\n * plural format first (since it may consume more of the string), then\n * `{{paramKey}}` parameter substitution. Exported for unit testing.\n */\nexport function interpolateTranslation(\n translation: string,\n params: Record<string, unknown>,\n): string {\n let result = processPluralFormat(translation, params);\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n}\n\n/**\n * Translation Manager for Frontend\n *\n * Wraps react-i18next. The messages JSON (loaded by i18next-http-backend) has\n * the same flat namespace structure: { \"Namespace\": { \"key\": \"value\" } }.\n * TranslationManager.t(namespace, key) maps directly to this structure.\n *\n * Interpolation supports two syntaxes, in this precedence order:\n *\n * 1. ICU MessageFormat plural — `{count, plural, =0 {…} =1 {…} other {…}}`\n * — used for count-sensitive strings like \"1 category selected\" /\n * \"3 categories selected\".\n * 2. Double-brace parameter substitution — `{{paramKey}}` — used for\n * everything else (`{{mode}}`, `{{delay}}`, etc.).\n *\n * The two managers (this one and the reference in\n * `@semiont/react-ui/contexts/TranslationContext`) implement the same\n * interpolation contract; keep them aligned when changing either.\n */\nexport function useMergedTranslationManager(): TranslationManager {\n const { i18n } = useTranslation();\n\n return useMemo(() => {\n return {\n t: (namespace: string, key: string, params?: Record<string, unknown>): string => {\n const messages = i18n.getResourceBundle(i18n.language, 'translation') as Messages | undefined;\n const translation = messages?.[namespace]?.[key];\n\n if (!translation) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`Translation not found: ${namespace}.${key} (locale: ${i18n.language})`);\n }\n return `${namespace}.${key}`;\n }\n\n if (params && typeof translation === 'string') {\n return interpolateTranslation(translation, params);\n }\n\n return translation;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [i18n, i18n.language]);\n}\n","import React from 'react';\nimport {\n ToastProvider,\n LiveRegionProvider,\n TranslationProvider,\n ThemeProvider,\n 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","processPluralFormat","text","params","pluralMatch","paramName","count","startPos","braceCount","endPos","i","pluralCases","cases","caseRegex","caseMatch","exactNumber","keyword","textContent","key","exactMatch","replaced","otherCase","interpolateTranslation","translation","result","paramKey","paramValue","useMergedTranslationManager","i18n","useTranslation","useMemo","namespace","messages","_a","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","t","k","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 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-BVOR3arc.js";import{r as c,O as j}from"./vendor-DJo4KD8w.js";import{b as $,L as F,u as y}from"./routing-CGghUc0N.js";import{u as p}from"./i18n-BbpF47i1.js";import{F as R,C as A}from"./CookiePreferences-5feiOAX4.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-Kk_oWnpO.js";import{r as b,L as h}from"./routing-CKNCPdYO.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-BK6OF3Hx.js.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"layout-BK6OF3Hx.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{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-BVOR3arc.js";import{r,O as S}from"./vendor-DJo4KD8w.js";import{b as y,L as E,u as R}from"./routing-CGghUc0N.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-5feiOAX4.js";import{K as O}from"./privacy-Kk_oWnpO.js";import{r as x,L as b}from"./routing-CKNCPdYO.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-Cw-T4GPy.js.map
|
|
@@ -1 +1 @@
|
|
|
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":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"layout-Cw-T4GPy.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,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=not-found-
|
|
1
|
+
import{j as e}from"./index-BVOR3arc.js";import{a as n,L as l}from"./routing-CGghUc0N.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-uRBdv-bF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found-
|
|
1
|
+
{"version":3,"file":"not-found-uRBdv-bF.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{r as o}from"./vendor-DJo4KD8w.js";import{u as t}from"./routing-
|
|
2
|
-
//# sourceMappingURL=page-
|
|
1
|
+
import{r as o}from"./vendor-DJo4KD8w.js";import{u as t}from"./routing-CGghUc0N.js";import"./index-BVOR3arc.js";import"./i18n-BbpF47i1.js";function a(){const r=t();return o.useEffect(()=>{r.replace("/know/discover")},[r]),null}export{a as default};
|
|
2
|
+
//# sourceMappingURL=page-5wC1as95.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-
|
|
1
|
+
{"version":3,"file":"page-5wC1as95.js","sources":["../../src/app/[locale]/auth/connect/page.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { useRouter } from '@/i18n/routing';\n\n/**\n * Legacy connect page — redirects to /know/discover.\n * Authentication is now handled inline in the Knowledge Base Panel.\n */\nexport default function ConnectPage() {\n const router = useRouter();\n\n useEffect(() => {\n router.replace('/know/discover');\n }, [router]);\n\n return null;\n}\n"],"names":["ConnectPage","router","useRouter","useEffect"],"mappings":"0IAOA,SAAwBA,GAAc,CACpC,MAAMC,EAASC,EAAA,EAEfC,OAAAA,EAAAA,UAAU,IAAM,CACdF,EAAO,QAAQ,gBAAgB,CACjC,EAAG,CAACA,CAAM,CAAC,EAEJ,IACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{g as u,c as g,h as W,i as f,k as b,j as w,J as x,T}from"./index-
|
|
2
|
-
//# sourceMappingURL=page-
|
|
1
|
+
import{g as u,c as g,h as W,i as f,k as b,j as w,J as x,T}from"./index-BVOR3arc.js";import{r as i}from"./vendor-DJo4KD8w.js";import{T as v}from"./ToolbarPanels-D5L18Wxk.js";import{u as y}from"./i18n-BbpF47i1.js";import"./routing-CGghUc0N.js";import"./XMarkIcon-KMKD47CF.js";var S={"legal-irac":{id:"legal-irac",name:"Legal Analysis (IRAC)",description:"Issue, Rule, Application, Conclusion framework for legal reasoning",domain:"legal",tags:[{name:"Issue",description:"The legal question or problem to be resolved",examples:["What is the central legal question?","What must the court decide?","What is the dispute about?"]},{name:"Rule",description:"The relevant law, statute, or legal principle",examples:["What law applies?","What is the legal standard?","What statute governs this case?"]},{name:"Application",description:"How the rule applies to the specific facts",examples:["How does the law apply to these facts?","Analysis of the case","How do the facts satisfy the legal standard?"]},{name:"Conclusion",description:"The resolution or outcome based on the analysis",examples:["What is the court's decision?","What is the final judgment?","What is the holding?"]}]},"scientific-imrad":{id:"scientific-imrad",name:"Scientific Paper (IMRAD)",description:"Introduction, Methods, Results, Discussion structure for research papers",domain:"scientific",tags:[{name:"Introduction",description:"Background, context, and research question",examples:["What is the research question?","Why is this important?","What is the hypothesis?"]},{name:"Methods",description:"Experimental design and procedures",examples:["How was the study conducted?","What methods were used?","What was the experimental design?"]},{name:"Results",description:"Findings and observations",examples:["What did the study find?","What are the data?","What were the observations?"]},{name:"Discussion",description:"Interpretation and implications of results",examples:["What do the results mean?","What are the implications?","How do these findings relate to prior work?"]}]},"argument-toulmin":{id:"argument-toulmin",name:"Argument Structure (Toulmin)",description:"Claim, Evidence, Warrant, Counterargument, Rebuttal framework for argumentation",domain:"general",tags:[{name:"Claim",description:"The main assertion or thesis",examples:["What is being argued?","What is the main point?","What position is being taken?"]},{name:"Evidence",description:"Data or facts supporting the claim",examples:["What supports this claim?","What are the facts?","What data is provided?"]},{name:"Warrant",description:"Reasoning connecting evidence to claim",examples:["Why does this evidence support the claim?","What is the logic?","How does this reasoning work?"]},{name:"Counterargument",description:"Opposing viewpoints or objections",examples:["What are the objections?","What do critics say?","What are alternative views?"]},{name:"Rebuttal",description:"Response to counterarguments",examples:["How is the objection addressed?","Why is the counterargument wrong?","How is the criticism answered?"]}]}};function C(){return Object.values(S)}function I(){const{t:n}=y(),e=(t,p)=>n(`ModerateTagSchemas.${t}`,p),o=u(),r=g(o.activePanel$)??null,{theme:c,setTheme:a}=W(),{showLineNumbers:l,toggleLineNumbers:s}=f(),h=i.useCallback(({theme:t})=>{a(t)},[a]),m=i.useCallback(()=>{s()},[s]);b({"settings:theme-changed":h,"settings:line-numbers-toggled":m});const d=C();return w.jsx(x,{schemas:d,isLoading:!1,theme:c,showLineNumbers:l,activePanel:r,translations:{pageTitle:e("pageTitle"),pageDescription:e("pageDescription"),categories:e("categories"),loading:e("loading")},ToolbarPanels:v,Toolbar:T})}export{I as default};
|
|
2
|
+
//# sourceMappingURL=page-B6XEk2Ue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-VPeYeXi6.js","sources":["../../../../packages/ontology/dist/index.js","../../src/app/[locale]/moderate/tag-schemas/page.tsx"],"sourcesContent":["// src/entity-types.ts\nvar DEFAULT_ENTITY_TYPES = [\n \"Person\",\n \"Organization\",\n \"Location\",\n \"Event\",\n \"Concept\",\n \"Product\",\n \"Technology\",\n \"Date\",\n \"Author\"\n];\n\n// src/tag-schemas.ts\nvar TAG_SCHEMAS = {\n \"legal-irac\": {\n id: \"legal-irac\",\n name: \"Legal Analysis (IRAC)\",\n description: \"Issue, Rule, Application, Conclusion framework for legal reasoning\",\n domain: \"legal\",\n tags: [\n {\n name: \"Issue\",\n description: \"The legal question or problem to be resolved\",\n examples: [\n \"What is the central legal question?\",\n \"What must the court decide?\",\n \"What is the dispute about?\"\n ]\n },\n {\n name: \"Rule\",\n description: \"The relevant law, statute, or legal principle\",\n examples: [\n \"What law applies?\",\n \"What is the legal standard?\",\n \"What statute governs this case?\"\n ]\n },\n {\n name: \"Application\",\n description: \"How the rule applies to the specific facts\",\n examples: [\n \"How does the law apply to these facts?\",\n \"Analysis of the case\",\n \"How do the facts satisfy the legal standard?\"\n ]\n },\n {\n name: \"Conclusion\",\n description: \"The resolution or outcome based on the analysis\",\n examples: [\n \"What is the court's decision?\",\n \"What is the final judgment?\",\n \"What is the holding?\"\n ]\n }\n ]\n },\n \"scientific-imrad\": {\n id: \"scientific-imrad\",\n name: \"Scientific Paper (IMRAD)\",\n description: \"Introduction, Methods, Results, Discussion structure for research papers\",\n domain: \"scientific\",\n tags: [\n {\n name: \"Introduction\",\n description: \"Background, context, and research question\",\n examples: [\n \"What is the research question?\",\n \"Why is this important?\",\n \"What is the hypothesis?\"\n ]\n },\n {\n name: \"Methods\",\n description: \"Experimental design and procedures\",\n examples: [\n \"How was the study conducted?\",\n \"What methods were used?\",\n \"What was the experimental design?\"\n ]\n },\n {\n name: \"Results\",\n description: \"Findings and observations\",\n examples: [\n \"What did the study find?\",\n \"What are the data?\",\n \"What were the observations?\"\n ]\n },\n {\n name: \"Discussion\",\n description: \"Interpretation and implications of results\",\n examples: [\n \"What do the results mean?\",\n \"What are the implications?\",\n \"How do these findings relate to prior work?\"\n ]\n }\n ]\n },\n \"argument-toulmin\": {\n id: \"argument-toulmin\",\n name: \"Argument Structure (Toulmin)\",\n description: \"Claim, Evidence, Warrant, Counterargument, Rebuttal framework for argumentation\",\n domain: \"general\",\n tags: [\n {\n name: \"Claim\",\n description: \"The main assertion or thesis\",\n examples: [\n \"What is being argued?\",\n \"What is the main point?\",\n \"What position is being taken?\"\n ]\n },\n {\n name: \"Evidence\",\n description: \"Data or facts supporting the claim\",\n examples: [\n \"What supports this claim?\",\n \"What are the facts?\",\n \"What data is provided?\"\n ]\n },\n {\n name: \"Warrant\",\n description: \"Reasoning connecting evidence to claim\",\n examples: [\n \"Why does this evidence support the claim?\",\n \"What is the logic?\",\n \"How does this reasoning work?\"\n ]\n },\n {\n name: \"Counterargument\",\n description: \"Opposing viewpoints or objections\",\n examples: [\n \"What are the objections?\",\n \"What do critics say?\",\n \"What are alternative views?\"\n ]\n },\n {\n name: \"Rebuttal\",\n description: \"Response to counterarguments\",\n examples: [\n \"How is the objection addressed?\",\n \"Why is the counterargument wrong?\",\n \"How is the criticism answered?\"\n ]\n }\n ]\n }\n};\nfunction getTagSchema(schemaId) {\n return TAG_SCHEMAS[schemaId] || null;\n}\nfunction getAllTagSchemas() {\n return Object.values(TAG_SCHEMAS);\n}\nfunction getTagSchemasByDomain(domain) {\n return Object.values(TAG_SCHEMAS).filter((schema) => schema.domain === domain);\n}\nfunction isValidCategory(schemaId, categoryName) {\n const schema = getTagSchema(schemaId);\n if (!schema) return false;\n return schema.tags.some((tag) => tag.name === categoryName);\n}\nfunction getSchemaCategory(schemaId, categoryName) {\n const schema = getTagSchema(schemaId);\n if (!schema) return null;\n return schema.tags.find((tag) => tag.name === categoryName) || null;\n}\n\n// src/entity-extraction.ts\nfunction getEntityTypes(annotation) {\n if (Array.isArray(annotation.body)) {\n const entityTags = [];\n for (const item of annotation.body) {\n if (typeof item === \"object\" && item !== null && \"type\" in item && \"value\" in item && \"purpose\" in item) {\n const itemType = item.type;\n const itemValue = item.value;\n const itemPurpose = item.purpose;\n if (itemType === \"TextualBody\" && itemPurpose === \"tagging\" && typeof itemValue === \"string\" && itemValue.length > 0) {\n entityTags.push(itemValue);\n }\n }\n }\n return entityTags;\n }\n return [];\n}\n\n// src/tag-extraction.ts\nfunction isTag(annotation) {\n return annotation.motivation === \"tagging\";\n}\nfunction getTagCategory(annotation) {\n if (!isTag(annotation)) return void 0;\n const bodies = Array.isArray(annotation.body) ? annotation.body : [annotation.body];\n const taggingBody = bodies.find(\n (b) => b !== null && typeof b === \"object\" && \"purpose\" in b && b.purpose === \"tagging\"\n );\n if (taggingBody && \"value\" in taggingBody) {\n return taggingBody.value;\n }\n return void 0;\n}\nfunction getTagSchemaId(annotation) {\n if (!isTag(annotation)) return void 0;\n const bodies = Array.isArray(annotation.body) ? annotation.body : [annotation.body];\n const classifyingBody = bodies.find(\n (b) => b !== null && typeof b === \"object\" && \"purpose\" in b && b.purpose === \"classifying\"\n );\n if (classifyingBody && \"value\" in classifyingBody) {\n return classifyingBody.value;\n }\n return void 0;\n}\nexport {\n DEFAULT_ENTITY_TYPES,\n TAG_SCHEMAS,\n getAllTagSchemas,\n getEntityTypes,\n getSchemaCategory,\n getTagCategory,\n getTagSchema,\n getTagSchemaId,\n getTagSchemasByDomain,\n isValidCategory\n};\n//# sourceMappingURL=index.js.map","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, useShellVM, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { getAllTagSchemas } from '@semiont/ontology';\nimport { TagSchemasPage } from '@semiont/react-ui';\n\n// Authentication is handled by middleware (proxy.ts)\n// Only authenticated moderators/admins can reach this page\n\nexport default function TagSchemasPageWrapper() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerateTagSchemas.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const browseVM = useShellVM();\n const activePanel = useObservable(browseVM.activePanel$) ?? null;\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n const schemas = getAllTagSchemas();\n\n return (\n <TagSchemasPage\n schemas={schemas}\n isLoading={false}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n pageTitle: t('pageTitle'),\n pageDescription: t('pageDescription'),\n categories: t('categories'),\n loading: t('loading'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["TAG_SCHEMAS","getAllTagSchemas","TagSchemasPageWrapper","_t","useTranslation","t","k","browseVM","useShellVM","activePanel","useObservable","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","schemas","jsx","TagSchemasPage","ToolbarPanels","Toolbar"],"mappings":"kRAcA,IAAIA,EAAc,CAChB,aAAc,CACZ,GAAI,aACJ,KAAM,wBACN,YAAa,qEACb,OAAQ,QACR,KAAM,CACJ,CACE,KAAM,QACN,YAAa,+CACb,SAAU,CACR,sCACA,8BACA,4BACV,CACA,EACM,CACE,KAAM,OACN,YAAa,gDACb,SAAU,CACR,oBACA,8BACA,iCACV,CACA,EACM,CACE,KAAM,cACN,YAAa,6CACb,SAAU,CACR,yCACA,uBACA,8CACV,CACA,EACM,CACE,KAAM,aACN,YAAa,kDACb,SAAU,CACR,gCACA,8BACA,sBACV,CACA,CACA,CACA,EACE,mBAAoB,CAClB,GAAI,mBACJ,KAAM,2BACN,YAAa,2EACb,OAAQ,aACR,KAAM,CACJ,CACE,KAAM,eACN,YAAa,6CACb,SAAU,CACR,iCACA,yBACA,yBACV,CACA,EACM,CACE,KAAM,UACN,YAAa,qCACb,SAAU,CACR,+BACA,0BACA,mCACV,CACA,EACM,CACE,KAAM,UACN,YAAa,4BACb,SAAU,CACR,2BACA,qBACA,6BACV,CACA,EACM,CACE,KAAM,aACN,YAAa,6CACb,SAAU,CACR,4BACA,6BACA,6CACV,CACA,CACA,CACA,EACE,mBAAoB,CAClB,GAAI,mBACJ,KAAM,+BACN,YAAa,kFACb,OAAQ,UACR,KAAM,CACJ,CACE,KAAM,QACN,YAAa,+BACb,SAAU,CACR,wBACA,0BACA,+BACV,CACA,EACM,CACE,KAAM,WACN,YAAa,qCACb,SAAU,CACR,4BACA,sBACA,wBACV,CACA,EACM,CACE,KAAM,UACN,YAAa,yCACb,SAAU,CACR,4CACA,qBACA,+BACV,CACA,EACM,CACE,KAAM,kBACN,YAAa,oCACb,SAAU,CACR,2BACA,uBACA,6BACV,CACA,EACM,CACE,KAAM,WACN,YAAa,+BACb,SAAU,CACR,kCACA,oCACA,gCACV,CACA,CACA,CACA,CACA,EAIA,SAASC,GAAmB,CAC1B,OAAO,OAAO,OAAOD,CAAW,CAClC,CCvJA,SAAwBE,GAAwB,CAC9C,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAW,IAAgCH,EAAG,sBAAsBG,CAAC,GAAI,CAAQ,EAGtFC,EAAWC,EAAA,EACXC,EAAcC,EAAcH,EAAS,YAAY,GAAK,KACtD,CAAE,MAAAI,EAAO,SAAAC,CAAA,EAAaC,EAAA,EACtB,CAAE,gBAAAC,EAAiB,kBAAAC,CAAA,EAAsBC,EAAA,EAEzCC,EAAqBC,EAAAA,YAAY,CAAC,CAAE,MAAAP,KAAoD,CAC5FC,EAASD,CAAK,CAChB,EAAG,CAACC,CAAQ,CAAC,EAEPO,EAA2BD,EAAAA,YAAY,IAAM,CACjDH,EAAA,CACF,EAAG,CAACA,CAAiB,CAAC,EAEtBK,EAAsB,CACpB,yBAA0BH,EAC1B,gCAAiCE,CAAA,CAClC,EAED,MAAME,EAAUpB,EAAA,EAEhB,OACEqB,EAAAA,IAACC,EAAA,CACC,QAAAF,EACA,UAAW,GACX,MAAAV,EACA,gBAAAG,EACA,YAAAL,EACA,aAAc,CACZ,UAAWJ,EAAE,WAAW,EACxB,gBAAiBA,EAAE,iBAAiB,EACpC,WAAYA,EAAE,YAAY,EAC1B,QAASA,EAAE,SAAS,CAAA,EAEtB,cAAAmB,EACA,QAAAC,CAAA,CAAA,CAGN"}
|
|
1
|
+
{"version":3,"file":"page-B6XEk2Ue.js","sources":["../../../../packages/ontology/dist/index.js","../../src/app/[locale]/moderate/tag-schemas/page.tsx"],"sourcesContent":["// src/entity-types.ts\nvar DEFAULT_ENTITY_TYPES = [\n \"Person\",\n \"Organization\",\n \"Location\",\n \"Event\",\n \"Concept\",\n \"Product\",\n \"Technology\",\n \"Date\",\n \"Author\"\n];\n\n// src/tag-schemas.ts\nvar TAG_SCHEMAS = {\n \"legal-irac\": {\n id: \"legal-irac\",\n name: \"Legal Analysis (IRAC)\",\n description: \"Issue, Rule, Application, Conclusion framework for legal reasoning\",\n domain: \"legal\",\n tags: [\n {\n name: \"Issue\",\n description: \"The legal question or problem to be resolved\",\n examples: [\n \"What is the central legal question?\",\n \"What must the court decide?\",\n \"What is the dispute about?\"\n ]\n },\n {\n name: \"Rule\",\n description: \"The relevant law, statute, or legal principle\",\n examples: [\n \"What law applies?\",\n \"What is the legal standard?\",\n \"What statute governs this case?\"\n ]\n },\n {\n name: \"Application\",\n description: \"How the rule applies to the specific facts\",\n examples: [\n \"How does the law apply to these facts?\",\n \"Analysis of the case\",\n \"How do the facts satisfy the legal standard?\"\n ]\n },\n {\n name: \"Conclusion\",\n description: \"The resolution or outcome based on the analysis\",\n examples: [\n \"What is the court's decision?\",\n \"What is the final judgment?\",\n \"What is the holding?\"\n ]\n }\n ]\n },\n \"scientific-imrad\": {\n id: \"scientific-imrad\",\n name: \"Scientific Paper (IMRAD)\",\n description: \"Introduction, Methods, Results, Discussion structure for research papers\",\n domain: \"scientific\",\n tags: [\n {\n name: \"Introduction\",\n description: \"Background, context, and research question\",\n examples: [\n \"What is the research question?\",\n \"Why is this important?\",\n \"What is the hypothesis?\"\n ]\n },\n {\n name: \"Methods\",\n description: \"Experimental design and procedures\",\n examples: [\n \"How was the study conducted?\",\n \"What methods were used?\",\n \"What was the experimental design?\"\n ]\n },\n {\n name: \"Results\",\n description: \"Findings and observations\",\n examples: [\n \"What did the study find?\",\n \"What are the data?\",\n \"What were the observations?\"\n ]\n },\n {\n name: \"Discussion\",\n description: \"Interpretation and implications of results\",\n examples: [\n \"What do the results mean?\",\n \"What are the implications?\",\n \"How do these findings relate to prior work?\"\n ]\n }\n ]\n },\n \"argument-toulmin\": {\n id: \"argument-toulmin\",\n name: \"Argument Structure (Toulmin)\",\n description: \"Claim, Evidence, Warrant, Counterargument, Rebuttal framework for argumentation\",\n domain: \"general\",\n tags: [\n {\n name: \"Claim\",\n description: \"The main assertion or thesis\",\n examples: [\n \"What is being argued?\",\n \"What is the main point?\",\n \"What position is being taken?\"\n ]\n },\n {\n name: \"Evidence\",\n description: \"Data or facts supporting the claim\",\n examples: [\n \"What supports this claim?\",\n \"What are the facts?\",\n \"What data is provided?\"\n ]\n },\n {\n name: \"Warrant\",\n description: \"Reasoning connecting evidence to claim\",\n examples: [\n \"Why does this evidence support the claim?\",\n \"What is the logic?\",\n \"How does this reasoning work?\"\n ]\n },\n {\n name: \"Counterargument\",\n description: \"Opposing viewpoints or objections\",\n examples: [\n \"What are the objections?\",\n \"What do critics say?\",\n \"What are alternative views?\"\n ]\n },\n {\n name: \"Rebuttal\",\n description: \"Response to counterarguments\",\n examples: [\n \"How is the objection addressed?\",\n \"Why is the counterargument wrong?\",\n \"How is the criticism answered?\"\n ]\n }\n ]\n }\n};\nfunction getTagSchema(schemaId) {\n return TAG_SCHEMAS[schemaId] || null;\n}\nfunction getAllTagSchemas() {\n return Object.values(TAG_SCHEMAS);\n}\nfunction getTagSchemasByDomain(domain) {\n return Object.values(TAG_SCHEMAS).filter((schema) => schema.domain === domain);\n}\nfunction isValidCategory(schemaId, categoryName) {\n const schema = getTagSchema(schemaId);\n if (!schema) return false;\n return schema.tags.some((tag) => tag.name === categoryName);\n}\nfunction getSchemaCategory(schemaId, categoryName) {\n const schema = getTagSchema(schemaId);\n if (!schema) return null;\n return schema.tags.find((tag) => tag.name === categoryName) || null;\n}\n\n// src/entity-extraction.ts\nfunction getEntityTypes(annotation) {\n if (Array.isArray(annotation.body)) {\n const entityTags = [];\n for (const item of annotation.body) {\n if (typeof item === \"object\" && item !== null && \"type\" in item && \"value\" in item && \"purpose\" in item) {\n const itemType = item.type;\n const itemValue = item.value;\n const itemPurpose = item.purpose;\n if (itemType === \"TextualBody\" && itemPurpose === \"tagging\" && typeof itemValue === \"string\" && itemValue.length > 0) {\n entityTags.push(itemValue);\n }\n }\n }\n return entityTags;\n }\n return [];\n}\n\n// src/tag-extraction.ts\nfunction isTag(annotation) {\n return annotation.motivation === \"tagging\";\n}\nfunction getTagCategory(annotation) {\n if (!isTag(annotation)) return void 0;\n const bodies = Array.isArray(annotation.body) ? annotation.body : [annotation.body];\n const taggingBody = bodies.find(\n (b) => b !== null && typeof b === \"object\" && \"purpose\" in b && b.purpose === \"tagging\"\n );\n if (taggingBody && \"value\" in taggingBody) {\n return taggingBody.value;\n }\n return void 0;\n}\nfunction getTagSchemaId(annotation) {\n if (!isTag(annotation)) return void 0;\n const bodies = Array.isArray(annotation.body) ? annotation.body : [annotation.body];\n const classifyingBody = bodies.find(\n (b) => b !== null && typeof b === \"object\" && \"purpose\" in b && b.purpose === \"classifying\"\n );\n if (classifyingBody && \"value\" in classifyingBody) {\n return classifyingBody.value;\n }\n return void 0;\n}\nexport {\n DEFAULT_ENTITY_TYPES,\n TAG_SCHEMAS,\n getAllTagSchemas,\n getEntityTypes,\n getSchemaCategory,\n getTagCategory,\n getTagSchema,\n getTagSchemaId,\n getTagSchemasByDomain,\n isValidCategory\n};\n//# sourceMappingURL=index.js.map","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, useShellStateUnit, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { getAllTagSchemas } from '@semiont/ontology';\nimport { TagSchemasPage } from '@semiont/react-ui';\n\n// Authentication is handled by middleware (proxy.ts)\n// Only authenticated moderators/admins can reach this page\n\nexport default function TagSchemasPageWrapper() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerateTagSchemas.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const browseStateUnit = useShellStateUnit();\n const activePanel = useObservable(browseStateUnit.activePanel$) ?? null;\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n const schemas = getAllTagSchemas();\n\n return (\n <TagSchemasPage\n schemas={schemas}\n isLoading={false}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n pageTitle: t('pageTitle'),\n pageDescription: t('pageDescription'),\n categories: t('categories'),\n loading: t('loading'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["TAG_SCHEMAS","getAllTagSchemas","TagSchemasPageWrapper","_t","useTranslation","t","k","browseStateUnit","useShellStateUnit","activePanel","useObservable","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","schemas","jsx","TagSchemasPage","ToolbarPanels","Toolbar"],"mappings":"kRAcA,IAAIA,EAAc,CAChB,aAAc,CACZ,GAAI,aACJ,KAAM,wBACN,YAAa,qEACb,OAAQ,QACR,KAAM,CACJ,CACE,KAAM,QACN,YAAa,+CACb,SAAU,CACR,sCACA,8BACA,4BACV,CACA,EACM,CACE,KAAM,OACN,YAAa,gDACb,SAAU,CACR,oBACA,8BACA,iCACV,CACA,EACM,CACE,KAAM,cACN,YAAa,6CACb,SAAU,CACR,yCACA,uBACA,8CACV,CACA,EACM,CACE,KAAM,aACN,YAAa,kDACb,SAAU,CACR,gCACA,8BACA,sBACV,CACA,CACA,CACA,EACE,mBAAoB,CAClB,GAAI,mBACJ,KAAM,2BACN,YAAa,2EACb,OAAQ,aACR,KAAM,CACJ,CACE,KAAM,eACN,YAAa,6CACb,SAAU,CACR,iCACA,yBACA,yBACV,CACA,EACM,CACE,KAAM,UACN,YAAa,qCACb,SAAU,CACR,+BACA,0BACA,mCACV,CACA,EACM,CACE,KAAM,UACN,YAAa,4BACb,SAAU,CACR,2BACA,qBACA,6BACV,CACA,EACM,CACE,KAAM,aACN,YAAa,6CACb,SAAU,CACR,4BACA,6BACA,6CACV,CACA,CACA,CACA,EACE,mBAAoB,CAClB,GAAI,mBACJ,KAAM,+BACN,YAAa,kFACb,OAAQ,UACR,KAAM,CACJ,CACE,KAAM,QACN,YAAa,+BACb,SAAU,CACR,wBACA,0BACA,+BACV,CACA,EACM,CACE,KAAM,WACN,YAAa,qCACb,SAAU,CACR,4BACA,sBACA,wBACV,CACA,EACM,CACE,KAAM,UACN,YAAa,yCACb,SAAU,CACR,4CACA,qBACA,+BACV,CACA,EACM,CACE,KAAM,kBACN,YAAa,oCACb,SAAU,CACR,2BACA,uBACA,6BACV,CACA,EACM,CACE,KAAM,WACN,YAAa,+BACb,SAAU,CACR,kCACA,oCACA,gCACV,CACA,CACA,CACA,CACA,EAIA,SAASC,GAAmB,CAC1B,OAAO,OAAO,OAAOD,CAAW,CAClC,CCvJA,SAAwBE,GAAwB,CAC9C,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAW,IAAgCH,EAAG,sBAAsBG,CAAC,GAAI,CAAQ,EAGtFC,EAAkBC,EAAA,EAClBC,EAAcC,EAAcH,EAAgB,YAAY,GAAK,KAC7D,CAAE,MAAAI,EAAO,SAAAC,CAAA,EAAaC,EAAA,EACtB,CAAE,gBAAAC,EAAiB,kBAAAC,CAAA,EAAsBC,EAAA,EAEzCC,EAAqBC,EAAAA,YAAY,CAAC,CAAE,MAAAP,KAAoD,CAC5FC,EAASD,CAAK,CAChB,EAAG,CAACC,CAAQ,CAAC,EAEPO,EAA2BD,EAAAA,YAAY,IAAM,CACjDH,EAAA,CACF,EAAG,CAACA,CAAiB,CAAC,EAEtBK,EAAsB,CACpB,yBAA0BH,EAC1B,gCAAiCE,CAAA,CAClC,EAED,MAAME,EAAUpB,EAAA,EAEhB,OACEqB,EAAAA,IAACC,EAAA,CACC,QAAAF,EACA,UAAW,GACX,MAAAV,EACA,gBAAAG,EACA,YAAAL,EACA,aAAc,CACZ,UAAWJ,EAAE,WAAW,EACxB,gBAAiBA,EAAE,iBAAiB,EACpC,WAAYA,EAAE,YAAY,EAC1B,QAASA,EAAE,SAAS,CAAA,EAEtB,cAAAmB,EACA,QAAAC,CAAA,CAAA,CAGN"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as
|
|
2
|
-
//# sourceMappingURL=page-
|
|
1
|
+
import{u as C,c as s,d as I,e as R,j as O,W,P as k,f as L}from"./index-BVOR3arc.js";import{r as g}from"./vendor-DJo4KD8w.js";import{u as $,L as x}from"./routing-CGghUc0N.js";import{u as E}from"./i18n-BbpF47i1.js";function K(){var h;const{t:A}=E(),e=(r,p)=>A(`AuthWelcome.${r}`,p),n=C(),T=s(n.activeKbId$),t=s(n.activeSession$),c=s(t==null?void 0:t.user$)??null,d=(t==null?void 0:t.kb)??null,u=!!c,a=T!=null&&t==null,f=r=>{n.signOut(r)},o=$(),[y,S]=g.useState(!1),v=I(),U=t==null?void 0:t.client,l=R(()=>L(U)),i=s(l.userData$),P=s(l.isProcessing$)??!1;g.useEffect(()=>{if(!a){if(!u){o.push("/auth/connect");return}if(i!=null&&i.termsAcceptedAt){o.push("/");return}}},[a,u,o,i]);const m=async r=>{if(!r){d&&f(d.id),o.push("/");return}try{await l.acceptTerms(),S(!0),setTimeout(()=>{o.push("/")},1e3)}catch(p){console.error("Terms acceptance error:",p),v.showError(e("errorAcceptingTerms"))}},w=a?"loading":y?"accepted":"form",b=((h=c==null?void 0:c.name)==null?void 0:h.split(" ")[0])??"";return O.jsx(W,{userName:b,termsAcceptedAt:(i==null?void 0:i.termsAcceptedAt)??null,isNewUser:!(i!=null&&i.termsAcceptedAt),status:w,isProcessing:P,onAccept:()=>m(!0),onDecline:()=>m(!1),translations:{loading:e("loading"),welcomeTitle:e("welcomeTitle"),thanksForAccepting:e("thanksForAccepting"),welcomeUser:e("welcomeUser",{firstName:b}),reviewTermsPrompt:e("reviewTermsPrompt"),termsSummaryTitle:e("termsSummaryTitle"),termsSummaryIntro:e("termsSummaryIntro"),acceptableUseTitle:e("acceptableUseTitle"),acceptableUseResponsible:e("acceptableUseResponsible"),acceptableUseRespect:e("acceptableUseRespect"),acceptableUseConduct:e("acceptableUseConduct"),prohibitedContentTitle:e("prohibitedContentTitle"),prohibitedContentIntro:e("prohibitedContentIntro"),prohibitedIllegal:e("prohibitedIllegal"),prohibitedAdult:e("prohibitedAdult"),prohibitedHate:e("prohibitedHate"),prohibitedViolence:e("prohibitedViolence"),prohibitedMisinformation:e("prohibitedMisinformation"),prohibitedPrivacy:e("prohibitedPrivacy"),prohibitedCopyright:e("prohibitedCopyright"),prohibitedMalware:e("prohibitedMalware"),prohibitedSpam:e("prohibitedSpam"),conductTitle:e("conductTitle"),conductDescription:e("conductDescription"),conductLink:e("conductLink"),conductPromotion:e("conductPromotion"),responsibilitiesTitle:e("responsibilitiesTitle"),responsibilitiesSecure:e("responsibilitiesSecure"),responsibilitiesReport:e("responsibilitiesReport"),responsibilitiesAccurate:e("responsibilitiesAccurate"),responsibilitiesComply:e("responsibilitiesComply"),violationsWarning:e("violationsWarning"),readFullTerms:e("readFullTerms"),termsOfService:e("termsOfService"),and:e("and"),privacyPolicy:e("privacyPolicy"),declineAndSignOut:e("declineAndSignOut"),acceptAndContinue:e("acceptAndContinue"),processing:e("processing"),legallyBound:e("legallyBound")},PageLayout:k,Link:x})}export{K as default};
|
|
2
|
+
//# sourceMappingURL=page-BLt9SJto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-BLt9SJto.js","sources":["../../src/app/[locale]/auth/welcome/page.tsx"],"sourcesContent":["/**\n * Welcome Page - Thin Next.js wrapper\n *\n * This page handles Next.js-specific concerns (routing, auth, API calls)\n * and delegates rendering to the pure React WelcomePage component.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { useRouter } from '@/i18n/routing';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '@/i18n/routing';\nimport { PageLayout, useToast, useSemiont, useObservable } from '@semiont/react-ui';\nimport { WelcomePage } from '@semiont/react-ui';\nimport { createWelcomeStateUnit } from '@semiont/react-ui';\nimport { useStateUnit } from '@semiont/react-ui';\n\nexport default function Welcome() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AuthWelcome.${k}`, p as any) as string;\n const semiont = useSemiont();\n const activeKbId = useObservable(semiont.activeKbId$);\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const isAuthenticated = !!user;\n // \"Loading\" = KB is selected but session not yet constructed.\n const isLoading = activeKbId != null && session == null;\n const signOut = (id: string) => { void semiont.signOut(id); };\n const router = useRouter();\n const [termsAccepted, setTermsAccepted] = useState(false);\n const toast = useToast();\n\n const client = session?.client;\n const stateUnit = useStateUnit(() => createWelcomeStateUnit(client!));\n\n const userData = useObservable(stateUnit.userData$);\n const isProcessing = useObservable(stateUnit.isProcessing$) ?? false;\n\n // Redirect if not authenticated or if terms already accepted\n useEffect(() => {\n if (isLoading) return;\n if (!isAuthenticated) {\n router.push('/auth/connect');\n return;\n }\n\n if (userData?.termsAcceptedAt) {\n router.push('/');\n return;\n }\n }, [isLoading, isAuthenticated, router, userData]);\n\n const handleTermsAcceptance = async (accepted: boolean) => {\n if (!accepted) {\n if (activeKnowledgeBase) {\n signOut(activeKnowledgeBase.id);\n }\n router.push('/');\n return;\n }\n\n try {\n await stateUnit.acceptTerms();\n setTermsAccepted(true);\n\n setTimeout(() => {\n router.push('/');\n }, 1000);\n } catch (error) {\n console.error('Terms acceptance error:', error);\n toast.showError(t('errorAcceptingTerms'));\n }\n };\n\n const pageStatus = isLoading ? 'loading' : termsAccepted ? 'accepted' : 'form';\n const firstName = user?.name?.split(' ')[0] ?? '';\n\n return (\n <WelcomePage\n userName={firstName}\n termsAcceptedAt={userData?.termsAcceptedAt ?? null}\n isNewUser={!userData?.termsAcceptedAt}\n status={pageStatus}\n isProcessing={isProcessing}\n onAccept={() => handleTermsAcceptance(true)}\n onDecline={() => handleTermsAcceptance(false)}\n translations={{\n loading: t('loading'),\n welcomeTitle: t('welcomeTitle'),\n thanksForAccepting: t('thanksForAccepting'),\n welcomeUser: t('welcomeUser', { firstName }),\n reviewTermsPrompt: t('reviewTermsPrompt'),\n termsSummaryTitle: t('termsSummaryTitle'),\n termsSummaryIntro: t('termsSummaryIntro'),\n acceptableUseTitle: t('acceptableUseTitle'),\n acceptableUseResponsible: t('acceptableUseResponsible'),\n acceptableUseRespect: t('acceptableUseRespect'),\n acceptableUseConduct: t('acceptableUseConduct'),\n prohibitedContentTitle: t('prohibitedContentTitle'),\n prohibitedContentIntro: t('prohibitedContentIntro'),\n prohibitedIllegal: t('prohibitedIllegal'),\n prohibitedAdult: t('prohibitedAdult'),\n prohibitedHate: t('prohibitedHate'),\n prohibitedViolence: t('prohibitedViolence'),\n prohibitedMisinformation: t('prohibitedMisinformation'),\n prohibitedPrivacy: t('prohibitedPrivacy'),\n prohibitedCopyright: t('prohibitedCopyright'),\n prohibitedMalware: t('prohibitedMalware'),\n prohibitedSpam: t('prohibitedSpam'),\n conductTitle: t('conductTitle'),\n conductDescription: t('conductDescription'),\n conductLink: t('conductLink'),\n conductPromotion: t('conductPromotion'),\n responsibilitiesTitle: t('responsibilitiesTitle'),\n responsibilitiesSecure: t('responsibilitiesSecure'),\n responsibilitiesReport: t('responsibilitiesReport'),\n responsibilitiesAccurate: t('responsibilitiesAccurate'),\n responsibilitiesComply: t('responsibilitiesComply'),\n violationsWarning: t('violationsWarning'),\n readFullTerms: t('readFullTerms'),\n termsOfService: t('termsOfService'),\n and: t('and'),\n privacyPolicy: t('privacyPolicy'),\n declineAndSignOut: t('declineAndSignOut'),\n acceptAndContinue: t('acceptAndContinue'),\n processing: t('processing'),\n legallyBound: t('legallyBound'),\n }}\n PageLayout={PageLayout}\n Link={Link}\n />\n );\n}\n"],"names":["Welcome","_t","useTranslation","t","k","semiont","useSemiont","activeKbId","useObservable","session","user","activeKnowledgeBase","isAuthenticated","isLoading","signOut","id","router","useRouter","termsAccepted","setTermsAccepted","useState","toast","useToast","client","stateUnit","useStateUnit","createWelcomeStateUnit","userData","isProcessing","useEffect","handleTermsAcceptance","accepted","error","pageStatus","firstName","_a","jsx","WelcomePage","PageLayout","Link"],"mappings":"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"}
|