@semiont/cli 0.5.4 → 0.5.5

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.
Files changed (75) hide show
  1. package/dist/cli.mjs +27 -12
  2. package/dist/frontend/dist/assets/{CookiePreferences-CMgprW9V.js → CookiePreferences-Vt05bBY7.js} +2 -2
  3. package/dist/frontend/dist/assets/{CookiePreferences-CMgprW9V.js.map → CookiePreferences-Vt05bBY7.js.map} +1 -1
  4. package/dist/frontend/dist/assets/{KeyboardShortcutsContext-BRLeqQUj.js → KeyboardShortcutsContext-CK7NFEft.js} +2 -2
  5. package/dist/frontend/dist/assets/{KeyboardShortcutsContext-BRLeqQUj.js.map → KeyboardShortcutsContext-CK7NFEft.js.map} +1 -1
  6. package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CN3C3S55-DsCya3j0.js → PdfAnnotationCanvas.client-CN3C3S55-DZ2osbg-.js} +2 -2
  7. package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CN3C3S55-DsCya3j0.js.map → PdfAnnotationCanvas.client-CN3C3S55-DZ2osbg-.js.map} +1 -1
  8. package/dist/frontend/dist/assets/{ToolbarPanels-CRGQDX-L.js → ToolbarPanels-wzZqAqCQ.js} +2 -2
  9. package/dist/frontend/dist/assets/{ToolbarPanels-CRGQDX-L.js.map → ToolbarPanels-wzZqAqCQ.js.map} +1 -1
  10. package/dist/frontend/dist/assets/{client-DvALJ3DL.js → client-C54EWgTc.js} +2 -2
  11. package/dist/frontend/dist/assets/{client-DvALJ3DL.js.map → client-C54EWgTc.js.map} +1 -1
  12. package/dist/frontend/dist/assets/{client-uEoQ8iJO.js → client-D5yyxFbt.js} +2 -2
  13. package/dist/frontend/dist/assets/{client-uEoQ8iJO.js.map → client-D5yyxFbt.js.map} +1 -1
  14. package/dist/frontend/dist/assets/{client-DkMJxPA7.js → client-DgzjF497.js} +2 -2
  15. package/dist/frontend/dist/assets/{client-DkMJxPA7.js.map → client-DgzjF497.js.map} +1 -1
  16. package/dist/frontend/dist/assets/{client-DxlEW_QJ.js → client-myF3ozNf.js} +2 -2
  17. package/dist/frontend/dist/assets/{client-DxlEW_QJ.js.map → client-myF3ozNf.js.map} +1 -1
  18. package/dist/frontend/dist/assets/{index-DjtRDlfn.js → index-DojEUBpq.js} +6 -6
  19. package/dist/frontend/dist/assets/index-DojEUBpq.js.map +1 -0
  20. package/dist/frontend/dist/assets/{layout-xDEqzpvE.js → layout-CpxxVgZl.js} +2 -2
  21. package/dist/frontend/dist/assets/{layout-xDEqzpvE.js.map → layout-CpxxVgZl.js.map} +1 -1
  22. package/dist/frontend/dist/assets/{layout-BhnmJA6O.js → layout-DGddEk2F.js} +2 -2
  23. package/dist/frontend/dist/assets/{layout-BhnmJA6O.js.map → layout-DGddEk2F.js.map} +1 -1
  24. package/dist/frontend/dist/assets/{layout-e6QyrD0Y.js → layout-WUjhuEFR.js} +2 -2
  25. package/dist/frontend/dist/assets/{layout-e6QyrD0Y.js.map → layout-WUjhuEFR.js.map} +1 -1
  26. package/dist/frontend/dist/assets/{layout-DolG9tOf.js → layout-osn4jTJF.js} +2 -2
  27. package/dist/frontend/dist/assets/{layout-DolG9tOf.js.map → layout-osn4jTJF.js.map} +1 -1
  28. package/dist/frontend/dist/assets/{not-found-4iuCkpA7.js → not-found-CXjr3aHk.js} +2 -2
  29. package/dist/frontend/dist/assets/{not-found-4iuCkpA7.js.map → not-found-CXjr3aHk.js.map} +1 -1
  30. package/dist/frontend/dist/assets/{page-DVCVvH_S.js → page-3_orURnj.js} +2 -2
  31. package/dist/frontend/dist/assets/{page-DVCVvH_S.js.map → page-3_orURnj.js.map} +1 -1
  32. package/dist/frontend/dist/assets/{page-CXhfUrZM.js → page-A0bP7R9_.js} +2 -2
  33. package/dist/frontend/dist/assets/{page-CXhfUrZM.js.map → page-A0bP7R9_.js.map} +1 -1
  34. package/dist/frontend/dist/assets/{page-BrSlkHj9.js → page-BXDwcCLI.js} +2 -2
  35. package/dist/frontend/dist/assets/{page-BrSlkHj9.js.map → page-BXDwcCLI.js.map} +1 -1
  36. package/dist/frontend/dist/assets/{page-D0bYoQZI.js → page-CR97hIaP.js} +2 -2
  37. package/dist/frontend/dist/assets/{page-D0bYoQZI.js.map → page-CR97hIaP.js.map} +1 -1
  38. package/dist/frontend/dist/assets/{page-C5gTlI4M.js → page-ClOO6d4L.js} +2 -2
  39. package/dist/frontend/dist/assets/{page-C5gTlI4M.js.map → page-ClOO6d4L.js.map} +1 -1
  40. package/dist/frontend/dist/assets/{page-8sXDEos5.js → page-CoU19X7P.js} +2 -2
  41. package/dist/frontend/dist/assets/{page-8sXDEos5.js.map → page-CoU19X7P.js.map} +1 -1
  42. package/dist/frontend/dist/assets/{page-CXVPWK3i.js → page-Crea7MLa.js} +2 -2
  43. package/dist/frontend/dist/assets/{page-CXVPWK3i.js.map → page-Crea7MLa.js.map} +1 -1
  44. package/dist/frontend/dist/assets/{page-7cCGgkUd.js → page-D3vt40lt.js} +2 -2
  45. package/dist/frontend/dist/assets/{page-7cCGgkUd.js.map → page-D3vt40lt.js.map} +1 -1
  46. package/dist/frontend/dist/assets/{page-6YupxiP8.js → page-D74-p81B.js} +2 -2
  47. package/dist/frontend/dist/assets/{page-6YupxiP8.js.map → page-D74-p81B.js.map} +1 -1
  48. package/dist/frontend/dist/assets/{page-CkHE2rPM.js → page-D9VjQ4Ci.js} +2 -2
  49. package/dist/frontend/dist/assets/{page-CkHE2rPM.js.map → page-D9VjQ4Ci.js.map} +1 -1
  50. package/dist/frontend/dist/assets/{page-BioSV21A.js → page-DAaiG0_S.js} +2 -2
  51. package/dist/frontend/dist/assets/{page-BioSV21A.js.map → page-DAaiG0_S.js.map} +1 -1
  52. package/dist/frontend/dist/assets/{page-BOhOKDMk.js → page-DGGXDS8h.js} +2 -2
  53. package/dist/frontend/dist/assets/{page-BOhOKDMk.js.map → page-DGGXDS8h.js.map} +1 -1
  54. package/dist/frontend/dist/assets/{page-A6_MoyUb2.js → page-DWTT4pP82.js} +2 -2
  55. package/dist/frontend/dist/assets/{page-A6_MoyUb2.js.map → page-DWTT4pP82.js.map} +1 -1
  56. package/dist/frontend/dist/assets/{page-D1veR3Kp.js → page-Db8QDovL.js} +2 -2
  57. package/dist/frontend/dist/assets/{page-D1veR3Kp.js.map → page-Db8QDovL.js.map} +1 -1
  58. package/dist/frontend/dist/assets/{page-DbwiMF1N.js → page-V3GB89Xa.js} +2 -2
  59. package/dist/frontend/dist/assets/{page-DbwiMF1N.js.map → page-V3GB89Xa.js.map} +1 -1
  60. package/dist/frontend/dist/assets/{page-Bl8sZu8k.js → page-pid5J2JR.js} +2 -2
  61. package/dist/frontend/dist/assets/{page-Bl8sZu8k.js.map → page-pid5J2JR.js.map} +1 -1
  62. package/dist/frontend/dist/assets/{page-D6oe9LkY.js → page-vxSCIznX.js} +2 -2
  63. package/dist/frontend/dist/assets/{page-D6oe9LkY.js.map → page-vxSCIznX.js.map} +1 -1
  64. package/dist/frontend/dist/assets/{page-B9EYfbrY.js → page-yaV9evoV.js} +2 -2
  65. package/dist/frontend/dist/assets/{page-B9EYfbrY.js.map → page-yaV9evoV.js.map} +1 -1
  66. package/dist/frontend/dist/assets/{routing-DW1ehi64.js → routing-CcetIVef.js} +2 -2
  67. package/dist/frontend/dist/assets/{routing-DW1ehi64.js.map → routing-CcetIVef.js.map} +1 -1
  68. package/dist/frontend/dist/assets/{routing-Bcj1FhkC.js → routing-Dqgz2rV4.js} +2 -2
  69. package/dist/frontend/dist/assets/{routing-Bcj1FhkC.js.map → routing-Dqgz2rV4.js.map} +1 -1
  70. package/dist/frontend/dist/assets/{web-Dr6mdA1A.js → web-DAgGdiC_.js} +2 -2
  71. package/dist/frontend/dist/assets/{web-Dr6mdA1A.js.map → web-DAgGdiC_.js.map} +1 -1
  72. package/dist/frontend/dist/index.html +1 -1
  73. package/dist/frontend/package.json +1 -1
  74. package/package.json +8 -8
  75. package/dist/frontend/dist/assets/index-DjtRDlfn.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{$ as i,G as a,H as o,J as s,Ot as c,Q as l,T as u,W as d,Z as f,_ as p,ct as m,dt as h,ft as g,o as _,ot as v,pt as y,q as b,tt as x,ut as S}from"./index-DjtRDlfn.js";import{n as C,t as w}from"./XMarkIcon-CddZGiiz.js";import{i as T,n as E,r as D}from"./routing-Bcj1FhkC.js";var O=e(t());function k({title:e,titleId:t,...n},r){return O.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?O.createElement(`title`,{id:t},e):null,O.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9`}))}var A=O.forwardRef(k);function j({title:e,titleId:t,...n},r){return O.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?O.createElement(`title`,{id:t},e):null,O.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m4.5 12.75 6 6 9-13.5`}))}var M=O.forwardRef(j);function N({title:e,titleId:t,...n},r){return O.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?O.createElement(`title`,{id:t},e):null,O.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 4.5v15m7.5-7.5h-15`}))}var P=O.forwardRef(N),F=r(),I=`data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==`;function L(){let{t:e}=n(),t=(t,n)=>e(`UserPanel.${t}`,n),r=v(),s=f(r.activeSession$),c=f(s?.user$)??null,l=s?.kb??null,u=c?.name??c?.email?.split(`@`)[0]??`User`,p=c?.image??null,m=c?.domain||c?.email?.split(`@`)[1],h=c?.isAdmin??!1,g=c?.isModerator??!1,_=s?.client,y=x(()=>o(_)),b=T(),[S,C]=(0,O.useState)(!1),{timeRemaining:w}=i(),E=d(w)??`Unknown`,D=!p||S?I:a(p)||(console.warn(`Invalid profile image URL detected, using fallback`),I);return(0,F.jsxs)(`div`,{className:`semiont-user-panel`,children:[(0,F.jsx)(`h3`,{className:`semiont-user-panel__title`,children:t(`account`)}),l&&(0,F.jsx)(`div`,{style:{padding:`0 0.75rem 0.5rem`,fontSize:`0.8rem`,color:`var(--semiont-color-neutral-400)`},children:l.label}),(0,F.jsxs)(`div`,{className:`space-y-4`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,F.jsx)(`img`,{src:D,alt:t(`profileAlt`,{name:u||t(`user`)}),width:48,height:48,className:`w-12 h-12 rounded-full object-cover`,onError:()=>C(!0)}),(0,F.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,F.jsx)(`div`,{className:`semiont-panel-text`,children:u||t(`user`)}),m&&(0,F.jsxs)(`div`,{className:`semiont-panel-text-secondary`,children:[`@`,m]})]})]}),(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`label`,{className:`semiont-panel-label`,children:t(`session`)}),(0,F.jsx)(`div`,{className:`semiont-session-box`,children:(0,F.jsx)(`div`,{className:`semiont-panel-hint`,children:t(`expiresIn`,{time:E})})})]}),(h||g)&&(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`label`,{className:`semiont-panel-label`,children:t(`privileges`)}),(0,F.jsxs)(`div`,{className:`space-y-1`,children:[h&&(0,F.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--admin`,children:(0,F.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`administrator`)})}),g&&(0,F.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--moderator`,children:(0,F.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`moderator`)})})]})]}),(0,F.jsx)(`div`,{className:`semiont-panel-divider`,children:(0,F.jsx)(`button`,{onClick:async()=>{await y.logout(),l&&await r.signOut(l.id),b.push(`/`)},className:`semiont-signout-button`,children:t(`signOut`)})})]})]})}var R={authenticated:`var(--semiont-color-success-500, #22c55e)`,expired:`var(--semiont-color-warning-500, #eab308)`,"signed-out":`var(--semiont-color-neutral-400, #9ca3af)`,unreachable:`var(--semiont-color-error-500, #ef4444)`},z={authenticated:`statusConnected`,expired:`statusExpired`,"signed-out":`statusSignedOut`,unreachable:`statusUnreachable`};function B({status:e,t}){return(0,F.jsx)(`span`,{title:t(z[e]),style:{width:`0.5rem`,height:`0.5rem`,borderRadius:`50%`,backgroundColor:R[e],flexShrink:0}})}function V({t:e,onSubmit:t,onCancel:n,error:r,isSubmitting:i,autoFocus:a,pulsing:o,initialHost:s=`localhost`,initialPort:c=4e3,initialEmail:l=`admin@example.com`}){let[u,d]=(0,O.useState)(s),[f,p]=(0,O.useState)(String(c)),[m,g]=(0,O.useState)(S(s)),[_,v]=(0,O.useState)(l),[y,b]=(0,O.useState)(``),x=e=>{d(e),g(S(e))};return(0,F.jsxs)(`div`,{className:o?`semiont-panel__login-form--pulsing`:``,style:{margin:`0.5rem`,padding:`0.75rem`,border:`1px solid var(--semiont-color-neutral-200, #e5e7eb)`,borderRadius:`var(--semiont-panel-border-radius, 0.5rem)`,background:`var(--semiont-bg-secondary, transparent)`},children:[(0,F.jsx)(`h3`,{style:{fontSize:`0.8rem`,fontWeight:600,marginBottom:`0.5rem`},children:e(`connectTitle`)}),(0,F.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),h(u)&&t(u,parseInt(f,10)||4e3,m,_,y)},style:{display:`flex`,flexDirection:`column`,gap:`0.5rem`},children:[(0,F.jsxs)(`select`,{value:m,onChange:e=>g(e.target.value),className:`semiont-input`,children:[(0,F.jsx)(`option`,{value:`http`,children:`HTTP`}),(0,F.jsx)(`option`,{value:`https`,children:`HTTPS`})]}),(0,F.jsx)(`input`,{type:`text`,value:u,onChange:e=>x(e.target.value),placeholder:`Host`,className:`semiont-input`,autoFocus:a}),(0,F.jsx)(`input`,{type:`number`,value:f,onChange:e=>p(e.target.value),placeholder:`Port`,className:`semiont-input`}),u&&!h(u)&&(0,F.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:e(`invalidHost`)}),(0,F.jsx)(`input`,{type:`email`,value:_,onChange:e=>v(e.target.value),placeholder:`Email`,className:`semiont-input`}),(0,F.jsx)(`input`,{type:`password`,value:y,onChange:e=>b(e.target.value),placeholder:`Password`,className:`semiont-input`}),r&&(0,F.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:r}),(0,F.jsxs)(`div`,{style:{display:`flex`,gap:`0.5rem`},children:[(0,F.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1},disabled:i||!h(u),children:e(i?`connecting`:`connect`)}),(0,F.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:n,children:(0,F.jsx)(w,{style:{width:`1rem`,height:`1rem`}})})]})]})]})}function H({t:e,kb:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a}){let[o,s]=(0,O.useState)(``);return(0,F.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),n(o)},style:{padding:`0.5rem 0.75rem`,display:`flex`,flexDirection:`column`,gap:`0.375rem`},children:[(0,F.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--semiont-color-neutral-400)`},children:t.email}),(0,F.jsx)(`input`,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:`Password`,className:`semiont-input`,style:{fontSize:`0.8rem`},autoFocus:!0}),i&&(0,F.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,F.jsxs)(`div`,{style:{display:`flex`,gap:`0.375rem`},children:[(0,F.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1,fontSize:`0.8rem`},disabled:a,children:e(a?`signingIn`:`signIn`)}),(0,F.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,style:{fontSize:`0.8rem`},children:e(`cancel`)})]})]})}async function U(e,t,n,r,i){let a=new y({baseUrl:c(`${n}://${e}:${t}`)}),o=new m(a,new g(a),a),s=await o.auth.password(r,i),l=s.token??s.accessToken,u=s.refreshToken;if(!l)throw Error(`No access token received`);if(!u)throw Error(`No refresh token received`);let d=`${e}:${t}`,f;try{let e=await o.admin.status();e.projectName&&(d=e.projectName),e.gitBranch&&(f=e.gitBranch)}catch{}return{token:l,refreshToken:u,label:d,...f?{gitBranch:f}:{}}}function W(){let{t:e}=n(),t=(t,n)=>e(`KnowledgeBasePanel.${t}`,n),r=v(),i=f(r.kbs$)??[],a=f(r.activeSession$)?.kb??null,o=e=>{r.setActiveKb(e)},s=r.addKb.bind(r),c=r.removeKb.bind(r),l=r.updateKb.bind(r),u=(e,t,n)=>{r.signIn(e,t,n)},d=e=>{r.signOut(e)},[p,m]=(0,O.useState)(!1),[h,g]=(0,O.useState)(null),[_,y]=(0,O.useState)(!1),[b,x]=(0,O.useState)(null),[S,w]=(0,O.useState)(null),[T,E]=(0,O.useState)(!1),[D,k]=(0,O.useState)(null),[,j]=(0,O.useState)(0);(0,O.useEffect)(()=>{i.length===0&&m(!0)},[i.length]),(0,O.useEffect)(()=>{let e=setInterval(()=>j(e=>e+1),3e4);return()=>clearInterval(e)},[]);let N=()=>{m(!0),x(null),g(null)},I=async(e,t,n,r,a)=>{g(null),y(!0);let o=i.find(n=>n.endpoint.kind===`http`&&n.endpoint.host===e&&n.endpoint.port===t);if(o){try{let{token:i,refreshToken:s,gitBranch:c}=await U(e,t,n,r,a);l(o.id,{...c?{gitBranch:c}:{}}),u(o.id,i,s),m(!1)}catch(e){g(e instanceof Error?e.message:String(e))}finally{y(!1)}return}try{let{token:i,refreshToken:o,label:c,gitBranch:l}=await U(e,t,n,r,a);s({label:c,email:r,endpoint:{kind:`http`,host:e,port:t,protocol:n},...l?{gitBranch:l}:{}},i,o),m(!1)}catch(e){g(e instanceof Error?e.message:String(e))}finally{y(!1)}},L=async(e,t)=>{let n=i.find(t=>t.id===e);if(n){if(w(null),E(!0),n.endpoint.kind!==`http`){w(`Re-auth is HTTP-only; KB endpoint kind "${n.endpoint.kind}" is not supported here.`),E(!1);return}try{let{token:r,refreshToken:i,label:a,gitBranch:o}=await U(n.endpoint.host,n.endpoint.port,n.endpoint.protocol,n.email,t);l(e,{label:a,...o?{gitBranch:o}:{}}),u(e,r,i),x(null)}catch(e){w(e instanceof Error?e.message:String(e))}finally{E(!1)}}},R=e=>{r.getKbSessionStatus(e.id)===`authenticated`?o(e.id):(x(e.id),m(!1),w(null))};return(0,F.jsxs)(`div`,{className:`semiont-panel`,children:[(0,F.jsx)(`div`,{className:`semiont-panel-header`,children:(0,F.jsxs)(`h2`,{className:`semiont-panel-header__title`,children:[(0,F.jsx)(`span`,{className:`semiont-panel-header__text`,children:t(`title`)}),(0,F.jsxs)(`span`,{className:`semiont-panel-header__count`,children:[`(`,i.length,`)`]})]})}),(0,F.jsxs)(`div`,{className:`semiont-panel__content`,children:[(0,F.jsx)(`div`,{className:`semiont-panel__list`,children:i.map(e=>{let n=r.getKbSessionStatus(e.id),i=e.id===a?.id,o=b===e.id;return(0,F.jsxs)(`div`,{children:[(0,F.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable${i?` semiont-panel-item--selected`:``}`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>R(e),children:[(0,F.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,F.jsx)(B,{status:n,t}),(0,F.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.label}),i&&(0,F.jsx)(M,{style:{width:`1rem`,height:`1rem`,color:`var(--semiont-color-primary-500)`,flexShrink:0}}),n===`authenticated`&&(0,F.jsx)(`button`,{onClick:t=>{t.stopPropagation(),d(e.id)},title:t(`signOut`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,F.jsx)(A,{style:{width:`0.875rem`,height:`0.875rem`}})}),(0,F.jsx)(`button`,{onClick:t=>{t.stopPropagation(),k(e.id)},title:t(`remove`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,F.jsx)(C,{style:{width:`0.875rem`,height:`0.875rem`}})})]}),(0,F.jsxs)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:[e.endpoint.kind===`http`?`${e.endpoint.host}:${e.endpoint.port}`:`local:${e.endpoint.kbId}`,e.gitBranch?` · ${e.gitBranch}`:``]})]}),D===e.id&&(0,F.jsxs)(`div`,{style:{padding:`0.5rem 0.75rem`,fontSize:`0.8rem`,display:`flex`,alignItems:`center`,gap:`0.5rem`,background:`var(--semiont-bg-secondary, #f9fafb)`,borderBottom:`1px solid var(--semiont-color-neutral-200, #e5e7eb)`},children:[(0,F.jsx)(`span`,{style:{flex:1,color:`var(--semiont-color-neutral-500)`},children:t(`removeConfirm`,{label:e.label})}),(0,F.jsx)(`button`,{onClick:()=>{c(e.id),k(null)},className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`,color:`var(--semiont-color-error-500, #ef4444)`},children:t(`remove`)}),(0,F.jsx)(`button`,{onClick:()=>k(null),className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`},children:t(`cancel`)})]}),o&&(0,F.jsx)(H,{t,kb:e,onSubmit:t=>L(e.id,t),onCancel:()=>x(null),error:S,isSubmitting:T})]},e.id)})}),p&&(0,F.jsx)(V,{t,onSubmit:I,onCancel:()=>m(!1),error:h,isSubmitting:_,autoFocus:i.length===0,pulsing:i.length===0})]}),!p&&(0,F.jsx)(`div`,{className:`semiont-panel-footer`,children:(0,F.jsxs)(`button`,{onClick:N,className:`semiont-panel-item semiont-panel-item--clickable`,style:{width:`100%`,display:`flex`,alignItems:`center`,gap:`0.5rem`,color:`var(--semiont-color-primary-600)`},children:[(0,F.jsx)(P,{style:{width:`1rem`,height:`1rem`,flexShrink:0}}),(0,F.jsx)(`span`,{className:`semiont-panel-text`,style:{color:`inherit`},children:t(`addKnowledgeBase`)})]})})]})}function G({activePanel:e,theme:t,showLineNumbers:r,children:i}){let{hoverDelayMs:a}=s(),{t:o}=n(),c=!!f(f(v().activeSession$)?.user$),d=E(),m=T(),h=D(),[g,y]=(0,O.useTransition)(),{width:x,setWidth:S,minWidth:C,maxWidth:w}=l();return b({"settings:locale-changed":(0,O.useCallback)(({locale:e})=>{h&&y(()=>{m.replace(h,{locale:e})})},[h,m,y])}),!e||!i&&!_.includes(e)?null:(0,F.jsxs)(`div`,{className:`semiont-toolbar-panels`,style:{width:`${x}px`,position:`relative`},children:[(0,F.jsx)(p,{onResize:S,minWidth:C,maxWidth:w,position:`left`,ariaLabel:`Resize right panel`}),(0,F.jsxs)(`div`,{className:`semiont-toolbar-panels__content`,children:[i,e===`knowledge-base`&&(0,F.jsx)(W,{}),e===`user`&&(c?(0,F.jsx)(L,{}):(0,F.jsxs)(`div`,{className:`semiont-panel`,children:[(0,F.jsx)(`div`,{className:`semiont-panel-header`,children:(0,F.jsx)(`h2`,{className:`semiont-panel-header__title`,children:(0,F.jsx)(`span`,{className:`semiont-panel-header__text`,children:o(`UserPanel.account`)})})}),(0,F.jsx)(`div`,{className:`semiont-panel__content`,style:{padding:`1rem`,textAlign:`center`},children:(0,F.jsx)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:o(`AccountPanel.notAuthenticated`)})})]})),e===`settings`&&(0,F.jsx)(u,{showLineNumbers:r,theme:t,hoverDelayMs:a,locale:d,isPendingLocaleChange:g})]})]})}export{P as n,G as t};
2
- //# sourceMappingURL=ToolbarPanels-CRGQDX-L.js.map
1
+ import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{$ as i,G as a,H as o,J as s,Ot as c,Q as l,T as u,W as d,Z as f,_ as p,ct as m,dt as h,ft as g,o as _,ot as v,pt as y,q as b,tt as x,ut as S}from"./index-DojEUBpq.js";import{n as C,t as w}from"./XMarkIcon-CddZGiiz.js";import{i as T,n as E,r as D}from"./routing-Dqgz2rV4.js";var O=e(t());function k({title:e,titleId:t,...n},r){return O.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?O.createElement(`title`,{id:t},e):null,O.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9`}))}var A=O.forwardRef(k);function j({title:e,titleId:t,...n},r){return O.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?O.createElement(`title`,{id:t},e):null,O.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m4.5 12.75 6 6 9-13.5`}))}var M=O.forwardRef(j);function N({title:e,titleId:t,...n},r){return O.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:1.5,stroke:`currentColor`,"aria-hidden":`true`,"data-slot":`icon`,ref:r,"aria-labelledby":t},n),e?O.createElement(`title`,{id:t},e):null,O.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 4.5v15m7.5-7.5h-15`}))}var P=O.forwardRef(N),F=r(),I=`data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==`;function L(){let{t:e}=n(),t=(t,n)=>e(`UserPanel.${t}`,n),r=v(),s=f(r.activeSession$),c=f(s?.user$)??null,l=s?.kb??null,u=c?.name??c?.email?.split(`@`)[0]??`User`,p=c?.image??null,m=c?.domain||c?.email?.split(`@`)[1],h=c?.isAdmin??!1,g=c?.isModerator??!1,_=s?.client,y=x(()=>o(_)),b=T(),[S,C]=(0,O.useState)(!1),{timeRemaining:w}=i(),E=d(w)??`Unknown`,D=!p||S?I:a(p)||(console.warn(`Invalid profile image URL detected, using fallback`),I);return(0,F.jsxs)(`div`,{className:`semiont-user-panel`,children:[(0,F.jsx)(`h3`,{className:`semiont-user-panel__title`,children:t(`account`)}),l&&(0,F.jsx)(`div`,{style:{padding:`0 0.75rem 0.5rem`,fontSize:`0.8rem`,color:`var(--semiont-color-neutral-400)`},children:l.label}),(0,F.jsxs)(`div`,{className:`space-y-4`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,F.jsx)(`img`,{src:D,alt:t(`profileAlt`,{name:u||t(`user`)}),width:48,height:48,className:`w-12 h-12 rounded-full object-cover`,onError:()=>C(!0)}),(0,F.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,F.jsx)(`div`,{className:`semiont-panel-text`,children:u||t(`user`)}),m&&(0,F.jsxs)(`div`,{className:`semiont-panel-text-secondary`,children:[`@`,m]})]})]}),(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`label`,{className:`semiont-panel-label`,children:t(`session`)}),(0,F.jsx)(`div`,{className:`semiont-session-box`,children:(0,F.jsx)(`div`,{className:`semiont-panel-hint`,children:t(`expiresIn`,{time:E})})})]}),(h||g)&&(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`label`,{className:`semiont-panel-label`,children:t(`privileges`)}),(0,F.jsxs)(`div`,{className:`space-y-1`,children:[h&&(0,F.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--admin`,children:(0,F.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`administrator`)})}),g&&(0,F.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--moderator`,children:(0,F.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`moderator`)})})]})]}),(0,F.jsx)(`div`,{className:`semiont-panel-divider`,children:(0,F.jsx)(`button`,{onClick:async()=>{await y.logout(),l&&await r.signOut(l.id),b.push(`/`)},className:`semiont-signout-button`,children:t(`signOut`)})})]})]})}var R={authenticated:`var(--semiont-color-success-500, #22c55e)`,expired:`var(--semiont-color-warning-500, #eab308)`,"signed-out":`var(--semiont-color-neutral-400, #9ca3af)`,unreachable:`var(--semiont-color-error-500, #ef4444)`},z={authenticated:`statusConnected`,expired:`statusExpired`,"signed-out":`statusSignedOut`,unreachable:`statusUnreachable`};function B({status:e,t}){return(0,F.jsx)(`span`,{title:t(z[e]),style:{width:`0.5rem`,height:`0.5rem`,borderRadius:`50%`,backgroundColor:R[e],flexShrink:0}})}function V({t:e,onSubmit:t,onCancel:n,error:r,isSubmitting:i,autoFocus:a,pulsing:o,initialHost:s=`localhost`,initialPort:c=4e3,initialEmail:l=`admin@example.com`}){let[u,d]=(0,O.useState)(s),[f,p]=(0,O.useState)(String(c)),[m,g]=(0,O.useState)(S(s)),[_,v]=(0,O.useState)(l),[y,b]=(0,O.useState)(``),x=e=>{d(e),g(S(e))};return(0,F.jsxs)(`div`,{className:o?`semiont-panel__login-form--pulsing`:``,style:{margin:`0.5rem`,padding:`0.75rem`,border:`1px solid var(--semiont-color-neutral-200, #e5e7eb)`,borderRadius:`var(--semiont-panel-border-radius, 0.5rem)`,background:`var(--semiont-bg-secondary, transparent)`},children:[(0,F.jsx)(`h3`,{style:{fontSize:`0.8rem`,fontWeight:600,marginBottom:`0.5rem`},children:e(`connectTitle`)}),(0,F.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),h(u)&&t(u,parseInt(f,10)||4e3,m,_,y)},style:{display:`flex`,flexDirection:`column`,gap:`0.5rem`},children:[(0,F.jsxs)(`select`,{value:m,onChange:e=>g(e.target.value),className:`semiont-input`,children:[(0,F.jsx)(`option`,{value:`http`,children:`HTTP`}),(0,F.jsx)(`option`,{value:`https`,children:`HTTPS`})]}),(0,F.jsx)(`input`,{type:`text`,value:u,onChange:e=>x(e.target.value),placeholder:`Host`,className:`semiont-input`,autoFocus:a}),(0,F.jsx)(`input`,{type:`number`,value:f,onChange:e=>p(e.target.value),placeholder:`Port`,className:`semiont-input`}),u&&!h(u)&&(0,F.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:e(`invalidHost`)}),(0,F.jsx)(`input`,{type:`email`,value:_,onChange:e=>v(e.target.value),placeholder:`Email`,className:`semiont-input`}),(0,F.jsx)(`input`,{type:`password`,value:y,onChange:e=>b(e.target.value),placeholder:`Password`,className:`semiont-input`}),r&&(0,F.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:r}),(0,F.jsxs)(`div`,{style:{display:`flex`,gap:`0.5rem`},children:[(0,F.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1},disabled:i||!h(u),children:e(i?`connecting`:`connect`)}),(0,F.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:n,children:(0,F.jsx)(w,{style:{width:`1rem`,height:`1rem`}})})]})]})]})}function H({t:e,kb:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a}){let[o,s]=(0,O.useState)(``);return(0,F.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),n(o)},style:{padding:`0.5rem 0.75rem`,display:`flex`,flexDirection:`column`,gap:`0.375rem`},children:[(0,F.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--semiont-color-neutral-400)`},children:t.email}),(0,F.jsx)(`input`,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:`Password`,className:`semiont-input`,style:{fontSize:`0.8rem`},autoFocus:!0}),i&&(0,F.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,F.jsxs)(`div`,{style:{display:`flex`,gap:`0.375rem`},children:[(0,F.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1,fontSize:`0.8rem`},disabled:a,children:e(a?`signingIn`:`signIn`)}),(0,F.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,style:{fontSize:`0.8rem`},children:e(`cancel`)})]})]})}async function U(e,t,n,r,i){let a=new y({baseUrl:c(`${n}://${e}:${t}`)}),o=new m(a,new g(a),a),s=await o.auth.password(r,i),l=s.token??s.accessToken,u=s.refreshToken;if(!l)throw Error(`No access token received`);if(!u)throw Error(`No refresh token received`);let d=`${e}:${t}`,f;try{let e=await o.admin.status();e.projectName&&(d=e.projectName),e.gitBranch&&(f=e.gitBranch)}catch{}return{token:l,refreshToken:u,label:d,...f?{gitBranch:f}:{}}}function W(){let{t:e}=n(),t=(t,n)=>e(`KnowledgeBasePanel.${t}`,n),r=v(),i=f(r.kbs$)??[],a=f(r.activeSession$)?.kb??null,o=e=>{r.setActiveKb(e)},s=r.addKb.bind(r),c=r.removeKb.bind(r),l=r.updateKb.bind(r),u=(e,t,n)=>{r.signIn(e,t,n)},d=e=>{r.signOut(e)},[p,m]=(0,O.useState)(!1),[h,g]=(0,O.useState)(null),[_,y]=(0,O.useState)(!1),[b,x]=(0,O.useState)(null),[S,w]=(0,O.useState)(null),[T,E]=(0,O.useState)(!1),[D,k]=(0,O.useState)(null),[,j]=(0,O.useState)(0);(0,O.useEffect)(()=>{i.length===0&&m(!0)},[i.length]),(0,O.useEffect)(()=>{let e=setInterval(()=>j(e=>e+1),3e4);return()=>clearInterval(e)},[]);let N=()=>{m(!0),x(null),g(null)},I=async(e,t,n,r,a)=>{g(null),y(!0);let o=i.find(n=>n.endpoint.kind===`http`&&n.endpoint.host===e&&n.endpoint.port===t);if(o){try{let{token:i,refreshToken:s,gitBranch:c}=await U(e,t,n,r,a);l(o.id,{...c?{gitBranch:c}:{}}),u(o.id,i,s),m(!1)}catch(e){g(e instanceof Error?e.message:String(e))}finally{y(!1)}return}try{let{token:i,refreshToken:o,label:c,gitBranch:l}=await U(e,t,n,r,a);s({label:c,email:r,endpoint:{kind:`http`,host:e,port:t,protocol:n},...l?{gitBranch:l}:{}},i,o),m(!1)}catch(e){g(e instanceof Error?e.message:String(e))}finally{y(!1)}},L=async(e,t)=>{let n=i.find(t=>t.id===e);if(n){if(w(null),E(!0),n.endpoint.kind!==`http`){w(`Re-auth is HTTP-only; KB endpoint kind "${n.endpoint.kind}" is not supported here.`),E(!1);return}try{let{token:r,refreshToken:i,label:a,gitBranch:o}=await U(n.endpoint.host,n.endpoint.port,n.endpoint.protocol,n.email,t);l(e,{label:a,...o?{gitBranch:o}:{}}),u(e,r,i),x(null)}catch(e){w(e instanceof Error?e.message:String(e))}finally{E(!1)}}},R=e=>{r.getKbSessionStatus(e.id)===`authenticated`?o(e.id):(x(e.id),m(!1),w(null))};return(0,F.jsxs)(`div`,{className:`semiont-panel`,children:[(0,F.jsx)(`div`,{className:`semiont-panel-header`,children:(0,F.jsxs)(`h2`,{className:`semiont-panel-header__title`,children:[(0,F.jsx)(`span`,{className:`semiont-panel-header__text`,children:t(`title`)}),(0,F.jsxs)(`span`,{className:`semiont-panel-header__count`,children:[`(`,i.length,`)`]})]})}),(0,F.jsxs)(`div`,{className:`semiont-panel__content`,children:[(0,F.jsx)(`div`,{className:`semiont-panel__list`,children:i.map(e=>{let n=r.getKbSessionStatus(e.id),i=e.id===a?.id,o=b===e.id;return(0,F.jsxs)(`div`,{children:[(0,F.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable${i?` semiont-panel-item--selected`:``}`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>R(e),children:[(0,F.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,F.jsx)(B,{status:n,t}),(0,F.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.label}),i&&(0,F.jsx)(M,{style:{width:`1rem`,height:`1rem`,color:`var(--semiont-color-primary-500)`,flexShrink:0}}),n===`authenticated`&&(0,F.jsx)(`button`,{onClick:t=>{t.stopPropagation(),d(e.id)},title:t(`signOut`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,F.jsx)(A,{style:{width:`0.875rem`,height:`0.875rem`}})}),(0,F.jsx)(`button`,{onClick:t=>{t.stopPropagation(),k(e.id)},title:t(`remove`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,F.jsx)(C,{style:{width:`0.875rem`,height:`0.875rem`}})})]}),(0,F.jsxs)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:[e.endpoint.kind===`http`?`${e.endpoint.host}:${e.endpoint.port}`:`local:${e.endpoint.kbId}`,e.gitBranch?` · ${e.gitBranch}`:``]})]}),D===e.id&&(0,F.jsxs)(`div`,{style:{padding:`0.5rem 0.75rem`,fontSize:`0.8rem`,display:`flex`,alignItems:`center`,gap:`0.5rem`,background:`var(--semiont-bg-secondary, #f9fafb)`,borderBottom:`1px solid var(--semiont-color-neutral-200, #e5e7eb)`},children:[(0,F.jsx)(`span`,{style:{flex:1,color:`var(--semiont-color-neutral-500)`},children:t(`removeConfirm`,{label:e.label})}),(0,F.jsx)(`button`,{onClick:()=>{c(e.id),k(null)},className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`,color:`var(--semiont-color-error-500, #ef4444)`},children:t(`remove`)}),(0,F.jsx)(`button`,{onClick:()=>k(null),className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`},children:t(`cancel`)})]}),o&&(0,F.jsx)(H,{t,kb:e,onSubmit:t=>L(e.id,t),onCancel:()=>x(null),error:S,isSubmitting:T})]},e.id)})}),p&&(0,F.jsx)(V,{t,onSubmit:I,onCancel:()=>m(!1),error:h,isSubmitting:_,autoFocus:i.length===0,pulsing:i.length===0})]}),!p&&(0,F.jsx)(`div`,{className:`semiont-panel-footer`,children:(0,F.jsxs)(`button`,{onClick:N,className:`semiont-panel-item semiont-panel-item--clickable`,style:{width:`100%`,display:`flex`,alignItems:`center`,gap:`0.5rem`,color:`var(--semiont-color-primary-600)`},children:[(0,F.jsx)(P,{style:{width:`1rem`,height:`1rem`,flexShrink:0}}),(0,F.jsx)(`span`,{className:`semiont-panel-text`,style:{color:`inherit`},children:t(`addKnowledgeBase`)})]})})]})}function G({activePanel:e,theme:t,showLineNumbers:r,children:i}){let{hoverDelayMs:a}=s(),{t:o}=n(),c=!!f(f(v().activeSession$)?.user$),d=E(),m=T(),h=D(),[g,y]=(0,O.useTransition)(),{width:x,setWidth:S,minWidth:C,maxWidth:w}=l();return b({"settings:locale-changed":(0,O.useCallback)(({locale:e})=>{h&&y(()=>{m.replace(h,{locale:e})})},[h,m,y])}),!e||!i&&!_.includes(e)?null:(0,F.jsxs)(`div`,{className:`semiont-toolbar-panels`,style:{width:`${x}px`,position:`relative`},children:[(0,F.jsx)(p,{onResize:S,minWidth:C,maxWidth:w,position:`left`,ariaLabel:`Resize right panel`}),(0,F.jsxs)(`div`,{className:`semiont-toolbar-panels__content`,children:[i,e===`knowledge-base`&&(0,F.jsx)(W,{}),e===`user`&&(c?(0,F.jsx)(L,{}):(0,F.jsxs)(`div`,{className:`semiont-panel`,children:[(0,F.jsx)(`div`,{className:`semiont-panel-header`,children:(0,F.jsx)(`h2`,{className:`semiont-panel-header__title`,children:(0,F.jsx)(`span`,{className:`semiont-panel-header__text`,children:o(`UserPanel.account`)})})}),(0,F.jsx)(`div`,{className:`semiont-panel__content`,style:{padding:`1rem`,textAlign:`center`},children:(0,F.jsx)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:o(`AccountPanel.notAuthenticated`)})})]})),e===`settings`&&(0,F.jsx)(u,{showLineNumbers:r,theme:t,hoverDelayMs:a,locale:d,isPendingLocaleChange:g})]})]})}export{P as n,G as t};
2
+ //# sourceMappingURL=ToolbarPanels-wzZqAqCQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarPanels-CRGQDX-L.js","names":["ForwardRef","ForwardRef"],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowRightStartOnRectangleIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/PlusIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowRightStartOnRectangleIcon({\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.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowRightStartOnRectangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CheckIcon({\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 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction PlusIcon({\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 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(PlusIcon);\nexport default ForwardRef;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useSemiont,\n useObservable,\n createSessionStateUnit,\n useStateUnit,\n} from '@semiont/react-ui';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const displayName = user?.name ?? user?.email?.split('@')[0] ?? 'User';\n const avatarUrl = user?.image ?? null;\n const userDomain = user?.domain || user?.email?.split('@')[1];\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n const apiClient = session?.client;\n const sessionStateUnit = useStateUnit(() => createSessionStateUnit(apiClient!));\n const router = useRouter();\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n const handleSignOut = async () => {\n await sessionStateUnit.logout();\n if (activeKnowledgeBase) {\n await semiont.signOut(activeKnowledgeBase.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n {activeKnowledgeBase && (\n <div style={{ padding: '0 0.75rem 0.5rem', fontSize: '0.8rem', color: 'var(--semiont-color-neutral-400)' }}>\n {activeKnowledgeBase.label}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { SemiontClient, defaultProtocol, isValidHostname, type KnowledgeBase, type KbSessionStatus } from '@semiont/sdk';\nimport { HttpContentTransport, HttpTransport } from '@semiont/api-client';\nimport { baseUrl } from '@semiont/core';\nimport {\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\n\ntype T = (key: string, params?: Record<string, unknown>) => string;\n\nconst STATUS_COLORS: Record<KbSessionStatus, string> = {\n authenticated: 'var(--semiont-color-success-500, #22c55e)',\n expired: 'var(--semiont-color-warning-500, #eab308)',\n 'signed-out': 'var(--semiont-color-neutral-400, #9ca3af)',\n unreachable: 'var(--semiont-color-error-500, #ef4444)',\n};\n\nconst STATUS_KEYS: Record<KbSessionStatus, string> = {\n authenticated: 'statusConnected',\n expired: 'statusExpired',\n 'signed-out': 'statusSignedOut',\n unreachable: 'statusUnreachable',\n};\n\nfunction StatusDot({ status, t }: { status: KbSessionStatus; t: T }) {\n return (\n <span\n title={t(STATUS_KEYS[status])}\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: STATUS_COLORS[status],\n flexShrink: 0,\n }}\n />\n );\n}\n\nfunction LoginForm({ t, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n onSubmit: (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n autoFocus?: boolean;\n pulsing?: boolean;\n initialHost?: string;\n initialPort?: number;\n initialEmail?: string;\n}) {\n const [host, setHost] = useState(initialHost);\n const [port, setPort] = useState(String(initialPort));\n const [protocol, setProtocol] = useState<'http' | 'https'>(defaultProtocol(initialHost));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n const handleHostChange = (newHost: string) => {\n setHost(newHost);\n setProtocol(defaultProtocol(newHost));\n };\n\n return (\n <div\n className={pulsing ? 'semiont-panel__login-form--pulsing' : ''}\n style={{\n margin: '0.5rem',\n padding: '0.75rem',\n border: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n borderRadius: 'var(--semiont-panel-border-radius, 0.5rem)',\n background: 'var(--semiont-bg-secondary, transparent)',\n }}\n >\n <h3 style={{ fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.5rem' }}>{t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); if (isValidHostname(host)) onSubmit(host, parseInt(port, 10) || 4000, protocol, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <select value={protocol} onChange={e => setProtocol(e.target.value as 'http' | 'https')} className=\"semiont-input\">\n <option value=\"http\">HTTP</option>\n <option value=\"https\">HTTPS</option>\n </select>\n <input type=\"text\" value={host} onChange={e => handleHostChange(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" />\n {host && !isValidHostname(host) && (\n <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{t('invalidHost')}</div>\n )}\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)} placeholder=\"Email\" className=\"semiont-input\" />\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1 }} disabled={isSubmitting || !isValidHostname(host)}>\n {isSubmitting ? t('connecting') : t('connect')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel}>\n <XMarkIcon style={{ width: '1rem', height: '1rem' }} />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction ReauthForm({ t, kb, onSubmit, onCancel, error, isSubmitting }: {\n t: T;\n kb: KnowledgeBase;\n onSubmit: (password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n}) {\n const [password, setPassword] = useState('');\n\n return (\n <form onSubmit={(e) => { e.preventDefault(); onSubmit(password); }} style={{ padding: '0.5rem 0.75rem', display: 'flex', flexDirection: 'column', gap: '0.375rem' }}>\n <div style={{ fontSize: '0.75rem', color: 'var(--semiont-color-neutral-400)' }}>{kb.email}</div>\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" style={{ fontSize: '0.8rem' }} autoFocus />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.375rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1, fontSize: '0.8rem' }} disabled={isSubmitting}>\n {isSubmitting ? t('signingIn') : t('signIn')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel} style={{ fontSize: '0.8rem' }}>\n {t('cancel')}\n </button>\n </div>\n </form>\n );\n}\n\nasync function authenticateWithBackend(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n const transport = new HttpTransport({ baseUrl: baseUrl(origin) });\n const client = new SemiontClient(transport, new HttpContentTransport(transport), transport);\n\n const authResult = await client.auth!.password(emailStr, password);\n const token = (authResult as any).token ?? (authResult as any).accessToken;\n const refreshToken = (authResult as any).refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n\n let label = `${host}:${port}`;\n let gitBranch: string | undefined;\n try {\n const status = await client.admin!.status();\n if ((status as any).projectName) label = (status as any).projectName;\n if ((status as any).gitBranch) gitBranch = (status as any).gitBranch;\n } catch { /* use default label */ }\n\n return { token, refreshToken, label, ...(gitBranch ? { gitBranch } : {}) };\n}\n\nexport function KnowledgeBasePanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const setActiveKnowledgeBase = (id: string) => { void semiont.setActiveKb(id); };\n const addKnowledgeBase = semiont.addKb.bind(semiont);\n const removeKnowledgeBase = semiont.removeKb.bind(semiont);\n const updateKnowledgeBase = semiont.updateKb.bind(semiont);\n const signIn = (id: string, access: string, refresh: string) => { void semiont.signIn(id, access, refresh); };\n const signOut = (id: string) => { void semiont.signOut(id); };\n const [showAddForm, setShowAddForm] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [addSubmitting, setAddSubmitting] = useState(false);\n const [reauthKbId, setReauthKbId] = useState<string | null>(null);\n const [reauthError, setReauthError] = useState<string | null>(null);\n const [reauthSubmitting, setReauthSubmitting] = useState(false);\n const [confirmRemoveKbId, setConfirmRemoveKbId] = useState<string | null>(null);\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setShowAddForm(true);\n }, [knowledgeBases.length]);\n\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), 30_000);\n return () => clearInterval(interval);\n }, []);\n\n const openAddForm = () => {\n setShowAddForm(true);\n setReauthKbId(null);\n setAddError(null);\n };\n\n const handleAdd = async (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const existing = knowledgeBases.find(\n kb => kb.endpoint.kind === 'http' && kb.endpoint.host === host && kb.endpoint.port === port,\n );\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n addKnowledgeBase(\n {\n label,\n email,\n endpoint: { kind: 'http', host, port, protocol },\n ...(gitBranch ? { gitBranch } : {}),\n },\n token,\n refreshToken,\n );\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n };\n\n const handleReauth = async (kbId: string, password: string) => {\n const kb = knowledgeBases.find(k => k.id === kbId);\n if (!kb) return;\n setReauthError(null);\n setReauthSubmitting(true);\n if (kb.endpoint.kind !== 'http') {\n setReauthError(`Re-auth is HTTP-only; KB endpoint kind \"${kb.endpoint.kind}\" is not supported here.`);\n setReauthSubmitting(false);\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(\n kb.endpoint.host, kb.endpoint.port, kb.endpoint.protocol, kb.email, password,\n );\n updateKnowledgeBase(kbId, { label, ...(gitBranch ? { gitBranch } : {}) });\n signIn(kbId, token, refreshToken);\n setReauthKbId(null);\n } catch (err) {\n setReauthError(err instanceof Error ? err.message : String(err));\n } finally {\n setReauthSubmitting(false);\n }\n };\n\n const handleKbClick = (kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setShowAddForm(false);\n setReauthError(null);\n }\n };\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{t('title')}</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n\n return (\n <div key={kb.id}>\n <div\n className={`semiont-panel-item semiont-panel-item--clickable${isActive ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => handleKbClick(kb)}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <StatusDot status={status} t={t} />\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label}</span>\n {isActive && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n {status === 'authenticated' && (\n <button\n onClick={(e) => { e.stopPropagation(); signOut(kb.id); }}\n title={t('signOut')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <ArrowRightStartOnRectangleIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); setConfirmRemoveKbId(kb.id); }}\n title={t('remove')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <TrashIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {kb.endpoint.kind === 'http'\n ? `${kb.endpoint.host}:${kb.endpoint.port}`\n : `local:${kb.endpoint.kbId}`}\n {kb.gitBranch ? ` · ${kb.gitBranch}` : ''}\n </span>\n </div>\n {confirmRemoveKbId === kb.id && (\n <div style={{\n padding: '0.5rem 0.75rem',\n fontSize: '0.8rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n background: 'var(--semiont-bg-secondary, #f9fafb)',\n borderBottom: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n }}>\n <span style={{ flex: 1, color: 'var(--semiont-color-neutral-500)' }}>{t('removeConfirm', { label: kb.label })}</span>\n <button\n onClick={() => { removeKnowledgeBase(kb.id); setConfirmRemoveKbId(null); }}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem', color: 'var(--semiont-color-error-500, #ef4444)' }}\n >\n {t('remove')}\n </button>\n <button\n onClick={() => setConfirmRemoveKbId(null)}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem' }}\n >\n {t('cancel')}\n </button>\n </div>\n )}\n {isReauthing && (\n <ReauthForm\n t={t}\n kb={kb}\n onSubmit={(password) => handleReauth(kb.id, password)}\n onCancel={() => setReauthKbId(null)}\n error={reauthError}\n isSubmitting={reauthSubmitting}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {showAddForm && (\n <LoginForm\n t={t}\n onSubmit={handleAdd}\n onCancel={() => setShowAddForm(false)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n />\n )}\n </div>\n\n {!showAddForm && (\n <div className=\"semiont-panel-footer\">\n <button\n onClick={openAddForm}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>{t('addKnowledgeBase')}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useTransition, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n SettingsPanel,\n ResizeHandle,\n usePanelWidth,\n useEventSubscriptions,\n useSemiont,\n useObservable,\n useHoverDelay,\n} from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Line numbers setting */\n showLineNumbers: boolean;\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n showLineNumbers,\n children\n}: ToolbarPanelsProps) {\n // Source hover-delay from the shared hook so every page that mounts\n // ToolbarPanels gets the live value without prop-drilling. Previously\n // each page passed `hoverDelayMs` through as a prop; pages that forgot\n // (Discover, Admin, Moderation) rendered the Settings panel with\n // `undefined`, which surfaced as `{undefined}ms delay` after the\n // translation interpolation ran.\n const { hoverDelayMs } = useHoverDelay();\n const { t: _t } = useTranslation();\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - requires authentication */}\n {activePanel === 'user' && (\n isAuthenticated ? (\n <UserPanel />\n ) : (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{_t('UserPanel.account')}</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\" style={{ padding: '1rem', textAlign: 'center' }}>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {_t('AccountPanel.notAuthenticated')}\n </p>\n </div>\n </div>\n )\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"ToolbarPanels-wzZqAqCQ.js","names":["ForwardRef","ForwardRef"],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowRightStartOnRectangleIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/PlusIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowRightStartOnRectangleIcon({\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.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowRightStartOnRectangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CheckIcon({\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 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction PlusIcon({\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 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(PlusIcon);\nexport default ForwardRef;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useSemiont,\n useObservable,\n createSessionStateUnit,\n useStateUnit,\n} from '@semiont/react-ui';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const displayName = user?.name ?? user?.email?.split('@')[0] ?? 'User';\n const avatarUrl = user?.image ?? null;\n const userDomain = user?.domain || user?.email?.split('@')[1];\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n const apiClient = session?.client;\n const sessionStateUnit = useStateUnit(() => createSessionStateUnit(apiClient!));\n const router = useRouter();\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n const handleSignOut = async () => {\n await sessionStateUnit.logout();\n if (activeKnowledgeBase) {\n await semiont.signOut(activeKnowledgeBase.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n {activeKnowledgeBase && (\n <div style={{ padding: '0 0.75rem 0.5rem', fontSize: '0.8rem', color: 'var(--semiont-color-neutral-400)' }}>\n {activeKnowledgeBase.label}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { SemiontClient, defaultProtocol, isValidHostname, type KnowledgeBase, type KbSessionStatus } from '@semiont/sdk';\nimport { HttpContentTransport, HttpTransport } from '@semiont/api-client';\nimport { baseUrl } from '@semiont/core';\nimport {\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\n\ntype T = (key: string, params?: Record<string, unknown>) => string;\n\nconst STATUS_COLORS: Record<KbSessionStatus, string> = {\n authenticated: 'var(--semiont-color-success-500, #22c55e)',\n expired: 'var(--semiont-color-warning-500, #eab308)',\n 'signed-out': 'var(--semiont-color-neutral-400, #9ca3af)',\n unreachable: 'var(--semiont-color-error-500, #ef4444)',\n};\n\nconst STATUS_KEYS: Record<KbSessionStatus, string> = {\n authenticated: 'statusConnected',\n expired: 'statusExpired',\n 'signed-out': 'statusSignedOut',\n unreachable: 'statusUnreachable',\n};\n\nfunction StatusDot({ status, t }: { status: KbSessionStatus; t: T }) {\n return (\n <span\n title={t(STATUS_KEYS[status])}\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: STATUS_COLORS[status],\n flexShrink: 0,\n }}\n />\n );\n}\n\nfunction LoginForm({ t, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n onSubmit: (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n autoFocus?: boolean;\n pulsing?: boolean;\n initialHost?: string;\n initialPort?: number;\n initialEmail?: string;\n}) {\n const [host, setHost] = useState(initialHost);\n const [port, setPort] = useState(String(initialPort));\n const [protocol, setProtocol] = useState<'http' | 'https'>(defaultProtocol(initialHost));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n const handleHostChange = (newHost: string) => {\n setHost(newHost);\n setProtocol(defaultProtocol(newHost));\n };\n\n return (\n <div\n className={pulsing ? 'semiont-panel__login-form--pulsing' : ''}\n style={{\n margin: '0.5rem',\n padding: '0.75rem',\n border: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n borderRadius: 'var(--semiont-panel-border-radius, 0.5rem)',\n background: 'var(--semiont-bg-secondary, transparent)',\n }}\n >\n <h3 style={{ fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.5rem' }}>{t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); if (isValidHostname(host)) onSubmit(host, parseInt(port, 10) || 4000, protocol, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <select value={protocol} onChange={e => setProtocol(e.target.value as 'http' | 'https')} className=\"semiont-input\">\n <option value=\"http\">HTTP</option>\n <option value=\"https\">HTTPS</option>\n </select>\n <input type=\"text\" value={host} onChange={e => handleHostChange(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" />\n {host && !isValidHostname(host) && (\n <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{t('invalidHost')}</div>\n )}\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)} placeholder=\"Email\" className=\"semiont-input\" />\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1 }} disabled={isSubmitting || !isValidHostname(host)}>\n {isSubmitting ? t('connecting') : t('connect')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel}>\n <XMarkIcon style={{ width: '1rem', height: '1rem' }} />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction ReauthForm({ t, kb, onSubmit, onCancel, error, isSubmitting }: {\n t: T;\n kb: KnowledgeBase;\n onSubmit: (password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n}) {\n const [password, setPassword] = useState('');\n\n return (\n <form onSubmit={(e) => { e.preventDefault(); onSubmit(password); }} style={{ padding: '0.5rem 0.75rem', display: 'flex', flexDirection: 'column', gap: '0.375rem' }}>\n <div style={{ fontSize: '0.75rem', color: 'var(--semiont-color-neutral-400)' }}>{kb.email}</div>\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" style={{ fontSize: '0.8rem' }} autoFocus />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.375rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1, fontSize: '0.8rem' }} disabled={isSubmitting}>\n {isSubmitting ? t('signingIn') : t('signIn')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel} style={{ fontSize: '0.8rem' }}>\n {t('cancel')}\n </button>\n </div>\n </form>\n );\n}\n\nasync function authenticateWithBackend(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n const transport = new HttpTransport({ baseUrl: baseUrl(origin) });\n const client = new SemiontClient(transport, new HttpContentTransport(transport), transport);\n\n const authResult = await client.auth!.password(emailStr, password);\n const token = (authResult as any).token ?? (authResult as any).accessToken;\n const refreshToken = (authResult as any).refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n\n let label = `${host}:${port}`;\n let gitBranch: string | undefined;\n try {\n const status = await client.admin!.status();\n if ((status as any).projectName) label = (status as any).projectName;\n if ((status as any).gitBranch) gitBranch = (status as any).gitBranch;\n } catch { /* use default label */ }\n\n return { token, refreshToken, label, ...(gitBranch ? { gitBranch } : {}) };\n}\n\nexport function KnowledgeBasePanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const setActiveKnowledgeBase = (id: string) => { void semiont.setActiveKb(id); };\n const addKnowledgeBase = semiont.addKb.bind(semiont);\n const removeKnowledgeBase = semiont.removeKb.bind(semiont);\n const updateKnowledgeBase = semiont.updateKb.bind(semiont);\n const signIn = (id: string, access: string, refresh: string) => { void semiont.signIn(id, access, refresh); };\n const signOut = (id: string) => { void semiont.signOut(id); };\n const [showAddForm, setShowAddForm] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [addSubmitting, setAddSubmitting] = useState(false);\n const [reauthKbId, setReauthKbId] = useState<string | null>(null);\n const [reauthError, setReauthError] = useState<string | null>(null);\n const [reauthSubmitting, setReauthSubmitting] = useState(false);\n const [confirmRemoveKbId, setConfirmRemoveKbId] = useState<string | null>(null);\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setShowAddForm(true);\n }, [knowledgeBases.length]);\n\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), 30_000);\n return () => clearInterval(interval);\n }, []);\n\n const openAddForm = () => {\n setShowAddForm(true);\n setReauthKbId(null);\n setAddError(null);\n };\n\n const handleAdd = async (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const existing = knowledgeBases.find(\n kb => kb.endpoint.kind === 'http' && kb.endpoint.host === host && kb.endpoint.port === port,\n );\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n addKnowledgeBase(\n {\n label,\n email,\n endpoint: { kind: 'http', host, port, protocol },\n ...(gitBranch ? { gitBranch } : {}),\n },\n token,\n refreshToken,\n );\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n };\n\n const handleReauth = async (kbId: string, password: string) => {\n const kb = knowledgeBases.find(k => k.id === kbId);\n if (!kb) return;\n setReauthError(null);\n setReauthSubmitting(true);\n if (kb.endpoint.kind !== 'http') {\n setReauthError(`Re-auth is HTTP-only; KB endpoint kind \"${kb.endpoint.kind}\" is not supported here.`);\n setReauthSubmitting(false);\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(\n kb.endpoint.host, kb.endpoint.port, kb.endpoint.protocol, kb.email, password,\n );\n updateKnowledgeBase(kbId, { label, ...(gitBranch ? { gitBranch } : {}) });\n signIn(kbId, token, refreshToken);\n setReauthKbId(null);\n } catch (err) {\n setReauthError(err instanceof Error ? err.message : String(err));\n } finally {\n setReauthSubmitting(false);\n }\n };\n\n const handleKbClick = (kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setShowAddForm(false);\n setReauthError(null);\n }\n };\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{t('title')}</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n\n return (\n <div key={kb.id}>\n <div\n className={`semiont-panel-item semiont-panel-item--clickable${isActive ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => handleKbClick(kb)}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <StatusDot status={status} t={t} />\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label}</span>\n {isActive && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n {status === 'authenticated' && (\n <button\n onClick={(e) => { e.stopPropagation(); signOut(kb.id); }}\n title={t('signOut')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <ArrowRightStartOnRectangleIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); setConfirmRemoveKbId(kb.id); }}\n title={t('remove')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <TrashIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {kb.endpoint.kind === 'http'\n ? `${kb.endpoint.host}:${kb.endpoint.port}`\n : `local:${kb.endpoint.kbId}`}\n {kb.gitBranch ? ` · ${kb.gitBranch}` : ''}\n </span>\n </div>\n {confirmRemoveKbId === kb.id && (\n <div style={{\n padding: '0.5rem 0.75rem',\n fontSize: '0.8rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n background: 'var(--semiont-bg-secondary, #f9fafb)',\n borderBottom: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n }}>\n <span style={{ flex: 1, color: 'var(--semiont-color-neutral-500)' }}>{t('removeConfirm', { label: kb.label })}</span>\n <button\n onClick={() => { removeKnowledgeBase(kb.id); setConfirmRemoveKbId(null); }}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem', color: 'var(--semiont-color-error-500, #ef4444)' }}\n >\n {t('remove')}\n </button>\n <button\n onClick={() => setConfirmRemoveKbId(null)}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem' }}\n >\n {t('cancel')}\n </button>\n </div>\n )}\n {isReauthing && (\n <ReauthForm\n t={t}\n kb={kb}\n onSubmit={(password) => handleReauth(kb.id, password)}\n onCancel={() => setReauthKbId(null)}\n error={reauthError}\n isSubmitting={reauthSubmitting}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {showAddForm && (\n <LoginForm\n t={t}\n onSubmit={handleAdd}\n onCancel={() => setShowAddForm(false)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n />\n )}\n </div>\n\n {!showAddForm && (\n <div className=\"semiont-panel-footer\">\n <button\n onClick={openAddForm}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>{t('addKnowledgeBase')}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useTransition, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n SettingsPanel,\n ResizeHandle,\n usePanelWidth,\n useEventSubscriptions,\n useSemiont,\n useObservable,\n useHoverDelay,\n} from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Line numbers setting */\n showLineNumbers: boolean;\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n showLineNumbers,\n children\n}: ToolbarPanelsProps) {\n // Source hover-delay from the shared hook so every page that mounts\n // ToolbarPanels gets the live value without prop-drilling. Previously\n // each page passed `hoverDelayMs` through as a prop; pages that forgot\n // (Discover, Admin, Moderation) rendered the Settings panel with\n // `undefined`, which surfaced as `{undefined}ms delay` after the\n // translation interpolation ran.\n const { hoverDelayMs } = useHoverDelay();\n const { t: _t } = useTranslation();\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - requires authentication */}\n {activePanel === 'user' && (\n isAuthenticated ? (\n <UserPanel />\n ) : (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{_t('UserPanel.account')}</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\" style={{ padding: '1rem', textAlign: 'center' }}>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {_t('AccountPanel.notAuthenticated')}\n </p>\n </div>\n </div>\n )\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{B as i,M as a,X as o,Z as s,et as c,n as l,nt as u,ot as d,q as f,tt as p}from"./index-DjtRDlfn.js";import{t as m}from"./ToolbarPanels-CRGQDX-L.js";var h=e(t()),g=r();function _(){let{t:e}=n(),t=(t,n)=>e(`AdminExchange.${t}`,n),r=s(d().activeSession$)?.client,_=c(),v=p(()=>i(_,()=>r.admin.backup(),e=>r.admin.restore(e))),y=s(v.browse.activePanel$)??null,b=s(v.selectedFile$)??null,x=s(v.preview$)??null,S=s(v.isExporting$)??!1,C=s(v.isImporting$)??!1,w=s(v.importPhase$)??null,T=s(v.importMessage$),E=s(v.importResult$),{theme:D,setTheme:O}=u(),{showLineNumbers:k,toggleLineNumbers:A}=o();f({"settings:theme-changed":(0,h.useCallback)(({theme:e})=>O(e),[O]),"settings:line-numbers-toggled":(0,h.useCallback)(()=>A(),[A])});let j=(0,h.useCallback)(async()=>{let{blob:e,filename:t}=await v.doExport(),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),URL.revokeObjectURL(n)},[v]),M=(0,h.useCallback)(async()=>{await v.doImport()},[v]);return(0,g.jsx)(l,{onExport:j,isExporting:S,onFileSelected:v.selectFile,onImport:M,onCancelImport:v.cancelImport,selectedFile:b,preview:x,isImporting:C,importPhase:w,importMessage:T,importResult:E,theme:D,showLineNumbers:k,activePanel:y,translations:{title:t(`title`),subtitle:t(`subtitle`),export:{title:t(`exportTitle`),description:t(`exportDescription`),exportButton:t(`exportButton`),exporting:t(`exporting`)},import:{title:t(`importTitle`),description:t(`importDescription`),dropzoneLabel:t(`dropzoneLabel`),dropzoneActive:t(`dropzoneActive`),detectedFormat:t(`detectedFormat`),statsPreview:t(`statsPreview`),importButton:t(`importButton`),importing:t(`importing`),importConfirmTitle:t(`importConfirmTitle`),importConfirmMessage:t(`importConfirmMessage`),confirmImport:t(`confirmImport`),cancelImport:t(`cancelImport`)},progress:{phaseStarted:t(`phaseStarted`),phaseEntityTypes:t(`phaseEntityTypes`),phaseResources:t(`phaseResources`),phaseAnnotations:t(`phaseAnnotations`),phaseComplete:t(`phaseComplete`),phaseError:t(`phaseError`),hashChainValid:t(`hashChainValid`),hashChainInvalid:t(`hashChainInvalid`),streams:t(`streams`),events:t(`events`),blobs:t(`blobs`)}},ToolbarPanels:m,Toolbar:a})}export{_ as default};
2
- //# sourceMappingURL=client-DvALJ3DL.js.map
1
+ import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{B as i,M as a,X as o,Z as s,et as c,n as l,nt as u,ot as d,q as f,tt as p}from"./index-DojEUBpq.js";import{t as m}from"./ToolbarPanels-wzZqAqCQ.js";var h=e(t()),g=r();function _(){let{t:e}=n(),t=(t,n)=>e(`AdminExchange.${t}`,n),r=s(d().activeSession$)?.client,_=c(),v=p(()=>i(_,()=>r.admin.backup(),e=>r.admin.restore(e))),y=s(v.browse.activePanel$)??null,b=s(v.selectedFile$)??null,x=s(v.preview$)??null,S=s(v.isExporting$)??!1,C=s(v.isImporting$)??!1,w=s(v.importPhase$)??null,T=s(v.importMessage$),E=s(v.importResult$),{theme:D,setTheme:O}=u(),{showLineNumbers:k,toggleLineNumbers:A}=o();f({"settings:theme-changed":(0,h.useCallback)(({theme:e})=>O(e),[O]),"settings:line-numbers-toggled":(0,h.useCallback)(()=>A(),[A])});let j=(0,h.useCallback)(async()=>{let{blob:e,filename:t}=await v.doExport(),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),URL.revokeObjectURL(n)},[v]),M=(0,h.useCallback)(async()=>{await v.doImport()},[v]);return(0,g.jsx)(l,{onExport:j,isExporting:S,onFileSelected:v.selectFile,onImport:M,onCancelImport:v.cancelImport,selectedFile:b,preview:x,isImporting:C,importPhase:w,importMessage:T,importResult:E,theme:D,showLineNumbers:k,activePanel:y,translations:{title:t(`title`),subtitle:t(`subtitle`),export:{title:t(`exportTitle`),description:t(`exportDescription`),exportButton:t(`exportButton`),exporting:t(`exporting`)},import:{title:t(`importTitle`),description:t(`importDescription`),dropzoneLabel:t(`dropzoneLabel`),dropzoneActive:t(`dropzoneActive`),detectedFormat:t(`detectedFormat`),statsPreview:t(`statsPreview`),importButton:t(`importButton`),importing:t(`importing`),importConfirmTitle:t(`importConfirmTitle`),importConfirmMessage:t(`importConfirmMessage`),confirmImport:t(`confirmImport`),cancelImport:t(`cancelImport`)},progress:{phaseStarted:t(`phaseStarted`),phaseEntityTypes:t(`phaseEntityTypes`),phaseResources:t(`phaseResources`),phaseAnnotations:t(`phaseAnnotations`),phaseComplete:t(`phaseComplete`),phaseError:t(`phaseError`),hashChainValid:t(`hashChainValid`),hashChainInvalid:t(`hashChainInvalid`),streams:t(`streams`),events:t(`events`),blobs:t(`blobs`)}},ToolbarPanels:m,Toolbar:a})}export{_ as default};
2
+ //# sourceMappingURL=client-C54EWgTc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-DvALJ3DL.js","names":[],"sources":["../../src/app/[locale]/admin/exchange/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellStateUnit,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useStateUnit,\n AdminExchangePage,\n} from '@semiont/react-ui';\nimport { createExchangeStateUnit } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\n\nexport default function AdminExchangeClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminExchange.${k}`, p as any) as string;\n const client = useObservable(useSemiont().activeSession$)?.client;\n\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createExchangeStateUnit(\n browseStateUnit,\n () => client!.admin!.backup(),\n (file) => client!.admin!.restore(file),\n ));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const selectedFile = useObservable(stateUnit.selectedFile$) ?? null;\n const preview = useObservable(stateUnit.preview$) ?? null;\n const isExporting = useObservable(stateUnit.isExporting$) ?? false;\n const isImporting = useObservable(stateUnit.isImporting$) ?? false;\n const importPhase = useObservable(stateUnit.importPhase$) ?? null;\n const importMessage = useObservable(stateUnit.importMessage$);\n const importResult = useObservable(stateUnit.importResult$);\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n useEventSubscriptions({\n 'settings:theme-changed': useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme), [setTheme]),\n 'settings:line-numbers-toggled': useCallback(() => toggleLineNumbers(), [toggleLineNumbers]),\n });\n\n const handleExport = useCallback(async () => {\n const { blob, filename } = await stateUnit.doExport();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [stateUnit]);\n\n const handleImport = useCallback(async () => {\n await stateUnit.doImport();\n }, [stateUnit]);\n\n return (\n <AdminExchangePage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={stateUnit.selectFile}\n onImport={handleImport}\n onCancelImport={stateUnit.cancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={isImporting}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"mappings":"mTAgBA,SAAwB,GAAsB,CAC5C,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,iBAAiB,IAAK,EAAS,CAClF,EAAS,EAAc,GAAY,CAAC,eAAe,EAAE,OAErD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EACnC,MACM,EAAQ,MAAO,QAAQ,CAC5B,GAAS,EAAQ,MAAO,QAAQ,EAAK,CACvC,CAAC,CAEI,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAe,EAAc,EAAU,cAAc,EAAI,KACzD,EAAU,EAAc,EAAU,SAAS,EAAI,KAC/C,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,KACvD,EAAgB,EAAc,EAAU,eAAe,CACvD,EAAe,EAAc,EAAU,cAAc,CAErD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAE/D,EAAsB,CACpB,0BAAA,EAAA,EAAA,cAAuC,CAAE,WAAoD,EAAS,EAAM,CAAE,CAAC,EAAS,CAAC,CACzH,iCAAA,EAAA,EAAA,iBAAmD,GAAmB,CAAE,CAAC,EAAkB,CAAC,CAC7F,CAAC,CAEF,IAAM,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,GAAM,CAAE,OAAM,YAAa,MAAM,EAAU,UAAU,CAC/C,EAAM,IAAI,gBAAgB,EAAK,CAC/B,EAAI,SAAS,cAAc,IAAI,CACrC,EAAE,KAAO,EACT,EAAE,SAAW,EACb,EAAE,OAAO,CACT,IAAI,gBAAgB,EAAI,EACvB,CAAC,EAAU,CAAC,CAET,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,MAAM,EAAU,UAAU,EACzB,CAAC,EAAU,CAAC,CAEf,OACE,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,EACG,cACb,eAAgB,EAAU,WAC1B,SAAU,EACV,eAAgB,EAAU,aACZ,eACL,UACI,cACA,cACE,gBACD,eACP,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CAC1B,CACD,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,cAAe,EAAE,gBAAgB,CACjC,eAAgB,EAAE,iBAAiB,CACnC,eAAgB,EAAE,iBAAiB,CACnC,aAAc,EAAE,eAAe,CAC/B,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CACzB,mBAAoB,EAAE,qBAAqB,CAC3C,qBAAsB,EAAE,uBAAuB,CAC/C,cAAe,EAAE,gBAAgB,CACjC,aAAc,EAAE,eAAe,CAChC,CACD,SAAU,CACR,aAAc,EAAE,eAAe,CAC/B,iBAAkB,EAAE,mBAAmB,CACvC,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,cAAe,EAAE,gBAAgB,CACjC,WAAY,EAAE,aAAa,CAC3B,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,QAAS,EAAE,UAAU,CACrB,OAAQ,EAAE,SAAS,CACnB,MAAO,EAAE,QAAQ,CAClB,CACF,CACc,gBACN,UACT,CAAA"}
1
+ {"version":3,"file":"client-C54EWgTc.js","names":[],"sources":["../../src/app/[locale]/admin/exchange/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellStateUnit,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useStateUnit,\n AdminExchangePage,\n} from '@semiont/react-ui';\nimport { createExchangeStateUnit } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\n\nexport default function AdminExchangeClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminExchange.${k}`, p as any) as string;\n const client = useObservable(useSemiont().activeSession$)?.client;\n\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createExchangeStateUnit(\n browseStateUnit,\n () => client!.admin!.backup(),\n (file) => client!.admin!.restore(file),\n ));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const selectedFile = useObservable(stateUnit.selectedFile$) ?? null;\n const preview = useObservable(stateUnit.preview$) ?? null;\n const isExporting = useObservable(stateUnit.isExporting$) ?? false;\n const isImporting = useObservable(stateUnit.isImporting$) ?? false;\n const importPhase = useObservable(stateUnit.importPhase$) ?? null;\n const importMessage = useObservable(stateUnit.importMessage$);\n const importResult = useObservable(stateUnit.importResult$);\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n useEventSubscriptions({\n 'settings:theme-changed': useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme), [setTheme]),\n 'settings:line-numbers-toggled': useCallback(() => toggleLineNumbers(), [toggleLineNumbers]),\n });\n\n const handleExport = useCallback(async () => {\n const { blob, filename } = await stateUnit.doExport();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [stateUnit]);\n\n const handleImport = useCallback(async () => {\n await stateUnit.doImport();\n }, [stateUnit]);\n\n return (\n <AdminExchangePage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={stateUnit.selectFile}\n onImport={handleImport}\n onCancelImport={stateUnit.cancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={isImporting}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"mappings":"mTAgBA,SAAwB,GAAsB,CAC5C,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,iBAAiB,IAAK,EAAS,CAClF,EAAS,EAAc,GAAY,CAAC,eAAe,EAAE,OAErD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EACnC,MACM,EAAQ,MAAO,QAAQ,CAC5B,GAAS,EAAQ,MAAO,QAAQ,EAAK,CACvC,CAAC,CAEI,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAe,EAAc,EAAU,cAAc,EAAI,KACzD,EAAU,EAAc,EAAU,SAAS,EAAI,KAC/C,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,KACvD,EAAgB,EAAc,EAAU,eAAe,CACvD,EAAe,EAAc,EAAU,cAAc,CAErD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAE/D,EAAsB,CACpB,0BAAA,EAAA,EAAA,cAAuC,CAAE,WAAoD,EAAS,EAAM,CAAE,CAAC,EAAS,CAAC,CACzH,iCAAA,EAAA,EAAA,iBAAmD,GAAmB,CAAE,CAAC,EAAkB,CAAC,CAC7F,CAAC,CAEF,IAAM,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,GAAM,CAAE,OAAM,YAAa,MAAM,EAAU,UAAU,CAC/C,EAAM,IAAI,gBAAgB,EAAK,CAC/B,EAAI,SAAS,cAAc,IAAI,CACrC,EAAE,KAAO,EACT,EAAE,SAAW,EACb,EAAE,OAAO,CACT,IAAI,gBAAgB,EAAI,EACvB,CAAC,EAAU,CAAC,CAET,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,MAAM,EAAU,UAAU,EACzB,CAAC,EAAU,CAAC,CAEf,OACE,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,EACG,cACb,eAAgB,EAAU,WAC1B,SAAU,EACV,eAAgB,EAAU,aACZ,eACL,UACI,cACA,cACE,gBACD,eACP,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CAC1B,CACD,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,cAAe,EAAE,gBAAgB,CACjC,eAAgB,EAAE,iBAAiB,CACnC,eAAgB,EAAE,iBAAiB,CACnC,aAAc,EAAE,eAAe,CAC/B,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CACzB,mBAAoB,EAAE,qBAAqB,CAC3C,qBAAsB,EAAE,uBAAuB,CAC/C,cAAe,EAAE,gBAAgB,CACjC,aAAc,EAAE,eAAe,CAChC,CACD,SAAU,CACR,aAAc,EAAE,eAAe,CAC/B,iBAAkB,EAAE,mBAAmB,CACvC,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,cAAe,EAAE,gBAAgB,CACjC,WAAY,EAAE,aAAa,CAC3B,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,QAAS,EAAE,UAAU,CACrB,OAAQ,EAAE,SAAS,CACnB,MAAO,EAAE,QAAQ,CAClB,CACF,CACc,gBACN,UACT,CAAA"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{I as i,M as a,P as o,X as s,Z as c,et as l,i as u,nt as d,ot as f,q as p,tt as m}from"./index-DjtRDlfn.js";import{t as h}from"./ToolbarPanels-CRGQDX-L.js";var g=e(t()),_=r();function v(){let{t:e}=n(),t=(t,n)=>e(`AdminUsers.${t}`,n),r=c(f().activeSession$)?.client,v=l(),y=m(()=>i(r,v)),b=c(y.browse.activePanel$)??null,x=c(y.users$)??[],S=c(y.stats$)??null,C=c(y.usersLoading$)??!0,w=c(y.statsLoading$)??!0,{theme:T,setTheme:E}=d(),{showLineNumbers:D,toggleLineNumbers:O}=s();return p({"settings:theme-changed":(0,g.useCallback)(({theme:e})=>{E(e)},[E]),"settings:line-numbers-toggled":(0,g.useCallback)(()=>{O()},[O])}),(0,_.jsx)(u,{users:x,userStats:S,isLoadingUsers:C,isLoadingStats:w,onUpdateUser:(0,g.useCallback)(async(e,t)=>{try{await y.updateUser(e,t)}catch(e){console.error(`Failed to update user:`,e)}},[y]),onDeleteUser:(0,g.useCallback)(async e=>{console.warn(`Delete user not implemented:`,e),alert(`Delete user functionality is not currently available`)},[]),onAddUser:(0,g.useCallback)(()=>{console.log(`Add user clicked`)},[]),onExportUsers:(0,g.useCallback)(()=>{console.log(`Export users clicked`)},[]),theme:T,showLineNumbers:D,activePanel:b,translations:{title:t(`title`),subtitle:t(`subtitle`),addUser:t(`addUser`),totalUsers:t(`totalUsers`),activeUsers:t(`activeUsers`),administrators:t(`administrators`),recentUsers:t(`recentUsers`),searchUsers:t(`searchUsers`),searchPlaceholder:t(`searchPlaceholder`),role:t(`role`),allRoles:t(`allRoles`),admin:t(`admin`),user:t(`user`),status:t(`status`),allStatus:t(`allStatus`),active:t(`active`),inactive:t(`inactive`),exportUsers:t(`exportUsers`),loadingUsers:t(`loadingUsers`),userColumn:t(`userColumn`),domainColumn:t(`domainColumn`),roleColumn:t(`roleColumn`),statusColumn:t(`statusColumn`),lastLoginColumn:t(`lastLoginColumn`),joinedColumn:t(`joinedColumn`),actionsColumn:t(`actionsColumn`),noUsersFound:t(`noUsersFound`),noUsersFoundDescription:t(`noUsersFoundDescription`),noName:t(`noName`),never:t(`never`),removeAdmin:t(`removeAdmin`),makeAdmin:t(`makeAdmin`),deactivateUser:t(`deactivateUser`),activateUser:t(`activateUser`),deleteUser:t(`deleteUser`)},ToolbarPanels:h,Toolbar:a,buttonStyles:o})}export{v as default};
2
- //# sourceMappingURL=client-uEoQ8iJO.js.map
1
+ import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{I as i,M as a,P as o,X as s,Z as c,et as l,i as u,nt as d,ot as f,q as p,tt as m}from"./index-DojEUBpq.js";import{t as h}from"./ToolbarPanels-wzZqAqCQ.js";var g=e(t()),_=r();function v(){let{t:e}=n(),t=(t,n)=>e(`AdminUsers.${t}`,n),r=c(f().activeSession$)?.client,v=l(),y=m(()=>i(r,v)),b=c(y.browse.activePanel$)??null,x=c(y.users$)??[],S=c(y.stats$)??null,C=c(y.usersLoading$)??!0,w=c(y.statsLoading$)??!0,{theme:T,setTheme:E}=d(),{showLineNumbers:D,toggleLineNumbers:O}=s();return p({"settings:theme-changed":(0,g.useCallback)(({theme:e})=>{E(e)},[E]),"settings:line-numbers-toggled":(0,g.useCallback)(()=>{O()},[O])}),(0,_.jsx)(u,{users:x,userStats:S,isLoadingUsers:C,isLoadingStats:w,onUpdateUser:(0,g.useCallback)(async(e,t)=>{try{await y.updateUser(e,t)}catch(e){console.error(`Failed to update user:`,e)}},[y]),onDeleteUser:(0,g.useCallback)(async e=>{console.warn(`Delete user not implemented:`,e),alert(`Delete user functionality is not currently available`)},[]),onAddUser:(0,g.useCallback)(()=>{console.log(`Add user clicked`)},[]),onExportUsers:(0,g.useCallback)(()=>{console.log(`Export users clicked`)},[]),theme:T,showLineNumbers:D,activePanel:b,translations:{title:t(`title`),subtitle:t(`subtitle`),addUser:t(`addUser`),totalUsers:t(`totalUsers`),activeUsers:t(`activeUsers`),administrators:t(`administrators`),recentUsers:t(`recentUsers`),searchUsers:t(`searchUsers`),searchPlaceholder:t(`searchPlaceholder`),role:t(`role`),allRoles:t(`allRoles`),admin:t(`admin`),user:t(`user`),status:t(`status`),allStatus:t(`allStatus`),active:t(`active`),inactive:t(`inactive`),exportUsers:t(`exportUsers`),loadingUsers:t(`loadingUsers`),userColumn:t(`userColumn`),domainColumn:t(`domainColumn`),roleColumn:t(`roleColumn`),statusColumn:t(`statusColumn`),lastLoginColumn:t(`lastLoginColumn`),joinedColumn:t(`joinedColumn`),actionsColumn:t(`actionsColumn`),noUsersFound:t(`noUsersFound`),noUsersFoundDescription:t(`noUsersFoundDescription`),noName:t(`noName`),never:t(`never`),removeAdmin:t(`removeAdmin`),makeAdmin:t(`makeAdmin`),deactivateUser:t(`deactivateUser`),activateUser:t(`activateUser`),deleteUser:t(`deleteUser`)},ToolbarPanels:h,Toolbar:a,buttonStyles:o})}export{v as default};
2
+ //# sourceMappingURL=client-D5yyxFbt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-uEoQ8iJO.js","names":[],"sources":["../../src/app/[locale]/admin/users/client.tsx"],"sourcesContent":["/**\n * Admin Users Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminUsersPage component.\n */\n\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { buttonStyles, Toolbar, useSemiont } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, useShellStateUnit, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminUsersPage } from '@semiont/react-ui';\nimport type { AdminUser, AdminUserStats } from '@semiont/react-ui';\nimport { createAdminUsersStateUnit } from '@semiont/react-ui';\nimport { useStateUnit } from '@semiont/react-ui';\n\nexport default function AdminUsers() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminUsers.${k}`, p as any) as string;\n\n const semiont = useObservable(useSemiont().activeSession$)?.client;\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createAdminUsersStateUnit(semiont!, browseStateUnit));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const users = useObservable(stateUnit.users$) ?? [];\n const userStats = useObservable(stateUnit.stats$) ?? null;\n const usersLoading = useObservable(stateUnit.usersLoading$) ?? true;\n const statsLoading = useObservable(stateUnit.statsLoading$) ?? true;\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n const handleUpdateUser = useCallback(async (id: string, data: { isAdmin?: boolean; isActive?: boolean }) => {\n try {\n await stateUnit.updateUser(id, data);\n } catch (error) {\n console.error('Failed to update user:', error);\n }\n }, [stateUnit]);\n\n const handleDeleteUser = useCallback(async (id: string) => {\n console.warn('Delete user not implemented:', id);\n alert('Delete user functionality is not currently available');\n }, []);\n\n const handleAddUser = useCallback(() => {\n console.log('Add user clicked');\n }, []);\n\n const handleExportUsers = useCallback(() => {\n console.log('Export users clicked');\n }, []);\n\n return (\n <AdminUsersPage\n users={users as AdminUser[]}\n userStats={userStats as AdminUserStats | null}\n isLoadingUsers={usersLoading}\n isLoadingStats={statsLoading}\n onUpdateUser={handleUpdateUser}\n onDeleteUser={handleDeleteUser}\n onAddUser={handleAddUser}\n onExportUsers={handleExportUsers}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n addUser: t('addUser'),\n totalUsers: t('totalUsers'),\n activeUsers: t('activeUsers'),\n administrators: t('administrators'),\n recentUsers: t('recentUsers'),\n searchUsers: t('searchUsers'),\n searchPlaceholder: t('searchPlaceholder'),\n role: t('role'),\n allRoles: t('allRoles'),\n admin: t('admin'),\n user: t('user'),\n status: t('status'),\n allStatus: t('allStatus'),\n active: t('active'),\n inactive: t('inactive'),\n exportUsers: t('exportUsers'),\n loadingUsers: t('loadingUsers'),\n userColumn: t('userColumn'),\n domainColumn: t('domainColumn'),\n roleColumn: t('roleColumn'),\n statusColumn: t('statusColumn'),\n lastLoginColumn: t('lastLoginColumn'),\n joinedColumn: t('joinedColumn'),\n actionsColumn: t('actionsColumn'),\n noUsersFound: t('noUsersFound'),\n noUsersFoundDescription: t('noUsersFoundDescription'),\n noName: t('noName'),\n never: t('never'),\n removeAdmin: t('removeAdmin'),\n makeAdmin: t('makeAdmin'),\n deactivateUser: t('deactivateUser'),\n activateUser: t('activateUser'),\n deleteUser: t('deleteUser'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n buttonStyles={buttonStyles}\n />\n );\n}\n"],"mappings":"0TAiBA,SAAwB,GAAa,CACnC,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,cAAc,IAAK,EAAS,CAE/E,EAAU,EAAc,GAAY,CAAC,eAAe,EAAE,OACtD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EAA0B,EAAU,EAAgB,CAAC,CAEpF,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAQ,EAAc,EAAU,OAAO,EAAI,EAAE,CAC7C,EAAY,EAAc,EAAU,OAAO,EAAI,KAC/C,EAAe,EAAc,EAAU,cAAc,EAAI,GACzD,EAAe,EAAc,EAAU,cAAc,EAAI,GAEzD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAoC/D,OA1BA,EAAsB,CACpB,0BAAA,EAAA,EAAA,cATsC,CAAE,WAAoD,CAC5F,EAAS,EAAM,EACd,CAAC,EAAS,CAOe,CAC1B,iCAAA,EAAA,EAAA,iBANiD,CACjD,GAAmB,EAClB,CAAC,EAAkB,CAIa,CAClC,CAAC,EAwBA,EAAA,EAAA,KAAC,EAAD,CACS,QACI,YACX,eAAgB,EAChB,eAAgB,EAChB,cAAA,EAAA,EAAA,aA3BiC,MAAO,EAAY,IAAoD,CAC1G,GAAI,CACF,MAAM,EAAU,WAAW,EAAI,EAAK,OAC7B,EAAO,CACd,QAAQ,MAAM,yBAA0B,EAAM,GAE/C,CAAC,EAAU,CAqBI,CACd,cAAA,EAAA,EAAA,aApBiC,KAAO,IAAe,CACzD,QAAQ,KAAK,+BAAgC,EAAG,CAChD,MAAM,uDAAuD,EAC5D,EAAE,CAiBa,CACd,WAAA,EAAA,EAAA,iBAhBoC,CACtC,QAAQ,IAAI,mBAAmB,EAC9B,EAAE,CAcU,CACX,eAAA,EAAA,EAAA,iBAbwC,CAC1C,QAAQ,IAAI,uBAAuB,EAClC,EAAE,CAWc,CACR,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,QAAS,EAAE,UAAU,CACrB,WAAY,EAAE,aAAa,CAC3B,YAAa,EAAE,cAAc,CAC7B,eAAgB,EAAE,iBAAiB,CACnC,YAAa,EAAE,cAAc,CAC7B,YAAa,EAAE,cAAc,CAC7B,kBAAmB,EAAE,oBAAoB,CACzC,KAAM,EAAE,OAAO,CACf,SAAU,EAAE,WAAW,CACvB,MAAO,EAAE,QAAQ,CACjB,KAAM,EAAE,OAAO,CACf,OAAQ,EAAE,SAAS,CACnB,UAAW,EAAE,YAAY,CACzB,OAAQ,EAAE,SAAS,CACnB,SAAU,EAAE,WAAW,CACvB,YAAa,EAAE,cAAc,CAC7B,aAAc,EAAE,eAAe,CAC/B,WAAY,EAAE,aAAa,CAC3B,aAAc,EAAE,eAAe,CAC/B,WAAY,EAAE,aAAa,CAC3B,aAAc,EAAE,eAAe,CAC/B,gBAAiB,EAAE,kBAAkB,CACrC,aAAc,EAAE,eAAe,CAC/B,cAAe,EAAE,gBAAgB,CACjC,aAAc,EAAE,eAAe,CAC/B,wBAAyB,EAAE,0BAA0B,CACrD,OAAQ,EAAE,SAAS,CACnB,MAAO,EAAE,QAAQ,CACjB,YAAa,EAAE,cAAc,CAC7B,UAAW,EAAE,YAAY,CACzB,eAAgB,EAAE,iBAAiB,CACnC,aAAc,EAAE,eAAe,CAC/B,WAAY,EAAE,aAAa,CAC5B,CACc,gBACN,UACK,eACd,CAAA"}
1
+ {"version":3,"file":"client-D5yyxFbt.js","names":[],"sources":["../../src/app/[locale]/admin/users/client.tsx"],"sourcesContent":["/**\n * Admin Users Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminUsersPage component.\n */\n\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { buttonStyles, Toolbar, useSemiont } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, useShellStateUnit, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminUsersPage } from '@semiont/react-ui';\nimport type { AdminUser, AdminUserStats } from '@semiont/react-ui';\nimport { createAdminUsersStateUnit } from '@semiont/react-ui';\nimport { useStateUnit } from '@semiont/react-ui';\n\nexport default function AdminUsers() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminUsers.${k}`, p as any) as string;\n\n const semiont = useObservable(useSemiont().activeSession$)?.client;\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createAdminUsersStateUnit(semiont!, browseStateUnit));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const users = useObservable(stateUnit.users$) ?? [];\n const userStats = useObservable(stateUnit.stats$) ?? null;\n const usersLoading = useObservable(stateUnit.usersLoading$) ?? true;\n const statsLoading = useObservable(stateUnit.statsLoading$) ?? true;\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n const handleUpdateUser = useCallback(async (id: string, data: { isAdmin?: boolean; isActive?: boolean }) => {\n try {\n await stateUnit.updateUser(id, data);\n } catch (error) {\n console.error('Failed to update user:', error);\n }\n }, [stateUnit]);\n\n const handleDeleteUser = useCallback(async (id: string) => {\n console.warn('Delete user not implemented:', id);\n alert('Delete user functionality is not currently available');\n }, []);\n\n const handleAddUser = useCallback(() => {\n console.log('Add user clicked');\n }, []);\n\n const handleExportUsers = useCallback(() => {\n console.log('Export users clicked');\n }, []);\n\n return (\n <AdminUsersPage\n users={users as AdminUser[]}\n userStats={userStats as AdminUserStats | null}\n isLoadingUsers={usersLoading}\n isLoadingStats={statsLoading}\n onUpdateUser={handleUpdateUser}\n onDeleteUser={handleDeleteUser}\n onAddUser={handleAddUser}\n onExportUsers={handleExportUsers}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n addUser: t('addUser'),\n totalUsers: t('totalUsers'),\n activeUsers: t('activeUsers'),\n administrators: t('administrators'),\n recentUsers: t('recentUsers'),\n searchUsers: t('searchUsers'),\n searchPlaceholder: t('searchPlaceholder'),\n role: t('role'),\n allRoles: t('allRoles'),\n admin: t('admin'),\n user: t('user'),\n status: t('status'),\n allStatus: t('allStatus'),\n active: t('active'),\n inactive: t('inactive'),\n exportUsers: t('exportUsers'),\n loadingUsers: t('loadingUsers'),\n userColumn: t('userColumn'),\n domainColumn: t('domainColumn'),\n roleColumn: t('roleColumn'),\n statusColumn: t('statusColumn'),\n lastLoginColumn: t('lastLoginColumn'),\n joinedColumn: t('joinedColumn'),\n actionsColumn: t('actionsColumn'),\n noUsersFound: t('noUsersFound'),\n noUsersFoundDescription: t('noUsersFoundDescription'),\n noName: t('noName'),\n never: t('never'),\n removeAdmin: t('removeAdmin'),\n makeAdmin: t('makeAdmin'),\n deactivateUser: t('deactivateUser'),\n activateUser: t('activateUser'),\n deleteUser: t('deleteUser'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n buttonStyles={buttonStyles}\n />\n );\n}\n"],"mappings":"0TAiBA,SAAwB,GAAa,CACnC,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,cAAc,IAAK,EAAS,CAE/E,EAAU,EAAc,GAAY,CAAC,eAAe,EAAE,OACtD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EAA0B,EAAU,EAAgB,CAAC,CAEpF,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAQ,EAAc,EAAU,OAAO,EAAI,EAAE,CAC7C,EAAY,EAAc,EAAU,OAAO,EAAI,KAC/C,EAAe,EAAc,EAAU,cAAc,EAAI,GACzD,EAAe,EAAc,EAAU,cAAc,EAAI,GAEzD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAoC/D,OA1BA,EAAsB,CACpB,0BAAA,EAAA,EAAA,cATsC,CAAE,WAAoD,CAC5F,EAAS,EAAM,EACd,CAAC,EAAS,CAOe,CAC1B,iCAAA,EAAA,EAAA,iBANiD,CACjD,GAAmB,EAClB,CAAC,EAAkB,CAIa,CAClC,CAAC,EAwBA,EAAA,EAAA,KAAC,EAAD,CACS,QACI,YACX,eAAgB,EAChB,eAAgB,EAChB,cAAA,EAAA,EAAA,aA3BiC,MAAO,EAAY,IAAoD,CAC1G,GAAI,CACF,MAAM,EAAU,WAAW,EAAI,EAAK,OAC7B,EAAO,CACd,QAAQ,MAAM,yBAA0B,EAAM,GAE/C,CAAC,EAAU,CAqBI,CACd,cAAA,EAAA,EAAA,aApBiC,KAAO,IAAe,CACzD,QAAQ,KAAK,+BAAgC,EAAG,CAChD,MAAM,uDAAuD,EAC5D,EAAE,CAiBa,CACd,WAAA,EAAA,EAAA,iBAhBoC,CACtC,QAAQ,IAAI,mBAAmB,EAC9B,EAAE,CAcU,CACX,eAAA,EAAA,EAAA,iBAbwC,CAC1C,QAAQ,IAAI,uBAAuB,EAClC,EAAE,CAWc,CACR,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,QAAS,EAAE,UAAU,CACrB,WAAY,EAAE,aAAa,CAC3B,YAAa,EAAE,cAAc,CAC7B,eAAgB,EAAE,iBAAiB,CACnC,YAAa,EAAE,cAAc,CAC7B,YAAa,EAAE,cAAc,CAC7B,kBAAmB,EAAE,oBAAoB,CACzC,KAAM,EAAE,OAAO,CACf,SAAU,EAAE,WAAW,CACvB,MAAO,EAAE,QAAQ,CACjB,KAAM,EAAE,OAAO,CACf,OAAQ,EAAE,SAAS,CACnB,UAAW,EAAE,YAAY,CACzB,OAAQ,EAAE,SAAS,CACnB,SAAU,EAAE,WAAW,CACvB,YAAa,EAAE,cAAc,CAC7B,aAAc,EAAE,eAAe,CAC/B,WAAY,EAAE,aAAa,CAC3B,aAAc,EAAE,eAAe,CAC/B,WAAY,EAAE,aAAa,CAC3B,aAAc,EAAE,eAAe,CAC/B,gBAAiB,EAAE,kBAAkB,CACrC,aAAc,EAAE,eAAe,CAC/B,cAAe,EAAE,gBAAgB,CACjC,aAAc,EAAE,eAAe,CAC/B,wBAAyB,EAAE,0BAA0B,CACrD,OAAQ,EAAE,SAAS,CACnB,MAAO,EAAE,QAAQ,CACjB,YAAa,EAAE,cAAc,CAC7B,UAAW,EAAE,YAAY,CACzB,eAAgB,EAAE,iBAAiB,CACnC,aAAc,EAAE,eAAe,CAC/B,WAAY,EAAE,aAAa,CAC5B,CACc,gBACN,UACK,eACd,CAAA"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{F as i,M as a,X as o,Z as s,et as c,nt as l,ot as u,q as d,r as f,tt as p}from"./index-DjtRDlfn.js";import{t as m}from"./ToolbarPanels-CRGQDX-L.js";var h=e(t()),g=r();function _(){let{t:e}=n(),t=(t,n)=>e(`AdminSecurity.${t}`,n),r=s(u().activeSession$)?.client,_=c(),v=p(()=>i(r,_)),y=s(v.browse.activePanel$)??null,b=s(v.providers$)??[],x=s(v.allowedDomains$)??[],S=s(v.isLoading$)??!0,{theme:C,setTheme:w}=l(),{showLineNumbers:T,toggleLineNumbers:E}=o();return d({"settings:theme-changed":(0,h.useCallback)(({theme:e})=>{w(e)},[w]),"settings:line-numbers-toggled":(0,h.useCallback)(()=>{E()},[E])}),(0,g.jsx)(f,{providers:b,allowedDomains:x,isLoading:S,theme:C,showLineNumbers:T,activePanel:y,translations:{title:t(`title`),subtitle:t(`subtitle`),oauthProviders:t(`oauthProviders`),oauthProvidersDescription:t(`oauthProvidersDescription`),clientId:t(`clientId`),configured:t(`configured`),noProvidersConfigured:t(`noProvidersConfigured`),allowedDomains:t(`allowedDomains`),allowedDomainsDescription:t(`allowedDomainsDescription`),noDomainsConfigured:t(`noDomainsConfigured`),configManagementTitle:t(`configManagementTitle`),configManagementDescription:t(`configManagementDescription`),configLocalDev:t(`configLocalDev`),configCloudDeploy:t(`configCloudDeploy`),configCloudDeployCommand:t(`configCloudDeployCommand`),configCloudDeployEnd:t(`configCloudDeployEnd`),configAWS:t(`configAWS`)},ToolbarPanels:m,Toolbar:a})}export{_ as default};
2
- //# sourceMappingURL=client-DkMJxPA7.js.map
1
+ import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{F as i,M as a,X as o,Z as s,et as c,nt as l,ot as u,q as d,r as f,tt as p}from"./index-DojEUBpq.js";import{t as m}from"./ToolbarPanels-wzZqAqCQ.js";var h=e(t()),g=r();function _(){let{t:e}=n(),t=(t,n)=>e(`AdminSecurity.${t}`,n),r=s(u().activeSession$)?.client,_=c(),v=p(()=>i(r,_)),y=s(v.browse.activePanel$)??null,b=s(v.providers$)??[],x=s(v.allowedDomains$)??[],S=s(v.isLoading$)??!0,{theme:C,setTheme:w}=l(),{showLineNumbers:T,toggleLineNumbers:E}=o();return d({"settings:theme-changed":(0,h.useCallback)(({theme:e})=>{w(e)},[w]),"settings:line-numbers-toggled":(0,h.useCallback)(()=>{E()},[E])}),(0,g.jsx)(f,{providers:b,allowedDomains:x,isLoading:S,theme:C,showLineNumbers:T,activePanel:y,translations:{title:t(`title`),subtitle:t(`subtitle`),oauthProviders:t(`oauthProviders`),oauthProvidersDescription:t(`oauthProvidersDescription`),clientId:t(`clientId`),configured:t(`configured`),noProvidersConfigured:t(`noProvidersConfigured`),allowedDomains:t(`allowedDomains`),allowedDomainsDescription:t(`allowedDomainsDescription`),noDomainsConfigured:t(`noDomainsConfigured`),configManagementTitle:t(`configManagementTitle`),configManagementDescription:t(`configManagementDescription`),configLocalDev:t(`configLocalDev`),configCloudDeploy:t(`configCloudDeploy`),configCloudDeployCommand:t(`configCloudDeployCommand`),configCloudDeployEnd:t(`configCloudDeployEnd`),configAWS:t(`configAWS`)},ToolbarPanels:m,Toolbar:a})}export{_ as default};
2
+ //# sourceMappingURL=client-DgzjF497.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-DkMJxPA7.js","names":[],"sources":["../../src/app/[locale]/admin/security/client.tsx"],"sourcesContent":["/**\n * Admin Security Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminSecurityPage component.\n */\n\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Toolbar, useSemiont } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, useShellStateUnit, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminSecurityPage } from '@semiont/react-ui';\nimport type { OAuthProvider } from '@semiont/react-ui';\nimport { createAdminSecurityStateUnit } from '@semiont/react-ui';\nimport { useStateUnit } from '@semiont/react-ui';\n\nexport default function AdminSecurity() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminSecurity.${k}`, p as any) as string;\n\n const semiont = useObservable(useSemiont().activeSession$)?.client;\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createAdminSecurityStateUnit(semiont!, browseStateUnit));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const providers = useObservable(stateUnit.providers$) ?? [];\n const allowedDomains = useObservable(stateUnit.allowedDomains$) ?? [];\n const isLoading = useObservable(stateUnit.isLoading$) ?? true;\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n return (\n <AdminSecurityPage\n providers={providers as OAuthProvider[]}\n allowedDomains={allowedDomains}\n isLoading={isLoading}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n oauthProviders: t('oauthProviders'),\n oauthProvidersDescription: t('oauthProvidersDescription'),\n clientId: t('clientId'),\n configured: t('configured'),\n noProvidersConfigured: t('noProvidersConfigured'),\n allowedDomains: t('allowedDomains'),\n allowedDomainsDescription: t('allowedDomainsDescription'),\n noDomainsConfigured: t('noDomainsConfigured'),\n configManagementTitle: t('configManagementTitle'),\n configManagementDescription: t('configManagementDescription'),\n configLocalDev: t('configLocalDev'),\n configCloudDeploy: t('configCloudDeploy'),\n configCloudDeployCommand: t('configCloudDeployCommand'),\n configCloudDeployEnd: t('configCloudDeployEnd'),\n configAWS: t('configAWS'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"mappings":"mTAiBA,SAAwB,GAAgB,CACtC,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,iBAAiB,IAAK,EAAS,CAElF,EAAU,EAAc,GAAY,CAAC,eAAe,EAAE,OACtD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EAA6B,EAAU,EAAgB,CAAC,CAEvF,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAY,EAAc,EAAU,WAAW,EAAI,EAAE,CACrD,EAAiB,EAAc,EAAU,gBAAgB,EAAI,EAAE,CAC/D,EAAY,EAAc,EAAU,WAAW,EAAI,GAEnD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAe/D,OALA,EAAsB,CACpB,0BAAA,EAAA,EAAA,cATsC,CAAE,WAAoD,CAC5F,EAAS,EAAM,EACd,CAAC,EAAS,CAOe,CAC1B,iCAAA,EAAA,EAAA,iBANiD,CACjD,GAAmB,EAClB,CAAC,EAAkB,CAIa,CAClC,CAAC,EAGA,EAAA,EAAA,KAAC,EAAD,CACa,YACK,iBACL,YACJ,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,eAAgB,EAAE,iBAAiB,CACnC,0BAA2B,EAAE,4BAA4B,CACzD,SAAU,EAAE,WAAW,CACvB,WAAY,EAAE,aAAa,CAC3B,sBAAuB,EAAE,wBAAwB,CACjD,eAAgB,EAAE,iBAAiB,CACnC,0BAA2B,EAAE,4BAA4B,CACzD,oBAAqB,EAAE,sBAAsB,CAC7C,sBAAuB,EAAE,wBAAwB,CACjD,4BAA6B,EAAE,8BAA8B,CAC7D,eAAgB,EAAE,iBAAiB,CACnC,kBAAmB,EAAE,oBAAoB,CACzC,yBAA0B,EAAE,2BAA2B,CACvD,qBAAsB,EAAE,uBAAuB,CAC/C,UAAW,EAAE,YAAY,CAC1B,CACc,gBACN,UACT,CAAA"}
1
+ {"version":3,"file":"client-DgzjF497.js","names":[],"sources":["../../src/app/[locale]/admin/security/client.tsx"],"sourcesContent":["/**\n * Admin Security Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminSecurityPage component.\n */\n\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Toolbar, useSemiont } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, useShellStateUnit, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminSecurityPage } from '@semiont/react-ui';\nimport type { OAuthProvider } from '@semiont/react-ui';\nimport { createAdminSecurityStateUnit } from '@semiont/react-ui';\nimport { useStateUnit } from '@semiont/react-ui';\n\nexport default function AdminSecurity() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminSecurity.${k}`, p as any) as string;\n\n const semiont = useObservable(useSemiont().activeSession$)?.client;\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createAdminSecurityStateUnit(semiont!, browseStateUnit));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const providers = useObservable(stateUnit.providers$) ?? [];\n const allowedDomains = useObservable(stateUnit.allowedDomains$) ?? [];\n const isLoading = useObservable(stateUnit.isLoading$) ?? true;\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n return (\n <AdminSecurityPage\n providers={providers as OAuthProvider[]}\n allowedDomains={allowedDomains}\n isLoading={isLoading}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n oauthProviders: t('oauthProviders'),\n oauthProvidersDescription: t('oauthProvidersDescription'),\n clientId: t('clientId'),\n configured: t('configured'),\n noProvidersConfigured: t('noProvidersConfigured'),\n allowedDomains: t('allowedDomains'),\n allowedDomainsDescription: t('allowedDomainsDescription'),\n noDomainsConfigured: t('noDomainsConfigured'),\n configManagementTitle: t('configManagementTitle'),\n configManagementDescription: t('configManagementDescription'),\n configLocalDev: t('configLocalDev'),\n configCloudDeploy: t('configCloudDeploy'),\n configCloudDeployCommand: t('configCloudDeployCommand'),\n configCloudDeployEnd: t('configCloudDeployEnd'),\n configAWS: t('configAWS'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"mappings":"mTAiBA,SAAwB,GAAgB,CACtC,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,iBAAiB,IAAK,EAAS,CAElF,EAAU,EAAc,GAAY,CAAC,eAAe,EAAE,OACtD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EAA6B,EAAU,EAAgB,CAAC,CAEvF,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAY,EAAc,EAAU,WAAW,EAAI,EAAE,CACrD,EAAiB,EAAc,EAAU,gBAAgB,EAAI,EAAE,CAC/D,EAAY,EAAc,EAAU,WAAW,EAAI,GAEnD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAe/D,OALA,EAAsB,CACpB,0BAAA,EAAA,EAAA,cATsC,CAAE,WAAoD,CAC5F,EAAS,EAAM,EACd,CAAC,EAAS,CAOe,CAC1B,iCAAA,EAAA,EAAA,iBANiD,CACjD,GAAmB,EAClB,CAAC,EAAkB,CAIa,CAClC,CAAC,EAGA,EAAA,EAAA,KAAC,EAAD,CACa,YACK,iBACL,YACJ,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,eAAgB,EAAE,iBAAiB,CACnC,0BAA2B,EAAE,4BAA4B,CACzD,SAAU,EAAE,WAAW,CACvB,WAAY,EAAE,aAAa,CAC3B,sBAAuB,EAAE,wBAAwB,CACjD,eAAgB,EAAE,iBAAiB,CACnC,0BAA2B,EAAE,4BAA4B,CACzD,oBAAqB,EAAE,sBAAsB,CAC7C,sBAAuB,EAAE,wBAAwB,CACjD,4BAA6B,EAAE,8BAA8B,CAC7D,eAAgB,EAAE,iBAAiB,CACnC,kBAAmB,EAAE,oBAAoB,CACzC,yBAA0B,EAAE,2BAA2B,CACvD,qBAAsB,EAAE,uBAAuB,CAC/C,UAAW,EAAE,YAAY,CAC1B,CACc,gBACN,UACT,CAAA"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{B as i,M as a,X as o,Z as s,et as c,nt as l,ot as u,p as d,q as f,tt as p}from"./index-DjtRDlfn.js";import{t as m}from"./ToolbarPanels-CRGQDX-L.js";var h=e(t()),g=r();function _(){let{t:e}=n(),t=(t,n)=>e(`ModerationLinkedData.${t}`,n),r=s(u().activeSession$)?.client,_=c(),v=p(()=>i(_,e=>r.admin.exportKnowledgeBase(e),e=>r.admin.importKnowledgeBase(e))),y=s(v.browse.activePanel$)??null,b=s(v.selectedFile$)??null,x=s(v.preview$)??null,S=s(v.isExporting$)??!1,C=s(v.isImporting$)??!1,w=s(v.importPhase$)??null,T=s(v.importMessage$),E=s(v.importResult$),{theme:D,setTheme:O}=l(),{showLineNumbers:k,toggleLineNumbers:A}=o();f({"settings:theme-changed":(0,h.useCallback)(({theme:e})=>O(e),[O]),"settings:line-numbers-toggled":(0,h.useCallback)(()=>A(),[A])});let j=(0,h.useCallback)(async()=>{let{blob:e,filename:t}=await v.doExport(),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),URL.revokeObjectURL(n)},[v]),M=(0,h.useCallback)(async()=>{await v.doImport()},[v]);return(0,g.jsx)(d,{onExport:j,isExporting:S,onFileSelected:v.selectFile,onImport:M,onCancelImport:v.cancelImport,selectedFile:b,preview:x,isImporting:C,importPhase:w,importMessage:T,importResult:E,theme:D,showLineNumbers:k,activePanel:y,translations:{title:t(`title`),subtitle:t(`subtitle`),export:{title:t(`exportTitle`),description:t(`exportDescription`),exportButton:t(`exportButton`),exporting:t(`exporting`)},import:{title:t(`importTitle`),description:t(`importDescription`),dropzoneLabel:t(`dropzoneLabel`),dropzoneActive:t(`dropzoneActive`),detectedFormat:t(`detectedFormat`),statsPreview:t(`statsPreview`),importButton:t(`importButton`),importing:t(`importing`),importConfirmTitle:t(`importConfirmTitle`),importConfirmMessage:t(`importConfirmMessage`),confirmImport:t(`confirmImport`),cancelImport:t(`cancelImport`)},progress:{phaseStarted:t(`phaseStarted`),phaseEntityTypes:t(`phaseEntityTypes`),phaseResources:t(`phaseResources`),phaseAnnotations:t(`phaseAnnotations`),phaseComplete:t(`phaseComplete`),phaseError:t(`phaseError`),hashChainValid:t(`hashChainValid`),hashChainInvalid:t(`hashChainInvalid`),streams:t(`streams`),events:t(`events`),blobs:t(`blobs`)}},ToolbarPanels:m,Toolbar:a})}export{_ as default};
2
- //# sourceMappingURL=client-DxlEW_QJ.js.map
1
+ import{n as e}from"./rolldown-runtime-jpDsebLB.js";import{i as t,n}from"./i18n-B53Yefbh.js";import{t as r}from"./vendor-0HjOURbh.js";import{B as i,M as a,X as o,Z as s,et as c,nt as l,ot as u,p as d,q as f,tt as p}from"./index-DojEUBpq.js";import{t as m}from"./ToolbarPanels-wzZqAqCQ.js";var h=e(t()),g=r();function _(){let{t:e}=n(),t=(t,n)=>e(`ModerationLinkedData.${t}`,n),r=s(u().activeSession$)?.client,_=c(),v=p(()=>i(_,e=>r.admin.exportKnowledgeBase(e),e=>r.admin.importKnowledgeBase(e))),y=s(v.browse.activePanel$)??null,b=s(v.selectedFile$)??null,x=s(v.preview$)??null,S=s(v.isExporting$)??!1,C=s(v.isImporting$)??!1,w=s(v.importPhase$)??null,T=s(v.importMessage$),E=s(v.importResult$),{theme:D,setTheme:O}=l(),{showLineNumbers:k,toggleLineNumbers:A}=o();f({"settings:theme-changed":(0,h.useCallback)(({theme:e})=>O(e),[O]),"settings:line-numbers-toggled":(0,h.useCallback)(()=>A(),[A])});let j=(0,h.useCallback)(async()=>{let{blob:e,filename:t}=await v.doExport(),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),URL.revokeObjectURL(n)},[v]),M=(0,h.useCallback)(async()=>{await v.doImport()},[v]);return(0,g.jsx)(d,{onExport:j,isExporting:S,onFileSelected:v.selectFile,onImport:M,onCancelImport:v.cancelImport,selectedFile:b,preview:x,isImporting:C,importPhase:w,importMessage:T,importResult:E,theme:D,showLineNumbers:k,activePanel:y,translations:{title:t(`title`),subtitle:t(`subtitle`),export:{title:t(`exportTitle`),description:t(`exportDescription`),exportButton:t(`exportButton`),exporting:t(`exporting`)},import:{title:t(`importTitle`),description:t(`importDescription`),dropzoneLabel:t(`dropzoneLabel`),dropzoneActive:t(`dropzoneActive`),detectedFormat:t(`detectedFormat`),statsPreview:t(`statsPreview`),importButton:t(`importButton`),importing:t(`importing`),importConfirmTitle:t(`importConfirmTitle`),importConfirmMessage:t(`importConfirmMessage`),confirmImport:t(`confirmImport`),cancelImport:t(`cancelImport`)},progress:{phaseStarted:t(`phaseStarted`),phaseEntityTypes:t(`phaseEntityTypes`),phaseResources:t(`phaseResources`),phaseAnnotations:t(`phaseAnnotations`),phaseComplete:t(`phaseComplete`),phaseError:t(`phaseError`),hashChainValid:t(`hashChainValid`),hashChainInvalid:t(`hashChainInvalid`),streams:t(`streams`),events:t(`events`),blobs:t(`blobs`)}},ToolbarPanels:m,Toolbar:a})}export{_ as default};
2
+ //# sourceMappingURL=client-myF3ozNf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-DxlEW_QJ.js","names":[],"sources":["../../src/app/[locale]/moderate/linked-data/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellStateUnit,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useStateUnit,\n LinkedDataPage,\n} from '@semiont/react-ui';\nimport { createExchangeStateUnit } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\n\nexport default function LinkedDataClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerationLinkedData.${k}`, p as any) as string;\n const client = useObservable(useSemiont().activeSession$)?.client;\n\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createExchangeStateUnit(\n browseStateUnit,\n (params) => client!.admin!.exportKnowledgeBase(params),\n (file) => client!.admin!.importKnowledgeBase(file),\n ));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const selectedFile = useObservable(stateUnit.selectedFile$) ?? null;\n const preview = useObservable(stateUnit.preview$) ?? null;\n const isExporting = useObservable(stateUnit.isExporting$) ?? false;\n const isImporting = useObservable(stateUnit.isImporting$) ?? false;\n const importPhase = useObservable(stateUnit.importPhase$) ?? null;\n const importMessage = useObservable(stateUnit.importMessage$);\n const importResult = useObservable(stateUnit.importResult$);\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n useEventSubscriptions({\n 'settings:theme-changed': useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme), [setTheme]),\n 'settings:line-numbers-toggled': useCallback(() => toggleLineNumbers(), [toggleLineNumbers]),\n });\n\n const handleExport = useCallback(async () => {\n const { blob, filename } = await stateUnit.doExport();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [stateUnit]);\n\n const handleImport = useCallback(async () => {\n await stateUnit.doImport();\n }, [stateUnit]);\n\n return (\n <LinkedDataPage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={stateUnit.selectFile}\n onImport={handleImport}\n onCancelImport={stateUnit.cancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={isImporting}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"mappings":"mTAgBA,SAAwB,GAAmB,CACzC,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,wBAAwB,IAAK,EAAS,CACzF,EAAS,EAAc,GAAY,CAAC,eAAe,EAAE,OAErD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EACnC,EACC,GAAW,EAAQ,MAAO,oBAAoB,EAAO,CACrD,GAAS,EAAQ,MAAO,oBAAoB,EAAK,CACnD,CAAC,CAEI,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAe,EAAc,EAAU,cAAc,EAAI,KACzD,EAAU,EAAc,EAAU,SAAS,EAAI,KAC/C,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,KACvD,EAAgB,EAAc,EAAU,eAAe,CACvD,EAAe,EAAc,EAAU,cAAc,CAErD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAE/D,EAAsB,CACpB,0BAAA,EAAA,EAAA,cAAuC,CAAE,WAAoD,EAAS,EAAM,CAAE,CAAC,EAAS,CAAC,CACzH,iCAAA,EAAA,EAAA,iBAAmD,GAAmB,CAAE,CAAC,EAAkB,CAAC,CAC7F,CAAC,CAEF,IAAM,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,GAAM,CAAE,OAAM,YAAa,MAAM,EAAU,UAAU,CAC/C,EAAM,IAAI,gBAAgB,EAAK,CAC/B,EAAI,SAAS,cAAc,IAAI,CACrC,EAAE,KAAO,EACT,EAAE,SAAW,EACb,EAAE,OAAO,CACT,IAAI,gBAAgB,EAAI,EACvB,CAAC,EAAU,CAAC,CAET,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,MAAM,EAAU,UAAU,EACzB,CAAC,EAAU,CAAC,CAEf,OACE,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,EACG,cACb,eAAgB,EAAU,WAC1B,SAAU,EACV,eAAgB,EAAU,aACZ,eACL,UACI,cACA,cACE,gBACD,eACP,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CAC1B,CACD,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,cAAe,EAAE,gBAAgB,CACjC,eAAgB,EAAE,iBAAiB,CACnC,eAAgB,EAAE,iBAAiB,CACnC,aAAc,EAAE,eAAe,CAC/B,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CACzB,mBAAoB,EAAE,qBAAqB,CAC3C,qBAAsB,EAAE,uBAAuB,CAC/C,cAAe,EAAE,gBAAgB,CACjC,aAAc,EAAE,eAAe,CAChC,CACD,SAAU,CACR,aAAc,EAAE,eAAe,CAC/B,iBAAkB,EAAE,mBAAmB,CACvC,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,cAAe,EAAE,gBAAgB,CACjC,WAAY,EAAE,aAAa,CAC3B,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,QAAS,EAAE,UAAU,CACrB,OAAQ,EAAE,SAAS,CACnB,MAAO,EAAE,QAAQ,CAClB,CACF,CACc,gBACN,UACT,CAAA"}
1
+ {"version":3,"file":"client-myF3ozNf.js","names":[],"sources":["../../src/app/[locale]/moderate/linked-data/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellStateUnit,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useStateUnit,\n LinkedDataPage,\n} from '@semiont/react-ui';\nimport { createExchangeStateUnit } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\n\nexport default function LinkedDataClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerationLinkedData.${k}`, p as any) as string;\n const client = useObservable(useSemiont().activeSession$)?.client;\n\n const browseStateUnit = useShellStateUnit();\n const stateUnit = useStateUnit(() => createExchangeStateUnit(\n browseStateUnit,\n (params) => client!.admin!.exportKnowledgeBase(params),\n (file) => client!.admin!.importKnowledgeBase(file),\n ));\n\n const activePanel = useObservable(stateUnit.browse.activePanel$) ?? null;\n const selectedFile = useObservable(stateUnit.selectedFile$) ?? null;\n const preview = useObservable(stateUnit.preview$) ?? null;\n const isExporting = useObservable(stateUnit.isExporting$) ?? false;\n const isImporting = useObservable(stateUnit.isImporting$) ?? false;\n const importPhase = useObservable(stateUnit.importPhase$) ?? null;\n const importMessage = useObservable(stateUnit.importMessage$);\n const importResult = useObservable(stateUnit.importResult$);\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n useEventSubscriptions({\n 'settings:theme-changed': useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme), [setTheme]),\n 'settings:line-numbers-toggled': useCallback(() => toggleLineNumbers(), [toggleLineNumbers]),\n });\n\n const handleExport = useCallback(async () => {\n const { blob, filename } = await stateUnit.doExport();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [stateUnit]);\n\n const handleImport = useCallback(async () => {\n await stateUnit.doImport();\n }, [stateUnit]);\n\n return (\n <LinkedDataPage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={stateUnit.selectFile}\n onImport={handleImport}\n onCancelImport={stateUnit.cancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={isImporting}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"mappings":"mTAgBA,SAAwB,GAAmB,CACzC,GAAM,CAAE,EAAG,GAAO,GAAgB,CAC5B,GAAK,EAAW,IAAgC,EAAG,wBAAwB,IAAK,EAAS,CACzF,EAAS,EAAc,GAAY,CAAC,eAAe,EAAE,OAErD,EAAkB,GAAmB,CACrC,EAAY,MAAmB,EACnC,EACC,GAAW,EAAQ,MAAO,oBAAoB,EAAO,CACrD,GAAS,EAAQ,MAAO,oBAAoB,EAAK,CACnD,CAAC,CAEI,EAAc,EAAc,EAAU,OAAO,aAAa,EAAI,KAC9D,EAAe,EAAc,EAAU,cAAc,EAAI,KACzD,EAAU,EAAc,EAAU,SAAS,EAAI,KAC/C,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,GACvD,EAAc,EAAc,EAAU,aAAa,EAAI,KACvD,EAAgB,EAAc,EAAU,eAAe,CACvD,EAAe,EAAc,EAAU,cAAc,CAErD,CAAE,QAAO,YAAa,GAAU,CAChC,CAAE,kBAAiB,qBAAsB,GAAgB,CAE/D,EAAsB,CACpB,0BAAA,EAAA,EAAA,cAAuC,CAAE,WAAoD,EAAS,EAAM,CAAE,CAAC,EAAS,CAAC,CACzH,iCAAA,EAAA,EAAA,iBAAmD,GAAmB,CAAE,CAAC,EAAkB,CAAC,CAC7F,CAAC,CAEF,IAAM,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,GAAM,CAAE,OAAM,YAAa,MAAM,EAAU,UAAU,CAC/C,EAAM,IAAI,gBAAgB,EAAK,CAC/B,EAAI,SAAS,cAAc,IAAI,CACrC,EAAE,KAAO,EACT,EAAE,SAAW,EACb,EAAE,OAAO,CACT,IAAI,gBAAgB,EAAI,EACvB,CAAC,EAAU,CAAC,CAET,GAAA,EAAA,EAAA,aAA2B,SAAY,CAC3C,MAAM,EAAU,UAAU,EACzB,CAAC,EAAU,CAAC,CAEf,OACE,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,EACG,cACb,eAAgB,EAAU,WAC1B,SAAU,EACV,eAAgB,EAAU,aACZ,eACL,UACI,cACA,cACE,gBACD,eACP,QACU,kBACJ,cACb,aAAc,CACZ,MAAO,EAAE,QAAQ,CACjB,SAAU,EAAE,WAAW,CACvB,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CAC1B,CACD,OAAQ,CACN,MAAO,EAAE,cAAc,CACvB,YAAa,EAAE,oBAAoB,CACnC,cAAe,EAAE,gBAAgB,CACjC,eAAgB,EAAE,iBAAiB,CACnC,eAAgB,EAAE,iBAAiB,CACnC,aAAc,EAAE,eAAe,CAC/B,aAAc,EAAE,eAAe,CAC/B,UAAW,EAAE,YAAY,CACzB,mBAAoB,EAAE,qBAAqB,CAC3C,qBAAsB,EAAE,uBAAuB,CAC/C,cAAe,EAAE,gBAAgB,CACjC,aAAc,EAAE,eAAe,CAChC,CACD,SAAU,CACR,aAAc,EAAE,eAAe,CAC/B,iBAAkB,EAAE,mBAAmB,CACvC,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,cAAe,EAAE,gBAAgB,CACjC,WAAY,EAAE,aAAa,CAC3B,eAAgB,EAAE,iBAAiB,CACnC,iBAAkB,EAAE,mBAAmB,CACvC,QAAS,EAAE,UAAU,CACrB,OAAQ,EAAE,SAAS,CACnB,MAAO,EAAE,QAAQ,CAClB,CACF,CACc,gBACN,UACT,CAAA"}