@semiont/cli 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +394 -287
- package/dist/frontend/dist/assets/{CookiePreferences-CPbRK2Nf.js → CookiePreferences-D5wgmVC7.js} +2 -2
- package/dist/frontend/dist/assets/{CookiePreferences-CPbRK2Nf.js.map → CookiePreferences-D5wgmVC7.js.map} +1 -1
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-5QESNO5H-CprYrfHh.js → PdfAnnotationCanvas.client-5QESNO5H-B7UjwjIX.js} +2 -2
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-5QESNO5H-CprYrfHh.js.map → PdfAnnotationCanvas.client-5QESNO5H-B7UjwjIX.js.map} +1 -1
- package/dist/frontend/dist/assets/{ToolbarPanels-CPoZvoTB.js → ToolbarPanels-CjWlSOUC.js} +2 -2
- package/dist/frontend/dist/assets/{ToolbarPanels-CPoZvoTB.js.map → ToolbarPanels-CjWlSOUC.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-kS15_T5U.js → client-B-MtBLP9.js} +2 -2
- package/dist/frontend/dist/assets/{client-kS15_T5U.js.map → client-B-MtBLP9.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-CPOjL49o.js → client-DX1ckM1P.js} +2 -2
- package/dist/frontend/dist/assets/{client-CPOjL49o.js.map → client-DX1ckM1P.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-CCxdaxo8.js → client-Dh9ak8Fa.js} +2 -2
- package/dist/frontend/dist/assets/{client-CCxdaxo8.js.map → client-Dh9ak8Fa.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-D04WIU14.js → client-DsP3tx7D.js} +2 -2
- package/dist/frontend/dist/assets/{client-D04WIU14.js.map → client-DsP3tx7D.js.map} +1 -1
- package/dist/frontend/dist/assets/{index-fHqJXd_A.css → index-Dg-Pampr.css} +1 -1
- package/dist/frontend/dist/assets/{index-Bsr9DJ3G.js → index-DoPpOINE.js} +57 -57
- package/dist/frontend/dist/assets/index-DoPpOINE.js.map +1 -0
- package/dist/frontend/dist/assets/{layout-w9wtEpkI.js → layout-BNfHKiGS.js} +2 -2
- package/dist/frontend/dist/assets/{layout-w9wtEpkI.js.map → layout-BNfHKiGS.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-DqFHhLVw.js → layout-CMpievJ_.js} +2 -2
- package/dist/frontend/dist/assets/{layout-DqFHhLVw.js.map → layout-CMpievJ_.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-BWesrQWr.js → layout-Delbhxmy.js} +2 -2
- package/dist/frontend/dist/assets/{layout-BWesrQWr.js.map → layout-Delbhxmy.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-B-lufx1s.js → layout-G6HeeKIH.js} +2 -2
- package/dist/frontend/dist/assets/{layout-B-lufx1s.js.map → layout-G6HeeKIH.js.map} +1 -1
- package/dist/frontend/dist/assets/{not-found-C0HTZoKU.js → not-found-CtwZrTVU.js} +2 -2
- package/dist/frontend/dist/assets/{not-found-C0HTZoKU.js.map → not-found-CtwZrTVU.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BS88Xh4W.js → page-7nyyO6Jy.js} +2 -2
- package/dist/frontend/dist/assets/{page-BS88Xh4W.js.map → page-7nyyO6Jy.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-JI9gNkHU.js → page-BEhfXGas.js} +2 -2
- package/dist/frontend/dist/assets/{page-JI9gNkHU.js.map → page-BEhfXGas.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CryPHwXI.js → page-Bb5SB6_Q.js} +2 -2
- package/dist/frontend/dist/assets/{page-CryPHwXI.js.map → page-Bb5SB6_Q.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BIyG0SOs.js → page-CI8oLbhf.js} +2 -2
- package/dist/frontend/dist/assets/{page-BIyG0SOs.js.map → page-CI8oLbhf.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-C43cKrO_.js → page-CV0h_zZE.js} +2 -2
- package/dist/frontend/dist/assets/{page-C43cKrO_.js.map → page-CV0h_zZE.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BoFYscYi.js → page-C_fIdKsk.js} +2 -2
- package/dist/frontend/dist/assets/{page-BoFYscYi.js.map → page-C_fIdKsk.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CPL87vBZ.js → page-CjI_QXry.js} +2 -2
- package/dist/frontend/dist/assets/{page-CPL87vBZ.js.map → page-CjI_QXry.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BMeXKClk.js → page-CkiQdVlI.js} +2 -2
- package/dist/frontend/dist/assets/{page-BMeXKClk.js.map → page-CkiQdVlI.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CU11Rd_F.js → page-D5qkLwSn.js} +2 -2
- package/dist/frontend/dist/assets/{page-CU11Rd_F.js.map → page-D5qkLwSn.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-Dvw2I_gp.js → page-DBYS9qIU.js} +2 -2
- package/dist/frontend/dist/assets/{page-Dvw2I_gp.js.map → page-DBYS9qIU.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DYOj954J.js → page-DBlue8Rh.js} +2 -2
- package/dist/frontend/dist/assets/{page-DYOj954J.js.map → page-DBlue8Rh.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-haUujHsJ.js → page-DSW3JQF2.js} +2 -2
- package/dist/frontend/dist/assets/{page-haUujHsJ.js.map → page-DSW3JQF2.js.map} +1 -1
- package/dist/frontend/dist/assets/page-DU909Np3.js +2 -0
- package/dist/frontend/dist/assets/{page-Du1JP0jA.js.map → page-DU909Np3.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BzkBmeDS.js → page-DV9q0oju.js} +2 -2
- package/dist/frontend/dist/assets/{page-BzkBmeDS.js.map → page-DV9q0oju.js.map} +1 -1
- package/dist/frontend/dist/assets/{page--QmNUvGH.js → page-D_6K1M4j.js} +2 -2
- package/dist/frontend/dist/assets/{page--QmNUvGH.js.map → page-D_6K1M4j.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CHCWv8gH.js → page-RgfG8Fre.js} +2 -2
- package/dist/frontend/dist/assets/{page-CHCWv8gH.js.map → page-RgfG8Fre.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CN1zC8Ky.js → page-VPeYeXi6.js} +2 -2
- package/dist/frontend/dist/assets/{page-CN1zC8Ky.js.map → page-VPeYeXi6.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BkEdFy5p.js → page-kVSb0jfm.js} +2 -2
- package/dist/frontend/dist/assets/{page-BkEdFy5p.js.map → page-kVSb0jfm.js.map} +1 -1
- package/dist/frontend/dist/assets/{privacy-CZ8NTWnp.js → privacy-NaGU1hj4.js} +2 -2
- package/dist/frontend/dist/assets/{privacy-CZ8NTWnp.js.map → privacy-NaGU1hj4.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-D4iNsc7y.js → routing-BybXhU8X.js} +2 -2
- package/dist/frontend/dist/assets/{routing-D4iNsc7y.js.map → routing-BybXhU8X.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-DCIgrT7s.js → routing-o1npPvOW.js} +2 -2
- package/dist/frontend/dist/assets/{routing-DCIgrT7s.js.map → routing-o1npPvOW.js.map} +1 -1
- package/dist/frontend/dist/assets/{web-Ua5dIRkZ.js → web-DAOI6EsG.js} +2 -2
- package/dist/frontend/dist/assets/{web-Ua5dIRkZ.js.map → web-DAOI6EsG.js.map} +1 -1
- package/dist/frontend/dist/index.html +2 -2
- package/dist/frontend/package.json +1 -1
- package/package.json +8 -8
- package/dist/frontend/dist/assets/index-Bsr9DJ3G.js.map +0 -1
- package/dist/frontend/dist/assets/page-Du1JP0jA.js +0 -2
package/dist/frontend/dist/assets/{ToolbarPanels-CPoZvoTB.js.map → ToolbarPanels-CjWlSOUC.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarPanels-CPoZvoTB.js","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 createSessionVM,\n useViewModel,\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 sessionVM = useViewModel(() => createSessionVM(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 sessionVM.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));\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(kb => kb.host === host && kb.port === port);\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({ label, host, port, protocol, email, ...(gitBranch ? { gitBranch } : {}) }, token, refreshToken);\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 try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(kb.host, kb.port, kb.protocol, kb.email, password);\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.host}:{kb.port}{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} 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 /** Hover delay setting */\n hoverDelayMs: number;\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 hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\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"],"names":["ArrowRightStartOnRectangleIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CheckIcon","PlusIcon","FALLBACK_AVATAR","UserPanel","_t","useTranslation","p","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","displayName","_a","avatarUrl","userDomain","_b","isAdmin","isModerator","apiClient","sessionVM","useViewModel","createSessionVM","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","STATUS_COLORS","STATUS_KEYS","StatusDot","status","LoginForm","t","onSubmit","onCancel","error","isSubmitting","autoFocus","pulsing","initialHost","initialPort","initialEmail","host","setHost","port","setPort","protocol","setProtocol","defaultProtocol","email","setEmail","password","setPassword","handleHostChange","newHost","e","isValidHostname","XMarkIcon","ReauthForm","kb","authenticateWithBackend","emailStr","origin","transport","HttpTransport","baseUrl","client","SemiontClient","HttpContentTransport","authResult","token","refreshToken","label","gitBranch","KnowledgeBasePanel","k","knowledgeBases","setActiveKnowledgeBase","id","addKnowledgeBase","removeKnowledgeBase","updateKnowledgeBase","signIn","access","refresh","signOut","showAddForm","setShowAddForm","addError","setAddError","addSubmitting","setAddSubmitting","reauthKbId","setReauthKbId","reauthError","setReauthError","reauthSubmitting","setReauthSubmitting","confirmRemoveKbId","setConfirmRemoveKbId","setTick","useEffect","interval","openAddForm","handleAdd","existing","err","handleReauth","kbId","handleKbClick","isActive","isReauthing","TrashIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","isAuthenticated","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"ToolbarPanels-CjWlSOUC.js","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 createSessionVM,\n useViewModel,\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 sessionVM = useViewModel(() => createSessionVM(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 sessionVM.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));\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(kb => kb.host === host && kb.port === port);\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({ label, host, port, protocol, email, ...(gitBranch ? { gitBranch } : {}) }, token, refreshToken);\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 try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(kb.host, kb.port, kb.protocol, kb.email, password);\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.host}:{kb.port}{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} 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 /** Hover delay setting */\n hoverDelayMs: number;\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 hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\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"],"names":["ArrowRightStartOnRectangleIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CheckIcon","PlusIcon","FALLBACK_AVATAR","UserPanel","_t","useTranslation","p","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","displayName","_a","avatarUrl","userDomain","_b","isAdmin","isModerator","apiClient","sessionVM","useViewModel","createSessionVM","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","STATUS_COLORS","STATUS_KEYS","StatusDot","status","LoginForm","t","onSubmit","onCancel","error","isSubmitting","autoFocus","pulsing","initialHost","initialPort","initialEmail","host","setHost","port","setPort","protocol","setProtocol","defaultProtocol","email","setEmail","password","setPassword","handleHostChange","newHost","e","isValidHostname","XMarkIcon","ReauthForm","kb","authenticateWithBackend","emailStr","origin","transport","HttpTransport","baseUrl","client","SemiontClient","HttpContentTransport","authResult","token","refreshToken","label","gitBranch","KnowledgeBasePanel","k","knowledgeBases","setActiveKnowledgeBase","id","addKnowledgeBase","removeKnowledgeBase","updateKnowledgeBase","signIn","access","refresh","signOut","showAddForm","setShowAddForm","addError","setAddError","addSubmitting","setAddSubmitting","reauthKbId","setReauthKbId","reauthError","setReauthError","reauthSubmitting","setReauthSubmitting","confirmRemoveKbId","setConfirmRemoveKbId","setTick","useEffect","interval","openAddForm","handleAdd","existing","err","handleReauth","kbId","handleKbClick","isActive","isReauthing","TrashIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","isAuthenticated","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as a,u as f,g as $,e as w,h as y,i as D,k as E,j as N,t as P,b as j,T as F,v as M}from"./index-
|
|
2
|
-
//# sourceMappingURL=client-
|
|
1
|
+
import{c as a,u as f,g as $,e as w,h as y,i as D,k as E,j as N,t as P,b as j,T as F,v as M}from"./index-DoPpOINE.js";import{r as n}from"./vendor-DJo4KD8w.js";import{T as V}from"./ToolbarPanels-CjWlSOUC.js";import{u as R}from"./i18n-BbpF47i1.js";import"./routing-o1npPvOW.js";import"./XMarkIcon-KMKD47CF.js";function H(){var i;const{t:u}=R(),e=(t,o)=>u(`AdminUsers.${t}`,o),c=(i=a(f().activeSession$))==null?void 0:i.client,d=$(),s=w(()=>M(c,d)),m=a(s.browse.activePanel$)??null,U=a(s.users$)??[],g=a(s.stats$)??null,h=a(s.usersLoading$)??!0,b=a(s.statsLoading$)??!0,{theme:p,setTheme:r}=y(),{showLineNumbers:v,toggleLineNumbers:l}=D(),C=n.useCallback(({theme:t})=>{r(t)},[r]),L=n.useCallback(()=>{l()},[l]);E({"settings:theme-changed":C,"settings:line-numbers-toggled":L});const k=n.useCallback(async(t,o)=>{try{await s.updateUser(t,o)}catch(T){console.error("Failed to update user:",T)}},[s]),A=n.useCallback(async t=>{console.warn("Delete user not implemented:",t),alert("Delete user functionality is not currently available")},[]),x=n.useCallback(()=>{console.log("Add user clicked")},[]),S=n.useCallback(()=>{console.log("Export users clicked")},[]);return N.jsx(P,{users:U,userStats:g,isLoadingUsers:h,isLoadingStats:b,onUpdateUser:k,onDeleteUser:A,onAddUser:x,onExportUsers:S,theme:p,showLineNumbers:v,activePanel:m,translations:{title:e("title"),subtitle:e("subtitle"),addUser:e("addUser"),totalUsers:e("totalUsers"),activeUsers:e("activeUsers"),administrators:e("administrators"),recentUsers:e("recentUsers"),searchUsers:e("searchUsers"),searchPlaceholder:e("searchPlaceholder"),role:e("role"),allRoles:e("allRoles"),admin:e("admin"),user:e("user"),status:e("status"),allStatus:e("allStatus"),active:e("active"),inactive:e("inactive"),exportUsers:e("exportUsers"),loadingUsers:e("loadingUsers"),userColumn:e("userColumn"),domainColumn:e("domainColumn"),roleColumn:e("roleColumn"),statusColumn:e("statusColumn"),lastLoginColumn:e("lastLoginColumn"),joinedColumn:e("joinedColumn"),actionsColumn:e("actionsColumn"),noUsersFound:e("noUsersFound"),noUsersFoundDescription:e("noUsersFoundDescription"),noName:e("noName"),never:e("never"),removeAdmin:e("removeAdmin"),makeAdmin:e("makeAdmin"),deactivateUser:e("deactivateUser"),activateUser:e("activateUser"),deleteUser:e("deleteUser")},ToolbarPanels:V,Toolbar:F,buttonStyles:j})}export{H as default};
|
|
2
|
+
//# sourceMappingURL=client-B-MtBLP9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-
|
|
1
|
+
{"version":3,"file":"client-B-MtBLP9.js","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, useShellVM, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminUsersPage } from '@semiont/react-ui';\nimport type { AdminUser, AdminUserStats } from '@semiont/react-ui';\nimport { createAdminUsersVM } from '@semiont/react-ui';\nimport { useViewModel } 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 browseVM = useShellVM();\n const vm = useViewModel(() => createAdminUsersVM(semiont!, browseVM));\n\n const activePanel = useObservable(vm.browse.activePanel$) ?? null;\n const users = useObservable(vm.users$) ?? [];\n const userStats = useObservable(vm.stats$) ?? null;\n const usersLoading = useObservable(vm.usersLoading$) ?? true;\n const statsLoading = useObservable(vm.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 vm.updateUser(id, data);\n } catch (error) {\n console.error('Failed to update user:', error);\n }\n }, [vm]);\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"],"names":["AdminUsers","_t","useTranslation","t","k","p","semiont","_a","useObservable","useSemiont","browseVM","useShellVM","vm","useViewModel","createAdminUsersVM","activePanel","users","userStats","usersLoading","statsLoading","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","handleUpdateUser","id","data","error","handleDeleteUser","handleAddUser","handleExportUsers","jsx","AdminUsersPage","ToolbarPanels","Toolbar","buttonStyles"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as s,u as L,g as P,e as R,h as k,i as M,k as y,j as A,y as S,T as F,z as V}from"./index-
|
|
2
|
-
//# sourceMappingURL=client-
|
|
1
|
+
import{c as s,u as L,g as P,e as R,h as k,i as M,k as y,j as A,y as S,T as F,z as V}from"./index-DoPpOINE.js";import{r}from"./vendor-DJo4KD8w.js";import{T as j}from"./ToolbarPanels-CjWlSOUC.js";import{u as z}from"./i18n-BbpF47i1.js";import"./routing-o1npPvOW.js";import"./XMarkIcon-KMKD47CF.js";function q(){var c;const{t:h}=z(),e=(o,n)=>h(`AdminExchange.${o}`,n),a=(c=s(L().activeSession$))==null?void 0:c.client,u=P(),t=R(()=>V(u,()=>a.admin.backup(),(o,n)=>a.admin.restore(o,n==null?void 0:n.onProgress))),d=s(t.browse.activePanel$)??null,b=s(t.selectedFile$)??null,g=s(t.preview$)??null,x=s(t.isExporting$)??!1,v=s(t.isImporting$)??!1,E=s(t.importPhase$)??null,f=s(t.importMessage$),C=s(t.importResult$),{theme:I,setTheme:l}=k(),{showLineNumbers:T,toggleLineNumbers:p}=M();y({"settings:theme-changed":r.useCallback(({theme:o})=>l(o),[l]),"settings:line-numbers-toggled":r.useCallback(()=>p(),[p])});const w=r.useCallback(async()=>{const{blob:o,filename:n}=await t.doExport(),m=URL.createObjectURL(o),i=document.createElement("a");i.href=m,i.download=n,i.click(),URL.revokeObjectURL(m)},[t]),$=r.useCallback(async()=>{await t.doImport()},[t]);return A.jsx(S,{onExport:w,isExporting:x,onFileSelected:t.selectFile,onImport:$,onCancelImport:t.cancelImport,selectedFile:b,preview:g,isImporting:v,importPhase:E,importMessage:f,importResult:C,theme:I,showLineNumbers:T,activePanel:d,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:j,Toolbar:F})}export{q as default};
|
|
2
|
+
//# sourceMappingURL=client-DX1ckM1P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-
|
|
1
|
+
{"version":3,"file":"client-DX1ckM1P.js","sources":["../../src/app/[locale]/admin/exchange/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellVM,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useViewModel,\n AdminExchangePage,\n} from '@semiont/react-ui';\nimport { createExchangeVM } from '@semiont/sdk';\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 browseVM = useShellVM();\n const vm = useViewModel(() => createExchangeVM(\n browseVM,\n () => client!.admin.backup(),\n (file, opts) => client!.admin.restore(file, opts?.onProgress),\n ));\n\n const activePanel = useObservable(vm.browse.activePanel$) ?? null;\n const selectedFile = useObservable(vm.selectedFile$) ?? null;\n const preview = useObservable(vm.preview$) ?? null;\n const isExporting = useObservable(vm.isExporting$) ?? false;\n const isImporting = useObservable(vm.isImporting$) ?? false;\n const importPhase = useObservable(vm.importPhase$) ?? null;\n const importMessage = useObservable(vm.importMessage$);\n const importResult = useObservable(vm.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 vm.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 }, [vm]);\n\n const handleImport = useCallback(async () => {\n await vm.doImport();\n }, [vm]);\n\n return (\n <AdminExchangePage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={vm.selectFile}\n onImport={handleImport}\n onCancelImport={vm.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"],"names":["AdminExchangeClient","_t","useTranslation","t","k","p","client","_a","useObservable","useSemiont","browseVM","useShellVM","vm","useViewModel","createExchangeVM","file","opts","activePanel","selectedFile","preview","isExporting","isImporting","importPhase","importMessage","importResult","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","useEventSubscriptions","useCallback","handleExport","blob","filename","url","a","handleImport","jsx","AdminExchangePage","ToolbarPanels","Toolbar"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as s,u as k,g as $,e as M,h as P,i as R,k as S,j as y,L as B,T as F,z as V}from"./index-
|
|
2
|
-
//# sourceMappingURL=client-
|
|
1
|
+
import{c as s,u as k,g as $,e as M,h as P,i as R,k as S,j as y,L as B,T as F,z as V}from"./index-DoPpOINE.js";import{r as a}from"./vendor-DJo4KD8w.js";import{T as j}from"./ToolbarPanels-CjWlSOUC.js";import{u as z}from"./i18n-BbpF47i1.js";import"./routing-o1npPvOW.js";import"./XMarkIcon-KMKD47CF.js";function _(){var c;const{t:h}=z(),e=(o,n)=>h(`ModerationLinkedData.${o}`,n),r=(c=s(k().activeSession$))==null?void 0:c.client,u=$(),t=M(()=>V(u,o=>r.admin.exportKnowledgeBase(o),(o,n)=>r.admin.importKnowledgeBase(o,n==null?void 0:n.onProgress))),d=s(t.browse.activePanel$)??null,b=s(t.selectedFile$)??null,g=s(t.preview$)??null,x=s(t.isExporting$)??!1,v=s(t.isImporting$)??!1,f=s(t.importPhase$)??null,C=s(t.importMessage$),E=s(t.importResult$),{theme:w,setTheme:l}=P(),{showLineNumbers:I,toggleLineNumbers:p}=R();S({"settings:theme-changed":a.useCallback(({theme:o})=>l(o),[l]),"settings:line-numbers-toggled":a.useCallback(()=>p(),[p])});const L=a.useCallback(async()=>{const{blob:o,filename:n}=await t.doExport(),m=URL.createObjectURL(o),i=document.createElement("a");i.href=m,i.download=n,i.click(),URL.revokeObjectURL(m)},[t]),T=a.useCallback(async()=>{await t.doImport()},[t]);return y.jsx(B,{onExport:L,isExporting:x,onFileSelected:t.selectFile,onImport:T,onCancelImport:t.cancelImport,selectedFile:b,preview:g,isImporting:v,importPhase:f,importMessage:C,importResult:E,theme:w,showLineNumbers:I,activePanel:d,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:j,Toolbar:F})}export{_ as default};
|
|
2
|
+
//# sourceMappingURL=client-Dh9ak8Fa.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-
|
|
1
|
+
{"version":3,"file":"client-Dh9ak8Fa.js","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 useShellVM,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useViewModel,\n LinkedDataPage,\n} from '@semiont/react-ui';\nimport { createExchangeVM } from '@semiont/sdk';\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 browseVM = useShellVM();\n const vm = useViewModel(() => createExchangeVM(\n browseVM,\n (params) => client!.admin.exportKnowledgeBase(params),\n (file, opts) => client!.admin.importKnowledgeBase(file, opts?.onProgress),\n ));\n\n const activePanel = useObservable(vm.browse.activePanel$) ?? null;\n const selectedFile = useObservable(vm.selectedFile$) ?? null;\n const preview = useObservable(vm.preview$) ?? null;\n const isExporting = useObservable(vm.isExporting$) ?? false;\n const isImporting = useObservable(vm.isImporting$) ?? false;\n const importPhase = useObservable(vm.importPhase$) ?? null;\n const importMessage = useObservable(vm.importMessage$);\n const importResult = useObservable(vm.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 vm.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 }, [vm]);\n\n const handleImport = useCallback(async () => {\n await vm.doImport();\n }, [vm]);\n\n return (\n <LinkedDataPage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={vm.selectFile}\n onImport={handleImport}\n onCancelImport={vm.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"],"names":["LinkedDataClient","_t","useTranslation","t","k","p","client","_a","useObservable","useSemiont","browseVM","useShellVM","vm","useViewModel","createExchangeVM","params","file","opts","activePanel","selectedFile","preview","isExporting","isImporting","importPhase","importMessage","importResult","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","useEventSubscriptions","useCallback","handleExport","blob","filename","url","a","handleImport","jsx","LinkedDataPage","ToolbarPanels","Toolbar"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o,u as C,g as w,e as T,h as y,i as P,k as S,j as L,w as M,T as x,x as A}from"./index-
|
|
2
|
-
//# sourceMappingURL=client-
|
|
1
|
+
import{c as o,u as C,g as w,e as T,h as y,i as P,k as S,j as L,w as M,T as x,x as A}from"./index-DoPpOINE.js";import{r}from"./vendor-DJo4KD8w.js";import{T as $}from"./ToolbarPanels-CjWlSOUC.js";import{u as E}from"./i18n-BbpF47i1.js";import"./routing-o1npPvOW.js";import"./XMarkIcon-KMKD47CF.js";function O(){var a;const{t:l}=E(),e=(i,v)=>l(`AdminSecurity.${i}`,v),c=(a=o(C().activeSession$))==null?void 0:a.client,d=w(),n=T(()=>A(c,d)),u=o(n.browse.activePanel$)??null,m=o(n.providers$)??[],g=o(n.allowedDomains$)??[],f=o(n.isLoading$)??!0,{theme:p,setTheme:s}=y(),{showLineNumbers:D,toggleLineNumbers:t}=P(),h=r.useCallback(({theme:i})=>{s(i)},[s]),b=r.useCallback(()=>{t()},[t]);return S({"settings:theme-changed":h,"settings:line-numbers-toggled":b}),L.jsx(M,{providers:m,allowedDomains:g,isLoading:f,theme:p,showLineNumbers:D,activePanel:u,translations:{title:e("title"),subtitle:e("subtitle"),oauthProviders:e("oauthProviders"),oauthProvidersDescription:e("oauthProvidersDescription"),clientId:e("clientId"),configured:e("configured"),noProvidersConfigured:e("noProvidersConfigured"),allowedDomains:e("allowedDomains"),allowedDomainsDescription:e("allowedDomainsDescription"),noDomainsConfigured:e("noDomainsConfigured"),configManagementTitle:e("configManagementTitle"),configManagementDescription:e("configManagementDescription"),configLocalDev:e("configLocalDev"),configCloudDeploy:e("configCloudDeploy"),configCloudDeployCommand:e("configCloudDeployCommand"),configCloudDeployEnd:e("configCloudDeployEnd"),configAWS:e("configAWS")},ToolbarPanels:$,Toolbar:x})}export{O as default};
|
|
2
|
+
//# sourceMappingURL=client-DsP3tx7D.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-
|
|
1
|
+
{"version":3,"file":"client-DsP3tx7D.js","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, useShellVM, useObservable, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminSecurityPage } from '@semiont/react-ui';\nimport type { OAuthProvider } from '@semiont/react-ui';\nimport { createAdminSecurityVM } from '@semiont/react-ui';\nimport { useViewModel } 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 browseVM = useShellVM();\n const vm = useViewModel(() => createAdminSecurityVM(semiont!, browseVM));\n\n const activePanel = useObservable(vm.browse.activePanel$) ?? null;\n const providers = useObservable(vm.providers$) ?? [];\n const allowedDomains = useObservable(vm.allowedDomains$) ?? [];\n const isLoading = useObservable(vm.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"],"names":["AdminSecurity","_t","useTranslation","t","k","p","semiont","_a","useObservable","useSemiont","browseVM","useShellVM","vm","useViewModel","createAdminSecurityVM","activePanel","providers","allowedDomains","isLoading","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","jsx","AdminSecurityPage","ToolbarPanels","Toolbar"],"mappings":"uSAiBA,SAAwBA,GAAgB,OACtC,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAWC,IAAgCJ,EAAG,iBAAiBG,CAAC,GAAIC,CAAQ,EAEjFC,GAAUC,EAAAC,EAAcC,EAAA,EAAa,cAAc,IAAzC,YAAAF,EAA4C,OACtDG,EAAWC,EAAA,EACXC,EAAKC,EAAa,IAAMC,EAAsBR,EAAUI,CAAQ,CAAC,EAEjEK,EAAcP,EAAcI,EAAG,OAAO,YAAY,GAAK,KACvDI,EAAYR,EAAcI,EAAG,UAAU,GAAK,CAAA,EAC5CK,EAAiBT,EAAcI,EAAG,eAAe,GAAK,CAAA,EACtDM,EAAYV,EAAcI,EAAG,UAAU,GAAK,GAE5C,CAAE,MAAAO,EAAO,SAAAC,CAAA,EAAaC,EAAA,EACtB,CAAE,gBAAAC,EAAiB,kBAAAC,CAAA,EAAsBC,EAAA,EAEzCC,EAAqBC,EAAAA,YAAY,CAAC,CAAE,MAAAP,KAAoD,CAC5FC,EAASD,CAAK,CAChB,EAAG,CAACC,CAAQ,CAAC,EAEPO,EAA2BD,EAAAA,YAAY,IAAM,CACjDH,EAAA,CACF,EAAG,CAACA,CAAiB,CAAC,EAEtB,OAAAK,EAAsB,CACpB,yBAA0BH,EAC1B,gCAAiCE,CAAA,CAClC,EAGCE,EAAAA,IAACC,EAAA,CACC,UAAAd,EACA,eAAAC,EACA,UAAAC,EACA,MAAAC,EACA,gBAAAG,EACA,YAAAP,EACA,aAAc,CACZ,MAAOZ,EAAE,OAAO,EAChB,SAAUA,EAAE,UAAU,EACtB,eAAgBA,EAAE,gBAAgB,EAClC,0BAA2BA,EAAE,2BAA2B,EACxD,SAAUA,EAAE,UAAU,EACtB,WAAYA,EAAE,YAAY,EAC1B,sBAAuBA,EAAE,uBAAuB,EAChD,eAAgBA,EAAE,gBAAgB,EAClC,0BAA2BA,EAAE,2BAA2B,EACxD,oBAAqBA,EAAE,qBAAqB,EAC5C,sBAAuBA,EAAE,uBAAuB,EAChD,4BAA6BA,EAAE,6BAA6B,EAC5D,eAAgBA,EAAE,gBAAgB,EAClC,kBAAmBA,EAAE,mBAAmB,EACxC,yBAA0BA,EAAE,0BAA0B,EACtD,qBAAsBA,EAAE,sBAAsB,EAC9C,UAAWA,EAAE,WAAW,CAAA,EAE1B,cAAA4B,EACA,QAAAC,CAAA,CAAA,CAGN"}
|