@semiont/cli 0.4.14 → 0.4.15
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 +15470 -4962
- package/dist/frontend/dist/assets/{ArrowsRightLeftIcon-CMDe963r.js → ArrowsRightLeftIcon-BzLgl5o9.js} +2 -2
- package/dist/frontend/dist/assets/{ArrowsRightLeftIcon-CMDe963r.js.map → ArrowsRightLeftIcon-BzLgl5o9.js.map} +1 -1
- package/dist/frontend/dist/assets/{ChevronLeftIcon-CMXd_XZQ.js → ChevronLeftIcon-BLyRNZuL.js} +2 -2
- package/dist/frontend/dist/assets/{ChevronLeftIcon-CMXd_XZQ.js.map → ChevronLeftIcon-BLyRNZuL.js.map} +1 -1
- package/dist/frontend/dist/assets/{CommandLineIcon-BBerq9Nd.js → CommandLineIcon-Ba4gpk8e.js} +2 -2
- package/dist/frontend/dist/assets/{CommandLineIcon-BBerq9Nd.js.map → CommandLineIcon-Ba4gpk8e.js.map} +1 -1
- package/dist/frontend/dist/assets/{CookiePreferences-Cbur0STI.js → CookiePreferences-CO_BNHwm.js} +2 -2
- package/dist/frontend/dist/assets/{CookiePreferences-Cbur0STI.js.map → CookiePreferences-CO_BNHwm.js.map} +1 -1
- package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-CHDCGQBR-BLaEAPe0.js +2 -0
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CW6SKH2U-DIkAGn7X.js.map → PdfAnnotationCanvas.client-CHDCGQBR-BLaEAPe0.js.map} +1 -1
- package/dist/frontend/dist/assets/StreamStatusContext-BNiTXRfJ.js +2 -0
- package/dist/frontend/dist/assets/{StreamStatusContext-BuPATpTz.js.map → StreamStatusContext-BNiTXRfJ.js.map} +1 -1
- package/dist/frontend/dist/assets/ToolbarPanels-DRHyLUHl.js +2 -0
- package/dist/frontend/dist/assets/ToolbarPanels-DRHyLUHl.js.map +1 -0
- package/dist/frontend/dist/assets/{XMarkIcon-6m9KVFaj.js → XMarkIcon-KMKD47CF.js} +2 -2
- package/dist/frontend/dist/assets/{XMarkIcon-6m9KVFaj.js.map → XMarkIcon-KMKD47CF.js.map} +1 -1
- package/dist/frontend/dist/assets/{browser-ponyfill-DkbQZCyF.js → browser-ponyfill-D2ngVqWO.js} +2 -2
- package/dist/frontend/dist/assets/{browser-ponyfill-DkbQZCyF.js.map → browser-ponyfill-D2ngVqWO.js.map} +1 -1
- package/dist/frontend/dist/assets/client-RpFyflU_.js +2 -0
- package/dist/frontend/dist/assets/{client-BiL3eI7d.js.map → client-RpFyflU_.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-BnL1es01.js → client-bqO7W1Xj.js} +2 -2
- package/dist/frontend/dist/assets/{client-BnL1es01.js.map → client-bqO7W1Xj.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-DrQUcCJy.js → client-ekxuarKC.js} +2 -2
- package/dist/frontend/dist/assets/{client-DrQUcCJy.js.map → client-ekxuarKC.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-BPbsU2tc.js → client-xJTgSko3.js} +2 -2
- package/dist/frontend/dist/assets/{client-BPbsU2tc.js.map → client-xJTgSko3.js.map} +1 -1
- package/dist/frontend/dist/assets/{i18n-BYxb14hm.js → i18n-BbpF47i1.js} +2 -2
- package/dist/frontend/dist/assets/{i18n-BYxb14hm.js.map → i18n-BbpF47i1.js.map} +1 -1
- package/dist/frontend/dist/assets/{index-CNb3PHS7.css → index-BUe9tsov.css} +1 -1
- package/dist/frontend/dist/assets/index-XWcEpo5a.js +159 -0
- package/dist/frontend/dist/assets/index-XWcEpo5a.js.map +1 -0
- package/dist/frontend/dist/assets/layout-BFanPfv_.js +2 -0
- package/dist/frontend/dist/assets/layout-BFanPfv_.js.map +1 -0
- package/dist/frontend/dist/assets/layout-BN0UEIdX.js +2 -0
- package/dist/frontend/dist/assets/layout-BN0UEIdX.js.map +1 -0
- package/dist/frontend/dist/assets/layout-ChyKFPPP.js +2 -0
- package/dist/frontend/dist/assets/layout-ChyKFPPP.js.map +1 -0
- package/dist/frontend/dist/assets/layout-DmjP6diV.js +2 -0
- package/dist/frontend/dist/assets/layout-DmjP6diV.js.map +1 -0
- package/dist/frontend/dist/assets/{not-found-CwWw1pZc.js → not-found-BboGygIW.js} +2 -2
- package/dist/frontend/dist/assets/{not-found-CwWw1pZc.js.map → not-found-BboGygIW.js.map} +1 -1
- package/dist/frontend/dist/assets/page-8F47gNEm.js +2 -0
- package/dist/frontend/dist/assets/page-8F47gNEm.js.map +1 -0
- package/dist/frontend/dist/assets/page-8x98ZAYe.js +2 -0
- package/dist/frontend/dist/assets/{page-iSL5E639.js.map → page-8x98ZAYe.js.map} +1 -1
- package/dist/frontend/dist/assets/page-BaqIbrus.js +2 -0
- package/dist/frontend/dist/assets/{page-Deep7E5d.js.map → page-BaqIbrus.js.map} +1 -1
- package/dist/frontend/dist/assets/page-BfhPRgzq.js +2 -0
- package/dist/frontend/dist/assets/{page-ZBwMTeR-.js.map → page-BfhPRgzq.js.map} +1 -1
- package/dist/frontend/dist/assets/page-Bht4dePL.js +5 -0
- package/dist/frontend/dist/assets/{page-CelRTchO.js.map → page-Bht4dePL.js.map} +1 -1
- package/dist/frontend/dist/assets/page-BtqPeWyh.js +2 -0
- package/dist/frontend/dist/assets/page-BtqPeWyh.js.map +1 -0
- package/dist/frontend/dist/assets/{page-Dv386AZD.js → page-CG7C0ib3.js} +3 -3
- package/dist/frontend/dist/assets/{page-Dv386AZD.js.map → page-CG7C0ib3.js.map} +1 -1
- package/dist/frontend/dist/assets/page-CJnfSnRg.js +2 -0
- package/dist/frontend/dist/assets/page-CJnfSnRg.js.map +1 -0
- package/dist/frontend/dist/assets/page-Cct5hwIU.js +8 -0
- package/dist/frontend/dist/assets/{page-E99MPOn5.js.map → page-Cct5hwIU.js.map} +1 -1
- package/dist/frontend/dist/assets/page-CnJVZMgv.js +2 -0
- package/dist/frontend/dist/assets/page-CnJVZMgv.js.map +1 -0
- package/dist/frontend/dist/assets/page-CpbZG7nR.js +2 -0
- package/dist/frontend/dist/assets/{page-C5bIvv1V.js.map → page-CpbZG7nR.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-D_nHe9FT.js → page-CzvERJKF.js} +2 -2
- package/dist/frontend/dist/assets/{page-D_nHe9FT.js.map → page-CzvERJKF.js.map} +1 -1
- package/dist/frontend/dist/assets/page-DB8grXzl.js +2 -0
- package/dist/frontend/dist/assets/{page-Zq6ARIvg.js.map → page-DB8grXzl.js.map} +1 -1
- package/dist/frontend/dist/assets/page-DI1MUp4X.js +2 -0
- package/dist/frontend/dist/assets/{page-xdXYx3nl.js.map → page-DI1MUp4X.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CslYhbgz.js → page-Dhi8hP-S.js} +2 -2
- package/dist/frontend/dist/assets/{page-CslYhbgz.js.map → page-Dhi8hP-S.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BmHLf-7O.js → page-FovvpNWp.js} +2 -2
- package/dist/frontend/dist/assets/{page-BmHLf-7O.js.map → page-FovvpNWp.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-KtkB4tEv.js → page-T424mvNp.js} +2 -2
- package/dist/frontend/dist/assets/{page-KtkB4tEv.js.map → page-T424mvNp.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-1BwlyTUj.js → page-knhbwxzQ.js} +2 -2
- package/dist/frontend/dist/assets/{page-1BwlyTUj.js.map → page-knhbwxzQ.js.map} +1 -1
- package/dist/frontend/dist/assets/privacy-B5TeXaed.js +2 -0
- package/dist/frontend/dist/assets/{privacy-DO1oxJpM.js.map → privacy-B5TeXaed.js.map} +1 -1
- package/dist/frontend/dist/assets/{query-ATBhtd3K.js → query-B6BuIB0M.js} +3 -3
- package/dist/frontend/dist/assets/{query-ATBhtd3K.js.map → query-B6BuIB0M.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-DMdXWYXo.js → routing-By_4TZHr.js} +2 -2
- package/dist/frontend/dist/assets/{routing-DMdXWYXo.js.map → routing-By_4TZHr.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-tJ_HbFRP.js → routing-vcvYfuPO.js} +2 -2
- package/dist/frontend/dist/assets/{routing-tJ_HbFRP.js.map → routing-vcvYfuPO.js.map} +1 -1
- package/dist/frontend/dist/assets/{vendor-EnoIVk-c.js → vendor-DJo4KD8w.js} +2 -2
- package/dist/frontend/dist/assets/{vendor-EnoIVk-c.js.map → vendor-DJo4KD8w.js.map} +1 -1
- package/dist/frontend/dist/index.html +5 -5
- package/dist/frontend/package.json +1 -1
- package/package.json +9 -9
- package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-CW6SKH2U-DIkAGn7X.js +0 -2
- package/dist/frontend/dist/assets/StreamStatusContext-BuPATpTz.js +0 -2
- package/dist/frontend/dist/assets/ToolbarPanels-rN1MIRTV.js +0 -2
- package/dist/frontend/dist/assets/ToolbarPanels-rN1MIRTV.js.map +0 -1
- package/dist/frontend/dist/assets/client-BiL3eI7d.js +0 -2
- package/dist/frontend/dist/assets/en-IUV4ZXKH-BY1RKeLS.js +0 -135
- package/dist/frontend/dist/assets/en-IUV4ZXKH-BY1RKeLS.js.map +0 -1
- package/dist/frontend/dist/assets/index-DA31r_0s.js +0 -27
- package/dist/frontend/dist/assets/index-DA31r_0s.js.map +0 -1
- package/dist/frontend/dist/assets/layout-B8IinUdt.js +0 -2
- package/dist/frontend/dist/assets/layout-B8IinUdt.js.map +0 -1
- package/dist/frontend/dist/assets/layout-BjpW078f.js +0 -2
- package/dist/frontend/dist/assets/layout-BjpW078f.js.map +0 -1
- package/dist/frontend/dist/assets/layout-CDIjxs5a.js +0 -6
- package/dist/frontend/dist/assets/layout-CDIjxs5a.js.map +0 -1
- package/dist/frontend/dist/assets/layout-DKm9XdRr.js +0 -2
- package/dist/frontend/dist/assets/layout-DKm9XdRr.js.map +0 -1
- package/dist/frontend/dist/assets/page-BQ00VxR5.js +0 -2
- package/dist/frontend/dist/assets/page-BQ00VxR5.js.map +0 -1
- package/dist/frontend/dist/assets/page-C5bIvv1V.js +0 -2
- package/dist/frontend/dist/assets/page-CelRTchO.js +0 -5
- package/dist/frontend/dist/assets/page-Cf9cnqhC.js +0 -2
- package/dist/frontend/dist/assets/page-Cf9cnqhC.js.map +0 -1
- package/dist/frontend/dist/assets/page-DEjlNEY0.js +0 -2
- package/dist/frontend/dist/assets/page-DEjlNEY0.js.map +0 -1
- package/dist/frontend/dist/assets/page-DLtwpo78.js +0 -2
- package/dist/frontend/dist/assets/page-DLtwpo78.js.map +0 -1
- package/dist/frontend/dist/assets/page-Deep7E5d.js +0 -2
- package/dist/frontend/dist/assets/page-E99MPOn5.js +0 -8
- package/dist/frontend/dist/assets/page-ZBwMTeR-.js +0 -2
- package/dist/frontend/dist/assets/page-Zq6ARIvg.js +0 -2
- package/dist/frontend/dist/assets/page-iSL5E639.js +0 -2
- package/dist/frontend/dist/assets/page-xdXYx3nl.js +0 -2
- package/dist/frontend/dist/assets/privacy-DO1oxJpM.js +0 -2
- package/dist/frontend/dist/assets/useAuth-yUx5lBP5.js +0 -2
- package/dist/frontend/dist/assets/useAuth-yUx5lBP5.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,Q as T,a as L,M as A,b as D}from"./query-B6BuIB0M.js";import{r as i,O as M}from"./vendor-DJo4KD8w.js";import{h as z,aq as W,ar as B,as as N,at as O,au as G,av as x,aw as v,ax as j,ay as I}from"./index-XWcEpo5a.js";import{a as F,C as q,b as $,i as Q,c as V,s as y}from"./privacy-B5TeXaed.js";import{u as Y}from"./routing-By_4TZHr.js";import{u as b}from"./i18n-BbpF47i1.js";function K(){const t=Y(),n=i.useCallback(({url:o,cancelFallback:l})=>{l(),t.push(o)},[t]),s=i.useCallback(({path:o})=>{t.push(o)},[t]);return z({"browse:external-navigate":n,"browse:router-push":s}),null}function _(){const{i18n:t}=b();return i.useMemo(()=>({t:(n,s,o)=>{var m;const l=t.getResourceBundle(t.language,"translation");let c=(m=l==null?void 0:l[n])==null?void 0:m[s];if(!c)return`${n}.${s}`;if(o&&typeof c=="string"){let a=c;return Object.entries(o).forEach(([d,f])=>{a=a.replace(new RegExp(`\\{${d}\\}`,"g"),String(f))}),a}return c}}),[t,t.language])}function H(){return new L({queryCache:new D({onError:t=>{t instanceof x&&(t.status===401?v("Your session has expired. Please sign in again."):t.status===403&&j("You do not have permission to access this resource."))}}),mutationCache:new A({onError:t=>{t instanceof x&&(t.status===401?v("Your session has expired. Please sign in again."):t.status===403&&j("You do not have permission to perform this action."))}}),defaultOptions:{queries:{retry:(t,n)=>n instanceof x&&(n.status===401||n.status===403||n.status>=400&&n.status<500)?!1:t<3,retryDelay:t=>Math.min(1e3*2**t,3e4),staleTime:300*1e3,refetchOnWindowFocus:!1}}})}function U({children:t}){const[n]=i.useState(()=>H()),s=_();return e.jsx(W,{translationManager:s,children:e.jsx(T,{client:n,children:e.jsx(B,{children:e.jsx(N,{children:e.jsx(F,{children:e.jsx(O,{children:e.jsxs(G,{children:[e.jsx(K,{}),t]})})})})})})})}function J({title:t,titleId:n,...s},o){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:o,"aria-labelledby":n},s),t?i.createElement("title",{id:n},t):null,i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5"}))}const X=i.forwardRef(J);function Z({title:t,titleId:n,...s},o){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:o,"aria-labelledby":n},s),t?i.createElement("title",{id:n},t):null,i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5"}))}const ee=i.forwardRef(Z);function te({className:t=""}){const{t:n}=b(),s=(r,u)=>n(`CookieBanner.${r}`,u),[o,l]=i.useState(!1),[c,m]=i.useState(!1),[a,d]=i.useState(!1),[f,p]=i.useState("GENERAL"),[g,C]=i.useState({necessary:!0,analytics:!1,marketing:!1,preferences:!1});i.useEffect(()=>{(async()=>{if($()){l(!0);try{const[u,R]=await Promise.all([Q(),V()]);p(u?"GDPR":R?"CCPA":"GENERAL")}catch(u){console.error("Failed to detect region:",u),p("GENERAL")}}})()},[]);const w=async()=>{d(!0);try{const r={necessary:!0,analytics:!0,marketing:!0,preferences:!0};await Promise.resolve(y(r)),l(!1)}catch(r){console.error("Failed to save cookie consent:",r)}finally{d(!1)}},k=async()=>{d(!0);try{const r={necessary:!0,analytics:!1,marketing:!1,preferences:!1};await Promise.resolve(y(r)),l(!1)}catch(r){console.error("Failed to save cookie consent:",r)}finally{d(!1)}},P=async()=>{d(!0);try{await Promise.resolve(y(g)),l(!1)}catch(r){console.error("Failed to save cookie consent:",r)}finally{d(!1)}},E=r=>{r!=="necessary"&&C(u=>({...u,[r]:!u[r]}))},S=()=>{switch(f){case"GDPR":return{title:s("gdprTitle"),description:s("gdprDescription"),learnMore:s("gdprLearnMore")};case"CCPA":return{title:s("ccpaTitle"),description:s("ccpaDescription"),learnMore:s("ccpaLearnMore")};default:return{title:s("generalTitle"),description:s("generalDescription"),learnMore:s("generalLearnMore")}}};if(!o)return null;const h=S();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:h.title}),e.jsx("p",{style:{fontSize:"var(--semiont-text-sm, 0.875rem)",color:"var(--semiont-text-secondary)",marginBottom:"0.25rem"},children:h.description}),e.jsx("p",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)"},children:h.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:[s("customize"),c?e.jsx(ee,{style:{width:"1rem",height:"1rem"}}):e.jsx(X,{style:{width:"1rem",height:"1rem"}})]}),f!=="GDPR"&&e.jsx("button",{type:"button",onClick:k,disabled:a,className:"semiont-button--secondary",children:s(a?"saving":"rejectAll")}),e.jsx("button",{type:"button",onClick:w,disabled:a,className:"semiont-button--primary",children:s(a?"saving":"acceptAll")})]})]}),c&&e.jsx("div",{style:{borderTop:"1px solid var(--semiont-border-primary)",paddingTop:"1rem"},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e.jsx("h4",{style:{fontSize:"1rem",fontWeight:500,color:"var(--semiont-text-primary)"},children:s("cookiePreferences")}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:q.map(r=>e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"0.75rem"},children:[e.jsx("div",{style:{display:"flex",alignItems:"center",height:"1.25rem"},children:e.jsx("input",{id:`cookie-${r.id}`,type:"checkbox",checked:g[r.id]||!1,onChange:()=>E(r.id),disabled:r.required||a,style:{accentColor:"var(--semiont-color-primary-600, #2563eb)"}})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("label",{htmlFor:`cookie-${r.id}`,style:{fontSize:"var(--semiont-text-sm, 0.875rem)",fontWeight:500,color:"var(--semiont-text-primary)",cursor:"pointer"},children:[r.name,r.required&&e.jsx("span",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)",marginLeft:"0.25rem"},children:s("required")})]}),e.jsx("p",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-secondary)",marginTop:"0.25rem"},children:r.description}),e.jsxs("details",{style:{marginTop:"0.25rem"},children:[e.jsx("summary",{style:{fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-color-primary-600, #2563eb)",cursor:"pointer"},children:s("viewCookies")}),e.jsx("div",{style:{marginTop:"0.25rem",fontSize:"var(--semiont-text-xs, 0.75rem)",color:"var(--semiont-text-tertiary)"},children:r.cookies.join(", ")})]})]})]},r.id))}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.75rem",paddingTop:"1rem"},children:[e.jsx("button",{type:"button",onClick:()=>m(!1),className:"semiont-button--secondary",children:s("cancel")}),e.jsx("button",{type:"button",onClick:P,disabled:a,className:"semiont-button--primary",children:s(a?"saving":"savePreferences")})]})]})})]})})})}function le(){return e.jsxs(U,{children:[e.jsx(I,{}),e.jsx(M,{}),e.jsx(te,{})]})}export{le as default};
|
|
2
|
+
//# sourceMappingURL=layout-BFanPfv_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-BFanPfv_.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 'browse:external-navigate': handleExternalNavigate,\n 'browse:router-push': handleRouterPush,\n });\n\n // This component only manages navigation, doesn't render anything\n return null;\n}\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { TranslationManager } from '@semiont/react-ui';\n\ntype Messages = Record<string, Record<string, string>>;\n\n/**\n * Translation Manager for Frontend\n *\n * Wraps react-i18next. The messages JSON (loaded by i18next-http-backend) has\n * the same flat namespace structure: { \"Namespace\": { \"key\": \"value\" } }.\n * TranslationManager.t(namespace, key) maps directly to this structure.\n */\nexport function useMergedTranslationManager(): TranslationManager {\n const { i18n } = useTranslation();\n\n return useMemo(() => {\n return {\n t: (namespace: string, key: string, params?: Record<string, unknown>): string => {\n const messages = i18n.getResourceBundle(i18n.language, 'translation') as Messages | undefined;\n let translation = messages?.[namespace]?.[key];\n\n if (!translation) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`Translation not found: ${namespace}.${key} (locale: ${i18n.language})`);\n }\n return `${namespace}.${key}`;\n }\n\n if (params && typeof translation === 'string') {\n let result = translation;\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n }\n\n return translation;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [i18n, i18n.language]);\n}\n","import React, { useState } from 'react';\nimport { QueryClient, QueryClientProvider, QueryCache, MutationCache } from '@tanstack/react-query';\nimport {\n ToastProvider,\n LiveRegionProvider,\n TranslationProvider,\n ThemeProvider,\n EventBusProvider,\n notifySessionExpired,\n notifyPermissionDenied,\n} from '@semiont/react-ui';\nimport { KeyboardShortcutsProvider } from '@/contexts/KeyboardShortcutsContext';\nimport { NavigationHandler } from '@/components/knowledge/NavigationHandler';\nimport { APIError } from '@semiont/api-client';\nimport { useMergedTranslationManager } from '@/hooks/useMergedTranslationManager';\n\n/**\n * Create a minimal QueryClient with error handlers and retry logic.\n * Authentication is handled by @semiont/api-client via lib/api-hooks.\n *\n * SAFETY NET — the handlers below run only when the api-client's\n * `tokenRefresher` did NOT recover a 401. Two cases:\n *\n * 1. The api-client that issued the request has no `tokenRefresher`\n * configured. KnowledgeBasePanel's bootstrap auth calls go through\n * a fresh client without a refresher, so a 401 from those reaches\n * this handler directly. (Bootstrap calls shouldn't 401 in normal\n * operation, but this handler keeps us covered if they do.)\n *\n * 2. The refresh attempt itself failed. In that case `refreshActive`\n * already set `sessionExpiredAt` BEFORE the 401 propagated, so the\n * `notifySessionExpired` call here is idempotent — it just sets the\n * same flag that's already set.\n *\n * Don't delete this handler — case (1) is still real. But understand that\n * for the protected-layout flows (the bulk of the app), it almost never\n * fires because the api-client's beforeRetry hook handles 401s transparently.\n *\n * 401/403 errors route through module-scoped notify functions registered by\n * the active KnowledgeBaseSessionProvider (mounted inside the protected\n * AuthShell). On pre-app routes where no provider is mounted, the calls are\n * no-ops.\n */\nfunction createQueryClient() {\n return new QueryClient({\n queryCache: new QueryCache({\n onError: (error) => {\n if (error instanceof APIError) {\n if (error.status === 401) {\n notifySessionExpired('Your session has expired. Please sign in again.');\n } else if (error.status === 403) {\n notifyPermissionDenied('You do not have permission to access this resource.');\n }\n }\n },\n }),\n mutationCache: new MutationCache({\n onError: (error) => {\n if (error instanceof APIError) {\n if (error.status === 401) {\n notifySessionExpired('Your session has expired. Please sign in again.');\n } else if (error.status === 403) {\n notifyPermissionDenied('You do not have permission to perform this action.');\n }\n }\n },\n }),\n defaultOptions: {\n queries: {\n retry: (failureCount, error) => {\n // Don't retry on client errors (4xx) - these won't fix themselves\n if (error instanceof APIError) {\n // Never retry auth errors\n if (error.status === 401 || error.status === 403) {\n return false;\n }\n // Never retry other client errors (400, 404, 422, etc.)\n if (error.status >= 400 && error.status < 500) {\n return false;\n }\n }\n // Only retry server errors (5xx) or network errors, max 3 times\n return failureCount < 3;\n },\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000), // Exponential backoff: 1s, 2s, 4s, max 30s\n staleTime: 5 * 60 * 1000, // 5 minutes\n refetchOnWindowFocus: false, // Prevent unnecessary refetches when window regains focus\n },\n },\n });\n}\n\n/**\n * Root Provider Composition for Semiont Frontend.\n *\n * Wires up GLOBAL contexts that every page needs — auth-independent.\n *\n * Auth-dependent providers (KnowledgeBaseSessionProvider, ProtectedErrorBoundary,\n * SessionExpiredModal, PermissionDeniedModal) are bundled in `AuthShell` and\n * mounted only in protected layouts (know/, admin/, moderate/, auth/welcome/).\n * Pre-app routes (landing, OAuth flow) intentionally do NOT mount AuthShell —\n * they have no need to validate JWTs.\n *\n * ApiClientProvider is added in feature-specific layouts (e.g. /know) that\n * require API access. Public pages don't need it.\n *\n * Provider order — outer to inner:\n * 1. TranslationProvider — i18n\n * 2. QueryClientProvider — React Query\n * 3. ToastProvider — toast notifications\n * 4. LiveRegionProvider — a11y live region\n * 5. KeyboardShortcutsProvider — keyboard shortcuts\n * 6. ThemeProvider — theme\n * 7. EventBusProvider — RxJS event bus\n * + NavigationHandler\n */\nexport function Providers({ children }: { children: React.ReactNode }) {\n const [queryClient] = useState(() => createQueryClient());\n const translationManager = useMergedTranslationManager();\n\n return (\n <TranslationProvider translationManager={translationManager}>\n <QueryClientProvider client={queryClient}>\n <ToastProvider>\n <LiveRegionProvider>\n <KeyboardShortcutsProvider>\n <ThemeProvider>\n <EventBusProvider>\n <NavigationHandler />\n {children}\n </EventBusProvider>\n </ThemeProvider>\n </KeyboardShortcutsProvider>\n </LiveRegionProvider>\n </ToastProvider>\n </QueryClientProvider>\n </TranslationProvider>\n );\n}\n","import * as React from \"react\";\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m19.5 8.25-7.5 7.5-7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronDownIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronUpIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 15.75 7.5-7.5 7.5 7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronUpIcon);\nexport default ForwardRef;","\"use client\";\n\nimport React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n getCookieConsent,\n setCookieConsent,\n shouldShowBanner,\n COOKIE_CATEGORIES,\n CookieConsent,\n isCCPAApplicable,\n isGDPRApplicable,\n type CookieCategory\n} from '@/lib/cookies';\nimport { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline';\n\ninterface CookieBannerProps {\n className?: string;\n}\n\nexport function CookieBanner({ className = '' }: CookieBannerProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`CookieBanner.${k}`, p as any) as string;\n const [isVisible, setIsVisible] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [region, setRegion] = useState<'GDPR' | 'CCPA' | 'GENERAL'>('GENERAL');\n const [consent, setConsent] = useState<Partial<CookieConsent>>({\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n });\n\n useEffect(() => {\n const checkVisibility = async () => {\n if (shouldShowBanner()) {\n setIsVisible(true);\n\n try {\n // Determine applicable regulation\n const [isGDPR, isCCPA] = await Promise.all([\n isGDPRApplicable(),\n isCCPAApplicable()\n ]);\n\n if (isGDPR) {\n setRegion('GDPR');\n } else if (isCCPA) {\n setRegion('CCPA');\n } else {\n setRegion('GENERAL');\n }\n } catch (error) {\n // If region detection fails, default to GENERAL\n console.error('Failed to detect region:', error);\n setRegion('GENERAL');\n }\n }\n };\n\n checkVisibility();\n }, []);\n\n const handleAcceptAll = async () => {\n setIsLoading(true);\n\n try {\n const fullConsent = {\n necessary: true,\n analytics: true,\n marketing: true,\n preferences: true\n };\n\n await Promise.resolve(setCookieConsent(fullConsent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleRejectAll = async () => {\n setIsLoading(true);\n\n try {\n const minimalConsent = {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n };\n\n await Promise.resolve(setCookieConsent(minimalConsent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSavePreferences = async () => {\n setIsLoading(true);\n\n try {\n await Promise.resolve(setCookieConsent(consent));\n setIsVisible(false);\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleCategoryToggle = (categoryId: keyof Omit<CookieConsent, 'timestamp' | 'version'>) => {\n if (categoryId === 'necessary') return; // Can't toggle necessary cookies\n\n setConsent(prev => ({\n ...prev,\n [categoryId]: !prev[categoryId]\n }));\n };\n\n const getBannerText = () => {\n switch (region) {\n case 'GDPR':\n return {\n title: t('gdprTitle'),\n description: t('gdprDescription'),\n learnMore: t('gdprLearnMore')\n };\n case 'CCPA':\n return {\n title: t('ccpaTitle'),\n description: t('ccpaDescription'),\n learnMore: t('ccpaLearnMore')\n };\n default:\n return {\n title: t('generalTitle'),\n description: t('generalDescription'),\n learnMore: t('generalLearnMore')\n };\n }\n };\n\n if (!isVisible) return null;\n\n const bannerText = getBannerText();\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 50,\n backgroundColor: 'var(--semiont-bg-primary)',\n borderTop: '1px solid var(--semiont-border-primary)',\n boxShadow: 'var(--semiont-shadow-lg)',\n }}\n >\n <div style={{ maxWidth: '80rem', margin: '0 auto', padding: '1rem 1.5rem' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Main banner content */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '1.5rem', flexWrap: 'wrap' }}>\n <div style={{ flex: 1, minWidth: '300px' }}>\n <h3 style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n color: 'var(--semiont-text-primary)',\n marginBottom: '0.5rem',\n }}>\n {bannerText.title}\n </h3>\n <p style={{\n fontSize: 'var(--semiont-text-sm, 0.875rem)',\n color: 'var(--semiont-text-secondary)',\n marginBottom: '0.25rem',\n }}>\n {bannerText.description}\n </p>\n <p style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n }}>\n {bannerText.learnMore}\n </p>\n </div>\n\n {/* Action buttons */}\n <div style={{ display: 'flex', gap: '0.75rem', alignItems: 'center', flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n onClick={() => setShowDetails(!showDetails)}\n className=\"semiont-button--secondary\"\n style={{ display: 'flex', alignItems: 'center', gap: '0.25rem' }}\n >\n {t('customize')}\n {showDetails ? (\n <ChevronUpIcon style={{ width: '1rem', height: '1rem' }} />\n ) : (\n <ChevronDownIcon style={{ width: '1rem', height: '1rem' }} />\n )}\n </button>\n\n {region !== 'GDPR' && (\n <button\n type=\"button\"\n onClick={handleRejectAll}\n disabled={isLoading}\n className=\"semiont-button--secondary\"\n >\n {isLoading ? t('saving') : t('rejectAll')}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleAcceptAll}\n disabled={isLoading}\n className=\"semiont-button--primary\"\n >\n {isLoading ? t('saving') : t('acceptAll')}\n </button>\n </div>\n </div>\n\n {/* Detailed preferences */}\n {showDetails && (\n <div style={{\n borderTop: '1px solid var(--semiont-border-primary)',\n paddingTop: '1rem',\n }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <h4 style={{\n fontSize: '1rem',\n fontWeight: 500,\n color: 'var(--semiont-text-primary)',\n }}>\n {t('cookiePreferences')}\n </h4>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {COOKIE_CATEGORIES.map((category: CookieCategory) => (\n <div key={category.id} style={{ display: 'flex', alignItems: 'flex-start', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', height: '1.25rem' }}>\n <input\n id={`cookie-${category.id}`}\n type=\"checkbox\"\n checked={consent[category.id] || false}\n onChange={() => handleCategoryToggle(category.id)}\n disabled={category.required || isLoading}\n style={{ accentColor: 'var(--semiont-color-primary-600, #2563eb)' }}\n />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <label\n htmlFor={`cookie-${category.id}`}\n style={{\n fontSize: 'var(--semiont-text-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--semiont-text-primary)',\n cursor: 'pointer',\n }}\n >\n {category.name}\n {category.required && (\n <span style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n marginLeft: '0.25rem',\n }}>\n {t('required')}\n </span>\n )}\n </label>\n <p style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-secondary)',\n marginTop: '0.25rem',\n }}>\n {category.description}\n </p>\n <details style={{ marginTop: '0.25rem' }}>\n <summary style={{\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-color-primary-600, #2563eb)',\n cursor: 'pointer',\n }}>\n {t('viewCookies')}\n </summary>\n <div style={{\n marginTop: '0.25rem',\n fontSize: 'var(--semiont-text-xs, 0.75rem)',\n color: 'var(--semiont-text-tertiary)',\n }}>\n {category.cookies.join(', ')}\n </div>\n </details>\n </div>\n </div>\n ))}\n </div>\n\n <div style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '0.75rem',\n paddingTop: '1rem',\n }}>\n <button\n type=\"button\"\n onClick={() => setShowDetails(false)}\n className=\"semiont-button--secondary\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n disabled={isLoading}\n className=\"semiont-button--primary\"\n >\n {isLoading ? t('saving') : t('savePreferences')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default CookieBanner;\n","import { Outlet } from 'react-router-dom';\nimport { Providers } from '../providers';\nimport { CookieBanner } from '@/components/CookieBanner';\nimport { SkipLinks } from '@semiont/react-ui';\n\n/**\n * Locale Layout — root layout for all /:locale/* routes.\n *\n * Mounts only auth-independent providers. Auth-dependent providers\n * (KnowledgeBaseProvider, AuthProvider, SessionProvider, modals)\n * are mounted via AuthShell in protected layouts (know/, admin/,\n * moderate/, auth/welcome/).\n */\nexport default function LocaleLayout() {\n return (\n <Providers>\n <SkipLinks />\n <Outlet />\n <CookieBanner />\n </Providers>\n );\n}\n"],"names":["NavigationHandler","router","useRouter","handleExternalNavigate","useCallback","url","cancelFallback","handleRouterPush","path","useEventSubscriptions","useMergedTranslationManager","i18n","useTranslation","useMemo","namespace","key","params","messages","translation","_a","result","paramKey","paramValue","createQueryClient","QueryClient","QueryCache","error","APIError","notifySessionExpired","notifyPermissionDenied","MutationCache","failureCount","attemptIndex","Providers","children","queryClient","useState","translationManager","TranslationProvider","jsx","QueryClientProvider","ToastProvider","LiveRegionProvider","KeyboardShortcutsProvider","ThemeProvider","EventBusProvider","ChevronDownIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","ChevronUpIcon","CookieBanner","className","_t","t","k","p","isVisible","setIsVisible","showDetails","setShowDetails","isLoading","setIsLoading","region","setRegion","consent","setConsent","useEffect","shouldShowBanner","isGDPR","isCCPA","isGDPRApplicable","isCCPAApplicable","handleAcceptAll","fullConsent","setCookieConsent","handleRejectAll","minimalConsent","handleSavePreferences","handleCategoryToggle","categoryId","prev","getBannerText","bannerText","jsxs","COOKIE_CATEGORIES","category","LocaleLayout","SkipLinks","Outlet"],"mappings":"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","x_google_ignoreList":[3,4]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as o}from"./query-B6BuIB0M.js";import{r as t,O as b}from"./vendor-DJo4KD8w.js";import{h as k,M as g,N as w,u as v,O as L,Q as j,U as S,V as y,X as R}from"./index-XWcEpo5a.js";import{b as E,L as A,u as $}from"./routing-By_4TZHr.js";import{u as p}from"./i18n-BbpF47i1.js";import{F as C}from"./ArrowsRightLeftIcon-BzLgl5o9.js";import{F,a as M}from"./ChevronLeftIcon-BLyRNZuL.js";import{C as B}from"./CookiePreferences-CO_BNHwm.js";import{K as H}from"./privacy-B5TeXaed.js";import{r as h,L as x}from"./routing-vcvYfuPO.js";import"./XMarkIcon-KMKD47CF.js";function K({title:r,titleId:e,...n},s){return t.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:s,"aria-labelledby":e},n),r?t.createElement("title",{id:e},r):null,t.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 N=t.forwardRef(K);function O({title:r,titleId:e,...n},s){return t.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:s,"aria-labelledby":e},n),r?t.createElement("title",{id:e},r):null,t.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 T=t.forwardRef(O);function D({title:r,titleId:e,...n},s){return t.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:s,"aria-labelledby":e},n),r?t.createElement("title",{id:e},r):null,t.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"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 6h.008v.008H6V6Z"}))}const P=t.forwardRef(D);function U({href:r,to:e,...n}){return o.jsx(A,{to:r??"",...n})}function W({isCollapsed:r,toggleCollapsed:e,navigationMenu:n}){const{t:s}=p(),a=(c,d)=>s(`Moderation.${c}`,d),{t:m}=p(),l=(c,d)=>m(`Sidebar.${c}`,d),u=E(),f=t.useCallback(()=>{e()},[e]);k({"browse:sidebar-toggle":f});const i=[{name:a("recentResources"),href:"/moderate/recent",icon:T,description:a("recentResourcesDescription")},{name:a("entityTags"),href:"/moderate/entity-tags",icon:P,description:a("entityTagsDescription")},{name:a("tagSchemas"),href:"/moderate/tag-schemas",icon:N,description:a("tagSchemasDescription")},{name:a("linkedData"),href:"/moderate/linked-data",icon:C,description:a("linkedDataDescription")}];return o.jsx(g,{title:a("title"),items:i,currentPath:u,LinkComponent:U,...n&&{dropdownContent:n},isCollapsed:r,icons:{chevronLeft:M,bars:F},collapseSidebarLabel:l("collapseSidebar"),expandSidebarLabel:l("expandSidebar")})}function Z(){const{t:r}=p(),e=t.useContext(H),{isAuthenticated:n,isAdmin:s,isModerator:a,token:m,activeKnowledgeBase:l,refreshActive:u}=v(),f=$();return l?o.jsx(L,{token:m,children:o.jsx(j,{baseUrl:R(l),tokenRefresher:u,children:o.jsxs("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900 flex flex-col",children:[o.jsxs("div",{className:"flex flex-1",children:[o.jsx(S,{Link:x,routes:h,t:i=>r(`Navigation.${i}`),tHome:i=>r(`Home.${i}`),brandingLink:"/",collapsible:!0,storageKey:"moderation-sidebar-collapsed",isAuthenticated:n,isAdmin:s,isModerator:a,children:(i,c,d)=>o.jsx(W,{isCollapsed:i,toggleCollapsed:c,navigationMenu:d})}),o.jsx("main",{className:"flex-1 p-6 flex flex-col",children:o.jsx("div",{className:"max-w-7xl mx-auto flex-1 flex flex-col w-full",children:o.jsx(b,{})})})]}),o.jsx(y,{Link:x,routes:h,t:(i,c)=>r(`Footer.${i}`,c),CookiePreferences:B,...(e==null?void 0:e.openKeyboardHelp)&&{onOpenKeyboardHelp:e.openKeyboardHelp}})]})})}):(f.push("/know"),null)}function re(){return o.jsx(w,{children:o.jsx(Z,{})})}export{re as default};
|
|
2
|
+
//# sourceMappingURL=layout-BN0UEIdX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-BN0UEIdX.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 'browse: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 ApiClientProvider,\n AuthTokenProvider,\n useKnowledgeBaseSession,\n kbBackendUrl,\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';\nimport { AuthShell } from '@/contexts/AuthShell';\n\nfunction ModerateLayoutBody() {\n const { t } = useTranslation();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n const { isAuthenticated, isAdmin, isModerator, token: authToken, activeKnowledgeBase, refreshActive } = useKnowledgeBaseSession();\n const router = useRouter();\n\n if (!activeKnowledgeBase) {\n router.push('/know');\n return null;\n }\n\n return (\n <AuthTokenProvider token={authToken}>\n <ApiClientProvider baseUrl={kbBackendUrl(activeKnowledgeBase)} tokenRefresher={refreshActive}>\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 </ApiClientProvider>\n </AuthTokenProvider>\n );\n}\n\nexport default function ModerateLayout() {\n return (\n <AuthShell>\n <ModerateLayoutBody />\n </AuthShell>\n );\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","t","k","p","_tSidebar","tSidebar","pathname","usePathname","handleSidebarToggle","useCallback","useEventSubscriptions","navigation","ArrowsRightLeftIcon","jsx","SimpleNavigation","ChevronLeftIcon","Bars3Icon","ModerateLayoutBody","keyboardContext","useContext","KeyboardShortcutsContext","isAuthenticated","isAdmin","isModerator","authToken","activeKnowledgeBase","refreshActive","useKnowledgeBaseSession","router","useRouter","AuthTokenProvider","ApiClientProvider","kbBackendUrl","jsxs","LeftSidebar","routes","key","Outlet","Footer","params","CookiePreferences","ModerateLayout","AuthShell"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./query-B6BuIB0M.js";import{r as i,O as b}from"./vendor-DJo4KD8w.js";import{b as g,L as k,u as v}from"./routing-By_4TZHr.js";import{h as w,M as j,N as L,u as S,O as F,Q as y,U as A,V as $,X as R}from"./index-XWcEpo5a.js";import{u as p}from"./i18n-BbpF47i1.js";import{F as K,C as N}from"./CookiePreferences-CO_BNHwm.js";import{F as C}from"./ArrowsRightLeftIcon-BzLgl5o9.js";import{F as E}from"./CommandLineIcon-Ba4gpk8e.js";import{F as H,a as B}from"./ChevronLeftIcon-BLyRNZuL.js";import{K as M}from"./privacy-B5TeXaed.js";import{r as x,L as h}from"./routing-vcvYfuPO.js";import"./XMarkIcon-KMKD47CF.js";function O({title:t,titleId:r,...s},c){return i.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:c,"aria-labelledby":r},s),t?i.createElement("title",{id:r},t):null,i.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 P=i.forwardRef(O);function D({href:t,to:r,...s}){return e.jsx(k,{to:t??"",...s})}function T({isCollapsed:t,toggleCollapsed:r,navigationMenu:s}){const{t:c}=p(),o=(a,l)=>c(`Administration.${a}`,l),{t:m}=p(),d=(a,l)=>m(`Sidebar.${a}`,l),u=g(),f=i.useCallback(()=>{r()},[r]);w({"browse:sidebar-toggle":f});const n=[{name:o("users"),href:"/admin/users",icon:P,description:o("usersDescription")},{name:o("oauthSettings"),href:"/admin/security",icon:K,description:o("oauthSettingsDescription")},{name:o("exchange"),href:"/admin/exchange",icon:C,description:o("exchangeDescription")},{name:o("devops"),href:"/admin/devops",icon:E,description:o("devopsDescription")}];return e.jsx(j,{title:o("title"),items:n,currentPath:u,LinkComponent:D,...s&&{dropdownContent:s},isCollapsed:t,icons:{chevronLeft:B,bars:H},collapseSidebarLabel:d("collapseSidebar"),expandSidebarLabel:d("expandSidebar")})}function U(){const{t}=p(),r=i.useContext(M),{isAuthenticated:s,isAdmin:c,isModerator:o,token:m,activeKnowledgeBase:d,refreshActive:u}=S(),f=v();return d?e.jsx(F,{token:m,children:e.jsx(y,{baseUrl:R(d),tokenRefresher:u,children:e.jsxs("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900 flex flex-col",children:[e.jsxs("div",{className:"flex flex-1",children:[e.jsx(A,{Link:h,routes:x,t:n=>t(`Navigation.${n}`),tHome:n=>t(`Home.${n}`),brandingLink:"/",collapsible:!0,storageKey:"admin-sidebar-collapsed",isAuthenticated:s,isAdmin:c,isModerator:o,children:(n,a,l)=>e.jsx(T,{isCollapsed:n,toggleCollapsed:a,navigationMenu:l})}),e.jsx("main",{className:"flex-1 p-6 flex flex-col",children:e.jsx("div",{className:"max-w-7xl mx-auto flex-1 flex flex-col w-full",children:e.jsx(b,{})})})]}),e.jsx($,{Link:h,routes:x,t:(n,a)=>t(`Footer.${n}`,a),CookiePreferences:N,...(r==null?void 0:r.openKeyboardHelp)&&{onOpenKeyboardHelp:r.openKeyboardHelp}})]})})}):(f.push("/know"),null)}function ee(){return e.jsx(L,{children:e.jsx(U,{})})}export{ee as default};
|
|
2
|
+
//# sourceMappingURL=layout-ChyKFPPP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-ChyKFPPP.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 'browse: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 ApiClientProvider,\n AuthTokenProvider,\n useKnowledgeBaseSession,\n kbBackendUrl,\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';\nimport { AuthShell } from '@/contexts/AuthShell';\n\nfunction AdminLayoutBody() {\n const { t } = useTranslation();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n const { isAuthenticated, isAdmin, isModerator, token: authToken, activeKnowledgeBase, refreshActive } = useKnowledgeBaseSession();\n const router = useRouter();\n\n if (!activeKnowledgeBase) {\n router.push('/know');\n return null;\n }\n\n return (\n <AuthTokenProvider token={authToken}>\n <ApiClientProvider baseUrl={kbBackendUrl(activeKnowledgeBase)} tokenRefresher={refreshActive}>\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 </ApiClientProvider>\n </AuthTokenProvider>\n );\n}\n\nexport default function AdminLayout() {\n return (\n <AuthShell>\n <AdminLayoutBody />\n </AuthShell>\n );\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","isAuthenticated","isAdmin","isModerator","authToken","activeKnowledgeBase","refreshActive","useKnowledgeBaseSession","router","useRouter","AuthTokenProvider","ApiClientProvider","kbBackendUrl","jsxs","LeftSidebar","routes","key","Outlet","Footer","params","CookiePreferences","AdminLayout","AuthShell"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as s,u as L}from"./query-B6BuIB0M.js";import{r as u,O as K}from"./vendor-DJo4KD8w.js";import{_ as A,h as E,$ as O,u as p,U as _,a0 as H,a1 as P,N as T,O as B,Q as C,a2 as F,a3 as M,a4 as I,V as g,X as z,e as D,f as W,g as Q,T as q,a5 as G,a6 as J,a7 as U,a8 as V}from"./index-XWcEpo5a.js";import{b as X,u as Y,L as Z}from"./routing-By_4TZHr.js";import{u as h}from"./i18n-BbpF47i1.js";import{F as ee,T as se}from"./ToolbarPanels-DRHyLUHl.js";import{F as te}from"./XMarkIcon-KMKD47CF.js";import{F as oe,a as ne}from"./ChevronLeftIcon-BLyRNZuL.js";import{r as v,L as w}from"./routing-vcvYfuPO.js";import{C as j}from"./CookiePreferences-CO_BNHwm.js";import{K as re}from"./privacy-B5TeXaed.js";import{S as ae}from"./StreamStatusContext-BNiTXRfJ.js";const ie=({className:t})=>s.jsx("span",{className:t,style:{fontSize:"1.25rem",lineHeight:"1"},children:"🔭"});function le({href:t,to:e,...n}){return s.jsx(Z,{to:t??"",...n})}function ce({isCollapsed:t,toggleCollapsed:e,navigationMenu:n}){const{t:o}=h(),r=(d,m)=>o(`Sidebar.${d}`,m),a=X(),l=Y(),{openResources:i,removeResource:c,reorderResources:f}=A(),b=[{name:r("discover"),href:"/know/discover",icon:ie,description:r("searchAndBrowse")},{name:r("compose"),href:"/know/compose",icon:ee,description:r("composeNewResource")}],S=u.useCallback(()=>{e()},[e]),N=u.useCallback(({resourceId:d})=>{c(d),a===`/know/resource/${d}`&&l.push("/know/discover")},[c,a,l]),R=u.useCallback(({oldIndex:d,newIndex:m})=>{f(d,m)},[f]);E({"browse:sidebar-toggle":S,"browse:resource-close":N,"browse:resource-reorder":R});const k=d=>{l.push(d)},$=d=>`/know/resource/${d}`;return s.jsx("div",{className:"flex flex-col h-full",children:s.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:s.jsx(O,{fixedItems:b,resources:i,isCollapsed:t,currentPath:a,LinkComponent:le,onNavigate:k,getResourceHref:$,className:"knowledge-navigation",translations:{title:r("title")},icons:{chevronLeft:ne,bars:oe,close:te},navigationMenu:n})})})}function de(){const{t}=h(),e=(i,c)=>t(`Navigation.${i}`,c),{t:n}=h(),o=(i,c)=>n(`Home.${i}`,c),{isAuthenticated:r,isAdmin:a,isModerator:l}=p();return s.jsx(_,{Link:w,routes:v,t:e,tHome:o,brandingLink:"/",collapsible:!0,storageKey:"knowledgeNavCollapsed",isAuthenticated:r,isAdmin:a,isModerator:l,children:(i,c,f)=>s.jsx(ce,{isCollapsed:i,toggleCollapsed:c,navigationMenu:f})})}const x="openDocuments";function y(t){return[...t].sort((e,n)=>e.order!==void 0&&n.order!==void 0?e.order-n.order:e.openedAt-n.openedAt)}function ue(){if(typeof localStorage>"u")return[];try{const t=localStorage.getItem(x);if(t)return y(JSON.parse(t))}catch{}return[]}class fe{constructor(){this.state$=new H(ue()),this.resources$=this.state$.asObservable(),this.handleStorageEvent=e=>{if(e.key===x&&e.newValue)try{this.state$.next(y(JSON.parse(e.newValue)))}catch{}},this.state$.subscribe(e=>{typeof localStorage<"u"&&localStorage.setItem(x,JSON.stringify(e))}),typeof window<"u"&&window.addEventListener("storage",this.handleStorageEvent)}get resources(){return this.state$.value}add(e,n,o,r){const a=this.state$.value;if(a.find(i=>i.id===e))this.state$.next(a.map(i=>i.id===e?{...i,name:n,...o&&{mediaType:o},...r&&{storageUri:r}}:i));else{const i=a.length>0?Math.max(...a.map(c=>c.order??c.openedAt)):0;this.state$.next([...a,{id:e,name:n,openedAt:Date.now(),order:i+1,...o&&{mediaType:o},...r&&{storageUri:r}}])}}remove(e){this.state$.next(this.state$.value.filter(n=>n.id!==e))}updateName(e,n){this.state$.next(this.state$.value.map(o=>o.id===e?{...o,name:n}:o))}reorder(e,n){const o=[...this.state$.value],r=o.splice(e,1)[0];o.splice(n,0,r),this.state$.next(o.map((a,l)=>({...a,order:l})))}destroy(){typeof window<"u"&&window.removeEventListener("storage",this.handleStorageEvent)}}function he(){const t=u.useMemo(()=>new fe,[]);u.useEffect(()=>()=>t.destroy(),[t]);const e=P(t.resources$)??t.resources,n=u.useMemo(()=>({addResource:(o,r,a,l)=>t.add(o,r,a,l),removeResource:o=>t.remove(o),updateResourceName:(o,r)=>t.updateName(o,r),reorderResources:(o,r)=>t.reorder(o,r)}),[t]);return u.useMemo(()=>({openResources:e,...n}),[e,n])}function me(){const t=L();return u.useMemo(()=>({invalidateAnnotations:e=>{t.invalidateQueries({queryKey:["resources",e,"annotations"]})},invalidateEvents:e=>{t.invalidateQueries({queryKey:["resources",e,"events"]})}}),[t])}function xe(){return G(),J(),null}function pe(){const{t}=h(),e=a=>t(`DiscoverEmptyState.${a}`),{knowledgeBases:n,activeKnowledgeBase:o}=p(),r=o?V(o.id):null;return n.length===0?s.jsxs("div",{style:{textAlign:"center",maxWidth:"24rem"},children:[s.jsx("h2",{style:{fontSize:"1.1rem",fontWeight:600,marginBottom:"0.5rem"},children:e("noKnowledgeBases")}),s.jsx("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:e("noKnowledgeBasesHint")})]}):r==="authenticated"?null:s.jsxs("div",{style:{textAlign:"center",maxWidth:"24rem"},children:[s.jsx("h2",{style:{fontSize:"1.1rem",fontWeight:600,marginBottom:"0.5rem"},children:(o==null?void 0:o.label)??""}),s.jsxs("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:[e(r==="expired"?"sessionExpired":"signedOut")," ",e("signInHint")]})]})}function ve({t,keyboardContext:e}){const{activePanel:n}=D(),{theme:o}=W(),{showLineNumbers:r}=Q();return s.jsxs("div",{className:"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden",children:[s.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[s.jsx("main",{className:"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden",children:s.jsx("div",{className:"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden items-center justify-center",children:s.jsx(pe,{})})}),s.jsx(se,{activePanel:n,showLineNumbers:r,theme:o,hoverDelayMs:150}),s.jsx(q,{activePanel:n,context:"simple"})]}),s.jsx(g,{Link:w,routes:v,t:(a,l)=>t(`Footer.${a}`,l),CookiePreferences:j,showPolicyLinks:!("__TAURI_INTERNALS__"in window),...(e==null?void 0:e.openKeyboardHelp)&&{onOpenKeyboardHelp:e.openKeyboardHelp}})]})}function we({children:t}){const{status:e}=U();return s.jsx(ae.Provider,{value:e,children:t})}function ge(){const{t}=h(),e=u.useContext(re),n=he(),o=me(),{token:r,isLoading:a,activeKnowledgeBase:l,refreshActive:i}=p();return a?s.jsx("div",{className:"h-screen flex items-center justify-center",children:s.jsxs("div",{className:"text-center",children:[s.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"}),s.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Loading..."})]})}):!l||!r?s.jsx(ve,{t:(c,f)=>t(c,f),keyboardContext:e}):s.jsx(B,{token:r,children:s.jsx(C,{baseUrl:z(l),tokenRefresher:i,children:s.jsx(F,{cacheManager:o,children:s.jsx(M,{openResourcesManager:n,children:s.jsxs(I,{children:[s.jsx(xe,{}),s.jsx(we,{children:s.jsxs("div",{className:"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden",children:[s.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[s.jsx(de,{}),s.jsx("main",{className:"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden",children:s.jsx("div",{className:"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden",children:s.jsx(K,{})})})]}),s.jsx(g,{Link:w,routes:v,t:(c,f)=>t(`Footer.${c}`,f),CookiePreferences:j,showPolicyLinks:!("__TAURI_INTERNALS__"in window),...(e==null?void 0:e.openKeyboardHelp)&&{onOpenKeyboardHelp:e.openKeyboardHelp}})]})})]})})})})})}function Oe(){return s.jsx(T,{children:s.jsx(ge,{})})}export{Oe as default};
|
|
2
|
+
//# sourceMappingURL=layout-DmjP6diV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-DmjP6diV.js","sources":["../../src/components/knowledge/KnowledgeNavigation.tsx","../../src/components/knowledge/KnowledgeSidebarWrapper.tsx","../../src/stores/open-resources-store.ts","../../src/hooks/useOpenResourcesManager.ts","../../src/hooks/useCacheManager.ts","../../src/app/[locale]/know/layout.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { PlusIcon, ChevronLeftIcon, Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline';\nimport {\n useOpenResources,\n useEventSubscriptions,\n CollapsibleResourceNavigation,\n type NavigationItem,\n type OpenResource\n} from '@semiont/react-ui';\n\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 { openResources, removeResource, reorderResources } = useOpenResources();\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 'browse:sidebar-toggle': handleSidebarToggle,\n 'browse:resource-close': handleResourceClose,\n 'browse:resource-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, useKnowledgeBaseSession } 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 { isAuthenticated, isAdmin, isModerator } = useKnowledgeBaseSession();\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","/**\n * OpenResourcesStore — per-workspace observable store for open resources\n *\n * BehaviorSubject-backed store for the list of open documents (tabs).\n * Replaces useState in useOpenResourcesManager with a reactive store that:\n * - Persists to localStorage\n * - Syncs across tabs via StorageEvent\n */\n\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport type { OpenResource } from '@semiont/react-ui';\n\nconst STORAGE_KEY = 'openDocuments';\n\nfunction sortResources(resources: OpenResource[]): OpenResource[] {\n return [...resources].sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) return a.order - b.order;\n return a.openedAt - b.openedAt;\n });\n}\n\nfunction loadFromStorage(): OpenResource[] {\n if (typeof localStorage === 'undefined') return [];\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) return sortResources(JSON.parse(stored) as OpenResource[]);\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\nexport class OpenResourcesStore {\n private readonly state$ = new BehaviorSubject<OpenResource[]>(loadFromStorage());\n\n /** Observable of the current open resources list */\n readonly resources$: Observable<OpenResource[]> = this.state$.asObservable();\n\n constructor() {\n // Persist to localStorage on every change\n this.state$.subscribe(resources => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(resources));\n }\n });\n\n // Sync from other tabs\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', this.handleStorageEvent);\n }\n }\n\n private readonly handleStorageEvent = (e: StorageEvent): void => {\n if (e.key === STORAGE_KEY && e.newValue) {\n try {\n this.state$.next(sortResources(JSON.parse(e.newValue) as OpenResource[]));\n } catch {\n // Ignore parse errors\n }\n }\n };\n\n get resources(): OpenResource[] {\n return this.state$.value;\n }\n\n add(id: string, name: string, mediaType?: string, storageUri?: string): void {\n const current = this.state$.value;\n const existing = current.find(r => r.id === id);\n if (existing) {\n this.state$.next(current.map(r =>\n r.id === id\n ? { ...r, name, ...(mediaType && { mediaType }), ...(storageUri && { storageUri }) }\n : r\n ));\n } else {\n const maxOrder = current.length > 0\n ? Math.max(...current.map(r => r.order ?? r.openedAt))\n : 0;\n this.state$.next([\n ...current,\n { id, name, openedAt: Date.now(), order: maxOrder + 1, ...(mediaType && { mediaType }), ...(storageUri && { storageUri }) },\n ]);\n }\n }\n\n remove(id: string): void {\n this.state$.next(this.state$.value.filter(r => r.id !== id));\n }\n\n updateName(id: string, name: string): void {\n this.state$.next(this.state$.value.map(r => r.id === id ? { ...r, name } : r));\n }\n\n reorder(oldIndex: number, newIndex: number): void {\n const current = [...this.state$.value];\n const moved = current.splice(oldIndex, 1)[0]!;\n current.splice(newIndex, 0, moved);\n this.state$.next(current.map((r, index) => ({ ...r, order: index })));\n }\n\n /** Release event listener — call when the workspace is torn down */\n destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', this.handleStorageEvent);\n }\n }\n}\n","import { useMemo, useEffect } from 'react';\nimport type { OpenResourcesManager } from '@semiont/react-ui';\nimport { useObservable } from '@semiont/react-ui';\nimport { OpenResourcesStore } from '@/stores/open-resources-store';\n\n/**\n * Hook that provides OpenResourcesManager delegating to OpenResourcesStore.\n * State lives in a BehaviorSubject; React re-renders via useObservable subscription.\n */\nexport function useOpenResourcesManager(): OpenResourcesManager {\n const store = useMemo(() => new OpenResourcesStore(), []);\n\n useEffect(() => () => store.destroy(), [store]);\n\n const openResources = useObservable(store.resources$) ?? store.resources;\n\n const callbacks = useMemo(\n () => ({\n addResource: (id: string, name: string, mediaType?: string, storageUri?: string) =>\n store.add(id, name, mediaType, storageUri),\n removeResource: (id: string) => store.remove(id),\n updateResourceName: (id: string, name: string) => store.updateName(id, name),\n reorderResources: (oldIndex: number, newIndex: number) => store.reorder(oldIndex, newIndex),\n }),\n [store],\n );\n\n return useMemo(\n () => ({ openResources, ...callbacks }),\n [openResources, callbacks],\n );\n}\n","import { useMemo } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { CacheManager } from '@semiont/react-ui';\nimport type { ResourceId } from '@semiont/core';\n\n/**\n * Frontend implementation of CacheManager using React Query\n *\n * Usage:\n * ```typescript\n * const cacheManager = useCacheManager();\n * <CacheProvider cacheManager={cacheManager}>\n * <YourComponents />\n * </CacheProvider>\n * ```\n */\nexport function useCacheManager(): CacheManager {\n const queryClient = useQueryClient();\n\n return useMemo(() => ({\n invalidateAnnotations: (rUri: ResourceId) => {\n queryClient.invalidateQueries({ queryKey: ['resources', rUri, 'annotations'] });\n },\n invalidateEvents: (rUri: ResourceId) => {\n queryClient.invalidateQueries({ queryKey: ['resources', rUri, 'events'] });\n }\n }), [queryClient]);\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 OpenResourcesProvider,\n CacheProvider,\n ApiClientProvider,\n AuthTokenProvider,\n Toolbar,\n useGlobalEvents,\n useAttentionStream,\n useStoreTokenSync,\n usePanelBrowse,\n useTheme,\n useLineNumbers,\n useKnowledgeBaseSession,\n kbBackendUrl,\n getKbSessionStatus,\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';\nimport { useOpenResourcesManager } from '@/hooks/useOpenResourcesManager';\nimport { useCacheManager } from '@/hooks/useCacheManager';\nimport { StreamStatusContext } from '@/contexts/StreamStatusContext';\nimport { AuthShell } from '@/contexts/AuthShell';\n\nfunction GlobalEventsConnector() {\n useStoreTokenSync();\n useGlobalEvents();\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 { knowledgeBases, activeKnowledgeBase } = useKnowledgeBaseSession();\n const status = activeKnowledgeBase\n ? getKbSessionStatus(activeKnowledgeBase.id)\n : null;\n\n if (knowledgeBases.length === 0) {\n return (\n <div style={{ textAlign: 'center', maxWidth: '24rem' }}>\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 }}>\n {t('noKnowledgeBasesHint')}\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 { activePanel } = usePanelBrowse();\n const { theme } = useTheme();\n const { showLineNumbers } = useLineNumbers();\n\n return (\n <div className=\"h-screen semiont-knowledge-layout semiont-layout-with-footer flex flex-col overflow-hidden\">\n <div className=\"flex flex-1 overflow-hidden\">\n <main className=\"flex-1 w-full px-2 pb-6 flex flex-col overflow-hidden\">\n <div className=\"w-full mx-auto flex-1 flex flex-col h-full overflow-hidden items-center justify-center\">\n <DiscoverEmptyState />\n </div>\n </main>\n <ToolbarPanels\n activePanel={activePanel}\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={150}\n />\n <Toolbar activePanel={activePanel} context=\"simple\" />\n </div>\n <Footer\n Link={Link}\n routes={routes}\n t={(key: string, params?: Record<string, unknown>) => t(`Footer.${key}`, params as any) as string}\n CookiePreferences={CookiePreferences}\n showPolicyLinks={!('__TAURI_INTERNALS__' in window)}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n />\n </div>\n );\n}\n\nfunction KnowledgeLayoutInner({ children }: { children: React.ReactNode }) {\n const { status } = useAttentionStream();\n return (\n <StreamStatusContext.Provider value={status}>\n {children}\n </StreamStatusContext.Provider>\n );\n}\n\nfunction KnowledgeLayoutBody() {\n const { t } = useTranslation();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n const openResourcesManager = useOpenResourcesManager();\n const cacheManager = useCacheManager();\n const { token: authToken, isLoading, activeKnowledgeBase, refreshActive } = useKnowledgeBaseSession();\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 || !authToken) {\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 <AuthTokenProvider token={authToken}>\n <ApiClientProvider baseUrl={kbBackendUrl(activeKnowledgeBase)} tokenRefresher={refreshActive}>\n <CacheProvider cacheManager={cacheManager}>\n <OpenResourcesProvider openResourcesManager={openResourcesManager}>\n <ResourceAnnotationsProvider>\n <GlobalEventsConnector />\n <KnowledgeLayoutInner>\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 </KnowledgeLayoutInner>\n </ResourceAnnotationsProvider>\n </OpenResourcesProvider>\n </CacheProvider>\n </ApiClientProvider>\n </AuthTokenProvider>\n );\n}\n\nexport default function KnowledgeLayout() {\n return (\n <AuthShell>\n <KnowledgeLayoutBody />\n </AuthShell>\n );\n}\n"],"names":["TelescopeIcon","className","jsx","HrefLink","href","_to","props","Link","KnowledgeNavigation","isCollapsed","toggleCollapsed","navigationMenu","_t","useTranslation","t","k","p","pathname","usePathname","router","useRouter","openResources","removeResource","reorderResources","useOpenResources","fixedNavigation","PlusIcon","handleSidebarToggle","useCallback","handleResourceClose","resourceId","handleResourceReorder","oldIndex","newIndex","useEventSubscriptions","handleNavigate","path","getResourceHref","CollapsibleResourceNavigation","ChevronLeftIcon","Bars3Icon","XMarkIcon","KnowledgeSidebarWrapper","_tHome","tHome","isAuthenticated","isAdmin","isModerator","useKnowledgeBaseSession","LeftSidebar","routes","STORAGE_KEY","sortResources","resources","a","b","loadFromStorage","stored","OpenResourcesStore","BehaviorSubject","id","name","mediaType","storageUri","current","r","maxOrder","moved","index","useOpenResourcesManager","store","useMemo","useEffect","useObservable","callbacks","useCacheManager","queryClient","useQueryClient","rUri","GlobalEventsConnector","useStoreTokenSync","useGlobalEvents","DiscoverEmptyState","knowledgeBases","activeKnowledgeBase","status","getKbSessionStatus","jsxs","UnauthenticatedKnowledgeLayout","keyboardContext","activePanel","usePanelBrowse","theme","useTheme","showLineNumbers","useLineNumbers","ToolbarPanels","Toolbar","Footer","key","params","CookiePreferences","KnowledgeLayoutInner","children","useAttentionStream","StreamStatusContext","KnowledgeLayoutBody","useContext","KeyboardShortcutsContext","openResourcesManager","cacheManager","authToken","isLoading","refreshActive","AuthTokenProvider","ApiClientProvider","kbBackendUrl","CacheProvider","OpenResourcesProvider","ResourceAnnotationsProvider","Outlet","KnowledgeLayout","AuthShell"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t}from"./query-
|
|
2
|
-
//# sourceMappingURL=not-found-
|
|
1
|
+
import{j as t}from"./query-B6BuIB0M.js";import{a as n,L as i}from"./routing-By_4TZHr.js";import{u as l}from"./i18n-BbpF47i1.js";import"./vendor-DJo4KD8w.js";import"./index-XWcEpo5a.js";function h(){const{t:s}=l(),e=(a,o)=>s(`NotFound.${a}`,o),r=n();return t.jsx("div",{className:"flex min-h-screen items-center justify-center bg-gray-50 dark:bg-gray-900",children:t.jsxs("div",{className:"text-center px-4",children:[t.jsx("h1",{className:"text-6xl font-bold text-gray-900 dark:text-white mb-4",children:e("title")}),t.jsx("h2",{className:"text-2xl font-semibold text-gray-700 dark:text-gray-300 mb-4",children:e("heading")}),t.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-8",children:e("message")}),t.jsx(i,{to:`/${r}`,className:"inline-block px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",children:e("goHome")})]})})}export{h as default};
|
|
2
|
+
//# sourceMappingURL=not-found-BboGygIW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found-
|
|
1
|
+
{"version":3,"file":"not-found-BboGygIW.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","t","k","p","locale","useLocale","jsxs","jsx","Link"],"mappings":"yLAKA,SAAwBA,GAAW,CACjC,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAWC,IAAgCJ,EAAG,YAAYG,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,SAAAN,EAAE,OAAO,EAAE,QACjF,KAAA,CAAG,UAAU,+DACX,SAAAA,EAAE,SAAS,EACd,QACC,IAAA,CAAE,UAAU,wCACV,SAAAA,EAAE,SAAS,EACd,EACAM,EAAAA,IAACC,EAAA,CACC,GAAI,IAAIJ,CAAM,GACd,UAAU,+FAET,WAAE,QAAQ,CAAA,CAAA,CACb,CAAA,CACF,CAAA,CACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as d}from"./query-B6BuIB0M.js";import{r as i,u as ne}from"./vendor-DJo4KD8w.js";import{a as se,u as re}from"./routing-By_4TZHr.js";import{C as A,u as ce,c as ie,e as ae,f as ue,g as le,k as de,h as pe,i as ge,l as fe,j as me,m as ye,n as he,o as Ce,T as Re,r as L,p as ke,q as Te,s as ve}from"./index-XWcEpo5a.js";import{T as we}from"./ToolbarPanels-DRHyLUHl.js";import{u as M}from"./i18n-BbpF47i1.js";import"./XMarkIcon-KMKD47CF.js";function xe(){const{t:f}=M(),e=(t,n)=>f(`Compose.${t}`,n),m=se(),c=re(),[o]=ne(),{isAuthenticated:y,isLoading:p,token:U}=ce(),{showError:u,showSuccess:E}=ie(),F=o==null?void 0:o.get("mode"),l=o==null?void 0:o.get("token");i.useEffect(()=>{p||y||c.push("/")},[p,y,c]);const g=o==null?void 0:o.get("annotationUri"),h=o==null?void 0:o.get("sourceDocumentId"),C=o==null?void 0:o.get("name"),R=o==null?void 0:o.get("entityTypes"),[N,k]=i.useState(!0),[j,B]=i.useState(null),[O,$]=i.useState(null),[P,K]=i.useState(null),{activePanel:Q}=ae(),{theme:Ie,setTheme:_,resolvedTheme:q}=ue(),{showLineNumbers:G,toggleLineNumbers:H}=le(),{hoverDelayMs:J}=de();pe({"settings:theme-changed":({theme:t})=>_(t),"settings:line-numbers-toggled":()=>H()});const T=ge(),W=fe(),Y=me(),D=ye(),S=he(),{data:v}=Y.list.useQuery(),z=(v==null?void 0:v.entityTypes)||[],V=T.create.useMutation(),X=W.updateBody.useMutation(),{data:a}=T.getByToken.useQuery(l||""),Z=T.createFromToken.useMutation(),b=!!(g&&h&&C),w=F==="clone"&&!!l,ee=w?"clone":b?"reference":"new";i.useEffect(()=>{(async()=>{if(b){const n=R?R.split(","):[];$({annotationUri:g,sourceDocumentId:h,name:C,entityTypes:n});const s=`gather-context:${g}`,r=sessionStorage.getItem(s);if(r){try{K(JSON.parse(r))}catch{}sessionStorage.removeItem(s)}k(!1);return}if(w&&a){if(a.sourceResource&&D&&S)try{const n=L(a.sourceResource["@id"]),s=ke(a.sourceResource)||"text/plain",{data:r}=await D.getResourceRepresentation(n,{accept:s,auth:S}),x=Te(r,s);B({sourceResource:a.sourceResource,sourceContent:x})}catch(n){console.error("Failed to fetch representation:",n),u("Failed to load resource representation")}else u("Invalid or expired clone token"),c.push("/know/discover");k(!1)}else w&&!l?(u("Clone token not found. Please try cloning again."),c.push("/know/discover")):k(!1)})()},[F,l,a,g,h,C,R,U]);const te=async t=>{try{let n;if(t.mode==="clone")n=(await Z.mutateAsync({token:l,name:t.name,content:t.content,archiveOriginal:t.archiveOriginal??!0})).resourceId;else{let s,r;if(t.file)s=t.file,r=t.format??"application/octet-stream";else{const I=new Blob([t.content||""],{type:t.format??"application/octet-stream"}),oe=t.format==="text/plain"?".txt":t.format==="text/html"?".html":".md";s=new File([I],t.name+oe,{type:t.format??"application/octet-stream"}),r=t.format??"application/octet-stream"}const x=t.charset&&!t.file?`${r}; charset=${t.charset}`:r;if(n=(await V.mutateAsync({name:t.name,file:s,format:x,entityTypes:t.entityTypes||[],language:t.language,creationMethod:"ui",storageUri:t.storageUri})).resourceId,t.mode==="reference"&&t.annotationUri&&t.sourceDocumentId)try{await X.mutateAsync({resourceId:L(t.sourceDocumentId),annotationId:ve(t.annotationUri),data:{operations:[{op:"add",item:{type:"SpecificResource",source:n,purpose:"linking"}}]}}),E("Reference successfully linked to the new resource")}catch(I){console.error("Failed to update reference:",I),u("Resource created but failed to update reference. You may need to manually link it.")}}c.push(`/know/resource/${encodeURIComponent(n)}`)}catch(n){console.error("Failed to save resource:",n);const s=n instanceof Error?n.message:"Failed to save resource. Please try again.";throw u(s),n}};return p||N?d.jsx(A,{message:p?"Checking authentication...":"Loading cloned resource..."}):y?d.jsx(Ce,{mode:ee,cloneData:j,referenceData:O,gatheredContext:P,availableEntityTypes:z,initialLocale:m,theme:q,showLineNumbers:G,hoverDelayMs:J,activePanel:Q,onSaveResource:te,onCancel:()=>c.push("/know/discover"),translations:{title:e("title"),titleEditClone:e("titleEditClone"),titleCompleteReference:e("titleCompleteReference"),subtitleClone:e("subtitleClone"),subtitleReference:e("subtitleReference"),linkedNoticePrefix:e("linkedNoticePrefix"),resourceName:e("resourceName"),resourceNamePlaceholder:e("resourceNamePlaceholder"),entityTypes:e("entityTypes"),language:e("language"),contentSource:e("contentSource"),uploadFile:e("uploadFile"),uploadFileDescription:e("uploadFileDescription"),writeContent:e("writeContent"),writeContentDescription:e("writeContentDescription"),dropFileOrClick:e("dropFileOrClick"),supportedFormats:e("supportedFormats"),mediaType:e("mediaType"),autoDetected:e("autoDetected"),format:e("format"),content:e("content"),resourceContent:e("resourceContent"),encoding:e("encoding"),archiveOriginal:e("archiveOriginal"),cancel:e("cancel"),saving:e("saving"),creating:e("creating"),creatingAndLinking:e("creatingAndLinking"),saveClonedResource:e("saveClonedResource"),createAndLinkResource:e("createAndLinkResource"),createResource:e("createResource")},ToolbarPanels:we,Toolbar:Re}):null}function Ee(){const{t:f}=M(),e=(m,c)=>f(`Compose.${m}`,c);return d.jsx(i.Suspense,{fallback:d.jsx(A,{message:e("loading")}),children:d.jsx(xe,{})})}export{Ee as default};
|
|
2
|
+
//# sourceMappingURL=page-8F47gNEm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-8F47gNEm.js","sources":["../../src/app/[locale]/know/compose/page.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Resource Compose Page - Thin Next.js wrapper\n *\n * This page handles Next.js-specific concerns (routing, auth, data loading, hooks)\n * and delegates rendering to the pure React ResourceComposePage component.\n */\n\nimport React, { useState, useEffect, Suspense } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocale } from '@/i18n/routing';\nimport { useRouter } from '@/i18n/routing';\nimport { useSearchParams } from 'react-router-dom';\nimport { useResources, useAnnotations, useEntityTypes, useApiClient, useAuthToken, useKnowledgeBaseSession } from '@semiont/react-ui';\nimport { useToast } from '@semiont/react-ui';\nimport { useTheme } from '@semiont/react-ui';\nimport { usePanelBrowse } from '@semiont/react-ui';\nimport { useLineNumbers } from '@semiont/react-ui';\nimport { useHoverDelay } from '@semiont/react-ui';\nimport { useEventSubscriptions } from '@semiont/react-ui';\nimport { Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { resourceId as toResourceId, annotationId as toAnnotationId, ContentFormat, AccessToken, type GatheredContext } from '@semiont/core';\nimport { getPrimaryMediaType } from '@semiont/api-client';\nimport { decodeWithCharset } from '@semiont/api-client';\nimport { ComposeLoadingState } from '@semiont/react-ui';\nimport { ResourceComposePage } from '@semiont/react-ui';\nimport type { SaveResourceParams } from '@semiont/react-ui';\n\nfunction ComposeResourceContent() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Compose.${k}`, p as any) as string;\n const locale = useLocale();\n const router = useRouter();\n const [searchParams] = useSearchParams();\n const { isAuthenticated, isLoading: authLoading, token: authToken } = useKnowledgeBaseSession();\n const { showError, showSuccess } = useToast();\n const mode = searchParams?.get('mode');\n const tokenFromUrl = searchParams?.get('token');\n\n // Authentication guard - redirect to home if not authenticated\n useEffect(() => {\n if (authLoading) return;\n if (!isAuthenticated) {\n router.push('/');\n }\n }, [authLoading, isAuthenticated, router]);\n\n // Reference completion parameters\n const annotationUriParam = searchParams?.get('annotationUri');\n const sourceDocumentId = searchParams?.get('sourceDocumentId');\n const nameFromUrl = searchParams?.get('name');\n const entityTypesFromUrl = searchParams?.get('entityTypes');\n\n const [isLoading, setIsLoading] = useState(true);\n const [cloneData, setCloneData] = useState<any>(null);\n const [referenceData, setReferenceData] = useState<any>(null);\n const [gatheredContext, setGatheredContext] = useState<GatheredContext | null>(null);\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme, resolvedTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n const { hoverDelayMs } = useHoverDelay();\n\n // Subscribe to settings events\n useEventSubscriptions({\n 'settings:theme-changed': ({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme),\n 'settings:line-numbers-toggled': () => toggleLineNumbers(),\n });\n\n // API hooks\n const resources = useResources();\n const annotations = useAnnotations();\n const entityTypesAPI = useEntityTypes();\n const client = useApiClient();\n const token = useAuthToken();\n\n // Fetch available entity types\n const { data: entityTypesData } = entityTypesAPI.list.useQuery();\n const availableEntityTypes = (entityTypesData as { entityTypes: string[] } | undefined)?.entityTypes || [];\n\n // Set up mutation hooks\n const createResourceMutation = resources.create.useMutation();\n const updateAnnotationBodyMutation = annotations.updateBody.useMutation();\n\n // Fetch cloned resource data if in clone mode\n const { data: cloneDataResponse } = resources.getByToken.useQuery(tokenFromUrl || '');\n const createFromTokenMutation = resources.createFromToken.useMutation();\n\n // Determine mode\n const isReferenceMode = Boolean(annotationUriParam && sourceDocumentId && nameFromUrl);\n const isCloneMode = mode === 'clone' && Boolean(tokenFromUrl);\n const pageMode = isCloneMode ? 'clone' : isReferenceMode ? 'reference' : 'new';\n\n // Load cloned resource data or reference completion data\n useEffect(() => {\n const loadInitialData = async () => {\n // Handle reference completion mode\n if (isReferenceMode) {\n const entityTypes = entityTypesFromUrl ? entityTypesFromUrl.split(',') : [];\n setReferenceData({\n annotationUri: annotationUriParam!,\n sourceDocumentId: sourceDocumentId!,\n name: nameFromUrl!,\n entityTypes,\n });\n\n // Read gathered context from sessionStorage (stored by wizard)\n const contextKey = `gather-context:${annotationUriParam}`;\n const stored = sessionStorage.getItem(contextKey);\n if (stored) {\n try {\n setGatheredContext(JSON.parse(stored));\n } catch {\n // Ignore malformed context\n }\n sessionStorage.removeItem(contextKey);\n }\n\n setIsLoading(false);\n return;\n }\n\n // Handle clone mode\n if (isCloneMode && cloneDataResponse) {\n if (cloneDataResponse.sourceResource && client && token) {\n try {\n const rId = toResourceId(cloneDataResponse.sourceResource['@id']);\n const mediaType = getPrimaryMediaType(cloneDataResponse.sourceResource) || 'text/plain';\n const { data } = await client.getResourceRepresentation(rId, {\n accept: mediaType as ContentFormat,\n auth: token as AccessToken,\n });\n const content = decodeWithCharset(data, mediaType);\n\n setCloneData({\n sourceResource: cloneDataResponse.sourceResource,\n sourceContent: content,\n });\n } catch (error) {\n console.error('Failed to fetch representation:', error);\n showError('Failed to load resource representation');\n }\n } else {\n showError('Invalid or expired clone token');\n router.push('/know/discover');\n }\n setIsLoading(false);\n } else if (isCloneMode && !tokenFromUrl) {\n showError('Clone token not found. Please try cloning again.');\n router.push('/know/discover');\n } else {\n setIsLoading(false);\n }\n };\n\n loadInitialData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode, tokenFromUrl, cloneDataResponse, annotationUriParam, sourceDocumentId, nameFromUrl, entityTypesFromUrl, authToken]);\n\n // Handle save resource\n const handleSaveResource = async (params: SaveResourceParams) => {\n try {\n let newResourceId: string;\n\n if (params.mode === 'clone') {\n // Create resource from clone token with edited content\n const response = await createFromTokenMutation.mutateAsync({\n token: tokenFromUrl!,\n name: params.name,\n content: params.content!,\n archiveOriginal: params.archiveOriginal ?? true,\n });\n\n newResourceId = response.resourceId;\n } else {\n // Create a new resource with entity types\n let fileToUpload: File;\n let mimeType: string;\n\n if (params.file) {\n fileToUpload = params.file;\n mimeType = params.format ?? 'application/octet-stream';\n } else {\n const blob = new Blob([params.content || ''], { type: params.format ?? 'application/octet-stream' });\n const extension = params.format === 'text/plain' ? '.txt' : params.format === 'text/html' ? '.html' : '.md';\n fileToUpload = new File([blob], params.name + extension, { type: params.format ?? 'application/octet-stream' });\n mimeType = params.format ?? 'application/octet-stream';\n }\n\n const format = params.charset && !params.file ? `${mimeType}; charset=${params.charset}` : mimeType;\n\n const response = await createResourceMutation.mutateAsync({\n name: params.name,\n file: fileToUpload,\n format,\n entityTypes: params.entityTypes || [],\n language: params.language,\n creationMethod: 'ui',\n storageUri: params.storageUri,\n });\n\n newResourceId = response.resourceId;\n\n // If this is a reference completion, update the reference\n if (params.mode === 'reference' && params.annotationUri && params.sourceDocumentId) {\n try {\n await updateAnnotationBodyMutation.mutateAsync({\n resourceId: toResourceId(params.sourceDocumentId),\n annotationId: toAnnotationId(params.annotationUri),\n data: {\n operations: [{\n op: 'add',\n item: {\n type: 'SpecificResource',\n source: newResourceId,\n purpose: 'linking',\n },\n }],\n },\n });\n showSuccess('Reference successfully linked to the new resource');\n } catch (error) {\n console.error('Failed to update reference:', error);\n showError('Resource created but failed to update reference. You may need to manually link it.');\n }\n }\n }\n\n // Navigate to the new resource\n router.push(`/know/resource/${encodeURIComponent(newResourceId)}`);\n } catch (error) {\n console.error('Failed to save resource:', error);\n const errorMessage = error instanceof Error ? error.message : 'Failed to save resource. Please try again.';\n showError(errorMessage);\n throw error;\n }\n };\n\n // Show loading state\n if (authLoading || isLoading) {\n return (\n <ComposeLoadingState\n message={authLoading ? 'Checking authentication...' : 'Loading cloned resource...'}\n />\n );\n }\n\n // Don't render if not authenticated\n if (!isAuthenticated) {\n return null;\n }\n\n // Render the pure component\n return (\n <ResourceComposePage\n mode={pageMode}\n cloneData={cloneData}\n referenceData={referenceData}\n gatheredContext={gatheredContext}\n availableEntityTypes={availableEntityTypes}\n initialLocale={locale}\n theme={resolvedTheme}\n showLineNumbers={showLineNumbers}\n hoverDelayMs={hoverDelayMs}\n activePanel={activePanel}\n onSaveResource={handleSaveResource}\n onCancel={() => router.push('/know/discover')}\n translations={{\n title: t('title'),\n titleEditClone: t('titleEditClone'),\n titleCompleteReference: t('titleCompleteReference'),\n subtitleClone: t('subtitleClone'),\n subtitleReference: t('subtitleReference'),\n linkedNoticePrefix: t('linkedNoticePrefix'),\n resourceName: t('resourceName'),\n resourceNamePlaceholder: t('resourceNamePlaceholder'),\n entityTypes: t('entityTypes'),\n language: t('language'),\n contentSource: t('contentSource'),\n uploadFile: t('uploadFile'),\n uploadFileDescription: t('uploadFileDescription'),\n writeContent: t('writeContent'),\n writeContentDescription: t('writeContentDescription'),\n dropFileOrClick: t('dropFileOrClick'),\n supportedFormats: t('supportedFormats'),\n mediaType: t('mediaType'),\n autoDetected: t('autoDetected'),\n format: t('format'),\n content: t('content'),\n resourceContent: t('resourceContent'),\n encoding: t('encoding'),\n archiveOriginal: t('archiveOriginal'),\n cancel: t('cancel'),\n saving: t('saving'),\n creating: t('creating'),\n creatingAndLinking: t('creatingAndLinking'),\n saveClonedResource: t('saveClonedResource'),\n createAndLinkResource: t('createAndLinkResource'),\n createResource: t('createResource'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n\nexport default function ComposeResourcePage() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Compose.${k}`, p as any) as string;\n\n return (\n <Suspense fallback={<ComposeLoadingState message={t('loading')} />}>\n <ComposeResourceContent />\n </Suspense>\n );\n}\n"],"names":["ComposeResourceContent","_t","useTranslation","t","k","p","locale","useLocale","router","useRouter","searchParams","useSearchParams","isAuthenticated","authLoading","authToken","useKnowledgeBaseSession","showError","showSuccess","useToast","mode","tokenFromUrl","useEffect","annotationUriParam","sourceDocumentId","nameFromUrl","entityTypesFromUrl","isLoading","setIsLoading","useState","cloneData","setCloneData","referenceData","setReferenceData","gatheredContext","setGatheredContext","activePanel","usePanelBrowse","theme","setTheme","resolvedTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","hoverDelayMs","useHoverDelay","useEventSubscriptions","resources","useResources","annotations","useAnnotations","entityTypesAPI","useEntityTypes","client","useApiClient","token","useAuthToken","entityTypesData","availableEntityTypes","createResourceMutation","updateAnnotationBodyMutation","cloneDataResponse","createFromTokenMutation","isReferenceMode","isCloneMode","pageMode","entityTypes","contextKey","stored","rId","toResourceId","mediaType","getPrimaryMediaType","data","content","decodeWithCharset","error","handleSaveResource","params","newResourceId","fileToUpload","mimeType","blob","extension","format","toAnnotationId","errorMessage","jsx","ComposeLoadingState","ResourceComposePage","ToolbarPanels","Toolbar","ComposeResourcePage","Suspense"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as o}from"./vendor-DJo4KD8w.js";import{u as t}from"./routing-By_4TZHr.js";import"./query-B6BuIB0M.js";import"./index-XWcEpo5a.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-8x98ZAYe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-
|
|
1
|
+
{"version":3,"file":"page-8x98ZAYe.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":"sKAOA,SAAwBA,GAAc,CACpC,MAAMC,EAASC,EAAA,EAEfC,OAAAA,EAAAA,UAAU,IAAM,CACdF,EAAO,QAAQ,gBAAgB,CACjC,EAAG,CAACA,CAAM,CAAC,EAEJ,IACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as s}from"./query-B6BuIB0M.js";import{u as f,r as g}from"./vendor-DJo4KD8w.js";import{P as l,A as y}from"./index-XWcEpo5a.js";import{C as d}from"./CookiePreferences-CO_BNHwm.js";import{K as A}from"./privacy-B5TeXaed.js";import{r as h,L as x}from"./routing-vcvYfuPO.js";import{L}from"./routing-By_4TZHr.js";import{u as b}from"./i18n-BbpF47i1.js";import"./XMarkIcon-KMKD47CF.js";function D(){const{t}=b(),e=(r,o)=>t(`AuthError.${r}`,o),n=(r,o)=>t(`Footer.${r}`,o),i=(r,o)=>t(`Navigation.${r}`,o),c=(r,o)=>t(`Home.${r}`,o),[m]=f(),a=g.useContext(A),p=m.get("error")??null,u={pageTitle:e("pageTitle"),tryAgain:e("tryAgain"),errorConfiguration:e("errorConfiguration"),errorAccessDenied:e("errorAccessDenied"),errorVerification:e("errorVerification"),errorGeneric:e("errorGeneric")};return s.jsx(l,{Link:x,routes:h,t:n,tNav:i,tHome:c,CookiePreferences:d,...(a==null?void 0:a.openKeyboardHelp)&&{onOpenKeyboardHelp:a.openKeyboardHelp},className:"bg-gray-50 dark:bg-gray-900",children:s.jsx(y,{errorType:p,Link:L,translations:u})})}export{D as default};
|
|
2
|
+
//# sourceMappingURL=page-BaqIbrus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-
|
|
1
|
+
{"version":3,"file":"page-BaqIbrus.js","sources":["../../src/app/[locale]/auth/error/page.tsx"],"sourcesContent":["import { useContext } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { PageLayout, AuthErrorDisplay } from '@semiont/react-ui';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { Link as RoutingLink, routes } from '@/lib/routing';\nimport { Link } from '@/i18n/routing';\n\nexport default function AuthError() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AuthError.${k}`, p as any) as string;\n const tFooter = (k: string, p?: Record<string, unknown>) => _t(`Footer.${k}`, p as any) as string;\n const tNav = (k: string, p?: Record<string, unknown>) => _t(`Navigation.${k}`, p as any) as string;\n const tHome = (k: string, p?: Record<string, unknown>) => _t(`Home.${k}`, p as any) as string;\n const [searchParams] = useSearchParams();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n\n const errorType = searchParams.get('error') ?? null;\n\n const translations = {\n pageTitle: t('pageTitle'),\n tryAgain: t('tryAgain'),\n errorConfiguration: t('errorConfiguration'),\n errorAccessDenied: t('errorAccessDenied'),\n errorVerification: t('errorVerification'),\n errorGeneric: t('errorGeneric'),\n };\n\n return (\n <PageLayout\n Link={RoutingLink}\n routes={routes}\n t={tFooter}\n tNav={tNav}\n tHome={tHome}\n CookiePreferences={CookiePreferences}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n className=\"bg-gray-50 dark:bg-gray-900\"\n >\n <AuthErrorDisplay errorType={errorType} Link={Link} translations={translations} />\n </PageLayout>\n );\n}\n"],"names":["AuthError","_t","useTranslation","t","k","p","tFooter","tNav","tHome","searchParams","useSearchParams","keyboardContext","useContext","KeyboardShortcutsContext","errorType","translations","jsx","PageLayout","RoutingLink","routes","CookiePreferences","AuthErrorDisplay","Link"],"mappings":"kYASA,SAAwBA,GAAY,CAClC,KAAM,CAAEC,CAAG,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAWC,IAAgCJ,EAAG,aAAaG,CAAC,GAAIC,CAAQ,EAC7EC,EAAU,CAACF,EAAWC,IAAgCJ,EAAG,UAAUG,CAAC,GAAIC,CAAQ,EAChFE,EAAO,CAACH,EAAWC,IAAgCJ,EAAG,cAAcG,CAAC,GAAIC,CAAQ,EACjFG,EAAQ,CAACJ,EAAWC,IAAgCJ,EAAG,QAAQG,CAAC,GAAIC,CAAQ,EAC5E,CAACI,CAAY,EAAIC,EAAA,EACjBC,EAAkBC,EAAAA,WAAWC,CAAwB,EAErDC,EAAYL,EAAa,IAAI,OAAO,GAAK,KAEzCM,EAAe,CACnB,UAAWZ,EAAE,WAAW,EACxB,SAAUA,EAAE,UAAU,EACtB,mBAAoBA,EAAE,oBAAoB,EAC1C,kBAAmBA,EAAE,mBAAmB,EACxC,kBAAmBA,EAAE,mBAAmB,EACxC,aAAcA,EAAE,cAAc,CAAA,EAGhC,OACEa,EAAAA,IAACC,EAAA,CACC,KAAMC,EACN,OAAAC,EACA,EAAGb,EACH,KAAAC,EACA,MAAAC,EACA,kBAAAY,EACC,IAAIT,GAAA,YAAAA,EAAiB,mBAAoB,CAAE,mBAAoBA,EAAgB,gBAAA,EAChF,UAAU,8BAEV,SAAAK,EAAAA,IAACK,EAAA,CAAiB,UAAAP,EAAA,KAAsBQ,EAAY,aAAAP,CAAA,CAA4B,CAAA,CAAA,CAGtF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as t}from"./query-B6BuIB0M.js";import{r as n}from"./vendor-DJo4KD8w.js";import{S as m,b as a}from"./index-XWcEpo5a.js";import{u as c}from"./routing-By_4TZHr.js";import{u as l}from"./i18n-BbpF47i1.js";const f=5e3;function j(){const{t:s}=l(),r=u=>s(`Home.${u}`),i=c(),e=n.useRef(null),o=()=>{e.current&&clearTimeout(e.current),i.push("/know/discover")};return n.useEffect(()=>(e.current=setTimeout(o,f),()=>{e.current&&clearTimeout(e.current)}),[]),t.jsxs("main",{role:"main",style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"100vh",gap:"2rem"},children:[t.jsx(m,{t:r,size:"xl",animated:!0}),t.jsx("button",{onClick:o,className:a.primary.base,children:r("begin")})]})}export{j as default};
|
|
2
|
+
//# sourceMappingURL=page-BfhPRgzq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-
|
|
1
|
+
{"version":3,"file":"page-BfhPRgzq.js","sources":["../../src/app/[locale]/page.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { SemiontBranding, buttonStyles } from '@semiont/react-ui';\nimport { useRouter } from '@/i18n/routing';\n\nconst AUTO_TRANSITION_MS = 5000;\n\nexport default function Home() {\n const { t: _t } = useTranslation();\n const t = (k: string) => _t(`Home.${k}`) as string;\n const router = useRouter();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const goToWorkspace = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n router.push('/know/discover');\n };\n\n useEffect(() => {\n timerRef.current = setTimeout(goToWorkspace, AUTO_TRANSITION_MS);\n return () => { if (timerRef.current) clearTimeout(timerRef.current); };\n }, []);\n\n return (\n <main\n role=\"main\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n gap: '2rem',\n }}\n >\n <SemiontBranding t={t} size=\"xl\" animated={true} />\n <button onClick={goToWorkspace} className={buttonStyles.primary.base}>\n {t('begin')}\n </button>\n </main>\n );\n}\n"],"names":["AUTO_TRANSITION_MS","Home","_t","useTranslation","t","k","router","useRouter","timerRef","useRef","goToWorkspace","useEffect","jsxs","jsx","SemiontBranding","buttonStyles"],"mappings":"iNAKA,MAAMA,EAAqB,IAE3B,SAAwBC,GAAO,CAC7B,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAKC,GAAcH,EAAG,QAAQG,CAAC,EAAE,EACjCC,EAASC,EAAA,EACTC,EAAWC,EAAAA,OAA6C,IAAI,EAE5DC,EAAgB,IAAM,CACtBF,EAAS,SAAS,aAAaA,EAAS,OAAO,EACnDF,EAAO,KAAK,gBAAgB,CAC9B,EAEAK,OAAAA,EAAAA,UAAU,KACRH,EAAS,QAAU,WAAWE,EAAeV,CAAkB,EACxD,IAAM,CAAMQ,EAAS,SAAS,aAAaA,EAAS,OAAO,CAAG,GACpE,CAAA,CAAE,EAGHI,EAAAA,KAAC,OAAA,CACC,KAAK,OACL,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,UAAW,QACX,IAAK,MAAA,EAGP,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAgB,EAAAV,EAAM,KAAK,KAAK,SAAU,GAAM,EACjDS,EAAAA,IAAC,SAAA,CAAO,QAASH,EAAe,UAAWK,EAAa,QAAQ,KAC7D,SAAAX,EAAE,OAAO,CAAA,CACZ,CAAA,CAAA,CAAA,CAGN"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{j as i}from"./query-B6BuIB0M.js";import{r as x}from"./vendor-DJo4KD8w.js";import{a as j,L as u}from"./routing-By_4TZHr.js";import{P as f}from"./index-XWcEpo5a.js";import{C as b}from"./CookiePreferences-CO_BNHwm.js";import{K as T}from"./privacy-B5TeXaed.js";import{r as v,L as y}from"./routing-vcvYfuPO.js";import{u as l}from"./i18n-BbpF47i1.js";import"./XMarkIcon-KMKD47CF.js";function I(){const{t:a}=l(),e=(t,s)=>a(`Terms.${t}`,s),{t:r}=l(),c=(t,s)=>r(`Footer.${t}`,s),{t:o}=l(),p=(t,s)=>o(`Navigation.${t}`,s),{t:d}=l(),h=(t,s)=>d(`Home.${t}`,s),m=j(),n=x.useContext(T);return i.jsx(f,{Link:y,routes:v,t:c,tNav:p,tHome:h,CookiePreferences:b,...(n==null?void 0:n.openKeyboardHelp)&&{onOpenKeyboardHelp:n.openKeyboardHelp},className:"semiont-static-page",children:i.jsx("div",{className:"semiont-static-container",children:i.jsxs("div",{className:"semiont-static-content",children:[i.jsxs("header",{className:"semiont-static-header",children:[i.jsx("h1",{className:"semiont-static-title",children:e("pageTitle")}),i.jsx("p",{className:"semiont-static-subtitle",children:e("pageSubtitle")})]}),i.jsxs("article",{className:"semiont-static-article",children:[i.jsx("h2",{children:e("aupTitle")}),i.jsx("p",{children:e("aup")}),i.jsx("h3",{children:e("prohibitedTitle")}),i.jsx("p",{children:e("prohibitedIntro")}),i.jsx("ul",{children:e("prohibited").split(`
|
|
2
|
+
`).map((t,s)=>i.jsx("li",{children:t},s))}),i.jsx("h3",{children:e("aiAllianceTitle")}),i.jsxs("p",{children:[e("aiAllianceIntro")," ",i.jsx("a",{href:"https://ai-alliance.cdn.prismic.io/ai-alliance/Zl-MG5m069VX1dgH_AIAllianceCodeofConduct.pdf",target:"_blank",rel:"noopener noreferrer",className:"semiont-static-link",children:e("aiAllianceLink")}),e("aiAllianceIncludes")]}),i.jsx("ul",{children:e("aiAlliance").split(`
|
|
3
|
+
`).map((t,s)=>i.jsx("li",{children:t},s))}),i.jsx("h3",{children:e("responsibilitiesTitle")}),i.jsx("p",{children:e("responsibilitiesIntro")}),i.jsx("ul",{children:e("responsibilities").split(`
|
|
4
|
+
`).map((t,s)=>i.jsx("li",{children:t},s))}),i.jsx("h3",{children:e("moderationTitle")}),i.jsx("p",{children:e("moderation")}),i.jsx("h3",{children:e("privacyTitle")}),i.jsxs("p",{children:[e("privacy").split(e("privacyLink"))[0],i.jsx(u,{to:`/${m}/privacy`,className:"semiont-static-link",children:e("privacyLink")}),e("privacy").split(e("privacyLink"))[1]]}),i.jsx("h3",{children:e("ipTitle")}),i.jsx("p",{children:e("ip")}),i.jsx("h3",{children:e("liabilityTitle")}),i.jsx("p",{children:e("liability")}),i.jsx("h3",{children:e("changesTitle")}),i.jsx("p",{children:e("changes")}),i.jsx("h3",{children:e("contactTitle")}),i.jsx("p",{children:e("contact")}),i.jsx("footer",{className:"semiont-static-footer",children:i.jsx("p",{children:e("lastUpdated",{date:new Date().toLocaleDateString()})})})]})]})})})}export{I as default};
|
|
5
|
+
//# sourceMappingURL=page-Bht4dePL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-
|
|
1
|
+
{"version":3,"file":"page-Bht4dePL.js","sources":["../../src/app/[locale]/terms/page.tsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport { Link } from '@/i18n/routing';\nimport { useTranslation } from 'react-i18next';\nimport { useLocale } from '@/i18n/routing';\nimport { PageLayout } from '@semiont/react-ui';\nimport { CookiePreferences } from '@/components/CookiePreferences';\nimport { KeyboardShortcutsContext } from '@/contexts/KeyboardShortcutsContext';\nimport { Link as RoutingLink, routes } from '@/lib/routing';\n\nexport default function TermsOfService() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Terms.${k}`, p as any) as string;\n const { t: _tFooter } = useTranslation();\n const tFooter = (k: string, p?: Record<string, unknown>) => _tFooter(`Footer.${k}`, p as any) as string;\n const { t: _tNav } = useTranslation();\n const tNav = (k: string, p?: Record<string, unknown>) => _tNav(`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 locale = useLocale();\n const keyboardContext = useContext(KeyboardShortcutsContext);\n\n return (\n <PageLayout\n Link={RoutingLink}\n routes={routes}\n t={tFooter}\n tNav={tNav}\n tHome={tHome}\n CookiePreferences={CookiePreferences}\n {...(keyboardContext?.openKeyboardHelp && { onOpenKeyboardHelp: keyboardContext.openKeyboardHelp })}\n className=\"semiont-static-page\"\n >\n <div className=\"semiont-static-container\">\n <div className=\"semiont-static-content\">\n <header className=\"semiont-static-header\">\n <h1 className=\"semiont-static-title\">\n {t('pageTitle')}\n </h1>\n <p className=\"semiont-static-subtitle\">\n {t('pageSubtitle')}\n </p>\n </header>\n\n <article className=\"semiont-static-article\">\n <h2>{t('aupTitle')}</h2>\n\n <p>\n {t('aup')}\n </p>\n\n <h3>{t('prohibitedTitle')}</h3>\n <p>{t('prohibitedIntro')}</p>\n <ul>\n {t('prohibited').split('\\n').map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n\n <h3>{t('aiAllianceTitle')}</h3>\n <p>\n {t('aiAllianceIntro')}{' '}\n <a\n href=\"https://ai-alliance.cdn.prismic.io/ai-alliance/Zl-MG5m069VX1dgH_AIAllianceCodeofConduct.pdf\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"semiont-static-link\"\n >\n {t('aiAllianceLink')}\n </a>\n {t('aiAllianceIncludes')}\n </p>\n <ul>\n {t('aiAlliance').split('\\n').map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n\n <h3>{t('responsibilitiesTitle')}</h3>\n <p>{t('responsibilitiesIntro')}</p>\n <ul>\n {t('responsibilities').split('\\n').map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n\n <h3>{t('moderationTitle')}</h3>\n <p>\n {t('moderation')}\n </p>\n\n <h3>{t('privacyTitle')}</h3>\n <p>\n {t('privacy').split(t('privacyLink'))[0]}\n <Link to={`/${locale}/privacy`} className=\"semiont-static-link\">\n {t('privacyLink')}\n </Link>\n {t('privacy').split(t('privacyLink'))[1]}\n </p>\n\n <h3>{t('ipTitle')}</h3>\n <p>\n {t('ip')}\n </p>\n\n <h3>{t('liabilityTitle')}</h3>\n <p>\n {t('liability')}\n </p>\n\n <h3>{t('changesTitle')}</h3>\n <p>\n {t('changes')}\n </p>\n\n <h3>{t('contactTitle')}</h3>\n <p>\n {t('contact')}\n </p>\n\n <footer className=\"semiont-static-footer\">\n <p>\n {t('lastUpdated', { date: new Date().toLocaleDateString() })}\n </p>\n </footer>\n </article>\n\n </div>\n </div>\n </PageLayout>\n );\n}"],"names":["TermsOfService","_t","useTranslation","t","k","p","_tFooter","tFooter","_tNav","tNav","_tHome","tHome","locale","useLocale","keyboardContext","useContext","KeyboardShortcutsContext","jsx","PageLayout","RoutingLink","routes","CookiePreferences","jsxs","item","i","Link"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as S}from"./query-B6BuIB0M.js";import{r as b}from"./vendor-DJo4KD8w.js";import{u as P,L as w}from"./routing-By_4TZHr.js";import{u as v,c as C,d as U,W as R,P as I}from"./index-XWcEpo5a.js";import{u as L}from"./i18n-BbpF47i1.js";function B(){var m;const{t:h}=L(),e=(c,n)=>h(`AuthWelcome.${c}`,n),{isAuthenticated:o,isLoading:r,user:s,activeKnowledgeBase:a,signOut:A}=v(),i=P(),[g,T]=b.useState(!1),f=C(),p=U(),{data:t}=p.me.useQuery(),l=p.acceptTerms.useMutation();b.useEffect(()=>{if(!r){if(!o){i.push("/auth/connect");return}if(t!=null&&t.termsAcceptedAt){i.push("/");return}if(o&&t!==void 0&&(t!=null&&t.termsAcceptedAt)){i.push("/");return}}},[r,o,i,t]);const d=async c=>{if(!c){a&&A(a.id),i.push("/");return}try{await l.mutateAsync(),T(!0),setTimeout(()=>{i.push("/")},1e3)}catch(n){console.error("Terms acceptance error:",n),f.showError(e("errorAcceptingTerms"))}},y=r?"loading":g?"accepted":"form",u=((m=s==null?void 0:s.name)==null?void 0:m.split(" ")[0])??"";return S.jsx(R,{userName:u,termsAcceptedAt:(t==null?void 0:t.termsAcceptedAt)??null,isNewUser:!(t!=null&&t.termsAcceptedAt),status:y,isProcessing:l.isPending,onAccept:()=>d(!0),onDecline:()=>d(!1),translations:{loading:e("loading"),welcomeTitle:e("welcomeTitle"),thanksForAccepting:e("thanksForAccepting"),welcomeUser:e("welcomeUser",{firstName:u}),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:I,Link:w})}export{B as default};
|
|
2
|
+
//# sourceMappingURL=page-BtqPeWyh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-BtqPeWyh.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, useAuthApi, useKnowledgeBaseSession } from '@semiont/react-ui';\nimport { WelcomePage } 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 { isAuthenticated, isLoading, user, activeKnowledgeBase, signOut } = useKnowledgeBaseSession();\n const router = useRouter();\n const [termsAccepted, setTermsAccepted] = useState(false);\n const toast = useToast();\n\n // API hooks\n const authAPI = useAuthApi();\n\n // Query user data to check if terms already accepted\n const { data: userData } = authAPI.me.useQuery();\n\n // Mutation for accepting terms\n const acceptTermsMutation = authAPI.acceptTerms.useMutation();\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 // Check if user has accepted terms\n if (userData?.termsAcceptedAt) {\n router.push('/');\n return;\n }\n\n // If terms already accepted, redirect to main app\n if (isAuthenticated && userData !== undefined && userData?.termsAcceptedAt) {\n router.push('/');\n return;\n }\n }, [isLoading, isAuthenticated, router, userData]);\n\n const handleTermsAcceptance = async (accepted: boolean) => {\n if (!accepted) {\n // User declined terms - sign out of the active KB and redirect to home\n if (activeKnowledgeBase) {\n signOut(activeKnowledgeBase.id);\n }\n router.push('/');\n return;\n }\n\n try {\n await acceptTermsMutation.mutateAsync();\n setTermsAccepted(true);\n\n // Small delay to show the acceptance state\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 // Determine status\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={acceptTermsMutation.isPending}\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","p","isAuthenticated","isLoading","user","activeKnowledgeBase","signOut","useKnowledgeBaseSession","router","useRouter","termsAccepted","setTermsAccepted","useState","toast","useToast","authAPI","useAuthApi","userData","acceptTermsMutation","useEffect","handleTermsAcceptance","accepted","error","pageStatus","firstName","_a","jsx","WelcomePage","PageLayout","Link"],"mappings":"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"}
|