living-ai-documentation 3.3.0 → 3.4.0

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.
@@ -1 +1 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--ink:#17202a;--muted:#667085;--line:#d9dee7;--line-strong:#b8c0cc;--panel:#fff;--panel-soft:#f8fafc;--accent:#276ef1;--accent-strong:#174ea6;--accent-soft:#e8f0ff;--green:#047857;--green-soft:#dcfce7;--red:#b42318;--red-soft:#fee4e2;--shadow:0 18px 60px #10182824;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}html,body{background:var(--bg);width:100%;height:100%;color:var(--ink);margin:0;overflow:hidden}button,input,select,textarea{font:inherit}.topbar{border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#ffffffeb;flex-shrink:0;justify-content:space-between;align-items:center;gap:24px;padding:0 24px;display:flex}.dark .topbar{color:#f3f4f6;background:#111827eb;border-bottom-color:#ffffff1a}.dark .brand-mark{background:#1f2937;border-color:#fff3}.dark .brand-lockup p{color:#9ca3af}.dark .ghost-button{color:#e5e7eb;background:0 0;border-color:#ffffff1f}.dark .ghost-button:hover{background:#ffffff0f}.brand-lockup,.status-row,.panel-title-row,.panel-actions,.panel-kicker{align-items:center;display:flex}.brand-lockup{gap:12px;min-width:0}.brand-mark{border:1px solid var(--line-strong);color:#fff;letter-spacing:0;background:#111827;border-radius:10px;place-items:center;width:38px;height:38px;font-size:12px;font-weight:800;display:grid}h1,p{margin:0}h1{letter-spacing:0;font-size:15px;font-weight:760}.brand-lockup p{color:var(--muted);margin-top:2px;font-size:12px}.status-row{gap:10px}.status-pill,.panel-kicker span{letter-spacing:0;border-radius:999px;font-size:12px;font-weight:700}.status-pill{border:1px solid var(--line);background:var(--panel-soft);color:#344054;padding:7px 10px}.status-pill.is-live{background:var(--green-soft);color:var(--green);border-color:#86efac}.status-pill.is-fallback{color:#9a3412;background:#fff7ed;border-color:#fed7aa}.workspace-shell{min-height:0;position:relative}.workspace-canvas{cursor:grab;touch-action:none;background:#f8fafc;width:100%;height:100%;transition:filter .18s;display:block}.workspace-canvas.is-panning{cursor:grabbing}.tool-button,.ghost-button,.icon-button,.primary-button,.secondary-button{border:1px solid var(--line);color:var(--ink);cursor:pointer;background:#fff}.tool-button{border-radius:16px;place-items:center;width:52px;height:52px;font-size:25px;font-weight:700;display:grid;box-shadow:0 10px 30px #1018281a}.tool-button.primary{color:#fff;background:#111827;border-color:#111827}.ghost-button{border-radius:9px;align-items:center;height:34px;padding:0 12px;font-size:13px;font-weight:700;text-decoration:none;display:inline-flex}.config-surface{color:#f1f5f9;--panel-ink:#f1f5f9;--panel-muted:#94a3b8;--panel-line:#ffffff1a;--panel-field-bg:#ffffff0d;--panel-field-bg-focus:#ffffff14;background:#111827;border:1px solid #ffffff14;border-radius:28px;flex-direction:column;width:min(780px,max(540px,50vw));max-width:calc(100vw - 48px);height:calc(100vh - 118px);padding:24px;display:flex;overflow-y:auto;box-shadow:0 24px 80px #0006}.config-surface[hidden]{display:none}.panel-kicker{flex-shrink:0;justify-content:space-between;margin-bottom:18px}.panel-kicker span{padding:6px 9px}#nodeTypeBadge{color:#93c5fd;background:#60a5fa26}#nodeHealthBadge{background:var(--green-soft);color:var(--green)}.panel-title-row{flex-shrink:0;justify-content:space-between;align-items:start;gap:12px;margin-bottom:18px}.panel-title-row>div{flex:auto;min-width:0}.eyebrow,.field span{color:var(--panel-muted,#475467);font-size:12px;font-weight:720;display:block}.title-input{width:100%;min-width:0;color:var(--panel-ink,#101828);letter-spacing:0;background:0 0;border:0;outline:0;margin-top:6px;font-size:24px;font-weight:780}.icon-button{border-radius:10px;place-items:center;width:36px;height:36px;font-size:20px;line-height:1;display:grid}.icon-button.danger{color:#fca5a5;background:#ef444433;border-color:#ef444466}.icon-button.close{color:#fde047;background:#eab30826;border-color:#eab30866}.form-grid{flex-shrink:0;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;display:grid}.field{min-width:0}.field.wide{grid-column:1/-1}.field input,.field select,.field textarea{border:1px solid var(--panel-line,var(--line));background:var(--panel-field-bg,#fff);width:100%;color:var(--panel-ink,var(--ink));border-radius:12px;outline:0;margin-top:7px}.field input,.field select{height:42px;padding:0 12px}.field textarea{resize:none;min-height:84px;padding:10px 12px;line-height:1.45}.checkbox-field{align-items:center;gap:10px;min-height:42px;display:flex}.checkbox-field input{accent-color:#2563eb;width:18px;height:18px;margin-top:0}.checkbox-field span{color:var(--panel-ink,var(--ink));font-size:13px;font-weight:760}.field input:focus,.field select:focus,.field textarea:focus,.title-input:focus{border-color:#60a5fa;box-shadow:0 0 0 4px #60a5fa26}.field input[readonly]{border-color:var(--panel-line,#d0d5dd);color:var(--panel-muted,#475467);background:#ffffff08;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,monospace;font-size:12px}.field select:disabled,.icon-button:disabled,.primary-button:disabled,.secondary-button:disabled{cursor:not-allowed;opacity:.62}.contents{display:contents}.contents[hidden]{display:none}.model-field-row{flex-direction:column;display:flex}.model-select-wrap{align-items:center;gap:6px;margin-top:7px;display:flex}.model-select-wrap select{flex:1;margin-top:0}.model-select-wrap .icon-button{border:1px solid var(--line);width:36px;height:42px;color:var(--ink);cursor:pointer;background:#fff;border-radius:12px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;display:flex}.model-select-wrap .icon-button:hover{background:#f0f4ff}@keyframes spin{to{transform:rotate(360deg)}}.model-select-wrap .icon-button.loading{pointer-events:none;opacity:.7;animation:.7s linear infinite spin;display:inline-block}.panel-actions{flex-shrink:0;justify-content:space-between;align-items:center;gap:10px;margin-top:auto;padding-top:18px}.panel-actions-left,.panel-actions-right{align-items:center;gap:8px;display:flex}.test-feedback{color:#475467;min-height:18px;margin:10px 0 0;font-size:12px;font-weight:650;line-height:1.4}.agent-section{flex:none;grid-template-columns:minmax(0,1fr);gap:14px;margin-top:16px;display:grid}.agent-section[hidden]{display:none}#nodeSystemPrompt{resize:vertical;min-height:180px}#nodeUserInputDescription{resize:vertical;min-height:104px}.mcp-inventory{border-top:1px solid var(--panel-line,var(--line));margin-top:18px;padding-top:16px}.inventory-header{justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;display:flex}.inventory-header span{color:var(--panel-ink,#344054);font-size:13px;font-weight:760}.inventory-header strong{color:#93c5fd;background:#60a5fa26;border-radius:999px;padding:5px 8px;font-size:11px}.inventory-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.inventory-grid article{border:1px solid var(--panel-line,var(--line));background:#ffffff0a;border-radius:14px;min-width:0;padding:12px}.inventory-grid h2{color:#e2e8f0;margin:0 0 8px;font-size:13px;font-weight:800}.inventory-grid ul{gap:5px;margin:0;padding:0;list-style:none;display:grid}.inventory-grid li{color:#94a3b8;text-overflow:ellipsis;white-space:nowrap;background:#ffffff0f;border-radius:8px;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,monospace;font-size:11px;overflow:hidden}.primary-button,.secondary-button,.danger-button{border-radius:11px;height:40px;padding:0 16px;font-size:13px;font-weight:760}.primary-button{border-color:var(--accent);background:var(--accent);color:#fff}.secondary-button{border-color:var(--panel-line,var(--line));background:var(--panel-field-bg,var(--panel-soft));color:var(--panel-ink,var(--ink))}.danger-button{color:#fff;cursor:pointer;background:#d92d20;border:1px solid #d92d20}.confirm-overlay{z-index:60;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#0f172a47;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.confirm-overlay[hidden]{display:none}.confirm-dialog{background:#fff;border:1px solid #fecdcae6;border-radius:20px;width:min(440px,100vw - 48px);padding:22px;animation:.16s ease-out both confirm-in;box-shadow:0 24px 80px #1018283d}.agent-run-dialog{background:#fff;border:1px solid #bfdbfee6;border-radius:20px;width:min(760px,100vw - 48px);max-height:min(82vh,760px);padding:22px;animation:.16s ease-out both confirm-in;overflow-y:auto;box-shadow:0 24px 80px #1018283d}.agent-run-input-field{margin-top:18px;display:block}.agent-run-result{color:#101828;white-space:pre-wrap;word-break:break-word;background:#f8fafc;border:1px solid #d0d5dd;border-radius:14px;max-height:300px;margin-top:16px;padding:14px;font-size:13px;line-height:1.55;overflow-y:auto}.agent-run-result[hidden]{display:none}.agent-run-result[data-state=loading]{color:#1d4ed8;background:#eff6ff;border-color:#bfdbfe}.agent-run-result[data-state=error]{color:#991b1b;background:#fef2f2;border-color:#fecaca}.confirm-kicker{color:var(--red);margin:0 0 6px;font-size:12px;font-weight:800}.confirm-dialog h2{color:#101828;margin:0;font-size:19px;font-weight:820}.confirm-message{color:#475467;margin:10px 0 0;font-size:14px;line-height:1.5}.confirm-actions{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.workspace-toast{z-index:40;color:#fff;background:#111827;border:1px solid #10182814;border-radius:14px;align-items:center;gap:10px;max-width:min(420px,100vw - 48px);padding:13px 16px;font-size:14px;font-weight:760;animation:.18s ease-out both toast-in;display:flex;position:fixed;bottom:24px;right:24px;box-shadow:0 18px 60px #10182838}.workspace-toast[hidden]{display:none}.toast-icon{color:#052e1b;background:#34d399;border-radius:999px;flex:none;place-items:center;width:20px;height:20px;font-size:13px;font-weight:900;display:grid}.workspace-toast[data-state=error] .toast-icon{color:#450a0a;background:#f87171}.workspace-toast[data-state=loading] .toast-icon{color:#fff;background:#6b7280;animation:.8s linear infinite spin}.fallback-panel-host{z-index:6;width:min(780px,max(540px,50vw - 24px));max-width:calc(100vw - 48px);position:absolute;top:24px;bottom:24px;right:24px}.fallback-panel-host:not([hidden]){animation:.22s ease-out both panel-in}.fallback-panel-host .config-surface{width:100%;height:100%}@media (width<=900px){.app-shell{grid-template-rows:88px minmax(0,1fr)}.topbar{flex-direction:column;justify-content:center;align-items:flex-start;gap:8px}.config-surface{width:min(420px,100vw - 32px);padding:18px}.fallback-panel-host{width:auto;inset:auto 16px 16px}.inventory-grid{grid-template-columns:1fr}}@keyframes panel-in{0%{opacity:0;transform:translate(18px)}to{opacity:1;transform:translate(0)}}@keyframes confirm-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.admin-scroll{height:100%;overflow-y:auto}.admin-form{display:contents}.save-bar{z-index:10;border-bottom:1px solid var(--line);background:var(--bg);position:sticky;top:0}.save-bar-inner{justify-content:space-between;align-items:center;gap:16px;max-width:720px;margin:0 auto;padding:12px 24px;display:flex}.save-bar-title{color:var(--ink);margin:0;font-size:16px;font-weight:700}.save-bar-desc{color:var(--muted);margin:2px 0 0;font-size:12px}.save-bar-actions{flex-shrink:0;align-items:center;gap:16px;display:flex}.save-msg{font-size:13px}.save-msg--ok{color:var(--green)}.save-msg--error{color:var(--red)}.admin-sections{flex-direction:column;gap:24px;max-width:720px;margin:0 auto;padding:24px 24px 40px;display:flex}.config-section{border:1px solid var(--line);background:var(--panel);border-radius:12px;overflow:hidden}.config-section-header{border-bottom:1px solid var(--line);padding:16px 24px}.config-section-title{color:var(--ink);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:600;display:flex}.config-section-desc{color:var(--muted);margin:4px 0 0 28px;font-size:12px}.config-section-body{flex-direction:column;gap:16px;padding:16px 24px;display:flex}.field-group{flex-direction:column;gap:4px;display:flex}.field-row{border-bottom:1px solid var(--line);grid-template-columns:1fr 1fr;gap:16px;margin-bottom:4px;padding-bottom:8px;display:grid}.info-item dt{color:var(--muted);text-transform:uppercase;letter-spacing:.05em;font-size:11px}.info-item dd{color:var(--ink);word-break:break-all;margin:2px 0 0;font-family:monospace;font-size:12px}.field-label{color:var(--ink);font-size:13px;font-weight:500}.field-hint{color:var(--muted);margin:0;font-size:12px}.field-input{border:1px solid var(--line-strong);background:var(--panel-soft);width:100%;color:var(--ink);border-radius:8px;outline:none;padding:8px 12px;font-size:13px;transition:border-color .15s,box-shadow .15s}.field-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.field-input--mono{font-family:monospace;font-size:12px}.checkbox-label{cursor:pointer;color:var(--ink);align-items:center;gap:10px;font-size:13px;font-weight:500;display:flex}.checkbox-label input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);border-radius:4px;flex-shrink:0}.checkbox-hint{margin-left:26px}.btn-primary{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:8px 20px;font-size:13px;font-weight:600;transition:background .15s}.btn-primary:hover{background:var(--accent-strong)}.btn-sm{padding:6px 12px;font-size:12px}.link-btn{color:var(--accent);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;text-decoration:underline}.link-btn:disabled{opacity:.35;pointer-events:none}.pattern-preview{background:var(--panel-soft);border:1px solid var(--line);border-radius:8px;padding:12px}.pattern-preview-title{color:var(--accent);text-transform:uppercase;letter-spacing:.05em;margin:0 0 4px;font-size:11px;font-weight:700}.pattern-rows{flex-direction:column;gap:8px;margin-top:8px;display:flex}.pattern-row{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:10px}.pattern-filename{color:var(--muted);word-break:break-all;margin:0 0 6px;font-family:monospace;font-size:11px}.pattern-cols{grid-template-columns:repeat(3,1fr);gap:8px;font-size:12px;display:grid}.pattern-col-label{color:var(--muted);margin-bottom:2px;font-size:11px;display:block}.pattern-value--date{color:var(--green)}.pattern-value--none{color:var(--muted)}.pattern-value--cat{color:var(--accent)}.pattern-value--title{color:var(--ink)}.file-browser{border:1px solid var(--line);border-radius:8px;overflow:hidden}.file-browser-toolbar{background:var(--panel-soft);border-bottom:1px solid var(--line);align-items:center;gap:8px;padding:6px 12px;display:flex}.file-browser-path{color:var(--muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:monospace;font-size:11px;overflow:hidden}.file-browser-list{max-height:208px;overflow-y:auto}.browser-msg{color:var(--muted);text-align:center;margin:0;padding:12px;font-size:12px}.browser-msg--error{color:var(--red)}.browser-row{text-align:left;cursor:pointer;border:none;border-bottom:1px solid var(--line);background:0 0;align-items:center;gap:8px;width:100%;padding:8px 12px;font-size:13px;display:flex}.browser-row:last-child{border-bottom:none}.browser-row:hover{background:var(--panel-soft)}.browser-row--dir{color:var(--ink)}.browser-row--file{cursor:default;justify-content:space-between}.browser-row-name{color:var(--ink);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.badge-added{color:var(--green);flex-shrink:0;font-size:11px}.extra-files-list{flex-direction:column;gap:4px;display:flex}.extra-file-row{background:var(--panel-soft);border-radius:6px;align-items:center;gap:8px;padding:8px 12px;display:flex}.extra-file-arrows{flex-direction:column;gap:0;display:flex}.extra-file-arrows button{color:var(--muted);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1.2}.extra-file-arrows button:disabled{opacity:.25;pointer-events:none}.extra-file-path{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:monospace;font-size:11px;overflow:hidden}.remove-btn{color:var(--red);cursor:pointer;background:0 0;border:none;flex-shrink:0;font-size:12px}.palette-header{justify-content:space-between;align-items:center;margin-bottom:4px;display:flex}.swatches{flex-wrap:wrap;gap:8px;margin-top:8px;display:flex}.swatch-wrap{width:32px;height:32px;position:relative}.swatch{pointer-events:none;border:3px solid;border-radius:50%;width:32px;height:32px}.swatch-input{opacity:0;cursor:pointer;border:none;width:100%;height:100%;padding:0;position:absolute;inset:0}.edge-swatch-wrap{flex-direction:column;align-items:center;gap:3px;display:flex}.edge-swatch{border:2px solid #00000026;border-radius:50%;width:26px;height:26px}.remove-swatch-btn{color:var(--red);cursor:pointer;background:0 0;border:none;padding:0;font-size:10px;line-height:1}.add-color-row{align-items:center;gap:8px;margin-top:12px;display:flex}.color-input{cursor:pointer;border:1px solid var(--line-strong);background:0 0;border-radius:6px;width:32px;height:32px;padding:0}.license-card{border:1px solid var(--accent-soft);border-radius:16px;overflow:hidden}.license-banner{background:linear-gradient(90deg,#276ef1,#4f8ef7,#6366f1);align-items:center;gap:16px;padding:20px 24px;display:flex}.license-icon{font-size:28px}.license-title{color:#fff;margin:0;font-size:15px;font-weight:700}.license-subtitle{color:#fffc;margin:4px 0 0;font-size:12px}.license-body{background:var(--panel);padding:20px 24px}.license-body p{color:var(--ink);margin:0 0 16px;font-size:13px}.license-links{flex-wrap:wrap;gap:12px;display:flex}.license-btn{color:#fff;border-radius:8px;align-items:center;gap:8px;padding:8px 16px;font-size:13px;font-weight:600;text-decoration:none;transition:opacity .15s;display:inline-flex}.license-btn svg{flex-shrink:0;width:16px;height:16px}.license-btn:hover{opacity:.85}.license-btn--linkedin{background:#0a66c2}.license-btn--npm{background:#cb3837}:root[data-blueprint]{--bg:#0f172a;--ink:#f1f5f9;--muted:#94a3b8;--line:#ffffff1a;--accent:#3b82f6;--accent-soft:#3b82f626;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}*{box-sizing:border-box}[hidden]{display:none!important}html,body{background:var(--bg);width:100%;height:100%;color:var(--ink);margin:0}.app-shell{grid-template-rows:64px minmax(0,1fr);width:100vw;height:100vh;display:grid}[data-blueprint] .topbar{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#0f172aeb}.brand-lockup{align-items:center;gap:12px;min-width:0;display:flex}[data-blueprint] .brand-mark{color:#fff;background:#1e293b;border-color:#fff3}.brand-lockup h1{letter-spacing:0;margin:0;font-size:14px;font-weight:760}.brand-lockup p{color:var(--muted);margin:2px 0 0;font-size:11px}.topbar-right{align-items:center;gap:8px;display:flex}.breadcrumb{color:var(--muted);align-items:center;gap:6px;font-size:13px;display:flex;overflow:hidden}.breadcrumb-item{cursor:pointer;color:var(--accent);white-space:nowrap;font-weight:600;font-size:inherit;background:0 0;border:none;padding:0;font-family:inherit;transition:opacity .15s}.breadcrumb-item:hover{opacity:.75}.breadcrumb-item.current{color:var(--ink);cursor:default;font-weight:700}.breadcrumb-sep{opacity:.4;font-size:11px}.ghost-button{border:1px solid var(--line);height:34px;color:var(--ink);cursor:pointer;background:0 0;border-radius:9px;align-items:center;padding:0 12px;font-size:13px;font-weight:700;text-decoration:none;transition:background .15s;display:inline-flex}[data-blueprint] .ghost-button:hover{background:#ffffff0f}.workspace-shell{position:relative;overflow:hidden}canvas{cursor:default;width:100%;height:100%}canvas.is-panning{cursor:grabbing}.rail{z-index:5;flex-direction:column;gap:10px;display:flex;position:absolute;top:16px;left:16px}[data-blueprint] .tool-button{background:#1e293b;box-shadow:0 8px 24px #0000004d}[data-blueprint] .tool-button:hover{background:#273549}[data-blueprint] .tool-button.active{color:#60a5fa;background:#3b82f633;border-color:#3b82f6}.file-explorer{border-left:1px solid var(--line);z-index:10;background:#0f172a;flex-direction:column;width:50%;animation:.2s ease-out both slide-in;display:flex;position:absolute;top:0;bottom:0;right:0}@keyframes slide-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.explorer-header{border-bottom:1px solid var(--line);flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:16px 20px;display:flex}.explorer-path{color:#93c5fd;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:700;overflow:hidden}.explorer-close{border:1px solid var(--line);width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border-radius:8px;flex-shrink:0;place-items:center;font-size:18px;transition:background .15s;display:grid}.explorer-close:hover{color:var(--ink);background:#ffffff0f}.explorer-top{flex:1;min-height:0;overflow-y:auto}.explorer-divider{background:var(--line);flex-shrink:0;height:1px}.explorer-bottom{flex:1;min-height:0;overflow-y:auto}.explorer-list{padding:8px 0}.explorer-item{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:8px 20px;font-size:13px;transition:background .1s;display:flex}.explorer-item:hover{background:#ffffff0a}.explorer-item.is-folder{color:#93c5fd;font-weight:600}.explorer-item.is-file{color:#94a3b8}.explorer-breadcrumb{flex:1;align-items:center;gap:4px;min-width:0;font-size:12px;display:flex;overflow:hidden}.explorer-breadcrumb-item{color:#60a5fa;cursor:pointer;white-space:nowrap;font-weight:600;font-size:inherit;background:0 0;border:none;padding:0;font-family:inherit}.explorer-breadcrumb-item:hover{text-decoration:underline}.explorer-breadcrumb-item.current{color:#f1f5f9;cursor:default}.explorer-breadcrumb-item.current:hover{text-decoration:none}.explorer-breadcrumb-sep{color:#475569;font-size:11px}.file-preview{height:100%;padding:16px}.file-preview-placeholder{color:#475569;margin:0;padding-top:8px;font-size:13px}.file-preview pre{white-space:pre-wrap;word-break:break-all;margin:0;font-size:12px;line-height:1.6}.file-preview .hljs{background:0 0;padding:0}.file-preview .hljs-ln{border-collapse:collapse;font-size:12px;line-height:1.6}.file-preview .hljs-ln td{padding:0}.file-preview .hljs-ln-numbers{-webkit-user-select:none;user-select:none;text-align:right;color:#3d4f6b;vertical-align:top;border-right:1px solid #1e3a5f;min-width:36px;padding-left:4px!important;padding-right:16px!important}.file-preview .hljs-ln-code{padding-left:16px!important}.file-preview img{object-fit:contain;border-radius:8px;max-width:100%;max-height:300px}.file-preview video{border-radius:8px;max-width:100%}.file-preview-binary,.file-preview-truncated{border-radius:6px;margin-top:8px;padding:4px 10px;font-size:11px;font-weight:700;display:inline-block}.file-preview-binary{color:#fca5a5;background:#ef444426}.file-preview-truncated{color:#fde047;background:#eab30826}.file-preview-name{color:#94a3b8;margin:0 0 10px;font-size:12px;font-weight:700}.explorer-section-label{color:#475569;text-transform:uppercase;letter-spacing:.06em;padding:12px 20px 4px;font-size:11px;font-weight:700}.empty-state{color:var(--muted);pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:12px;font-size:14px;display:flex;position:absolute;inset:0}.empty-state p{margin:0}.bpadr-overlay{z-index:50;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#94a3b84d;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.bpadr-modal{color:#1e293b;background:#f9fafb;border:1px solid #e2e8f0;border-radius:20px;flex-direction:column;width:min(1100px,96vw);max-height:92vh;display:flex;overflow:hidden;box-shadow:0 32px 80px #0000004d}.bpadr-header{border-bottom:1px solid #e2e8f0;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:20px 24px 16px;display:flex}.bpadr-title{color:#0f172a;margin:0;font-size:16px;font-weight:760}.bpadr-header-actions{align-items:center;gap:8px;display:flex}.bpadr-icon-btn{color:#64748b;cursor:pointer;background:0 0;border:1px solid #e2e8f0;border-radius:9px;place-items:center;width:32px;height:32px;font-size:16px;transition:background .15s;display:grid}.bpadr-icon-btn:hover{color:#0f172a;background:#f1f5f9}.bpadr-read{flex:1;padding:24px;overflow-y:auto}.bpadr-prose{width:100%;max-width:none!important}#bpadrRendered hr{opacity:1!important;border-color:#d1d5db!important}#bpadrRendered :not(pre)>code{color:#1f2937;background-color:#e5e7eb;border-radius:.25rem;padding:.1em .3em;font-size:.875em;font-weight:500}#bpadrRendered table{border-collapse:collapse;border:none}#bpadrRendered table th,#bpadrRendered table td{border:none;border-bottom:1px solid #e5e7eb;padding:.6rem 1rem}#bpadrRendered table thead th{border-bottom-color:#d1d5db}#bpadrRendered table thead,#bpadrRendered table tbody tr{border:none}.bpadr-form{flex-direction:column;flex:1;gap:14px;padding:20px 24px;display:flex;overflow-y:auto}.bpadr-field{flex-direction:column;gap:6px;display:flex}.bpadr-field label{color:#64748b;font-size:12px;font-weight:700}.bpadr-field-row{grid-template-columns:1fr 1fr;gap:14px;display:grid}.bpadr-field-grow{flex:1;min-height:0}.bpadr-field-grow .bpadr-textarea{flex:1;min-height:200px}.bpadr-input,.bpadr-textarea{color:#1e293b;resize:none;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;outline:none;padding:8px 12px;font-family:inherit;font-size:13px;transition:border-color .15s}.bpadr-input:focus,.bpadr-textarea:focus{background:#fff;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.bpadr-input[readonly]{color:#2563eb;cursor:default;background:#eff6ff;border-color:#bfdbfe}.bpadr-textarea{min-height:180px;line-height:1.6}.bpadr-footer{flex-shrink:0;justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.bpadr-btn-ghost{color:#64748b;cursor:pointer;background:0 0;border:1px solid #e2e8f0;border-radius:9px;height:36px;padding:0 14px;font-size:13px;font-weight:700}.bpadr-btn-ghost:hover{color:#1e293b;background:#f1f5f9}.bpadr-btn-primary{color:#fff;cursor:pointer;background:#3b82f6;border:none;border-radius:9px;height:36px;padding:0 16px;font-size:13px;font-weight:700}.bpadr-btn-primary:hover{background:#2563eb}.bpadr-folder-confirm{flex-direction:column;gap:8px;padding:32px 24px;display:flex}.bpadr-folder-confirm p{color:#1e293b;margin:0;font-size:14px}.bpadr-folder-confirm strong{color:#2563eb}.bpadr-muted{color:#64748b!important;font-size:13px!important}.files-page.svelte-4q2lov{max-width:720px;margin:0 auto;padding:32px 24px}.files-msg.svelte-4q2lov{color:var(--muted);text-align:center;padding:48px 0;font-size:14px}.files-msg--error.svelte-4q2lov{color:var(--red)}.files-msg--empty.svelte-4q2lov{font-style:italic}.files-list.svelte-4q2lov{border:1px solid var(--line);background:var(--panel);border-radius:12px;margin:0;padding:0;list-style:none;overflow:hidden}.files-row.svelte-4q2lov{border-bottom:1px solid var(--line);align-items:center;gap:12px;padding:14px 20px;display:flex}.files-row.svelte-4q2lov:last-child{border-bottom:none}.files-icon.svelte-4q2lov{flex-shrink:0;font-size:18px}.files-info.svelte-4q2lov{flex:1;min-width:0}.files-name.svelte-4q2lov{color:var(--ink);white-space:nowrap;text-overflow:ellipsis;font-size:14px;text-decoration:none;display:block;overflow:hidden}.files-name.svelte-4q2lov:hover{color:var(--accent);text-decoration:underline}.files-meta.svelte-4q2lov{color:var(--muted);margin-top:2px;font-size:12px}.files-row-error.svelte-4q2lov{color:var(--red);margin:4px 0 0;font-size:12px}.files-actions.svelte-4q2lov{flex-shrink:0;gap:8px;display:flex}.files-btn.svelte-4q2lov{border:1px solid var(--line-strong);background:var(--panel-soft);color:var(--ink);cursor:pointer;border-radius:8px;padding:5px 12px;font-family:inherit;font-size:12px;transition:background .15s}.files-btn.svelte-4q2lov:hover{background:var(--accent-soft);border-color:var(--accent)}.files-btn.svelte-4q2lov:disabled{opacity:.5;pointer-events:none}.files-btn--danger.svelte-4q2lov{border-color:var(--red-soft);color:var(--red)}.files-btn--danger.svelte-4q2lov:hover{background:var(--red-soft);border-color:var(--red)}.section-card.svelte-e5jhdq{border:1px solid var(--line);background:var(--panel);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.section-header.svelte-e5jhdq{justify-content:space-between;align-items:center;gap:12px;display:flex}.section-title.svelte-e5jhdq{color:var(--ink);font-size:13px;font-weight:600}.header-actions.svelte-e5jhdq{align-items:center;gap:8px;display:flex}.count-label.svelte-e5jhdq{color:var(--muted);font-size:12px}.instruction-list.svelte-e5jhdq{flex-direction:column;gap:8px;display:flex}.instruction-row.svelte-e5jhdq{border:1px solid var(--line);border-radius:8px;justify-content:space-between;align-items:flex-start;gap:12px;padding:8px 12px;display:flex}.instruction-info.svelte-e5jhdq{min-width:0}.instruction-path.svelte-e5jhdq{word-break:break-all;color:var(--accent);font-family:monospace;font-size:11px;text-decoration:none}.instruction-path.svelte-e5jhdq:hover{text-decoration:underline}.instruction-meta.svelte-e5jhdq{color:var(--muted);margin-top:2px;font-size:11px}.instruction-actions.svelte-e5jhdq{flex-shrink:0;align-items:center;gap:12px;display:flex}.status-ok.svelte-e5jhdq{color:var(--green);font-size:12px;font-weight:600}.status-missing.svelte-e5jhdq{color:var(--red);font-size:12px;font-weight:600}.empty-msg.svelte-e5jhdq{color:var(--muted);margin:0;font-size:13px}.rules-layout.svelte-1r3tey2{grid-template-columns:minmax(0,1fr) 22rem;align-items:start;gap:16px;display:grid}@media (width<=900px){.rules-layout.svelte-1r3tey2{grid-template-columns:1fr}}.section-card.svelte-1r3tey2{border:1px solid var(--line);background:var(--panel);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.aside-card.svelte-1r3tey2{gap:10px}.section-header.svelte-1r3tey2{justify-content:space-between;align-items:center;gap:12px;display:flex}.section-title.svelte-1r3tey2{color:var(--ink);font-size:13px;font-weight:600}.rules-folder.svelte-1r3tey2{color:var(--muted);font-family:monospace;font-size:11px}.rule-list.svelte-1r3tey2{flex-direction:column;gap:8px;display:flex}.rule-row.svelte-1r3tey2{border:1px solid var(--line);border-radius:8px;padding:10px 12px}.rule-top.svelte-1r3tey2{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:6px;display:flex}.rule-title-wrap.svelte-1r3tey2{min-width:0}.rule-title.svelte-1r3tey2{margin:0;font-size:13px;font-weight:600}.rule-link.svelte-1r3tey2{color:var(--accent);text-decoration:none}.rule-link.svelte-1r3tey2:hover{text-decoration:underline}.rule-path.svelte-1r3tey2{color:var(--muted);word-break:break-all;font-family:monospace;font-size:11px;text-decoration:none;display:block}.rule-path.svelte-1r3tey2:hover{color:var(--accent)}.severity-badge.svelte-1r3tey2{background:var(--panel-soft);border:1px solid var(--line);color:var(--ink);border-radius:4px;flex-shrink:0;padding:3px 8px;font-size:11px;font-weight:600}.rule-desc.svelte-1r3tey2{color:var(--muted);margin:0 0 6px;font-size:13px}.rule-tags.svelte-1r3tey2{flex-wrap:wrap;gap:4px;margin-bottom:4px;display:flex}.tag.svelte-1r3tey2{color:var(--accent);font-size:11px}.rule-applies.svelte-1r3tey2{color:var(--muted);word-break:break-all;font-family:monospace;font-size:11px}.empty-msg.svelte-1r3tey2{color:var(--muted);margin:0;font-size:13px}.section-card.svelte-1ui2b6s{border:1px solid var(--line);background:var(--panel);border-radius:12px;flex-direction:column;gap:14px;padding:16px;display:flex}.section-header.svelte-1ui2b6s{justify-content:space-between;align-items:center;gap:12px;display:flex}.section-title.svelte-1ui2b6s{color:var(--ink);font-size:13px;font-weight:600}.section-desc.svelte-1ui2b6s{color:var(--muted);margin:0;font-size:12px}.mcp-info-grid.svelte-1ui2b6s{grid-template-columns:1fr 1fr;gap:8px;display:grid}.mcp-info-cell.svelte-1ui2b6s{border:1px solid var(--line);border-radius:8px;padding:8px 10px}.mcp-info-cell.wide.svelte-1ui2b6s{grid-column:1/-1}.mcp-info-label.svelte-1ui2b6s{color:var(--muted);text-transform:uppercase;letter-spacing:.05em;font-size:11px}.mcp-info-value.svelte-1ui2b6s{color:var(--ink);margin-top:3px;font-size:12px;font-weight:600}.mcp-info-value.ok.svelte-1ui2b6s{color:var(--green)}.mcp-info-value.err.svelte-1ui2b6s{color:var(--red)}.mcp-info-value.mono.svelte-1ui2b6s{font-family:monospace;font-weight:400}.mcp-info-value.break.svelte-1ui2b6s{word-break:break-all}.subsection-header.svelte-1ui2b6s{justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;display:flex}.subsection-title.svelte-1ui2b6s{color:var(--muted);font-size:12px;font-weight:600}.subsection-actions.svelte-1ui2b6s{align-items:center;gap:8px;display:flex}.count-label.svelte-1ui2b6s{color:var(--muted);font-size:11px}.mcp-items.svelte-1ui2b6s{flex-direction:column;gap:6px;display:flex}.mcp-detail.svelte-1ui2b6s{border:1px solid var(--line);background:var(--panel-soft);border-radius:8px;padding:8px 12px}.mcp-summary.svelte-1ui2b6s{cursor:pointer;color:var(--accent);-webkit-user-select:none;user-select:none;font-family:monospace;font-size:12px;font-weight:600;list-style:none}.mcp-summary.svelte-1ui2b6s::-webkit-details-marker{display:none}.mcp-desc.svelte-1ui2b6s{color:var(--muted);white-space:pre-wrap;margin:8px 0 0;font-size:12px;line-height:1.5}.mcp-schema-wrap.svelte-1ui2b6s{margin-top:10px}.mcp-schema-title.svelte-1ui2b6s{color:var(--muted);margin:0 0 4px;font-size:11px;font-weight:600}.mcp-schema-pre.svelte-1ui2b6s{background:var(--panel);border:1px solid var(--line);max-height:200px;color:var(--ink);white-space:pre;border-radius:6px;padding:8px;font-size:11px;overflow:auto}.mcp-args-list.svelte-1ui2b6s{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.mcp-arg-item.svelte-1ui2b6s{border:1px solid var(--line);border-radius:6px;padding:6px 8px}.mcp-arg-name-row.svelte-1ui2b6s{align-items:center;gap:8px;display:flex}.mcp-arg-name.svelte-1ui2b6s{color:var(--ink);font-family:monospace;font-size:12px;font-weight:600}.mcp-arg-req.svelte-1ui2b6s{text-transform:uppercase;color:var(--muted);letter-spacing:.05em;font-size:11px}.mcp-arg-desc.svelte-1ui2b6s{color:var(--muted);margin:4px 0 0;font-size:11px}.mcp-run-area.svelte-1ui2b6s{border-top:1px solid var(--line);flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;display:flex}.mcp-run-label.svelte-1ui2b6s{color:var(--muted);font-size:11px;font-weight:600}.mcp-textarea.svelte-1ui2b6s{resize:vertical;font-family:monospace;font-size:11px}.mcp-run-footer.svelte-1ui2b6s{justify-content:space-between;align-items:center;gap:8px;display:flex}.mcp-error-text.svelte-1ui2b6s{color:var(--red);font-size:11px}.mcp-result.svelte-1ui2b6s{font-size:11px}.empty-msg.svelte-1ui2b6s{color:var(--muted);margin:0;font-size:12px}.mcp-running{color:var(--muted);font-style:italic}.mcp-saved-label{color:var(--muted);margin-bottom:4px;font-size:11px}.mcp-saved-link{background:var(--green-soft);color:var(--green);border-radius:6px;align-items:center;gap:4px;padding:4px 10px;font-family:monospace;font-size:11px;font-weight:600;text-decoration:none;display:inline-flex}.mcp-saved-link:hover{opacity:.8}.mcp-error-pre{white-space:pre-wrap;word-break:break-word;border:1px solid var(--red-soft);background:var(--red-soft);max-height:200px;color:var(--red);border-radius:6px;padding:8px;font-size:11px;line-height:1.5;overflow:auto}.context-scroll.svelte-rpj1e5{height:100%;overflow-y:auto}.context-inner.svelte-rpj1e5{flex-direction:column;gap:20px;max-width:1100px;margin:0 auto;padding:24px 24px 48px;display:flex}.page-intro.svelte-rpj1e5{flex-direction:column;gap:4px;display:flex}.page-title.svelte-rpj1e5{color:var(--ink);margin:0;font-size:18px;font-weight:700}.page-desc.svelte-rpj1e5{color:var(--muted);margin:0;font-size:13px}.status-text.svelte-rpj1e5{color:var(--muted);margin:0;font-size:12px;font-style:italic}.agents-page.svelte-lf8l46{max-width:960px;margin:0 auto;padding:32px 24px;position:relative}.agents-msg.svelte-lf8l46{color:var(--muted);text-align:center;padding:48px 0;font-size:14px;font-style:italic}.agents-msg--error.svelte-lf8l46{color:var(--red);font-style:normal}.agents-msg--empty.svelte-lf8l46{font-style:italic}.agents-grid.svelte-lf8l46{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px;display:grid}.agent-card.svelte-lf8l46{text-align:left;border:1px solid var(--line);background:var(--panel);cursor:pointer;border-radius:12px;flex-direction:column;gap:4px;padding:16px;font-family:inherit;transition:border-color .15s,box-shadow .15s;display:flex}.agent-card.svelte-lf8l46:hover:not(:disabled){border-color:var(--accent);box-shadow:0 2px 12px var(--accent-soft)}.agent-card--disabled.svelte-lf8l46{opacity:.5;cursor:not-allowed}.agent-name.svelte-lf8l46{color:var(--ink);font-size:14px;font-weight:700}.agent-provider.svelte-lf8l46{color:var(--muted);margin-bottom:8px;font-size:12px}.agent-badge.svelte-lf8l46{border-radius:20px;align-self:flex-start;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.agent-badge--ready.svelte-lf8l46{background:var(--green-soft);color:var(--green)}.agent-badge--requires_input.svelte-lf8l46{background:var(--accent-soft);color:var(--accent)}.agent-badge--not_ready.svelte-lf8l46{background:var(--panel-soft);color:var(--muted)}.agent-input-dialog.svelte-lf8l46{border-color:var(--line-strong)}.agent-toast.svelte-lf8l46{border:1px solid var(--line);background:var(--panel);z-index:50;border-radius:14px;align-items:flex-start;gap:12px;max-width:min(420px,100vw - 48px);padding:14px 16px;display:flex;position:fixed;bottom:24px;right:24px;box-shadow:0 8px 32px #10182824}.agent-toast-icon.svelte-lf8l46{border-radius:50%;flex-shrink:0;place-items:center;width:24px;height:24px;font-size:12px;font-weight:700;display:grid}.agent-toast--loading.svelte-lf8l46 .agent-toast-icon:where(.svelte-lf8l46){border:2px solid var(--accent);border-top-color:#0000;animation:.8s linear infinite svelte-lf8l46-spin}.agent-toast--success.svelte-lf8l46 .agent-toast-icon:where(.svelte-lf8l46){background:var(--green);color:#fff}.agent-toast--error.svelte-lf8l46 .agent-toast-icon:where(.svelte-lf8l46){background:var(--red);color:#fff}.agent-toast-body.svelte-lf8l46{flex:1;min-width:0}.agent-toast-title.svelte-lf8l46{color:var(--ink);margin:0;font-size:13px;font-weight:700}.agent-toast-message.svelte-lf8l46{color:var(--muted);word-break:break-word;margin:2px 0 0;font-size:12px}.agent-toast-link.svelte-lf8l46{color:var(--accent);margin-top:4px;font-size:12px;text-decoration:underline;display:inline-block}.agent-toast-close.svelte-lf8l46{color:var(--muted);cursor:pointer;background:0 0;border:none;flex-shrink:0;padding:0;font-size:18px;line-height:1}@keyframes svelte-lf8l46-spin{to{transform:rotate(360deg)}}.ld-inline-snippet-target{cursor:context-menu}.category-docs{transition:max-height .2s,opacity .2s}.category-docs.collapsed{opacity:0;max-height:0;overflow:hidden}.category-docs.expanded{opacity:1;max-height:9999px}.category-docs.no-transition{transition:none!important}.prose pre{position:relative}.ld-code-copy{z-index:2;color:#d1d5db;cursor:pointer;opacity:0;background:#ffffff14;border:1px solid #ffffff26;border-radius:.375rem;justify-content:center;align-items:center;width:36px;height:36px;font-size:.8rem;line-height:1;transition:opacity .15s,background .15s;display:inline-flex;position:absolute;top:.4rem;right:.5rem}.prose pre:hover .ld-code-copy,.ld-code-copy:focus-visible,.ld-code-copy.ld-copied{opacity:1}.ld-code-copy:hover{background:#fff3}.ld-code-copy.ld-copied{color:#86efac;background:#22c55e40;border-color:#22c55e66}table.table-color-info{--tbl-accent:#3b82f6;--tbl-accent-soft:#dbeafe;--tbl-accent-stripe:#eff6ff;--tbl-accent-text:#1e3a8a}table.table-color-success{--tbl-accent:#22c55e;--tbl-accent-soft:#dcfce7;--tbl-accent-stripe:#f0fdf4;--tbl-accent-text:#14532d}table.table-color-warning{--tbl-accent:#f59e0b;--tbl-accent-soft:#fef3c7;--tbl-accent-stripe:#fffbeb;--tbl-accent-text:#78350f}table.table-color-danger{--tbl-accent:#ef4444;--tbl-accent-soft:#fee2e2;--tbl-accent-stripe:#fef2f2;--tbl-accent-text:#7f1d1d}table.table-color-note{--tbl-accent:#8b5cf6;--tbl-accent-soft:#e9d5ff;--tbl-accent-stripe:#f5f3ff;--tbl-accent-text:#4c1d95}.dark table.table-color-info{--tbl-accent:#60a5fa;--tbl-accent-soft:#1e3a8a8c;--tbl-accent-stripe:#1e3a8a59;--tbl-accent-text:#bfdbfe}.dark table.table-color-success{--tbl-accent:#4ade80;--tbl-accent-soft:#14532d8c;--tbl-accent-stripe:#14532d59;--tbl-accent-text:#bbf7d0}.dark table.table-color-warning{--tbl-accent:#fbbf24;--tbl-accent-soft:#78350f8c;--tbl-accent-stripe:#78350f59;--tbl-accent-text:#fed7aa}.dark table.table-color-danger{--tbl-accent:#f87171;--tbl-accent-soft:#7f1d1d8c;--tbl-accent-stripe:#7f1d1d59;--tbl-accent-text:#fecaca}.dark table.table-color-note{--tbl-accent:#a78bfa;--tbl-accent-soft:#4c1d958c;--tbl-accent-stripe:#4c1d9559;--tbl-accent-text:#ddd6fe}.prose table[class*=table-color-] thead th{background-color:var(--tbl-accent-soft);color:var(--tbl-accent-text)}.prose table{border-collapse:collapse;border:none}.prose table th,.prose table td{border:none;border-bottom:1px solid #e5e7eb;padding:.6rem 1rem}.prose table thead th{border-bottom-color:#d1d5db}.dark .prose table th,.dark .prose table td{border-bottom-color:#374151}.prose table[class*=table-color-] th,.prose table[class*=table-color-] td{border-bottom-color:var(--tbl-accent-soft)}.prose table[class*=table-color-] thead th{border-bottom-color:var(--tbl-accent)}.prose table thead,.prose table tbody tr{border:none}.prose table.table-style-compact{font-size:.85em;line-height:1.35}.prose table.table-style-compact th,.prose table.table-style-compact td{padding:.2rem .5rem}.prose table.table-style-striped{border-collapse:collapse}.prose table.table-style-striped tbody tr:nth-child(odd){background-color:var(--tbl-accent-stripe,#f3f4f6)}.dark .prose table.table-style-striped tbody tr:nth-child(odd){background-color:var(--tbl-accent-stripe,#374151)}.prose table.table-border-bordered{border-collapse:collapse}.prose table.table-border-bordered,.prose table.table-border-bordered th,.prose table.table-border-bordered td{border:1px solid var(--tbl-accent,#d1d5db)}.dark .prose table.table-border-bordered,.dark .prose table.table-border-bordered th,.dark .prose table.table-border-bordered td{border-color:var(--tbl-accent,#4b5563)}.prose table.table-border-borderless th,.prose table.table-border-borderless td{border-top:none!important;border-left:none!important;border-right:none!important}pre.ld-collapsible{max-height:var(--ld-code-max-h,400px);position:relative;overflow:hidden}pre.ld-collapsible.ld-expanded{max-height:none;overflow:auto}pre.ld-collapsible:not(.ld-expanded):after{content:"";pointer-events:none;background:linear-gradient(#282c3400 0%,#282c34d9 100%);height:64px;position:absolute;bottom:0;left:0;right:0}.ld-code-toggle{z-index:1;color:#e5e7eb;cursor:pointer;background:#ffffff1f;border:1px solid #ffffff2e;border-radius:.375rem;padding:.15rem .6rem;font-size:.75rem;font-weight:500;transition:background .15s;position:absolute;bottom:.4rem;right:.5rem}.ld-code-toggle:hover{background:#ffffff38}.color-swatch-btn.selected-swatch,.color-text-swatch-btn.selected-text-swatch{outline-offset:2px;outline:2px solid;box-shadow:0 0 0 3px #00000026}.doc-item.active{color:#3b82f6;background-color:#3b82f61f;font-weight:600}.dark .doc-item.active{color:#60a5fa;background-color:#60a5fa26}.dark .prose{color:#d1d5db}.dark .prose h1,.dark .prose h2,.dark .prose h3,.dark .prose h4,.dark .prose h5,.dark .prose h6{color:#f9fafb}.dark .prose a{color:#60a5fa}.dark .prose strong{color:#f3f4f6}.prose code:not(pre code){color:#111827;background:#e5e7eb;border-radius:.25em;padding:.1em .35em;font-size:.875em;font-weight:400}.dark .prose code:not(pre code){color:#f87171;background:#4b5563;border-radius:.25em;padding:.1em .35em;font-size:.875em;font-weight:400}.dark .prose blockquote{color:#9ca3af;border-color:#4b5563}.prose img{margin-top:0;margin-bottom:0}.prose p>img:only-child,.prose p>a:only-child>img{margin-top:1em;margin-bottom:1em}.prose hr{border-color:#d1d5db;margin-top:2em;margin-bottom:2em}mark.ld-local-mark{color:inherit;background:#bae6fd;border-radius:2px;padding:0 1px}mark.ld-local-mark.ld-local-active{color:#fff;background:#0284c7}.dark mark.ld-local-mark{color:#e0f2fe;background:#075985}.dark mark.ld-local-mark.ld-local-active{color:#082f49;background:#0ea5e9}.ld-local-item-active{background:#0ea5e91f}.prose a.ld-file-attachment,a.ld-file-attachment{color:#5b21b6;background:#ede9fe;border:1px solid #ddd6fe;border-radius:.375rem;align-items:center;gap:.35em;padding:.1em .55em;font-weight:500;text-decoration:none;transition:background-color .15s,border-color .15s;display:inline-flex}.prose a.ld-file-attachment:hover,a.ld-file-attachment:hover{background:#ddd6fe;border-color:#c4b5fd}.dark .prose a.ld-file-attachment,.dark a.ld-file-attachment{color:#c4b5fd;background:#8b5cf62e;border-color:#8b5cf64d}.dark .prose a.ld-file-attachment:hover,.dark a.ld-file-attachment:hover{background:#8b5cf647;border-color:#8b5cf673}a.ld-file-attachment .ld-file-icon{opacity:.85;font-size:.85em}.dark .prose hr{border-color:#374151}.dark .prose table th{color:#f9fafb;background:#1f2937}.dark .prose table td{border-color:#374151}.dark .prose table tr:nth-child(2n){background:#111827}@media print{#sidebar,#header{display:none!important}#content-area{margin:0!important}.no-print{display:none!important}.prose{max-width:100%!important}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.dark ::-webkit-scrollbar-thumb{background:#4b5563}mark{color:inherit;background:#fef08a;border-radius:2px;padding:0 2px}mark.match-active{color:#fff;background:#f97316}.dark mark{color:#fef9c3;background:#713f12}.dark mark.match-active{color:#fff;background:#ea580c}html:not(.dark) body.ld-code-light #home-content-area{background:#fff}html:not(.dark) body.ld-code-light .ld-code-copy{color:#6b7280;background:#0000000a;border:1px solid #0000001a}html:not(.dark) body.ld-code-light .prose pre:hover .ld-code-copy,html:not(.dark) body.ld-code-light .ld-code-copy:focus-visible,html:not(.dark) body.ld-code-light .ld-code-copy.ld-copied{opacity:1}html:not(.dark) body.ld-code-light .ld-code-copy:hover{color:#111827;background:#00000014;border-color:#0000002e}html:not(.dark) body.ld-code-light .ld-code-copy.ld-copied{color:#15803d;background:#22c55e1f;border-color:#22c55e59}html:not(.dark) body.ld-code-light pre.ld-collapsible:not(.ld-expanded):after{background:linear-gradient(#f6f8fa00 0%,#f6f8faeb 100%)}html:not(.dark) body.ld-code-light .ld-code-toggle{color:#374151;background:#0000000d;border:1px solid #0000001f}html:not(.dark) body.ld-code-light .ld-code-toggle:hover{background:#0000001a}#vis-canvas>div{border:none!important}.tool-btn{cursor:pointer;color:#4b5563;background:0 0;border:none;border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;font-size:.875rem;transition:background-color .15s,color .15s;display:flex}.dark .tool-btn{color:#9ca3af}.tool-btn:hover{background:#f3f4f6}.dark .tool-btn:hover{background:#1f2937}.tool-active{color:#ea580c!important;background:#fff7ed!important}.dark .tool-active{color:#fb923c!important;background:#7c2d124d!important}#vis-canvas.cursor-crosshair canvas{cursor:crosshair!important}.float-panel{z-index:10;background:#fff;border:1px solid #e5e7eb;border-radius:.5rem;align-items:center;gap:.25rem;padding:.375rem .5rem;display:flex;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 12px #0000001a}.dark .float-panel{background:#1f2937;border-color:#374151}.float-panel.hidden{display:none!important}.panel-sep{background:#e5e7eb;flex-shrink:0;width:1px;height:1rem;margin:0 .125rem}.dark .panel-sep{background:#374151}#customShapeLabelPlacementControls{display:contents}#customShapeLabelPlacementControls.hidden{display:none}.edge-btn-active{color:#ea580c!important;background:#fff7ed!important}.dark .edge-btn-active{color:#fb923c!important;background:#7c2d124d!important}#labelInput{z-index:20;text-align:center;color:#1f2937;resize:none;background:#fffffff2;border:2px solid #3b82f6;border-radius:.5rem;outline:none;min-width:80px;min-height:28px;padding:4px 8px;font-family:system-ui,-apple-system,sans-serif;font-size:13px;font-weight:500;line-height:1.4;position:absolute;overflow:hidden;box-shadow:0 4px 16px #00000026}.dark #labelInput{color:#f3f4f6;background:#111827f2}#labelInput.hidden{display:none}#debugLayer{pointer-events:none;z-index:12;position:absolute;inset:0;overflow:hidden}.debug-box{pointer-events:auto;white-space:pre;-webkit-user-select:text;user-select:text;cursor:text;color:#c2410c;background:#ffffffe6;border:1px solid #f97316;border-radius:3px;padding:3px 6px;font:10px/1.4 monospace;position:absolute}.dark .debug-box{color:#fbbf24;background:#000000c7}#selectionOverlay{pointer-events:none;z-index:15;box-sizing:border-box;border:2px dashed #f97316;border-radius:3px;display:none;position:absolute}.resize-handle{pointer-events:all;z-index:1;background:#fff;border:2px solid #f97316;border-radius:2px;width:10px;height:10px;position:absolute}.dark .resize-handle{background:#374151}#rh-rotate{pointer-events:all;z-index:1;cursor:grab;color:#f97316;background:#fff;border:2px solid #f97316;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex;position:absolute}#rh-rotate:active{cursor:grabbing}.dark #rh-rotate{background:#374151}#rh-label-rotate{pointer-events:all;z-index:1;cursor:grab;color:#6366f1;background:#fff;border:2px solid #6366f1;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex;position:absolute}#rh-label-rotate:active{cursor:grabbing}.dark #rh-label-rotate{background:#374151}#toastContainer{z-index:1000;pointer-events:none;flex-direction:column-reverse;gap:.5rem;display:flex;position:fixed;bottom:1.5rem;right:1.5rem}.ld-toast{pointer-events:all;cursor:pointer;opacity:0;color:#fafaf9;background:#1c1917;border:1px solid #292524;border-radius:.5rem;padding:.6rem 1rem;font-size:.8rem;font-weight:500;transition:opacity .2s,transform .2s;transform:translateY(.5rem);box-shadow:0 4px 16px #0000002e}.dark .ld-toast{color:#1c1917;background:#fafaf9;border-color:#e7e5e4}.ld-toast--error{color:#fef2f2;background:#7f1d1d;border-color:#991b1b}.ld-toast--visible{opacity:1;transform:translateY(0)}#evidenceLayer{pointer-events:none;z-index:18;position:absolute;inset:0;overflow:hidden}#evidenceLayer.hidden{display:none}.evidence-marker{color:#0369a1;pointer-events:auto;background:#e0f2fe;border:1px solid #0284c7;border-radius:999px;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;font-size:.7rem;font-weight:700;line-height:1;display:flex;position:absolute;transform:translate(-50%,-50%);box-shadow:0 2px 8px #0284c747}.dark .evidence-marker{color:#e0f2fe;background:#082f49;border-color:#38bdf8}#customShapeBar{z-index:9;background:#fffffff5;border:1px solid #e5e7eb;border-radius:.5rem;align-items:center;gap:.25rem;max-width:min(42rem,100% - 1.5rem);padding:.35rem;display:flex;position:absolute;bottom:.75rem;left:.75rem;box-shadow:0 4px 12px #0000001a}.dark #customShapeBar{background:#1f2937f5;border-color:#374151}#customShapeBar.hidden{display:none}#customShapeBarBody{scrollbar-width:thin;gap:.25rem;display:flex;overflow-x:auto}.custom-shape-btn{background:0 0;border:1px solid #0000;border-radius:.375rem;flex:none;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.custom-shape-btn:hover{background:#f3f4f6}.dark .custom-shape-btn:hover{background:#111827}.custom-shape-btn img{object-fit:contain;pointer-events:none;max-width:1.7rem;max-height:1.7rem}.ld-shape-editor .btn{color:#374151;background:#fff;border:1px solid #d1d5db;border-radius:.375rem;justify-content:center;align-items:center;height:2rem;padding:0 .75rem;font-size:.8125rem;font-weight:600;display:inline-flex}.ld-shape-editor .btn:hover{background:#f3f4f6}.ld-shape-editor .btn-primary{color:#fff;background:#2563eb;border-color:#2563eb}.ld-shape-editor .btn-primary:hover{background:#1d4ed8}.ld-shape-editor .btn-danger{color:#b91c1c;border-color:#fecaca}.ld-shape-editor .btn-danger:hover{background:#fef2f2}.ld-shape-editor .field{background:#fff;border:1px solid #d1d5db;border-radius:.375rem;height:2rem;padding:0 .5rem;font-size:.875rem}.ld-shape-editor .shape-item.active{color:#1d4ed8;background:#eff6ff}.ld-shape-editor #previewStage{aspect-ratio:1;background-color:#0000;background-image:linear-gradient(45deg,#f9fafb 25%,#0000 25%),linear-gradient(-45deg,#f9fafb 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#f9fafb 75%),linear-gradient(-45deg,#0000 75%,#f9fafb 75%);background-position:0 0,0 .625rem,.625rem -.625rem,-.625rem 0;background-repeat:repeat,repeat,repeat,repeat;background-size:1.25rem 1.25rem;background-attachment:scroll,scroll,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;border:1px solid #d1d5db;border-radius:.5rem;width:min(34rem,100%);position:relative;overflow:hidden}.ld-shape-editor #previewImage{object-fit:fill;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.ld-shape-editor .anchor-dot{cursor:grab;background:#f97316;border:2px solid #fff;border-radius:999px;width:.9rem;height:.9rem;position:absolute;transform:translate(-50%,-50%);box-shadow:0 1px 4px #00000059}.ld-shape-editor .anchor-dot:active{cursor:grabbing}.ld-shape-editor .anchor-dot span{color:#374151;white-space:nowrap;background:#ffffffe6;border-radius:3px;padding:1px 3px;font:10px/1 system-ui,sans-serif;position:absolute;top:calc(100% + .2rem);left:50%;transform:translate(-50%)}
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--ink:#17202a;--muted:#667085;--line:#d9dee7;--line-strong:#b8c0cc;--panel:#fff;--panel-soft:#f8fafc;--accent:#276ef1;--accent-strong:#174ea6;--accent-soft:#e8f0ff;--green:#047857;--green-soft:#dcfce7;--red:#b42318;--red-soft:#fee4e2;--shadow:0 18px 60px #10182824;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}html,body{background:var(--bg);width:100%;height:100%;color:var(--ink);margin:0;overflow:hidden}button,input,select,textarea{font:inherit}.topbar{border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#ffffffeb;flex-shrink:0;justify-content:space-between;align-items:center;gap:24px;padding:0 24px;display:flex}.dark .topbar{color:#f3f4f6;background:#111827eb;border-bottom-color:#ffffff1a}.dark .brand-mark{background:#1f2937;border-color:#fff3}.dark .brand-lockup p{color:#9ca3af}.dark .ghost-button{color:#e5e7eb;background:0 0;border-color:#ffffff1f}.dark .ghost-button:hover{background:#ffffff0f}.brand-lockup,.status-row,.panel-title-row,.panel-actions,.panel-kicker{align-items:center;display:flex}.brand-lockup{gap:12px;min-width:0}.brand-mark{border:1px solid var(--line-strong);color:#fff;letter-spacing:0;background:#111827;border-radius:10px;place-items:center;width:38px;height:38px;font-size:12px;font-weight:800;display:grid}h1,p{margin:0}h1{letter-spacing:0;font-size:15px;font-weight:760}.brand-lockup p{color:var(--muted);margin-top:2px;font-size:12px}.status-row{gap:10px}.status-pill,.panel-kicker span{letter-spacing:0;border-radius:999px;font-size:12px;font-weight:700}.status-pill{border:1px solid var(--line);background:var(--panel-soft);color:#344054;padding:7px 10px}.status-pill.is-live{background:var(--green-soft);color:var(--green);border-color:#86efac}.status-pill.is-fallback{color:#9a3412;background:#fff7ed;border-color:#fed7aa}.workspace-shell{min-height:0;position:relative}.workspace-canvas{cursor:grab;touch-action:none;background:#f8fafc;width:100%;height:100%;transition:filter .18s;display:block}.workspace-canvas.is-panning{cursor:grabbing}.tool-button,.ghost-button,.icon-button,.primary-button,.secondary-button{border:1px solid var(--line);color:var(--ink);cursor:pointer;background:#fff}.tool-button{border-radius:16px;place-items:center;width:52px;height:52px;font-size:25px;font-weight:700;display:grid;box-shadow:0 10px 30px #1018281a}.tool-button.primary{color:#fff;background:#111827;border-color:#111827}.ghost-button{border-radius:9px;align-items:center;height:34px;padding:0 12px;font-size:13px;font-weight:700;text-decoration:none;display:inline-flex}.config-surface{color:#f1f5f9;--panel-ink:#f1f5f9;--panel-muted:#94a3b8;--panel-line:#ffffff1a;--panel-field-bg:#ffffff0d;--panel-field-bg-focus:#ffffff14;background:#111827;border:1px solid #ffffff14;border-radius:28px;flex-direction:column;width:min(780px,max(540px,50vw));max-width:calc(100vw - 48px);height:calc(100vh - 118px);padding:24px;display:flex;overflow-y:auto;box-shadow:0 24px 80px #0006}.config-surface[hidden]{display:none}.panel-kicker{flex-shrink:0;justify-content:space-between;margin-bottom:18px}.panel-kicker span{padding:6px 9px}#nodeTypeBadge{color:#93c5fd;background:#60a5fa26}#nodeHealthBadge{background:var(--green-soft);color:var(--green)}.panel-title-row{flex-shrink:0;justify-content:space-between;align-items:start;gap:12px;margin-bottom:18px}.panel-title-row>div{flex:auto;min-width:0}.eyebrow,.field span{color:var(--panel-muted,#475467);font-size:12px;font-weight:720;display:block}.title-input{width:100%;min-width:0;color:var(--panel-ink,#101828);letter-spacing:0;background:0 0;border:0;outline:0;margin-top:6px;font-size:24px;font-weight:780}.icon-button{border-radius:10px;place-items:center;width:36px;height:36px;font-size:20px;line-height:1;display:grid}.icon-button.danger{color:#fca5a5;background:#ef444433;border-color:#ef444466}.icon-button.close{color:#fde047;background:#eab30826;border-color:#eab30866}.form-grid{flex-shrink:0;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;display:grid}.field{min-width:0}.field.wide{grid-column:1/-1}.field input,.field select,.field textarea{border:1px solid var(--panel-line,var(--line));background:var(--panel-field-bg,#fff);width:100%;color:var(--panel-ink,var(--ink));border-radius:12px;outline:0;margin-top:7px}.field input,.field select{height:42px;padding:0 12px}.field textarea{resize:none;min-height:84px;padding:10px 12px;line-height:1.45}.checkbox-field{align-items:center;gap:10px;min-height:42px;display:flex}.checkbox-field input{accent-color:#2563eb;width:18px;height:18px;margin-top:0}.checkbox-field span{color:var(--panel-ink,var(--ink));font-size:13px;font-weight:760}.field input:focus,.field select:focus,.field textarea:focus,.title-input:focus{border-color:#60a5fa;box-shadow:0 0 0 4px #60a5fa26}.field input[readonly]{border-color:var(--panel-line,#d0d5dd);color:var(--panel-muted,#475467);background:#ffffff08;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,monospace;font-size:12px}.field select:disabled,.icon-button:disabled,.primary-button:disabled,.secondary-button:disabled{cursor:not-allowed;opacity:.62}.contents{display:contents}.contents[hidden]{display:none}.model-field-row{flex-direction:column;display:flex}.model-select-wrap{align-items:center;gap:6px;margin-top:7px;display:flex}.model-select-wrap select{flex:1;margin-top:0}.model-select-wrap .icon-button{border:1px solid var(--line);width:36px;height:42px;color:var(--ink);cursor:pointer;background:#fff;border-radius:12px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;display:flex}.model-select-wrap .icon-button:hover{background:#f0f4ff}@keyframes spin{to{transform:rotate(360deg)}}.model-select-wrap .icon-button.loading{pointer-events:none;opacity:.7;animation:.7s linear infinite spin;display:inline-block}.panel-actions{flex-shrink:0;justify-content:space-between;align-items:center;gap:10px;margin-top:auto;padding-top:18px}.panel-actions-left,.panel-actions-right{align-items:center;gap:8px;display:flex}.test-feedback{color:#475467;min-height:18px;margin:10px 0 0;font-size:12px;font-weight:650;line-height:1.4}.agent-section{flex:none;grid-template-columns:minmax(0,1fr);gap:14px;margin-top:16px;display:grid}.agent-section[hidden]{display:none}#nodeSystemPrompt{resize:vertical;min-height:180px}#nodeUserInputDescription{resize:vertical;min-height:104px}.mcp-inventory{border-top:1px solid var(--panel-line,var(--line));margin-top:18px;padding-top:16px}.inventory-header{justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;display:flex}.inventory-header span{color:var(--panel-ink,#344054);font-size:13px;font-weight:760}.inventory-header strong{color:#93c5fd;background:#60a5fa26;border-radius:999px;padding:5px 8px;font-size:11px}.inventory-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.inventory-grid article{border:1px solid var(--panel-line,var(--line));background:#ffffff0a;border-radius:14px;min-width:0;padding:12px}.inventory-grid h2{color:#e2e8f0;margin:0 0 8px;font-size:13px;font-weight:800}.inventory-grid ul{gap:5px;margin:0;padding:0;list-style:none;display:grid}.inventory-grid li{color:#94a3b8;text-overflow:ellipsis;white-space:nowrap;background:#ffffff0f;border-radius:8px;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,monospace;font-size:11px;overflow:hidden}.primary-button,.secondary-button,.danger-button{border-radius:11px;height:40px;padding:0 16px;font-size:13px;font-weight:760}.primary-button{border-color:var(--accent);background:var(--accent);color:#fff}.secondary-button{border-color:var(--panel-line,var(--line));background:var(--panel-field-bg,var(--panel-soft));color:var(--panel-ink,var(--ink))}.danger-button{color:#fff;cursor:pointer;background:#d92d20;border:1px solid #d92d20}.confirm-overlay{z-index:60;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#0f172a47;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.confirm-overlay[hidden]{display:none}.confirm-dialog{background:#fff;border:1px solid #fecdcae6;border-radius:20px;width:min(440px,100vw - 48px);padding:22px;animation:.16s ease-out both confirm-in;box-shadow:0 24px 80px #1018283d}.agent-run-dialog{background:#fff;border:1px solid #bfdbfee6;border-radius:20px;width:min(760px,100vw - 48px);max-height:min(82vh,760px);padding:22px;animation:.16s ease-out both confirm-in;overflow-y:auto;box-shadow:0 24px 80px #1018283d}.agent-run-input-field{margin-top:18px;display:block}.agent-run-result{color:#101828;white-space:pre-wrap;word-break:break-word;background:#f8fafc;border:1px solid #d0d5dd;border-radius:14px;max-height:300px;margin-top:16px;padding:14px;font-size:13px;line-height:1.55;overflow-y:auto}.agent-run-result[hidden]{display:none}.agent-run-result[data-state=loading]{color:#1d4ed8;background:#eff6ff;border-color:#bfdbfe}.agent-run-result[data-state=error]{color:#991b1b;background:#fef2f2;border-color:#fecaca}.confirm-kicker{color:var(--red);margin:0 0 6px;font-size:12px;font-weight:800}.confirm-dialog h2{color:#101828;margin:0;font-size:19px;font-weight:820}.confirm-message{color:#475467;margin:10px 0 0;font-size:14px;line-height:1.5}.confirm-actions{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.workspace-toast{z-index:40;color:#fff;background:#111827;border:1px solid #10182814;border-radius:14px;align-items:center;gap:10px;max-width:min(420px,100vw - 48px);padding:13px 16px;font-size:14px;font-weight:760;animation:.18s ease-out both toast-in;display:flex;position:fixed;bottom:24px;right:24px;box-shadow:0 18px 60px #10182838}.workspace-toast[hidden]{display:none}.toast-icon{color:#052e1b;background:#34d399;border-radius:999px;flex:none;place-items:center;width:20px;height:20px;font-size:13px;font-weight:900;display:grid}.workspace-toast[data-state=error] .toast-icon{color:#450a0a;background:#f87171}.workspace-toast[data-state=loading] .toast-icon{color:#fff;background:#6b7280;animation:.8s linear infinite spin}.fallback-panel-host{z-index:6;width:min(780px,max(540px,50vw - 24px));max-width:calc(100vw - 48px);position:absolute;top:24px;bottom:24px;right:24px}.fallback-panel-host:not([hidden]){animation:.22s ease-out both panel-in}.fallback-panel-host .config-surface{width:100%;height:100%}@media (width<=900px){.app-shell{grid-template-rows:88px minmax(0,1fr)}.topbar{flex-direction:column;justify-content:center;align-items:flex-start;gap:8px}.config-surface{width:min(420px,100vw - 32px);padding:18px}.fallback-panel-host{width:auto;inset:auto 16px 16px}.inventory-grid{grid-template-columns:1fr}}@keyframes panel-in{0%{opacity:0;transform:translate(18px)}to{opacity:1;transform:translate(0)}}@keyframes confirm-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.admin-scroll{height:100%;overflow-y:auto}.admin-form{display:contents}.save-bar{z-index:10;border-bottom:1px solid var(--line);background:var(--bg);position:sticky;top:0}.save-bar-inner{justify-content:space-between;align-items:center;gap:16px;max-width:720px;margin:0 auto;padding:12px 24px;display:flex}.save-bar-title{color:var(--ink);margin:0;font-size:16px;font-weight:700}.save-bar-desc{color:var(--muted);margin:2px 0 0;font-size:12px}.save-bar-actions{flex-shrink:0;align-items:center;gap:16px;display:flex}.save-msg{font-size:13px}.save-msg--ok{color:var(--green)}.save-msg--error{color:var(--red)}.admin-sections{flex-direction:column;gap:24px;max-width:720px;margin:0 auto;padding:24px 24px 40px;display:flex}.config-section{border:1px solid var(--line);background:var(--panel);border-radius:12px;overflow:hidden}.config-section-header{border-bottom:1px solid var(--line);padding:16px 24px}.config-section-title{color:var(--ink);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:600;display:flex}.config-section-desc{color:var(--muted);margin:4px 0 0 28px;font-size:12px}.config-section-body{flex-direction:column;gap:16px;padding:16px 24px;display:flex}.field-group{flex-direction:column;gap:4px;display:flex}.field-row{border-bottom:1px solid var(--line);grid-template-columns:1fr 1fr;gap:16px;margin-bottom:4px;padding-bottom:8px;display:grid}.info-item dt{color:var(--muted);text-transform:uppercase;letter-spacing:.05em;font-size:11px}.info-item dd{color:var(--ink);word-break:break-all;margin:2px 0 0;font-family:monospace;font-size:12px}.field-label{color:var(--ink);font-size:13px;font-weight:500}.field-hint{color:var(--muted);margin:0;font-size:12px}.field-input{border:1px solid var(--line-strong);background:var(--panel-soft);width:100%;color:var(--ink);border-radius:8px;outline:none;padding:8px 12px;font-size:13px;transition:border-color .15s,box-shadow .15s}.field-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.field-input--mono{font-family:monospace;font-size:12px}.checkbox-label{cursor:pointer;color:var(--ink);align-items:center;gap:10px;font-size:13px;font-weight:500;display:flex}.checkbox-label input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);border-radius:4px;flex-shrink:0}.checkbox-hint{margin-left:26px}.btn-primary{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:8px 20px;font-size:13px;font-weight:600;transition:background .15s}.btn-primary:hover{background:var(--accent-strong)}.btn-sm{padding:6px 12px;font-size:12px}.link-btn{color:var(--accent);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;text-decoration:underline}.link-btn:disabled{opacity:.35;pointer-events:none}.pattern-preview{background:var(--panel-soft);border:1px solid var(--line);border-radius:8px;padding:12px}.pattern-preview-title{color:var(--accent);text-transform:uppercase;letter-spacing:.05em;margin:0 0 4px;font-size:11px;font-weight:700}.pattern-rows{flex-direction:column;gap:8px;margin-top:8px;display:flex}.pattern-row{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:10px}.pattern-filename{color:var(--muted);word-break:break-all;margin:0 0 6px;font-family:monospace;font-size:11px}.pattern-cols{grid-template-columns:repeat(3,1fr);gap:8px;font-size:12px;display:grid}.pattern-col-label{color:var(--muted);margin-bottom:2px;font-size:11px;display:block}.pattern-value--date{color:var(--green)}.pattern-value--none{color:var(--muted)}.pattern-value--cat{color:var(--accent)}.pattern-value--title{color:var(--ink)}.file-browser{border:1px solid var(--line);border-radius:8px;overflow:hidden}.file-browser-toolbar{background:var(--panel-soft);border-bottom:1px solid var(--line);align-items:center;gap:8px;padding:6px 12px;display:flex}.file-browser-path{color:var(--muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:monospace;font-size:11px;overflow:hidden}.file-browser-list{max-height:208px;overflow-y:auto}.browser-msg{color:var(--muted);text-align:center;margin:0;padding:12px;font-size:12px}.browser-msg--error{color:var(--red)}.browser-row{text-align:left;cursor:pointer;border:none;border-bottom:1px solid var(--line);background:0 0;align-items:center;gap:8px;width:100%;padding:8px 12px;font-size:13px;display:flex}.browser-row:last-child{border-bottom:none}.browser-row:hover{background:var(--panel-soft)}.browser-row--dir{color:var(--ink)}.browser-row--file{cursor:default;justify-content:space-between}.browser-row-name{color:var(--ink);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.badge-added{color:var(--green);flex-shrink:0;font-size:11px}.extra-files-list{flex-direction:column;gap:4px;display:flex}.extra-file-row{background:var(--panel-soft);border-radius:6px;align-items:center;gap:8px;padding:8px 12px;display:flex}.extra-file-arrows{flex-direction:column;gap:0;display:flex}.extra-file-arrows button{color:var(--muted);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1.2}.extra-file-arrows button:disabled{opacity:.25;pointer-events:none}.extra-file-path{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:monospace;font-size:11px;overflow:hidden}.remove-btn{color:var(--red);cursor:pointer;background:0 0;border:none;flex-shrink:0;font-size:12px}.palette-header{justify-content:space-between;align-items:center;margin-bottom:4px;display:flex}.swatches{flex-wrap:wrap;gap:8px;margin-top:8px;display:flex}.swatch-wrap{width:32px;height:32px;position:relative}.swatch{pointer-events:none;border:3px solid;border-radius:50%;width:32px;height:32px}.swatch-input{opacity:0;cursor:pointer;border:none;width:100%;height:100%;padding:0;position:absolute;inset:0}.edge-swatch-wrap{flex-direction:column;align-items:center;gap:3px;display:flex}.edge-swatch{border:2px solid #00000026;border-radius:50%;width:26px;height:26px}.remove-swatch-btn{color:var(--red);cursor:pointer;background:0 0;border:none;padding:0;font-size:10px;line-height:1}.add-color-row{align-items:center;gap:8px;margin-top:12px;display:flex}.color-input{cursor:pointer;border:1px solid var(--line-strong);background:0 0;border-radius:6px;width:32px;height:32px;padding:0}.license-card{border:1px solid var(--accent-soft);border-radius:16px;overflow:hidden}.license-banner{background:linear-gradient(90deg,#276ef1,#4f8ef7,#6366f1);align-items:center;gap:16px;padding:20px 24px;display:flex}.license-icon{font-size:28px}.license-title{color:#fff;margin:0;font-size:15px;font-weight:700}.license-subtitle{color:#fffc;margin:4px 0 0;font-size:12px}.license-body{background:var(--panel);padding:20px 24px}.license-body p{color:var(--ink);margin:0 0 16px;font-size:13px}.license-links{flex-wrap:wrap;gap:12px;display:flex}.license-btn{color:#fff;border-radius:8px;align-items:center;gap:8px;padding:8px 16px;font-size:13px;font-weight:600;text-decoration:none;transition:opacity .15s;display:inline-flex}.license-btn svg{flex-shrink:0;width:16px;height:16px}.license-btn:hover{opacity:.85}.license-btn--linkedin{background:#0a66c2}.license-btn--npm{background:#cb3837}:root[data-blueprint]{--bg:#0f172a;--ink:#f1f5f9;--muted:#94a3b8;--line:#ffffff1a;--accent:#3b82f6;--accent-soft:#3b82f626;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}*{box-sizing:border-box}[hidden]{display:none!important}html,body{background:var(--bg);width:100%;height:100%;color:var(--ink);margin:0}.app-shell{grid-template-rows:64px minmax(0,1fr);width:100vw;height:100vh;display:grid}[data-blueprint] .topbar{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#0f172aeb}.brand-lockup{align-items:center;gap:12px;min-width:0;display:flex}[data-blueprint] .brand-mark{color:#fff;background:#1e293b;border-color:#fff3}.brand-lockup h1{letter-spacing:0;margin:0;font-size:14px;font-weight:760}.brand-lockup p{color:var(--muted);margin:2px 0 0;font-size:11px}.topbar-right{align-items:center;gap:8px;display:flex}.breadcrumb{color:var(--muted);align-items:center;gap:6px;font-size:13px;display:flex;overflow:hidden}.breadcrumb-item{cursor:pointer;color:var(--accent);white-space:nowrap;font-weight:600;font-size:inherit;background:0 0;border:none;padding:0;font-family:inherit;transition:opacity .15s}.breadcrumb-item:hover{opacity:.75}.breadcrumb-item.current{color:var(--ink);cursor:default;font-weight:700}.breadcrumb-sep{opacity:.4;font-size:11px}.ghost-button{border:1px solid var(--line);height:34px;color:var(--ink);cursor:pointer;background:0 0;border-radius:9px;align-items:center;padding:0 12px;font-size:13px;font-weight:700;text-decoration:none;transition:background .15s;display:inline-flex}[data-blueprint] .ghost-button:hover{background:#ffffff0f}.workspace-shell{position:relative;overflow:hidden}canvas{cursor:default;width:100%;height:100%}canvas.is-panning{cursor:grabbing}.rail{z-index:5;flex-direction:column;gap:10px;display:flex;position:absolute;top:16px;left:16px}[data-blueprint] .tool-button{background:#1e293b;box-shadow:0 8px 24px #0000004d}[data-blueprint] .tool-button:hover{background:#273549}[data-blueprint] .tool-button.active{color:#60a5fa;background:#3b82f633;border-color:#3b82f6}.file-explorer{border-left:1px solid var(--line);z-index:10;background:#0f172a;flex-direction:column;width:50%;animation:.2s ease-out both slide-in;display:flex;position:absolute;top:0;bottom:0;right:0}@keyframes slide-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.explorer-header{border-bottom:1px solid var(--line);flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:16px 20px;display:flex}.explorer-path{color:#93c5fd;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:700;overflow:hidden}.explorer-close{border:1px solid var(--line);width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border-radius:8px;flex-shrink:0;place-items:center;font-size:18px;transition:background .15s;display:grid}.explorer-close:hover{color:var(--ink);background:#ffffff0f}.explorer-top{flex:1;min-height:0;overflow-y:auto}.explorer-divider{background:var(--line);flex-shrink:0;height:1px}.explorer-bottom{flex:1;min-height:0;overflow-y:auto}.explorer-list{padding:8px 0}.explorer-item{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:8px 20px;font-size:13px;transition:background .1s;display:flex}.explorer-item:hover{background:#ffffff0a}.explorer-item.is-folder{color:#93c5fd;font-weight:600}.explorer-item.is-file{color:#94a3b8}.explorer-breadcrumb{flex:1;align-items:center;gap:4px;min-width:0;font-size:12px;display:flex;overflow:hidden}.explorer-breadcrumb-item{color:#60a5fa;cursor:pointer;white-space:nowrap;font-weight:600;font-size:inherit;background:0 0;border:none;padding:0;font-family:inherit}.explorer-breadcrumb-item:hover{text-decoration:underline}.explorer-breadcrumb-item.current{color:#f1f5f9;cursor:default}.explorer-breadcrumb-item.current:hover{text-decoration:none}.explorer-breadcrumb-sep{color:#475569;font-size:11px}.file-preview{height:100%;padding:16px}.file-preview-placeholder{color:#475569;margin:0;padding-top:8px;font-size:13px}.file-preview pre{white-space:pre-wrap;word-break:break-all;margin:0;font-size:12px;line-height:1.6}.file-preview .hljs{background:0 0;padding:0}.file-preview .hljs-ln{border-collapse:collapse;font-size:12px;line-height:1.6}.file-preview .hljs-ln td{padding:0}.file-preview .hljs-ln-numbers{-webkit-user-select:none;user-select:none;text-align:right;color:#3d4f6b;vertical-align:top;border-right:1px solid #1e3a5f;min-width:36px;padding-left:4px!important;padding-right:16px!important}.file-preview .hljs-ln-code{padding-left:16px!important}.file-preview img{object-fit:contain;border-radius:8px;max-width:100%;max-height:300px}.file-preview video{border-radius:8px;max-width:100%}.file-preview-binary,.file-preview-truncated{border-radius:6px;margin-top:8px;padding:4px 10px;font-size:11px;font-weight:700;display:inline-block}.file-preview-binary{color:#fca5a5;background:#ef444426}.file-preview-truncated{color:#fde047;background:#eab30826}.file-preview-name{color:#94a3b8;margin:0 0 10px;font-size:12px;font-weight:700}.explorer-section-label{color:#475569;text-transform:uppercase;letter-spacing:.06em;padding:12px 20px 4px;font-size:11px;font-weight:700}.empty-state{color:var(--muted);pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:12px;font-size:14px;display:flex;position:absolute;inset:0}.empty-state p{margin:0}.bpadr-overlay{z-index:50;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#94a3b84d;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.bpadr-modal{color:#1e293b;background:#f9fafb;border:1px solid #e2e8f0;border-radius:20px;flex-direction:column;width:min(1100px,96vw);max-height:92vh;display:flex;overflow:hidden;box-shadow:0 32px 80px #0000004d}.bpadr-header{border-bottom:1px solid #e2e8f0;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:20px 24px 16px;display:flex}.bpadr-title{color:#0f172a;margin:0;font-size:16px;font-weight:760}.bpadr-header-actions{align-items:center;gap:8px;display:flex}.bpadr-icon-btn{color:#64748b;cursor:pointer;background:0 0;border:1px solid #e2e8f0;border-radius:9px;place-items:center;width:32px;height:32px;font-size:16px;transition:background .15s;display:grid}.bpadr-icon-btn:hover{color:#0f172a;background:#f1f5f9}.bpadr-read{flex:1;padding:24px;overflow-y:auto}.bpadr-prose{width:100%;max-width:none!important}#bpadrRendered hr{opacity:1!important;border-color:#d1d5db!important}#bpadrRendered :not(pre)>code{color:#1f2937;background-color:#e5e7eb;border-radius:.25rem;padding:.1em .3em;font-size:.875em;font-weight:500}#bpadrRendered table{border-collapse:collapse;border:none}#bpadrRendered table th,#bpadrRendered table td{border:none;border-bottom:1px solid #e5e7eb;padding:.6rem 1rem}#bpadrRendered table thead th{border-bottom-color:#d1d5db}#bpadrRendered table thead,#bpadrRendered table tbody tr{border:none}.bpadr-form{flex-direction:column;flex:1;gap:14px;padding:20px 24px;display:flex;overflow-y:auto}.bpadr-field{flex-direction:column;gap:6px;display:flex}.bpadr-field label{color:#64748b;font-size:12px;font-weight:700}.bpadr-field-row{grid-template-columns:1fr 1fr;gap:14px;display:grid}.bpadr-field-grow{flex:1;min-height:0}.bpadr-field-grow .bpadr-textarea{flex:1;min-height:200px}.bpadr-input,.bpadr-textarea{color:#1e293b;resize:none;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;outline:none;padding:8px 12px;font-family:inherit;font-size:13px;transition:border-color .15s}.bpadr-input:focus,.bpadr-textarea:focus{background:#fff;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.bpadr-input[readonly]{color:#2563eb;cursor:default;background:#eff6ff;border-color:#bfdbfe}.bpadr-textarea{min-height:180px;line-height:1.6}.bpadr-footer{flex-shrink:0;justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.bpadr-btn-ghost{color:#64748b;cursor:pointer;background:0 0;border:1px solid #e2e8f0;border-radius:9px;height:36px;padding:0 14px;font-size:13px;font-weight:700}.bpadr-btn-ghost:hover{color:#1e293b;background:#f1f5f9}.bpadr-btn-primary{color:#fff;cursor:pointer;background:#3b82f6;border:none;border-radius:9px;height:36px;padding:0 16px;font-size:13px;font-weight:700}.bpadr-btn-primary:hover{background:#2563eb}.bpadr-folder-confirm{flex-direction:column;gap:8px;padding:32px 24px;display:flex}.bpadr-folder-confirm p{color:#1e293b;margin:0;font-size:14px}.bpadr-folder-confirm strong{color:#2563eb}.bpadr-muted{color:#64748b!important;font-size:13px!important}.files-page.svelte-4q2lov{max-width:720px;margin:0 auto;padding:32px 24px}.files-msg.svelte-4q2lov{color:var(--muted);text-align:center;padding:48px 0;font-size:14px}.files-msg--error.svelte-4q2lov{color:var(--red)}.files-msg--empty.svelte-4q2lov{font-style:italic}.files-list.svelte-4q2lov{border:1px solid var(--line);background:var(--panel);border-radius:12px;margin:0;padding:0;list-style:none;overflow:hidden}.files-row.svelte-4q2lov{border-bottom:1px solid var(--line);align-items:center;gap:12px;padding:14px 20px;display:flex}.files-row.svelte-4q2lov:last-child{border-bottom:none}.files-icon.svelte-4q2lov{flex-shrink:0;font-size:18px}.files-info.svelte-4q2lov{flex:1;min-width:0}.files-name.svelte-4q2lov{color:var(--ink);white-space:nowrap;text-overflow:ellipsis;font-size:14px;text-decoration:none;display:block;overflow:hidden}.files-name.svelte-4q2lov:hover{color:var(--accent);text-decoration:underline}.files-meta.svelte-4q2lov{color:var(--muted);margin-top:2px;font-size:12px}.files-row-error.svelte-4q2lov{color:var(--red);margin:4px 0 0;font-size:12px}.files-actions.svelte-4q2lov{flex-shrink:0;gap:8px;display:flex}.files-btn.svelte-4q2lov{border:1px solid var(--line-strong);background:var(--panel-soft);color:var(--ink);cursor:pointer;border-radius:8px;padding:5px 12px;font-family:inherit;font-size:12px;transition:background .15s}.files-btn.svelte-4q2lov:hover{background:var(--accent-soft);border-color:var(--accent)}.files-btn.svelte-4q2lov:disabled{opacity:.5;pointer-events:none}.files-btn--danger.svelte-4q2lov{border-color:var(--red-soft);color:var(--red)}.files-btn--danger.svelte-4q2lov:hover{background:var(--red-soft);border-color:var(--red)}.section-card.svelte-e5jhdq{border:1px solid var(--line);background:var(--panel);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.section-header.svelte-e5jhdq{justify-content:space-between;align-items:center;gap:12px;display:flex}.section-title.svelte-e5jhdq{color:var(--ink);font-size:13px;font-weight:600}.header-actions.svelte-e5jhdq{align-items:center;gap:8px;display:flex}.count-label.svelte-e5jhdq{color:var(--muted);font-size:12px}.instruction-list.svelte-e5jhdq{flex-direction:column;gap:8px;display:flex}.instruction-row.svelte-e5jhdq{border:1px solid var(--line);border-radius:8px;justify-content:space-between;align-items:flex-start;gap:12px;padding:8px 12px;display:flex}.instruction-info.svelte-e5jhdq{min-width:0}.instruction-path.svelte-e5jhdq{word-break:break-all;color:var(--accent);font-family:monospace;font-size:11px;text-decoration:none}.instruction-path.svelte-e5jhdq:hover{text-decoration:underline}.instruction-meta.svelte-e5jhdq{color:var(--muted);margin-top:2px;font-size:11px}.instruction-actions.svelte-e5jhdq{flex-shrink:0;align-items:center;gap:12px;display:flex}.status-ok.svelte-e5jhdq{color:var(--green);font-size:12px;font-weight:600}.status-missing.svelte-e5jhdq{color:var(--red);font-size:12px;font-weight:600}.empty-msg.svelte-e5jhdq{color:var(--muted);margin:0;font-size:13px}.rules-layout.svelte-1r3tey2{grid-template-columns:minmax(0,1fr) 22rem;align-items:start;gap:16px;display:grid}@media (width<=900px){.rules-layout.svelte-1r3tey2{grid-template-columns:1fr}}.section-card.svelte-1r3tey2{border:1px solid var(--line);background:var(--panel);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.aside-card.svelte-1r3tey2{gap:10px}.section-header.svelte-1r3tey2{justify-content:space-between;align-items:center;gap:12px;display:flex}.section-title.svelte-1r3tey2{color:var(--ink);font-size:13px;font-weight:600}.rules-folder.svelte-1r3tey2{color:var(--muted);font-family:monospace;font-size:11px}.rule-list.svelte-1r3tey2{flex-direction:column;gap:8px;display:flex}.rule-row.svelte-1r3tey2{border:1px solid var(--line);border-radius:8px;padding:10px 12px}.rule-top.svelte-1r3tey2{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:6px;display:flex}.rule-title-wrap.svelte-1r3tey2{min-width:0}.rule-title.svelte-1r3tey2{margin:0;font-size:13px;font-weight:600}.rule-link.svelte-1r3tey2{color:var(--accent);text-decoration:none}.rule-link.svelte-1r3tey2:hover{text-decoration:underline}.rule-path.svelte-1r3tey2{color:var(--muted);word-break:break-all;font-family:monospace;font-size:11px;text-decoration:none;display:block}.rule-path.svelte-1r3tey2:hover{color:var(--accent)}.severity-badge.svelte-1r3tey2{background:var(--panel-soft);border:1px solid var(--line);color:var(--ink);border-radius:4px;flex-shrink:0;padding:3px 8px;font-size:11px;font-weight:600}.rule-desc.svelte-1r3tey2{color:var(--muted);margin:0 0 6px;font-size:13px}.rule-tags.svelte-1r3tey2{flex-wrap:wrap;gap:4px;margin-bottom:4px;display:flex}.tag.svelte-1r3tey2{color:var(--accent);font-size:11px}.rule-applies.svelte-1r3tey2{color:var(--muted);word-break:break-all;font-family:monospace;font-size:11px}.empty-msg.svelte-1r3tey2{color:var(--muted);margin:0;font-size:13px}.section-card.svelte-1ui2b6s{border:1px solid var(--line);background:var(--panel);border-radius:12px;flex-direction:column;gap:14px;padding:16px;display:flex}.section-header.svelte-1ui2b6s{justify-content:space-between;align-items:center;gap:12px;display:flex}.section-title.svelte-1ui2b6s{color:var(--ink);font-size:13px;font-weight:600}.section-desc.svelte-1ui2b6s{color:var(--muted);margin:0;font-size:12px}.mcp-info-grid.svelte-1ui2b6s{grid-template-columns:1fr 1fr;gap:8px;display:grid}.mcp-info-cell.svelte-1ui2b6s{border:1px solid var(--line);border-radius:8px;padding:8px 10px}.mcp-info-cell.wide.svelte-1ui2b6s{grid-column:1/-1}.mcp-info-label.svelte-1ui2b6s{color:var(--muted);text-transform:uppercase;letter-spacing:.05em;font-size:11px}.mcp-info-value.svelte-1ui2b6s{color:var(--ink);margin-top:3px;font-size:12px;font-weight:600}.mcp-info-value.ok.svelte-1ui2b6s{color:var(--green)}.mcp-info-value.err.svelte-1ui2b6s{color:var(--red)}.mcp-info-value.mono.svelte-1ui2b6s{font-family:monospace;font-weight:400}.mcp-info-value.break.svelte-1ui2b6s{word-break:break-all}.subsection-header.svelte-1ui2b6s{justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;display:flex}.subsection-title.svelte-1ui2b6s{color:var(--muted);font-size:12px;font-weight:600}.subsection-actions.svelte-1ui2b6s{align-items:center;gap:8px;display:flex}.count-label.svelte-1ui2b6s{color:var(--muted);font-size:11px}.mcp-items.svelte-1ui2b6s{flex-direction:column;gap:6px;display:flex}.mcp-detail.svelte-1ui2b6s{border:1px solid var(--line);background:var(--panel-soft);border-radius:8px;padding:8px 12px}.mcp-summary.svelte-1ui2b6s{cursor:pointer;color:var(--accent);-webkit-user-select:none;user-select:none;font-family:monospace;font-size:12px;font-weight:600;list-style:none}.mcp-summary.svelte-1ui2b6s::-webkit-details-marker{display:none}.mcp-desc.svelte-1ui2b6s{color:var(--muted);white-space:pre-wrap;margin:8px 0 0;font-size:12px;line-height:1.5}.mcp-schema-wrap.svelte-1ui2b6s{margin-top:10px}.mcp-schema-title.svelte-1ui2b6s{color:var(--muted);margin:0 0 4px;font-size:11px;font-weight:600}.mcp-schema-pre.svelte-1ui2b6s{background:var(--panel);border:1px solid var(--line);max-height:200px;color:var(--ink);white-space:pre;border-radius:6px;padding:8px;font-size:11px;overflow:auto}.mcp-args-list.svelte-1ui2b6s{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.mcp-arg-item.svelte-1ui2b6s{border:1px solid var(--line);border-radius:6px;padding:6px 8px}.mcp-arg-name-row.svelte-1ui2b6s{align-items:center;gap:8px;display:flex}.mcp-arg-name.svelte-1ui2b6s{color:var(--ink);font-family:monospace;font-size:12px;font-weight:600}.mcp-arg-req.svelte-1ui2b6s{text-transform:uppercase;color:var(--muted);letter-spacing:.05em;font-size:11px}.mcp-arg-desc.svelte-1ui2b6s{color:var(--muted);margin:4px 0 0;font-size:11px}.mcp-run-area.svelte-1ui2b6s{border-top:1px solid var(--line);flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;display:flex}.mcp-run-label.svelte-1ui2b6s{color:var(--muted);font-size:11px;font-weight:600}.mcp-textarea.svelte-1ui2b6s{resize:vertical;font-family:monospace;font-size:11px}.mcp-run-footer.svelte-1ui2b6s{justify-content:space-between;align-items:center;gap:8px;display:flex}.mcp-error-text.svelte-1ui2b6s{color:var(--red);font-size:11px}.mcp-result.svelte-1ui2b6s{font-size:11px}.empty-msg.svelte-1ui2b6s{color:var(--muted);margin:0;font-size:12px}.mcp-running{color:var(--muted);font-style:italic}.mcp-saved-label{color:var(--muted);margin-bottom:4px;font-size:11px}.mcp-saved-link{background:var(--green-soft);color:var(--green);border-radius:6px;align-items:center;gap:4px;padding:4px 10px;font-family:monospace;font-size:11px;font-weight:600;text-decoration:none;display:inline-flex}.mcp-saved-link:hover{opacity:.8}.mcp-error-pre{white-space:pre-wrap;word-break:break-word;border:1px solid var(--red-soft);background:var(--red-soft);max-height:200px;color:var(--red);border-radius:6px;padding:8px;font-size:11px;line-height:1.5;overflow:auto}.context-scroll.svelte-rpj1e5{height:100%;overflow-y:auto}.context-inner.svelte-rpj1e5{flex-direction:column;gap:20px;max-width:1100px;margin:0 auto;padding:24px 24px 48px;display:flex}.page-intro.svelte-rpj1e5{flex-direction:column;gap:4px;display:flex}.page-title.svelte-rpj1e5{color:var(--ink);margin:0;font-size:18px;font-weight:700}.page-desc.svelte-rpj1e5{color:var(--muted);margin:0;font-size:13px}.status-text.svelte-rpj1e5{color:var(--muted);margin:0;font-size:12px;font-style:italic}.agents-page.svelte-lf8l46{max-width:960px;margin:0 auto;padding:32px 24px;position:relative}.agents-msg.svelte-lf8l46{color:var(--muted);text-align:center;padding:48px 0;font-size:14px;font-style:italic}.agents-msg--error.svelte-lf8l46{color:var(--red);font-style:normal}.agents-msg--empty.svelte-lf8l46{font-style:italic}.agents-grid.svelte-lf8l46{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px;display:grid}.agent-card.svelte-lf8l46{text-align:left;border:1px solid var(--line);background:var(--panel);cursor:pointer;border-radius:12px;flex-direction:column;gap:4px;padding:16px;font-family:inherit;transition:border-color .15s,box-shadow .15s;display:flex}.agent-card.svelte-lf8l46:hover:not(:disabled){border-color:var(--accent);box-shadow:0 2px 12px var(--accent-soft)}.agent-card--disabled.svelte-lf8l46{opacity:.5;cursor:not-allowed}.agent-name.svelte-lf8l46{color:var(--ink);font-size:14px;font-weight:700}.agent-provider.svelte-lf8l46{color:var(--muted);margin-bottom:8px;font-size:12px}.agent-badge.svelte-lf8l46{border-radius:20px;align-self:flex-start;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.agent-badge--ready.svelte-lf8l46{background:var(--green-soft);color:var(--green)}.agent-badge--requires_input.svelte-lf8l46{background:var(--accent-soft);color:var(--accent)}.agent-badge--not_ready.svelte-lf8l46{background:var(--panel-soft);color:var(--muted)}.agent-input-dialog.svelte-lf8l46{border-color:var(--line-strong)}.agent-toast.svelte-lf8l46{border:1px solid var(--line);background:var(--panel);z-index:50;border-radius:14px;align-items:flex-start;gap:12px;max-width:min(420px,100vw - 48px);padding:14px 16px;display:flex;position:fixed;bottom:24px;right:24px;box-shadow:0 8px 32px #10182824}.agent-toast-icon.svelte-lf8l46{border-radius:50%;flex-shrink:0;place-items:center;width:24px;height:24px;font-size:12px;font-weight:700;display:grid}.agent-toast--loading.svelte-lf8l46 .agent-toast-icon:where(.svelte-lf8l46){border:2px solid var(--accent);border-top-color:#0000;animation:.8s linear infinite svelte-lf8l46-spin}.agent-toast--success.svelte-lf8l46 .agent-toast-icon:where(.svelte-lf8l46){background:var(--green);color:#fff}.agent-toast--error.svelte-lf8l46 .agent-toast-icon:where(.svelte-lf8l46){background:var(--red);color:#fff}.agent-toast-body.svelte-lf8l46{flex:1;min-width:0}.agent-toast-title.svelte-lf8l46{color:var(--ink);margin:0;font-size:13px;font-weight:700}.agent-toast-message.svelte-lf8l46{color:var(--muted);word-break:break-word;margin:2px 0 0;font-size:12px}.agent-toast-link.svelte-lf8l46{color:var(--accent);margin-top:4px;font-size:12px;text-decoration:underline;display:inline-block}.agent-toast-close.svelte-lf8l46{color:var(--muted);cursor:pointer;background:0 0;border:none;flex-shrink:0;padding:0;font-size:18px;line-height:1}@keyframes svelte-lf8l46-spin{to{transform:rotate(360deg)}}.ld-inline-snippet-target{cursor:context-menu}.category-docs{transition:max-height .2s,opacity .2s}.category-docs.collapsed{opacity:0;max-height:0;overflow:hidden}.category-docs.expanded{opacity:1;max-height:9999px}.category-docs.no-transition{transition:none!important}.prose pre{position:relative}.ld-code-copy{z-index:2;color:#d1d5db;cursor:pointer;opacity:0;background:#ffffff14;border:1px solid #ffffff26;border-radius:.375rem;justify-content:center;align-items:center;width:36px;height:36px;font-size:.8rem;line-height:1;transition:opacity .15s,background .15s;display:inline-flex;position:absolute;top:.4rem;right:.5rem}.prose pre:hover .ld-code-copy,.ld-code-copy:focus-visible,.ld-code-copy.ld-copied{opacity:1}.ld-code-copy:hover{background:#fff3}.ld-code-copy.ld-copied{color:#86efac;background:#22c55e40;border-color:#22c55e66}table.table-color-info{--tbl-accent:#3b82f6;--tbl-accent-soft:#dbeafe;--tbl-accent-stripe:#eff6ff;--tbl-accent-text:#1e3a8a}table.table-color-success{--tbl-accent:#22c55e;--tbl-accent-soft:#dcfce7;--tbl-accent-stripe:#f0fdf4;--tbl-accent-text:#14532d}table.table-color-warning{--tbl-accent:#f59e0b;--tbl-accent-soft:#fef3c7;--tbl-accent-stripe:#fffbeb;--tbl-accent-text:#78350f}table.table-color-danger{--tbl-accent:#ef4444;--tbl-accent-soft:#fee2e2;--tbl-accent-stripe:#fef2f2;--tbl-accent-text:#7f1d1d}table.table-color-note{--tbl-accent:#8b5cf6;--tbl-accent-soft:#e9d5ff;--tbl-accent-stripe:#f5f3ff;--tbl-accent-text:#4c1d95}.dark table.table-color-info{--tbl-accent:#60a5fa;--tbl-accent-soft:#1e3a8a8c;--tbl-accent-stripe:#1e3a8a59;--tbl-accent-text:#bfdbfe}.dark table.table-color-success{--tbl-accent:#4ade80;--tbl-accent-soft:#14532d8c;--tbl-accent-stripe:#14532d59;--tbl-accent-text:#bbf7d0}.dark table.table-color-warning{--tbl-accent:#fbbf24;--tbl-accent-soft:#78350f8c;--tbl-accent-stripe:#78350f59;--tbl-accent-text:#fed7aa}.dark table.table-color-danger{--tbl-accent:#f87171;--tbl-accent-soft:#7f1d1d8c;--tbl-accent-stripe:#7f1d1d59;--tbl-accent-text:#fecaca}.dark table.table-color-note{--tbl-accent:#a78bfa;--tbl-accent-soft:#4c1d958c;--tbl-accent-stripe:#4c1d9559;--tbl-accent-text:#ddd6fe}.prose table[class*=table-color-] thead th{background-color:var(--tbl-accent-soft);color:var(--tbl-accent-text)}.prose table{border-collapse:collapse;border:none}.prose table th,.prose table td{border:none;border-bottom:1px solid #e5e7eb;padding:.6rem 1rem}.prose table thead th{border-bottom-color:#d1d5db}.dark .prose table th,.dark .prose table td{border-bottom-color:#374151}.prose table[class*=table-color-] th,.prose table[class*=table-color-] td{border-bottom-color:var(--tbl-accent-soft)}.prose table[class*=table-color-] thead th{border-bottom-color:var(--tbl-accent)}.prose table thead,.prose table tbody tr{border:none}.prose table.table-style-compact{font-size:.85em;line-height:1.35}.prose table.table-style-compact th,.prose table.table-style-compact td{padding:.2rem .5rem}.prose table.table-style-striped{border-collapse:collapse}.prose table.table-style-striped tbody tr:nth-child(odd){background-color:var(--tbl-accent-stripe,#f3f4f6)}.dark .prose table.table-style-striped tbody tr:nth-child(odd){background-color:var(--tbl-accent-stripe,#374151)}.prose table.table-border-bordered{border-collapse:collapse}.prose table.table-border-bordered,.prose table.table-border-bordered th,.prose table.table-border-bordered td{border:1px solid var(--tbl-accent,#d1d5db)}.dark .prose table.table-border-bordered,.dark .prose table.table-border-bordered th,.dark .prose table.table-border-bordered td{border-color:var(--tbl-accent,#4b5563)}.prose table.table-border-borderless th,.prose table.table-border-borderless td{border-top:none!important;border-left:none!important;border-right:none!important}pre.ld-collapsible{max-height:var(--ld-code-max-h,400px);position:relative;overflow:hidden}pre.ld-collapsible.ld-expanded{max-height:none;overflow:auto}pre.ld-collapsible:not(.ld-expanded):after{content:"";pointer-events:none;background:linear-gradient(#282c3400 0%,#282c34d9 100%);height:64px;position:absolute;bottom:0;left:0;right:0}.ld-code-toggle{z-index:1;color:#e5e7eb;cursor:pointer;background:#ffffff1f;border:1px solid #ffffff2e;border-radius:.375rem;padding:.15rem .6rem;font-size:.75rem;font-weight:500;transition:background .15s;position:absolute;bottom:.4rem;right:.5rem}.ld-code-toggle:hover{background:#ffffff38}.color-swatch-btn.selected-swatch,.color-text-swatch-btn.selected-text-swatch{outline-offset:2px;outline:2px solid;box-shadow:0 0 0 3px #00000026}.ld-toc-aside{border-left:1px solid #e5e7eb}.dark .ld-toc-aside{border-left-color:#374151}.doc-item.active{color:#3b82f6;background-color:#3b82f61f;font-weight:600}.dark .doc-item.active{color:#60a5fa;background-color:#60a5fa26}.dark .prose{color:#d1d5db}.dark .prose h1,.dark .prose h2,.dark .prose h3,.dark .prose h4,.dark .prose h5,.dark .prose h6{color:#f9fafb}.dark .prose a{color:#60a5fa}.dark .prose strong{color:#f3f4f6}.prose code:not(pre code){color:#111827;background:#e5e7eb;border-radius:.25em;padding:.1em .35em;font-size:.875em;font-weight:400}.dark .prose code:not(pre code){color:#f87171;background:#4b5563;border-radius:.25em;padding:.1em .35em;font-size:.875em;font-weight:400}.dark .prose blockquote{color:#9ca3af;border-color:#4b5563}.prose img{margin-top:0;margin-bottom:0}.prose p>img:only-child,.prose p>a:only-child>img{margin-top:1em;margin-bottom:1em}.prose hr{border-color:#d1d5db;margin-top:2em;margin-bottom:2em}mark.ld-local-mark{color:inherit;background:#bae6fd;border-radius:2px;padding:0 1px}mark.ld-local-mark.ld-local-active{color:#fff;background:#0284c7}.dark mark.ld-local-mark{color:#e0f2fe;background:#075985}.dark mark.ld-local-mark.ld-local-active{color:#082f49;background:#0ea5e9}.ld-local-item-active{background:#0ea5e91f}.prose a.ld-file-attachment,a.ld-file-attachment{color:#5b21b6;background:#ede9fe;border:1px solid #ddd6fe;border-radius:.375rem;align-items:center;gap:.35em;padding:.1em .55em;font-weight:500;text-decoration:none;transition:background-color .15s,border-color .15s;display:inline-flex}.prose a.ld-file-attachment:hover,a.ld-file-attachment:hover{background:#ddd6fe;border-color:#c4b5fd}.dark .prose a.ld-file-attachment,.dark a.ld-file-attachment{color:#c4b5fd;background:#8b5cf62e;border-color:#8b5cf64d}.dark .prose a.ld-file-attachment:hover,.dark a.ld-file-attachment:hover{background:#8b5cf647;border-color:#8b5cf673}a.ld-file-attachment .ld-file-icon{opacity:.85;font-size:.85em}.dark .prose hr{border-color:#374151}.dark .prose table th{color:#f9fafb;background:#1f2937}.dark .prose table td{border-color:#374151}.dark .prose table tr:nth-child(2n){background:#111827}@media print{#sidebar,#header{display:none!important}#content-area{margin:0!important}.no-print{display:none!important}.prose{max-width:100%!important}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.dark ::-webkit-scrollbar-thumb{background:#4b5563}mark{color:inherit;background:#fef08a;border-radius:2px;padding:0 2px}mark.match-active{color:#fff;background:#f97316}.dark mark{color:#fef9c3;background:#713f12}.dark mark.match-active{color:#fff;background:#ea580c}html:not(.dark) body.ld-code-light #home-content-area{background:#fff}html:not(.dark) body.ld-code-light .ld-code-copy{color:#6b7280;background:#0000000a;border:1px solid #0000001a}html:not(.dark) body.ld-code-light .prose pre:hover .ld-code-copy,html:not(.dark) body.ld-code-light .ld-code-copy:focus-visible,html:not(.dark) body.ld-code-light .ld-code-copy.ld-copied{opacity:1}html:not(.dark) body.ld-code-light .ld-code-copy:hover{color:#111827;background:#00000014;border-color:#0000002e}html:not(.dark) body.ld-code-light .ld-code-copy.ld-copied{color:#15803d;background:#22c55e1f;border-color:#22c55e59}html:not(.dark) body.ld-code-light pre.ld-collapsible:not(.ld-expanded):after{background:linear-gradient(#f6f8fa00 0%,#f6f8faeb 100%)}html:not(.dark) body.ld-code-light .ld-code-toggle{color:#374151;background:#0000000d;border:1px solid #0000001f}html:not(.dark) body.ld-code-light .ld-code-toggle:hover{background:#0000001a}#vis-canvas>div{border:none!important}.tool-btn{cursor:pointer;color:#4b5563;background:0 0;border:none;border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;font-size:.875rem;transition:background-color .15s,color .15s;display:flex}.dark .tool-btn{color:#9ca3af}.tool-btn:hover{background:#f3f4f6}.dark .tool-btn:hover{background:#1f2937}.tool-active{color:#ea580c!important;background:#fff7ed!important}.dark .tool-active{color:#fb923c!important;background:#7c2d124d!important}#vis-canvas.cursor-crosshair canvas{cursor:crosshair!important}.float-panel{z-index:10;background:#fff;border:1px solid #e5e7eb;border-radius:.5rem;align-items:center;gap:.25rem;padding:.375rem .5rem;display:flex;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 12px #0000001a}.dark .float-panel{background:#1f2937;border-color:#374151}.float-panel.hidden{display:none!important}.panel-sep{background:#e5e7eb;flex-shrink:0;width:1px;height:1rem;margin:0 .125rem}.dark .panel-sep{background:#374151}#customShapeLabelPlacementControls{display:contents}#customShapeLabelPlacementControls.hidden{display:none}.edge-btn-active{color:#ea580c!important;background:#fff7ed!important}.dark .edge-btn-active{color:#fb923c!important;background:#7c2d124d!important}#labelInput{z-index:20;text-align:center;color:#1f2937;resize:none;background:#fffffff2;border:2px solid #3b82f6;border-radius:.5rem;outline:none;min-width:80px;min-height:28px;padding:4px 8px;font-family:system-ui,-apple-system,sans-serif;font-size:13px;font-weight:500;line-height:1.4;position:absolute;overflow:hidden;box-shadow:0 4px 16px #00000026}.dark #labelInput{color:#f3f4f6;background:#111827f2}#labelInput.hidden{display:none}#debugLayer{pointer-events:none;z-index:12;position:absolute;inset:0;overflow:hidden}.debug-box{pointer-events:auto;white-space:pre;-webkit-user-select:text;user-select:text;cursor:text;color:#c2410c;background:#ffffffe6;border:1px solid #f97316;border-radius:3px;padding:3px 6px;font:10px/1.4 monospace;position:absolute}.dark .debug-box{color:#fbbf24;background:#000000c7}#selectionOverlay{pointer-events:none;z-index:15;box-sizing:border-box;border:2px dashed #f97316;border-radius:3px;display:none;position:absolute}.resize-handle{pointer-events:all;z-index:1;background:#fff;border:2px solid #f97316;border-radius:2px;width:10px;height:10px;position:absolute}.dark .resize-handle{background:#374151}#rh-rotate{pointer-events:all;z-index:1;cursor:grab;color:#f97316;background:#fff;border:2px solid #f97316;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex;position:absolute}#rh-rotate:active{cursor:grabbing}.dark #rh-rotate{background:#374151}#rh-label-rotate{pointer-events:all;z-index:1;cursor:grab;color:#6366f1;background:#fff;border:2px solid #6366f1;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex;position:absolute}#rh-label-rotate:active{cursor:grabbing}.dark #rh-label-rotate{background:#374151}#toastContainer{z-index:1000;pointer-events:none;flex-direction:column-reverse;gap:.5rem;display:flex;position:fixed;bottom:1.5rem;right:1.5rem}.ld-toast{pointer-events:all;cursor:pointer;opacity:0;color:#fafaf9;background:#1c1917;border:1px solid #292524;border-radius:.5rem;padding:.6rem 1rem;font-size:.8rem;font-weight:500;transition:opacity .2s,transform .2s;transform:translateY(.5rem);box-shadow:0 4px 16px #0000002e}.dark .ld-toast{color:#1c1917;background:#fafaf9;border-color:#e7e5e4}.ld-toast--error{color:#fef2f2;background:#7f1d1d;border-color:#991b1b}.ld-toast--visible{opacity:1;transform:translateY(0)}#evidenceLayer{pointer-events:none;z-index:18;position:absolute;inset:0;overflow:hidden}#evidenceLayer.hidden{display:none}.evidence-marker{color:#0369a1;pointer-events:auto;background:#e0f2fe;border:1px solid #0284c7;border-radius:999px;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;font-size:.7rem;font-weight:700;line-height:1;display:flex;position:absolute;transform:translate(-50%,-50%);box-shadow:0 2px 8px #0284c747}.dark .evidence-marker{color:#e0f2fe;background:#082f49;border-color:#38bdf8}#customShapeBar{z-index:9;background:#fffffff5;border:1px solid #e5e7eb;border-radius:.5rem;align-items:center;gap:.25rem;max-width:min(42rem,100% - 1.5rem);padding:.35rem;display:flex;position:absolute;bottom:.75rem;left:.75rem;box-shadow:0 4px 12px #0000001a}.dark #customShapeBar{background:#1f2937f5;border-color:#374151}#customShapeBar.hidden{display:none}#customShapeBarBody{scrollbar-width:thin;gap:.25rem;display:flex;overflow-x:auto}.custom-shape-btn{background:0 0;border:1px solid #0000;border-radius:.375rem;flex:none;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.custom-shape-btn:hover{background:#f3f4f6}.dark .custom-shape-btn:hover{background:#111827}.custom-shape-btn img{object-fit:contain;pointer-events:none;max-width:1.7rem;max-height:1.7rem}.ld-shape-editor .btn{color:#374151;background:#fff;border:1px solid #d1d5db;border-radius:.375rem;justify-content:center;align-items:center;height:2rem;padding:0 .75rem;font-size:.8125rem;font-weight:600;display:inline-flex}.ld-shape-editor .btn:hover{background:#f3f4f6}.ld-shape-editor .btn-primary{color:#fff;background:#2563eb;border-color:#2563eb}.ld-shape-editor .btn-primary:hover{background:#1d4ed8}.ld-shape-editor .btn-danger{color:#b91c1c;border-color:#fecaca}.ld-shape-editor .btn-danger:hover{background:#fef2f2}.ld-shape-editor .field{background:#fff;border:1px solid #d1d5db;border-radius:.375rem;height:2rem;padding:0 .5rem;font-size:.875rem}.ld-shape-editor .shape-item.active{color:#1d4ed8;background:#eff6ff}.ld-shape-editor #previewStage{aspect-ratio:1;background-color:#0000;background-image:linear-gradient(45deg,#f9fafb 25%,#0000 25%),linear-gradient(-45deg,#f9fafb 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#f9fafb 75%),linear-gradient(-45deg,#0000 75%,#f9fafb 75%);background-position:0 0,0 .625rem,.625rem -.625rem,-.625rem 0;background-repeat:repeat,repeat,repeat,repeat;background-size:1.25rem 1.25rem;background-attachment:scroll,scroll,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;border:1px solid #d1d5db;border-radius:.5rem;width:min(34rem,100%);position:relative;overflow:hidden}.ld-shape-editor #previewImage{object-fit:fill;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.ld-shape-editor .anchor-dot{cursor:grab;background:#f97316;border:2px solid #fff;border-radius:999px;width:.9rem;height:.9rem;position:absolute;transform:translate(-50%,-50%);box-shadow:0 1px 4px #00000059}.ld-shape-editor .anchor-dot:active{cursor:grabbing}.ld-shape-editor .anchor-dot span{color:#374151;white-space:nowrap;background:#ffffffe6;border-radius:3px;padding:1px 3px;font:10px/1 system-ui,sans-serif;position:absolute;top:calc(100% + .2rem);left:50%;transform:translate(-50%)}
@@ -88,7 +88,7 @@ Texte`};case`link`:return{text:Ce(`snip-link-text`),textFallback:Y(`snippet.link
88
88
 
89
89
  `,t+1);return n>=0?n:e.length}s=s.previousElementSibling}let c=a.nextElementSibling;for(;c;){let t=sm(e,c,r);if(t!==null){let n=e.lastIndexOf(`
90
90
 
91
- `,t);return n>=0?n:0}c=c.nextElementSibling}return e.length}function lm(e,t,n){if(!e||typeof t!=`string`)return()=>{};let r=$p(t);tm(e,r);let i=i=>{let a=i.target?.closest(`[data-inline-snippet-index]`);if(a&&e.contains(a)){let e=r[Number(a.dataset.inlineSnippetIndex)];if(!e)return;i.preventDefault();let t=Up(e.type),o=Gp(e.type);rm(i,[{iconClass:t.iconClass,labelKey:t.labelKey,dataAction:`edit`,dataType:e.type,onActivate:()=>n.onEdit(e)},{iconClass:o.iconClass,labelKey:o.labelKey,dataAction:`delete`,dataType:e.type,onActivate:()=>n.onDelete(e)}]);return}if(!e.contains(i.target))return;let o=cm(t,e,i.target,r,i.clientY);o!==null&&(i.preventDefault(),rm(i,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(o)}))};e.addEventListener(`contextmenu`,i);let a=e.closest(`#home-content-area`)||e.closest(`main`),o=null;a&&(o=r=>{r.defaultPrevented||e.offsetParent!==null&&(r.target?.closest(`textarea, input, [data-inline-snippet-index]`)||e.contains(r.target)||(r.preventDefault(),rm(r,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(t.length)})))},a.addEventListener(`contextmenu`,o));let s=e=>{qp&&!qp.contains(e.target)&&nm()},c=e=>{e.key===`Escape`&&nm()};return document.addEventListener(`click`,s),document.addEventListener(`keydown`,c),()=>{e.removeEventListener(`contextmenu`,i),a&&o&&a.removeEventListener(`contextmenu`,o),document.removeEventListener(`click`,s),document.removeEventListener(`keydown`,c),nm(),e.querySelectorAll(`[data-inline-snippet-index]`).forEach(e=>{e.removeAttribute(`data-inline-snippet-index`),e.classList.remove(`ld-inline-snippet-target`)})}}var um=W(`<span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-violet-100 text-violet-700 dark:bg-violet-900/40 dark:text-violet-300"> </span>`),dm=W(`<span class="text-xs text-gray-400 dark:text-gray-500"> </span>`),fm=W(`<span> </span>`),pm=W(`<div data-testid="edit-actions" class="flex items-center gap-2"><!> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div>`),mm=W(`<button data-testid="validate-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-green-700 bg-green-600 text-white font-semibold hover:bg-green-700 transition-colors"><i class="fa-solid fa-check" style="margin-right:4px"></i> </button>`),hm=Vr(`<g><line x1="8" y1="8" x2="92" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line><line x1="92" y1="8" x2="8" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line></g>`),gm=W(`<div data-testid="view-actions" class="flex items-center gap-2"><!> <button><svg width="18" height="18" viewBox="0 0 100 100" fill="none" style="display:inline-block;vertical-align:middle;margin-right:4px"><rect x="28" y="10" width="44" height="52" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><rect x="52" y="8" width="22" height="30" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><polygon points="28,60 10,80 30,80 38,72" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><polygon points="28,48 19,70 36,75 55,70" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><line x1="10" y1="90" x2="72" y2="90" stroke="currentColor" stroke-width="6" stroke-linecap="round"></line><!></svg> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-link"></i> </button> <button data-testid="metadata-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-code-compare"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-file-pen"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-red-200 dark:border-red-700 text-red-500 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/40 transition-colors"><i class="fa-solid fa-trash"></i> </button></div>`),_m=W(`<span class="text-gray-300 dark:text-gray-600 mx-1">·</span>`),vm=W(`<!> <button class="text-blue-600 dark:text-blue-400 hover:underline"> </button>`,1),ym=W(`<div class="no-print mt-2 flex flex-wrap gap-1 text-xs"></div>`),bm=W(`<li><button class="w-full text-left px-3 py-1.5 hover:bg-yellow-100 dark:hover:bg-yellow-900/30 transition-colors"><span class="text-yellow-600 dark:text-yellow-500 font-mono text-xs mr-2"> </span><span class="text-xs"> </span></button></li>`),xm=W(`<div class="mt-4 rounded-lg bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-sm text-yellow-800 dark:text-yellow-300 overflow-hidden"><div class="px-3 py-2 font-medium border-b border-yellow-200 dark:border-yellow-800"> </div> <ol class="max-h-40 overflow-y-auto divide-y divide-yellow-100 dark:divide-yellow-900/40 list-none m-0 p-0"></ol></div>`),Sm=W(`<textarea id="doc-editor" data-testid="doc-editor" spellcheck="false" class="w-full min-h-[70vh] px-4 py-3 text-sm font-mono leading-relaxed rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-y"></textarea>`),Cm=W(`<div id="doc-content" data-testid="doc-content"></div>`),wm=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-5"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"> </h3> <div class="space-y-1.5"><label for="img-paste-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> <span class="font-normal text-gray-400"> </span></label> <div class="flex items-center gap-2"><input id="img-paste-name" type="text" class="flex-1 px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="text-xs text-gray-400 shrink-0"> </span></div></div> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`),Tm=W(`<div class="fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4"><div class="w-full max-w-sm bg-white dark:bg-gray-900 border border-red-200 dark:border-red-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"><p class="text-sm text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-500 dark:text-gray-400 italic truncate"> </p> <div class="flex justify-end gap-2 mt-2"><button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-red-500 hover:bg-red-600 text-white font-semibold transition-colors"> </button></div></div></div>`),Em=W(`<div class="fixed inset-0 z-50 bg-black/90 flex items-center justify-center cursor-pointer"><img class="max-w-full max-h-full object-contain select-none"/> <button class="absolute top-4 right-4 text-white/70 hover:text-white text-2xl leading-none">×</button></div>`),Dm=W(`<article id="home-doc-view" data-testid="doc-view" class="max-w-none mx-auto px-6 pb-8"><header class="sticky top-0 z-10 bg-gray-50 dark:bg-gray-950 -mx-6 px-6 pt-8 mb-8 pb-6 border-b border-gray-300 dark:border-gray-800"><div class="flex items-start gap-4 flex-wrap"><div class="shrink min-w-0"><div class="flex items-center gap-2 mb-2 flex-wrap"><span class="flex items-center gap-2 flex-wrap"><!> <span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300"> </span></span> <!></div> <div class="flex items-center gap-2"><h1 data-testid="doc-title" class="min-w-0 text-2xl font-bold text-gray-900 dark:text-gray-50 leading-tight"> </h1> <button type="button" data-testid="copy-doc-id-btn"><i aria-hidden="true"></i></button></div></div> <div class="flex items-center gap-2 flex-wrap ml-auto"><!></div></div> <!> <!> <!> <div class="hidden no-print"></div></header> <!></article> <!> <!> <!> <!> <!> <!> <!>`,1);function Om(e,t){Ge(t,!0);let n=Bi(t,`navHistory`,19,()=>[]),r=F(null),i=F(null),a=F(null),o=F(null),s=F(!1),c=F(!1),l=F(`insert`),u=F(null),d=F(0),f=null;Vi(()=>{let e=window;return e.openSnippetsModal=()=>{I(l,`insert`),I(c,!0)},e.openSnippetsModalForInlineInsert=e=>{I(l,`inline-insert`),I(d,Math.max(0,Number(e)||0),!0),I(c,!0)},()=>{delete e.openSnippetsModal,delete e.openSnippetsModalForInlineInsert}});let p=F(null),m=F(L([])),h=``,g=P(()=>H(m).length?Y(H(m).length===1?`search.notice_singular`:`search.notice_plural`).replace(`{count}`,String(H(m).length)).replace(`{query}`,$.searchQuery):``),_=P(()=>Yd(t.doc.content)),v=P(()=>(H(_)||``).toUpperCase()===`TO BE VALIDATED`),y=F(!1),b=F(``),x=F(null),S=F(!1),C=F(!1),w=F(!1),T=F(!1),E=F(``),D=F(`png`),ee=null,O=0,te=0,k=F(null),ne=F(``),re=/[̀-ͯ]/g;function ie(e){return(e||``).normalize(`NFD`).replace(re,``).toLowerCase().replace(/[^a-z0-9]/g,`_`)}function ae(e){let t=document.getElementById(`home-content-area`),n=document.getElementById(e);if(!t||!n)return;let r=document.querySelector(`#home-doc-view header`),i=r?r.getBoundingClientRect().height:0;t.scrollTop+=n.getBoundingClientRect().top-t.getBoundingClientRect().top-i-8}On(()=>{let e=t.doc.id,n=$.searchQuery;if(f?.(),f=null,H(y)||!H(r))return;Cd(H(r),t.doc.html,{content:t.doc.content,codeBlockMaxHeight:$.codeBlockMaxHeight,t:Y,onDocLink:(e,n)=>t.onopen(e,n),onAnchor:ae});let i=typeof n==`string`&&n.toLowerCase().startsWith(`metadata://`);I(m,n&&!i?zp(H(r),n):[],!0),H(p)&&Rp(H(r),H(p),Y),f=lm(H(r),t.doc.content,{onEdit:e=>{I(l,`inline-edit`),I(u,e,!0),I(c,!0)},onInsert:e=>{I(l,`inline-insert`),I(d,e,!0),I(c,!0)},onDelete:async e=>{await H(o).show({title:Y(`snippet.inline_delete_title`),message:Y(`snippet.inline_delete_message`),confirmLabel:Y(`snippet.inline_delete_confirm_btn`),cancelLabel:Y(`common.cancel`),danger:!0})&&await t.onsave(t.doc.content.slice(0,e.start)+t.doc.content.slice(e.end))}}),e===h?H(a)?.apply():(h=e,H(a)?.load(e),Gd.load(e))});async function oe(){let e=1;try{let n=await Gd.load(t.doc.id);n&&typeof n.accuracy==`number`&&(e=n.accuracy)}catch{}let n=Math.round(e*100),r=n<100,i=Zd(t.doc.id),a=Y(i?`doc.validate_worklog_message`:`doc.validate_message`),s=r?Y(`doc.validate_detail_low_accuracy`).replace(`{accuracy}`,n+`%`):void 0;if(!await H(o).show({title:Y(`doc.validate_title`),message:a,detail:s,confirmLabel:Y(`doc.validate_confirm`),cancelLabel:Y(`common.cancel`)}))return;let c=Xd(t.doc.content,i?`Done`:`Accepted`);if(c!==t.doc.content)try{await t.onsave(c),r&&await fetch(`/api/metadata/`+encodeURIComponent(t.doc.id)+`/refresh`,{method:`POST`}),await Gd.load(t.doc.id),$.docStatuses={...$.docStatuses,[t.doc.id]:i?`Done`:`Accepted`}}catch(e){I(x,{text:Y(`doc.validate_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}On(()=>{try{I(S,localStorage.getItem(`ld-full-width`)===`1`)}catch{}});function se(){I(b,t.doc.content,!0),I(y,!0),I(x,null),requestAnimationFrame(()=>H(i)?.focus())}function ce(){I(y,!1),I(x,null)}async function le(){I(x,{text:Y(`doc.saving`),cls:`text-gray-400`},!0);try{await t.onsave(H(b)),I(y,!1),I(x,null)}catch(e){I(x,{text:Y(`error.save`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}function ue(e){let t=Array.from(e.clipboardData?.items??[]).find(e=>e.type.startsWith(`image/`));if(t){e.preventDefault(),O=H(i).selectionStart,te=H(i).selectionEnd,I(D,t.type.split(`/`)[1].replace(`jpeg`,`jpg`)||`png`,!0);let n=t.getAsFile();if(!n)return;ee=n,I(E,ie(Date.now().toString()),!0),I(T,!0);return}let n=Array.from(e.clipboardData?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(n.length){e.preventDefault();let t=H(i).selectionStart,r=H(i).selectionEnd;(async()=>{for(let e of n)await he(e,t,r)})()}}function de(e){let t=Array.from(e.dataTransfer?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(!t.length)return;e.preventDefault(),e.stopPropagation();let n=H(i).selectionStart,r=H(i).selectionEnd;(async()=>{for(let e of t)await he(e,n,r)})()}function fe(e){e.dataTransfer?.types?.includes(`Files`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)}function pe(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function me(e,t,n){let r=H(b).slice(0,t),a=H(b).slice(n);I(b,r+e+a),requestAnimationFrame(()=>{H(i).selectionStart=H(i).selectionEnd=t+e.length,H(i).focus()})}async function he(e,t,n){if(e.size>19922944){I(x,{text:Y(`doc.file_too_large`)+` (${(e.size/1024/1024).toFixed(1)} MB, max 19 MB)`,cls:`text-red-500 dark:text-red-400`},!0);return}I(x,{text:Y(`doc.uploading_file`),cls:`text-gray-400`},!0);try{let r=await pe(e),i=await fetch(`/api/files/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:r,name:e.name})});if(!i.ok){let e=``;try{e=(await i.json()).error||``}catch{e=await i.text()}throw Error(e||`HTTP ${i.status}`)}let{url:a,originalName:o}=await i.json();me(`[📎 ${o||e.name}](${a})`,t,n),I(x,null)}catch(e){I(x,{text:Y(`doc.file_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}function ge(){I(T,!1),ee=null}async function _e(){let e=ie(H(E))||Date.now().toString();if(I(T,!1),ee){I(x,{text:Y(`doc.uploading_image`),cls:`text-gray-400`},!0);try{let t=await pe(ee),n=await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:t,ext:H(D),name:e})});if(!n.ok)throw Error(await n.text());let{filename:r}=await n.json();me(`![image](/images/${r})`,O,te),I(x,null)}catch(e){I(x,{text:Y(`doc.image_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}finally{ee=null}}}async function ve(){try{await navigator.clipboard.writeText(location.href)}catch{}}async function ye(){try{await navigator.clipboard.writeText(decodeURIComponent(t.doc.id)),I(w,!0),setTimeout(()=>I(w,!1),1800)}catch{}}function be(){window.print()}function xe(e){let t=e.target.closest(`img`);!t||!e.shiftKey||(e.preventDefault(),e.stopPropagation(),I(k,t.src,!0),I(ne,t.alt||``,!0))}function Se(e){e.key===`Escape`&&H(k)&&I(k,null)}var Ce=Dm();Mr(`keydown`,an,Se);var we=z(Ce),Te=R(we),A=R(Te),Ee=R(A),De=R(Ee),Oe=R(De),ke=R(Oe);$r(ke,17,()=>t.doc.folder||[],Yr,(e,t)=>{var n=um(),r=R(n,!0);N(n),V(e=>{J(n,`title`,H(t)),K(r,e)},[()=>Bu(H(t))]),G(e,n)});var Ae=B(ke,2),j=R(Ae,!0);N(Ae),N(Oe);var je=B(Oe,2),M=e=>{var n=dm(),r=R(n,!0);N(n),V(()=>K(r,t.doc.formattedDate)),G(e,n)};q(je,e=>{t.doc.formattedDate&&e(M)}),N(De);var Me=B(De,2),Ne=R(Me),Pe=R(Ne,!0);N(Ne);var Fe=B(Ne,2),Ie=R(Fe);N(Fe),N(Me),N(Ee);var Le=B(Ee,2),Re=R(Le),ze=e=>{var t=pm(),n=R(t),r=e=>{var t=fm(),n=R(t,!0);N(t),V(()=>{hi(t,1,`text-xs ${H(x).cls??``}`),K(n,H(x).text)}),G(e,t)};q(n,e=>{H(x)&&e(r)});var i=B(n,2),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var u=B(o,2),d=R(u,!0);N(u),N(t),V((e,t,n,r)=>{K(a,e),J(o,`title`,t),K(s,n),K(d,r)},[()=>Y(`common.cancel`),()=>Y(`doc.snippets`),()=>Y(`doc.snippets_btn`),()=>Y(`common.save`)]),U(`click`,i,ce),U(`click`,o,()=>{I(l,`insert`),I(c,!0)}),U(`click`,u,le),G(e,t)},Be=e=>{let t=P(()=>$.markerActive?`#fef08a`:`#bfdbfe`),n=P(()=>$.markerActive?`#fef08a`:`#93c5fd`),r=P(()=>$.markerActive?`#fde047`:`#93c5fd`);var i=gm(),a=R(i),o=e=>{var t=mm(),n=B(R(t),1,!0);N(t),V((e,r)=>{J(t,`title`,e),K(n,r)},[()=>Y(`doc.validate_mode`),()=>Y(`doc.validate_btn`)]),U(`click`,t,oe),G(e,t)};q(a,e=>{H(v)&&e(o)});var c=B(a,2),l=R(c),u=R(l),d=B(u),f=B(d),p=B(f),m=B(p,2),h=e=>{G(e,hm())};q(m,e=>{$.markerHidden&&e(h)}),N(l);var g=B(l,1,!0);N(c);var _=B(c,2),y=R(_);N(_);var b=B(_,2),x=B(R(b));N(b);var S=B(b,2),w=B(R(S));N(S);var T=B(S,2),E=B(R(T));N(T);var D=B(T,2),ee=B(R(D));N(D),N(i),V((e,i,a,o,s,l,m,h,v,C,O,te)=>{J(c,`title`,e),hi(c,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${$.markerActive?`border-yellow-400 bg-yellow-100 dark:bg-yellow-900/40 text-yellow-700 dark:text-yellow-300`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`),J(u,`fill`,H(t)),J(d,`fill`,H(n)),J(f,`fill`,H(r)),J(p,`fill`,H(r)),K(g,i),J(_,`title`,a),K(y,`📄 ${o??``}`),J(b,`title`,s),K(x,` ${l??``}`),J(S,`title`,m),K(w,` ${h??``}`),J(T,`title`,v),K(E,` ${C??``}`),J(D,`title`,O),K(ee,` ${te??``}`)},[()=>Y(`doc.marker_mode`),()=>Y(`doc.marker_btn`),()=>Y(`doc.export_pdf`),()=>Y(`doc.export_pdf_btn`),()=>Y(`doc.copy_link`),()=>Y(`doc.copy_link_btn`),()=>Y(`metadata.button_title`),()=>Y(`metadata.button`),()=>Y(`doc.edit`),()=>Y(`doc.edit_btn`),()=>Y(`doc.delete`),()=>Y(`doc.delete_btn`)]),U(`click`,c,()=>$.toggleMarker()),U(`click`,_,be),U(`click`,b,ve),U(`click`,S,()=>I(s,!0)),U(`click`,T,se),U(`click`,D,()=>I(C,!0)),G(e,i)};q(Re,e=>{H(y)?e(ze):e(Be,-1)}),N(Le),N(A);var Ve=B(A,2),He=e=>{qd(e,{onopen:()=>I(s,!0)})};q(Ve,e=>{H(y)||e(He)});var Ue=B(Ve,2),We=e=>{var r=ym();$r(r,21,n,Yr,(e,n,r)=>{var i=vm(),a=z(i),o=e=>{G(e,_m())};q(a,e=>{r>0&&e(o)});var s=B(a,2),c=R(s);N(s),V(()=>K(c,`← ${H(n).title??``}`)),U(`click`,s,()=>t.ongoback?.(r)),G(e,i)}),N(r),G(e,r)};q(Ue,e=>{!H(y)&&n().length&&e(We)});var qe=B(Ue,2),Je=e=>{var t=xm(),n=R(t),r=R(n,!0);N(n);var i=B(n,2);$r(i,23,()=>H(m),e=>e.id,(e,t,n)=>{var r=bm(),i=R(r),a=R(i),o=R(a);N(a);var s=B(a),c=R(s,!0);N(s),N(i),N(r),V(()=>{K(o,`${H(n)+1}.`),K(c,H(t).snippet)}),U(`click`,i,()=>Bp(H(t).id)),G(e,r)}),N(i),N(t),V(()=>K(r,H(g))),G(e,t)};q(qe,e=>{!H(y)&&H(m).length&&$.searchQuery&&e(Je)}),Li(B(qe,2),e=>I(p,e),()=>H(p)),N(Te);var Ye=B(Te,2),Xe=e=>{var t=Sm();vn(t),Li(t,e=>I(i,e),()=>H(i)),Mr(`paste`,t,ue),Mr(`drop`,t,de),Mr(`dragover`,t,fe),Mi(t,()=>H(b),e=>I(b,e)),G(e,t)},Ze=e=>{var t=Cm();Li(t,e=>I(r,e),()=>H(r)),V(()=>hi(t,1,`prose prose-gray dark:prose-invert max-w-none prose-headings:scroll-mt-4 prose-a:text-blue-600 dark:prose-a:text-blue-400 prose-code:before:content-none prose-code:after:content-none ${$.codeBlockLightTheme?`prose-pre:bg-[#f6f8fa] prose-pre:text-gray-800 prose-pre:border prose-pre:border-gray-200 prose-pre:rounded-lg dark:prose-pre:bg-[#0d1117] dark:prose-pre:text-gray-100 dark:prose-pre:border-gray-700`:`prose-pre:bg-[#0d1117] prose-pre:border prose-pre:border-gray-700`} ${$.imageRoundedCorners?`[&_img]:rounded-xl`:``} ${$.imageCentered?`[&_img]:mx-auto [&_img]:block`:``} ${$.imageBorder?`[&_img]:[box-shadow:0_0_0_1px_rgba(0,0,0,0.10),0_4px_12px_rgba(0,0,0,0.04)] dark:[&_img]:[box-shadow:0_0_0_1px_rgba(255,255,255,0.08),0_4px_12px_rgba(255,255,255,0.25)]`:``}`)),U(`click`,t,xe),G(e,t)};q(Ye,e=>{H(y)?e(Xe):e(Ze,-1)}),N(we);var Qe=B(we,2);Li(zd(Qe,{get contentEl(){return H(r)},get docId(){return t.doc.id}}),e=>I(a,e,!0),()=>H(a));var $e=B(Qe,2);hf($e,{get open(){return H(s)},get docId(){return t.doc.id},get content(){return t.doc.content},onclose:()=>I(s,!1)});var et=B($e,2);jp(et,{get open(){return H(c)},get editor(){return H(i)},get mode(){return H(l)},get content(){return t.doc.content},get range(){return H(u)},get insertPos(){return H(d)},get onsave(){return t.onsave},onclose:()=>I(c,!1)});var tt=B(et,2);Li(Dl(tt,{}),e=>I(o,e,!0),()=>H(o));var nt=B(tt,2),rt=e=>{var t=wm(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a),s=R(o),c=B(s),l=R(c,!0);N(c),N(o);var u=B(o,2),d=R(u);Ei(d);var f=B(d,2),p=R(f);N(f),N(u),N(a);var m=B(a,2),h=R(m),g=R(h,!0);N(h);var _=B(h,2),v=R(_,!0);N(_),N(m),N(n),N(t),V((e,t,n,r,a)=>{K(i,`🖼️ ${e??``}`),K(s,`${t??``} `),K(l,n),Di(d,H(E)),K(p,`.${H(D)??``}`),K(g,r),K(v,a)},[()=>Y(`modal.img_paste.title`),()=>Y(`modal.img_paste.filename_label`),()=>Y(`modal.img_paste.saved_hint`),()=>Y(`common.cancel`),()=>Y(`modal.img_paste.paste_btn`)]),U(`input`,d,e=>I(E,ie(e.target.value),!0)),U(`click`,h,ge),U(`click`,_,_e),G(e,t)};q(nt,e=>{H(T)&&e(rt)});var it=B(nt,2),at=e=>{var n=Tm(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d,!0);N(d),N(c),N(r),N(n),V((e,n,r)=>{K(a,e),K(s,t.doc.title),K(u,n),K(f,r)},[()=>Y(`doc.confirm_delete`),()=>Y(`common.cancel`),()=>Y(`doc.confirm_delete_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&I(C,!1)}),U(`click`,l,()=>I(C,!1)),U(`click`,d,async()=>{I(C,!1),await t.ondelete()}),G(e,n)};q(it,e=>{H(C)&&e(at)});var ot=B(it,2),st=e=>{var t=Em(),n=R(t),r=B(n,2);N(t),V(()=>{J(n,`src`,H(k)),J(n,`alt`,H(ne))}),U(`click`,t,()=>I(k,null)),U(`click`,n,e=>e.stopPropagation()),U(`click`,r,()=>I(k,null)),G(e,t)};q(ot,e=>{H(k)&&e(st)}),V(e=>{K(j,t.doc.category),K(Pe,t.doc.title),J(Fe,`title`,e),hi(Fe,1,`no-print inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition-colors hover:bg-gray-50 hover:text-blue-600 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-blue-400 ${H(w)?`text-green-600 dark:text-green-400`:``}`),hi(Ie,1,`fa-${H(w)?`solid fa-check`:`regular fa-copy`}`)},[()=>Y(`doc.copy_mcp_id`)]),U(`click`,Fe,ye),G(e,Ce),Ke()}Nr([`click`,`input`]);var km=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),Am=W(`<p class="px-3 py-3 text-xs text-red-400 text-center"> </p>`),jm=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),Mm=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="truncate text-gray-700 dark:text-gray-300"> </span></button>`),Nm=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden text-sm"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="text-xs text-gray-500 dark:text-gray-400 font-mono truncate flex-1"> </span></div> <div class="max-h-40 overflow-y-auto divide-y divide-gray-100 dark:divide-gray-800"><!></div></div>`),Pm=W(`<p class="text-xs text-red-500"> </p>`),Fm=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-md mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><svg width="16" height="16" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="inline-block mr-1 align-text-bottom"><path d="M2 5a2 2 0 012-2h3.586a1 1 0 01.707.293L9.707 4.707A1 1 0 0010.414 5H16a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V5z" stroke="currentColor" stroke-width="1.5" fill="none"></path><line x1="10" y1="8" x2="10" y2="14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line><line x1="7" y1="11" x2="13" y2="11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line></svg> <span> </span></h3> <div class="space-y-1.5"><label for="new-folder-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-folder-name" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 text-sm text-gray-600 dark:text-gray-300 font-mono truncate"> </span> <button class="text-xs px-2 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0"> </button></div> <!></div> <div class="space-y-1"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 truncate"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function Im(e,t){Ge(t,!0);let n=F(``),r=F(null),i=F(null),a=F(``),o=F(``),s=F(`/ (root)`),c=F(!1),l=F(``),u=F(L([])),d=F(!1),f=F(!1),p=F(``),m=F(!1),h=F(null),g=!1;On(()=>{t.open&&!g?(g=!0,_()):t.open||(g=!1)});async function _(){try{I(n,(await fetch(`/api/config`).then(e=>e.json())).docsFolder||``,!0)}catch{I(n,``)}let e=``;if($.currentDocId){let t=decodeURIComponent($.currentDocId);if(!t.startsWith(`/`)){let n=t.split(`/`);n.length>1&&(e=n.slice(0,-1).join(`/`))}}I(a,e?H(n)+`/`+e:H(n),!0),I(r,H(a),!0),I(i,null),I(o,``),I(s,e?`/`+e:`/ (root)`,!0),I(c,!1),I(p,``),I(m,!1),setTimeout(()=>H(h)?.focus(),50)}let v=P(()=>{let e=H(o).trim();if(!e)return Y(`modal.new_folder.enter_name`);let t=H(a)||H(n),r=t.startsWith(H(n))?t.slice(H(n).length).replace(/^\//,``):``;return(r?r+`/`:``)+e});function y(){I(c,!H(c)),H(c)&&b(H(r)||H(n))}async function b(e){I(d,!0),I(f,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(r,t.current,!0),I(i,t.parent,!0),I(a,t.current,!0),I(l,t.current,!0),I(s,(t.current.startsWith(H(n)+`/`)?t.current.slice(H(n).length):t.current===H(n)?``:t.current)||`/ (root)`,!0),I(u,t.dirs||[],!0)}catch{I(f,!0),I(u,[],!0)}finally{I(d,!1)}}let x=P(()=>H(r)===H(n));function S(){H(i)&&b(H(i))}async function C(){let e=H(o).trim();if(I(p,``),!e){I(p,Y(`modal.new_folder.error_empty`),!0);return}if(!/^[a-zA-Z0-9_\-. ]+$/.test(e)){I(p,Y(`modal.new_folder.error_invalid_chars`),!0);return}let r=H(a)||H(n);if(r===H(n)&&(e===`files`||e===`images`)){I(p,Y(`modal.new_folder.error_reserved`),!0);return}let i=r.endsWith(`/`)?r+e:r+`/`+e;I(m,!0);try{let e=await fetch(`/api/browse/mkdir`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:i})});if(!e.ok)throw Error(await e.text());t.onclose(),t.onsuccess()}catch(e){I(m,!1),I(p,Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}}var w=Ur(),T=z(w),E=e=>{var n=Fm(),r=R(n),i=R(r),a=B(R(i),2),g=R(a,!0);N(a),N(i);var _=B(i,2),w=R(_),T=R(w,!0);N(w);var E=B(w,2);Ei(E),Li(E,e=>I(h,e),()=>H(h)),N(_);var D=B(_,2),ee=R(D),O=R(ee,!0);N(ee);var te=B(ee,2),k=R(te),ne=R(k,!0);N(k);var re=B(k,2),ie=R(re,!0);N(re),N(te);var ae=B(te,2),oe=e=>{var t=Nm(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),p=e=>{var t=km(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.loading`)]),G(e,t)},m=e=>{var t=Am(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`modal.new_folder.error_loading`)]),G(e,t)},h=e=>{var t=jm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`modal.new_folder.no_subfolders`)]),G(e,t)},g=e=>{var t=Ur();$r(z(t),17,()=>H(u),e=>e.path,(e,t)=>{var n=Mm(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>b(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(d)?e(p):H(f)?e(m,1):H(u).length===0?e(h,2):e(g,-1)}),N(s),N(t),V(e=>{r.disabled=H(x),K(i,e),K(o,H(l))},[()=>Y(`common.up`)]),U(`click`,r,S),G(e,t)};q(ae,e=>{H(c)&&e(oe)}),N(D);var se=B(D,2),ce=R(se),le=R(ce,!0);N(ce);var ue=B(ce,2),de=R(ue,!0);N(ue),N(se);var fe=B(se,2),pe=e=>{var t=Pm(),n=R(t,!0);N(t),V(()=>K(n,H(p))),G(e,t)};q(fe,e=>{H(p)&&e(pe)});var me=B(fe,2),he=R(me),ge=R(he,!0);N(he);var _e=B(he,2),ve=R(_e,!0);N(_e),N(me),N(r),N(n),V((e,t,n,r,i,a,o,c)=>{K(g,e),K(T,t),J(E,`placeholder`,n),K(O,r),K(ne,H(s)),K(ie,i),K(le,a),K(de,H(v)),K(ge,o),_e.disabled=H(m),K(ve,c)},[()=>Y(`modal.new_folder.title`),()=>Y(`modal.new_folder.name_label`),()=>Y(`modal.new_folder.name_placeholder`),()=>Y(`modal.new_folder.location_label`),()=>Y(`modal.new_folder.browse_btn`),()=>Y(`modal.new_folder.will_be_created`),()=>Y(`common.cancel`),()=>H(m)?Y(`modal.new_folder.creating_btn`):Y(`modal.new_folder.create_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),Mi(E,()=>H(o),e=>I(o,e)),U(`click`,re,y),U(`click`,he,function(...e){t.onclose?.apply(this,e)}),U(`click`,_e,C),G(e,n)};q(T,e=>{t.open&&e(E)}),G(e,w),Ke()}Nr([`click`]);var Lm=W(`<option></option>`),Rm=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),zm=W(`<p class="px-3 py-4 text-xs text-red-400 text-center"> </p>`),Bm=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),Vm=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button>`),Hm=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-40 overflow-y-auto"><!></div> <div class="border-t border-gray-200 dark:border-gray-700 flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800/50"><input type="text" class="flex-1 px-2 py-1 text-xs rounded border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-blue-400"/> <button class="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors shrink-0"> </button></div></div>`),Um=W(`<p class="text-xs text-red-500"> </p>`),Wm=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-lg mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50">&#10133; <span> </span></h3> <div class="space-y-1.5"><label for="new-doc-title" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-title" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label for="new-doc-category" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-category" type="text" list="new-doc-category-options" autocomplete="off" placeholder="GENERAL" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <datalist id="new-doc-category-options"></datalist></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 px-3 py-2 text-xs rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-500 dark:text-gray-400 font-mono truncate"> </span> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">&#128193; <span> </span></button></div> <!></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 font-mono text-gray-600 dark:text-gray-300 break-all"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function Gm(e,t){Ge(t,!0);let n=F(``),r=F(`YYYY_MM_DD_HH_mm_[Category]_title`),i=F(null),a=F(null),o=F(``),s=F(``),c=F(``),l=F(`/ (root)`),u=F(!1),d=F(``),f=F(L([])),p=F(!1),m=F(!1),h=F(``),g=F(L([])),_=F(``),v=F(!1),y=F(null);function b(e){return(e||``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toUpperCase().replace(/[^A-Z0-9_-]/g,``)}function x(e){let t=H(n);return e===t?``:e.startsWith(t+`/`)?e.slice(t.length+1):e}let S=!1;On(()=>{t.open&&!S?(S=!0,C()):t.open||(S=!1)});async function C(){try{let e=await fetch(`/api/config`).then(e=>e.json());I(n,e.docsFolder||``,!0),I(r,e.filenamePattern||`YYYY_MM_DD_HH_mm_[Category]_title`,!0)}catch{I(n,``),I(r,`YYYY_MM_DD_HH_mm_[Category]_title`)}let e=$.currentDocId&&$.allDocs.find(e=>e.id===$.currentDocId),t=b(e&&e.category||`General`)||`GENERAL`,d=``;if($.currentDocId){let e=decodeURIComponent($.currentDocId);if(!e.startsWith(`/`)){let t=e.split(`/`);t.length>1&&(d=t.slice(0,-1).join(`/`))}}let f=d?H(n)+`/`+d:``;I(o,d,!0),I(i,f||null,!0),I(a,null),w(),I(s,``),I(c,t,!0),I(l,d?`/`+d:`/ (root)`,!0),I(u,!1),I(h,``),I(_,``),I(v,!1),setTimeout(()=>H(y)?.focus(),50)}function w(){let e=new Set;($.allDocs||[]).forEach(t=>{let n=b(t.category||``);n&&e.add(n)}),I(g,Array.from(e).sort((e,t)=>e.localeCompare(t)),!0)}function T(){let e=b(H(c));H(c)!==e&&I(c,e,!0)}let E=P(()=>{let e=H(s).trim();if(!e)return Y(`modal.new_doc.title_placeholder`);let t=b(H(c))||`GENERAL`,n=new Date,i=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,`0`),l=String(n.getDate()).padStart(2,`0`),u=String(n.getHours()).padStart(2,`0`),d=String(n.getMinutes()).padStart(2,`0`),f=e.toLowerCase().replace(/\s+/g,`_`).replace(/[^a-z0-9_]/g,``).replace(/_+/g,`_`).replace(/^_|_$/g,``)||`document`,p=H(r).replace(`YYYY`,String(i)).replace(`MM`,a).replace(`DD`,l).replace(`HH`,u).replace(`mm`,d).replace(/\[Category\]/i,`[${t}]`).replace(/(?<![a-z0-9])(?:title_words|title)(?![a-z0-9])/i,f)+`.md`;return H(o)?H(o)+`/`+p:p});function D(){I(u,!H(u)),H(u)&&ee(H(i)||H(n))}async function ee(e){I(p,!0),I(m,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(i,t.current,!0),I(a,t.parent,!0),I(o,x(t.current),!0),I(d,t.current,!0),I(l,H(o)?`/`+H(o):`/ (root)`,!0),I(f,t.dirs||[],!0)}catch{I(m,!0),I(f,[],!0)}finally{I(p,!1)}}let O=P(()=>H(i)===H(n));function te(){H(i)!==H(n)&&H(a)&&ee(H(a))}function k(){let e=H(h).trim();if(!e)return;let t=H(i)||H(n);if(t===H(n)&&(e===`files`||e===`images`)){I(_,Y(`modal.new_folder.error_reserved`),!0);return}I(_,``);let r=(x(t)?x(t)+`/`:``)+e;I(o,r),I(l,`/`+r),I(h,``)}async function ne(){let e=H(s).trim(),n=b(H(c))||`GENERAL`;if(!e){I(_,Y(`modal.new_doc.error_empty_title`),!0);return}I(_,``),I(v,!0);try{let r=await fetch(`/api/documents`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:e,category:n,folder:H(o)})});if(!r.ok){let e=await r.json();throw Error(e.error||`Creation failed`)}let i=await r.json();t.onclose(),t.onsuccess(i.id)}catch(e){I(_,Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e))),I(v,!1)}}function re(e){e.key===`Enter`&&ne(),e.key===`Escape`&&t.onclose()}var ie=Ur(),ae=z(ie),oe=e=>{var n=Wm(),r=R(n),i=R(r),a=B(R(i)),o=R(a,!0);N(a),N(i);var b=B(i,2),x=R(b),S=R(x,!0);N(x);var C=B(x,2);Ei(C),Li(C,e=>I(y,e),()=>H(y)),N(b);var w=B(b,2),ie=R(w),ae=R(ie,!0);N(ie);var oe=B(ie,2);Ei(oe);var se=B(oe,2);$r(se,20,()=>H(g),e=>e,(e,t)=>{var n=Lm(),r={};V(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),G(e,n)}),N(se),N(w);var ce=B(w,2),le=R(ce),ue=R(le,!0);N(le);var de=B(le,2),fe=R(de),pe=R(fe,!0);N(fe);var me=B(fe,2),he=B(R(me)),ge=R(he,!0);N(he),N(me),N(de);var _e=B(de,2),ve=e=>{var t=Hm(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),l=e=>{var t=Rm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.loading`)]),G(e,t)},u=e=>{var t=zm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.cannot_read_dir`)]),G(e,t)},g=e=>{var t=Bm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`modal.new_doc.no_subfolders`)]),G(e,t)},_=e=>{var t=Ur();$r(z(t),17,()=>H(f),e=>e.path,(e,t)=>{var n=Vm(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>ee(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(p)?e(l):H(m)?e(u,1):H(f).length===0?e(g,2):e(_,-1)}),N(s);var v=B(s,2),y=R(v);Ei(y);var b=B(y,2),x=R(b,!0);N(b),N(v),N(t),V((e,t,n)=>{r.disabled=H(O),K(i,`↑ ${e??``}`),K(o,H(d)),J(y,`placeholder`,t),K(x,n)},[()=>Y(`common.up`),()=>Y(`modal.new_doc.new_folder_placeholder`),()=>Y(`modal.new_doc.create_folder_btn`)]),U(`click`,r,te),U(`keydown`,y,e=>{e.key===`Enter`&&k()}),Mi(y,()=>H(h),e=>I(h,e)),U(`click`,b,k),G(e,t)};q(_e,e=>{H(u)&&e(ve)}),N(ce);var ye=B(ce,2),be=R(ye),xe=R(be,!0);N(be);var Se=B(be,2),Ce=R(Se,!0);N(Se),N(ye);var we=B(ye,2),Te=e=>{var t=Um(),n=R(t,!0);N(t),V(()=>K(n,H(_))),G(e,t)};q(we,e=>{H(_)&&e(Te)});var A=B(we,2),Ee=R(A),De=R(Ee,!0);N(Ee);var Oe=B(Ee,2),ke=R(Oe,!0);N(Oe),N(A),N(r),N(n),V((e,t,n,r,i,a,s,c,u)=>{K(o,e),K(S,t),J(C,`placeholder`,n),K(ae,r),K(ue,i),K(pe,H(l)),K(ge,a),K(xe,s),K(Ce,H(E)),K(De,c),Oe.disabled=H(v),K(ke,u)},[()=>Y(`modal.new_doc.title`),()=>Y(`modal.new_doc.title_label`),()=>Y(`modal.new_doc.title_placeholder`),()=>Y(`modal.new_doc.category_label`),()=>Y(`modal.new_doc.location_label`),()=>Y(`modal.new_doc.browse_btn`),()=>Y(`modal.new_doc.filename_label`),()=>Y(`common.cancel`),()=>H(v)?Y(`modal.new_folder.creating_btn`):Y(`common.create`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),U(`keydown`,C,re),Mi(C,()=>H(s),e=>I(s,e)),U(`input`,oe,T),U(`keydown`,oe,re),Mi(oe,()=>H(c),e=>I(c,e)),U(`click`,me,D),U(`click`,Ee,function(...e){t.onclose?.apply(this,e)}),U(`click`,Oe,ne),G(e,n)};q(ae,e=>{t.open&&e(oe)}),G(e,ie),Ke()}Nr([`click`,`keydown`,`input`]);var Km=W(`<p class="text-sm text-gray-400 py-2"> </p>`),qm=W(`<p class="text-sm text-red-500"> </p>`),Jm=W(`<label class="flex items-center gap-3 px-1 py-1.5 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer"><input type="checkbox" class="w-4 h-4 rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500"/> <span class="text-sm text-gray-700 dark:text-gray-300"> </span></label>`),Ym=W(`<div><div class="max-h-48 overflow-y-auto space-y-0.5 border border-gray-200 dark:border-gray-700 rounded-lg p-2"><!></div></div>`),Xm=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),Zm=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg border border-blue-500 text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 font-semibold transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),Qm=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><i class="fa-solid fa-file-export mr-2 text-blue-500"></i> <span> </span></h3> <div class="flex gap-0 border-b border-gray-200 dark:border-gray-700"><button> </button> <button> </button> <button> </button></div> <!> <!> <!> <!></div></div>`);function $m(e,t){Ge(t,!0);let n=F(`markdown`),r=!1,i=F(!1),a=F(!1),o=F(L([])),s=F(L({})),c=F(!1),l=F(!1),u=F(!1),d=F(!1),f=!1;On(()=>{t.open&&!f?(f=!0,I(n,`markdown`),r=!1,I(o,[],!0),I(s,{},!0)):t.open||(f=!1)});function p(e){return String(e??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function m(e){I(n,e,!0),e===`html`&&h()}async function h(){if(!r){I(i,!0),I(a,!1);try{let e=await fetch(`/api/documents`).then(e=>e.json()),t=new Set;e.forEach(e=>t.add(e.folder?.[0]??e.category??`General`)),I(o,[...t].sort((e,t)=>e===`General`?-1:t===`General`?1:e.localeCompare(t)),!0),r=!0}catch{I(a,!0)}finally{I(i,!1)}}}async function g(){I(c,!0);try{let e=await fetch(`/api/export/markdown`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`});if(!e.ok)throw Error(await e.text());let n=await e.blob(),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`export-markdown.zip`,i.click(),URL.revokeObjectURL(r),t.onclose()}catch(e){alert(Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(c,!1)}}async function _(e){let n=H(o).filter(e=>H(s)[e]);if(n.length){I(e===`confluence`?u:l,!0);try{let r=await fetch(`/api/export/html`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folders:n,mode:e})});if(!r.ok)throw Error(await r.text());let i=await r.blob(),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=`export-${e}.zip`,o.click(),URL.revokeObjectURL(a),t.onclose()}catch(e){alert(Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(u,!1),I(l,!1)}}}async function v(){I(d,!0);try{let e=$.allDocs&&$.allDocs.length?$.allDocs:await fetch(`/api/documents`).then(e=>e.json()),n={};for(let t=0;t<e.length;t+=5){let r=e.slice(t,t+5),i=await Promise.all(r.map(e=>fetch(`/api/documents/`+e.id).then(e=>e.ok?e.json():null).catch(()=>null)));for(let r of i)r&&(n[r.id??e[t]?.id]=r);r.forEach((e,t)=>{i[t]&&(n[e.id]=i[t])})}function r(e){let t={categories:{},children:{}};for(let n of e){let e=t;for(let t of n.folder||[])e.children[t]||(e.children[t]={categories:{},children:{}}),e=e.children[t];e.categories[n.category]||(e.categories[n.category]=[]),e.categories[n.category].push(n)}return t}function i(e){let t=[];e.categories.General&&t.push(...e.categories.General);let n=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let r of n)t.push(...i(e.children[r]));let r=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let n of r)t.push(...e.categories[n]);return t}function a(e){return e.replace(/^\d+_/,``).replace(/[_-]+/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function o(e,t){let n=``,r=t*1.25,i=(e,i)=>{let a=t===0&&e===`General`?`General`:e;n+=`<li style="margin-left:${r}rem;margin-top:${t===0?`0.75`:`0.4`}rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#6b7280;">${a}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`;for(let e of i)n+=`<li style="margin-left:${r+.75}rem;padding:0.15rem 0;">`,n+=`<a href="#doc-${e.id}" style="color:#1d4ed8;text-decoration:none;font-size:0.875rem;">${p(e.title)}</a>`,e.formattedDate&&(n+=`<span style="color:#9ca3af;font-size:0.7rem;margin-left:0.5rem;">${p(e.formattedDate)}</span>`),n+=`</li>`;n+=`</ul></li>`};e.categories.General&&i(`General`,e.categories.General);let s=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let i of s)n+=`<li style="margin-left:${r}rem;margin-top:0.75rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#7c3aed;">&#128193; ${a(i)}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`,n+=o(e.children[i],t+1),n+=`</ul></li>`;let c=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let t of c)i(t,e.categories[t]);return n}function s(e){return e.replace(/href="[^"]*\?doc=([^"&#]+)(?:#[^"]*)?"/g,(e,t)=>`href="#doc-${t}"`)}let c=p(document.title||`Living Documentation`),l=r(e),u=i(l),d=`<!DOCTYPE html>
91
+ `,t);return n>=0?n:0}c=c.nextElementSibling}return e.length}function lm(e,t,n){if(!e||typeof t!=`string`)return()=>{};let r=$p(t);tm(e,r);let i=i=>{let a=i.target?.closest(`[data-inline-snippet-index]`);if(a&&e.contains(a)){let e=r[Number(a.dataset.inlineSnippetIndex)];if(!e)return;i.preventDefault();let t=Up(e.type),o=Gp(e.type);rm(i,[{iconClass:t.iconClass,labelKey:t.labelKey,dataAction:`edit`,dataType:e.type,onActivate:()=>n.onEdit(e)},{iconClass:o.iconClass,labelKey:o.labelKey,dataAction:`delete`,dataType:e.type,onActivate:()=>n.onDelete(e)}]);return}if(!e.contains(i.target))return;let o=cm(t,e,i.target,r,i.clientY);o!==null&&(i.preventDefault(),rm(i,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(o)}))};e.addEventListener(`contextmenu`,i);let a=e.closest(`#home-content-area`)||e.closest(`main`),o=null;a&&(o=r=>{r.defaultPrevented||e.offsetParent!==null&&(r.target?.closest(`textarea, input, [data-inline-snippet-index]`)||e.contains(r.target)||(r.preventDefault(),rm(r,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(t.length)})))},a.addEventListener(`contextmenu`,o));let s=e=>{qp&&!qp.contains(e.target)&&nm()},c=e=>{e.key===`Escape`&&nm()};return document.addEventListener(`click`,s),document.addEventListener(`keydown`,c),()=>{e.removeEventListener(`contextmenu`,i),a&&o&&a.removeEventListener(`contextmenu`,o),document.removeEventListener(`click`,s),document.removeEventListener(`keydown`,c),nm(),e.querySelectorAll(`[data-inline-snippet-index]`).forEach(e=>{e.removeAttribute(`data-inline-snippet-index`),e.classList.remove(`ld-inline-snippet-target`)})}}var um=W(`<span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-violet-100 text-violet-700 dark:bg-violet-900/40 dark:text-violet-300"> </span>`),dm=W(`<span class="text-xs text-gray-400 dark:text-gray-500"> </span>`),fm=W(`<span> </span>`),pm=W(`<div data-testid="edit-actions" class="flex items-center gap-2"><!> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div>`),mm=W(`<button data-testid="validate-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-green-700 bg-green-600 text-white font-semibold hover:bg-green-700 transition-colors"><i class="fa-solid fa-check" style="margin-right:4px"></i> </button>`),hm=Vr(`<g><line x1="8" y1="8" x2="92" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line><line x1="92" y1="8" x2="8" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line></g>`),gm=W(`<div data-testid="view-actions" class="flex items-center gap-2"><!> <button><svg width="18" height="18" viewBox="0 0 100 100" fill="none" style="display:inline-block;vertical-align:middle;margin-right:4px"><rect x="28" y="10" width="44" height="52" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><rect x="52" y="8" width="22" height="30" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><polygon points="28,60 10,80 30,80 38,72" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><polygon points="28,48 19,70 36,75 55,70" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><line x1="10" y1="90" x2="72" y2="90" stroke="currentColor" stroke-width="6" stroke-linecap="round"></line><!></svg> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-link"></i> </button> <button data-testid="metadata-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-code-compare"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-file-pen"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-red-200 dark:border-red-700 text-red-500 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/40 transition-colors"><i class="fa-solid fa-trash"></i> </button> <button><i class="fa-solid fa-list-ul"></i></button></div>`),_m=W(`<span class="text-gray-300 dark:text-gray-600 mx-1">·</span>`),vm=W(`<!> <button class="text-blue-600 dark:text-blue-400 hover:underline"> </button>`,1),ym=W(`<div class="no-print mt-2 flex flex-wrap gap-1 text-xs"></div>`),bm=W(`<li><button class="w-full text-left px-3 py-1.5 hover:bg-yellow-100 dark:hover:bg-yellow-900/30 transition-colors"><span class="text-yellow-600 dark:text-yellow-500 font-mono text-xs mr-2"> </span><span class="text-xs"> </span></button></li>`),xm=W(`<div class="mt-4 rounded-lg bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-sm text-yellow-800 dark:text-yellow-300 overflow-hidden"><div class="px-3 py-2 font-medium border-b border-yellow-200 dark:border-yellow-800"> </div> <ol class="max-h-40 overflow-y-auto divide-y divide-yellow-100 dark:divide-yellow-900/40 list-none m-0 p-0"></ol></div>`),Sm=W(`<textarea id="doc-editor" data-testid="doc-editor" spellcheck="false" class="w-full min-h-[70vh] px-4 py-3 text-sm font-mono leading-relaxed rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-y"></textarea>`),Cm=W(`<div id="doc-content" data-testid="doc-content"></div>`),wm=W(`<li class="m-0 p-0"><a class="block text-xs text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:underline py-0.5 leading-snug transition-colors truncate"> </a></li>`),Tm=W(`<div></div> <aside class="no-print shrink-0 sticky top-0 self-start max-h-screen overflow-y-auto py-8 pr-4 pl-3 ld-toc-aside"><p class="text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 mb-3"> </p> <nav><ul class="space-y-1 list-none m-0 p-0"></ul></nav></aside>`,1),Em=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-5"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"> </h3> <div class="space-y-1.5"><label for="img-paste-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> <span class="font-normal text-gray-400"> </span></label> <div class="flex items-center gap-2"><input id="img-paste-name" type="text" class="flex-1 px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="text-xs text-gray-400 shrink-0"> </span></div></div> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`),Dm=W(`<div class="fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4"><div class="w-full max-w-sm bg-white dark:bg-gray-900 border border-red-200 dark:border-red-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"><p class="text-sm text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-500 dark:text-gray-400 italic truncate"> </p> <div class="flex justify-end gap-2 mt-2"><button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-red-500 hover:bg-red-600 text-white font-semibold transition-colors"> </button></div></div></div>`),Om=W(`<div class="fixed inset-0 z-50 bg-black/90 flex items-center justify-center cursor-pointer"><img class="max-w-full max-h-full object-contain select-none"/> <button class="absolute top-4 right-4 text-white/70 hover:text-white text-2xl leading-none">×</button></div>`),km=W(`<header id="home-doc-header" class="sticky top-0 z-10 bg-gray-50 dark:bg-gray-950 px-6 pt-8 pb-6 mb-0 border-b border-gray-300 dark:border-gray-800"><div class="flex items-start gap-4 flex-wrap"><div class="shrink min-w-0"><div class="flex items-center gap-2 mb-2 flex-wrap"><span class="flex items-center gap-2 flex-wrap"><!> <span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300"> </span></span> <!></div> <div class="flex items-center gap-2"><h1 data-testid="doc-title" class="min-w-0 text-2xl font-bold text-gray-900 dark:text-gray-50 leading-tight"> </h1> <button type="button" data-testid="copy-doc-id-btn"><i aria-hidden="true"></i></button></div></div> <div class="flex items-center gap-2 flex-wrap ml-auto"><!></div></div> <!> <!> <!> <div class="hidden no-print"></div></header> <div class="flex min-h-full items-start"><article id="home-doc-view" data-testid="doc-view" class="flex-1 min-w-0 px-6 pt-8 pb-8"><!></article> <!></div> <!> <!> <!> <!> <!> <!> <!>`,1);function Am(e,t){Ge(t,!0);let n=Bi(t,`navHistory`,19,()=>[]),r=F(null),i=F(null),a=F(null),o=F(null),s=F(!1),c=F(!1),l=F(`insert`),u=F(null),d=F(0),f=null;Vi(()=>{let e=window;return e.openSnippetsModal=()=>{I(l,`insert`),I(c,!0)},e.openSnippetsModalForInlineInsert=e=>{I(l,`inline-insert`),I(d,Math.max(0,Number(e)||0),!0),I(c,!0)},()=>{delete e.openSnippetsModal,delete e.openSnippetsModalForInlineInsert}});let p=F(null),m=F(L([])),h=``,g=P(()=>H(m).length?Y(H(m).length===1?`search.notice_singular`:`search.notice_plural`).replace(`{count}`,String(H(m).length)).replace(`{query}`,$.searchQuery):``),_=P(()=>Yd(t.doc.content)),v=P(()=>(H(_)||``).toUpperCase()===`TO BE VALIDATED`),y=F(!1),b=F(``),x=F(null),S=F(!1),C=F(!1),w=F(!1),T=F(!1),E=F(``),D=F(`png`),ee=null,O=0,te=0,k=F(null),ne=F(``),re=/[̀-ͯ]/g;function ie(e){return(e||``).normalize(`NFD`).replace(re,``).toLowerCase().replace(/[^a-z0-9]/g,`_`)}function ae(e){let t=document.getElementById(`home-content-area`),n=document.getElementById(e);if(!t||!n)return;let r=document.querySelector(`#home-doc-view header`),i=r?r.getBoundingClientRect().height:0;t.scrollTop+=n.getBoundingClientRect().top-t.getBoundingClientRect().top-i-8}On(()=>{let e=t.doc.id,n=$.searchQuery;if(f?.(),f=null,H(y)||!H(r))return;Cd(H(r),t.doc.html,{content:t.doc.content,codeBlockMaxHeight:$.codeBlockMaxHeight,t:Y,onDocLink:(e,n)=>t.onopen(e,n),onAnchor:ae});let i=typeof n==`string`&&n.toLowerCase().startsWith(`metadata://`);I(m,n&&!i?zp(H(r),n):[],!0),H(p)&&Rp(H(r),H(p),Y),f=lm(H(r),t.doc.content,{onEdit:e=>{I(l,`inline-edit`),I(u,e,!0),I(c,!0)},onInsert:e=>{I(l,`inline-insert`),I(d,e,!0),I(c,!0)},onDelete:async e=>{await H(o).show({title:Y(`snippet.inline_delete_title`),message:Y(`snippet.inline_delete_message`),confirmLabel:Y(`snippet.inline_delete_confirm_btn`),cancelLabel:Y(`common.cancel`),danger:!0})&&await t.onsave(t.doc.content.slice(0,e.start)+t.doc.content.slice(e.end))}}),e===h?H(a)?.apply():(h=e,H(a)?.load(e),Gd.load(e)),I(ce,Array.from(H(r).querySelectorAll(`h1,h2,h3,h4,h5,h6`)).map(e=>({id:e.id,text:e.textContent?.trim()??``,level:parseInt(e.tagName[1])})).filter(e=>e.id&&e.text),!0)});async function oe(){let e=1;try{let n=await Gd.load(t.doc.id);n&&typeof n.accuracy==`number`&&(e=n.accuracy)}catch{}let n=Math.round(e*100),r=n<100,i=Zd(t.doc.id),a=Y(i?`doc.validate_worklog_message`:`doc.validate_message`),s=r?Y(`doc.validate_detail_low_accuracy`).replace(`{accuracy}`,n+`%`):void 0;if(!await H(o).show({title:Y(`doc.validate_title`),message:a,detail:s,confirmLabel:Y(`doc.validate_confirm`),cancelLabel:Y(`common.cancel`)}))return;let c=Xd(t.doc.content,i?`Done`:`Accepted`);if(c!==t.doc.content)try{await t.onsave(c),r&&await fetch(`/api/metadata/`+encodeURIComponent(t.doc.id)+`/refresh`,{method:`POST`}),await Gd.load(t.doc.id),$.docStatuses={...$.docStatuses,[t.doc.id]:i?`Done`:`Accepted`}}catch(e){I(x,{text:Y(`doc.validate_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}On(()=>{try{I(S,localStorage.getItem(`ld-full-width`)===`1`)}catch{}});let se=F(!1),ce=F(L([])),le=`ld-toc-w`,ue=F(!1),de=F(null);function fe(e){if(e.preventDefault(),!H(de))return;let t=e.clientX,n=H(de).getBoundingClientRect().width;I(ue,!0),H(de).style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let r=e=>{let r=Math.max(160,Math.min(400,n-(e.clientX-t)));H(de).style.width=r+`px`},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``,I(ue,!1),H(de).style.transition=``;try{localStorage.setItem(le,String(parseInt(H(de).style.width,10)))}catch{}};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}On(()=>{try{I(se,localStorage.getItem(`ld-toc-open`)===`1`)}catch{}try{let e=parseInt(localStorage.getItem(le)||``,10);H(de)&&e>=160&&e<=400&&(H(de).style.width=e+`px`)}catch{}});function pe(){I(se,!H(se));try{localStorage.setItem(`ld-toc-open`,H(se)?`1`:`0`)}catch{}}function me(e){let t=document.getElementById(e),n=document.getElementById(`home-content-area`),r=document.getElementById(`home-doc-header`);if(!t||!n)return;let i=t.parentElement;for(;i&&i!==n;)i.tagName===`DETAILS`&&(i.open=!0),i=i.parentElement;let a=r?r.getBoundingClientRect().height:0,o=t.getBoundingClientRect().top-n.getBoundingClientRect().top+n.scrollTop;n.scrollTo({top:o-a-16,behavior:`smooth`})}function he(){I(b,t.doc.content,!0),I(y,!0),I(x,null),requestAnimationFrame(()=>H(i)?.focus())}function ge(){I(y,!1),I(x,null)}async function _e(){I(x,{text:Y(`doc.saving`),cls:`text-gray-400`},!0);try{await t.onsave(H(b)),I(y,!1),I(x,null)}catch(e){I(x,{text:Y(`error.save`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}function ve(e){let t=Array.from(e.clipboardData?.items??[]).find(e=>e.type.startsWith(`image/`));if(t){e.preventDefault(),O=H(i).selectionStart,te=H(i).selectionEnd,I(D,t.type.split(`/`)[1].replace(`jpeg`,`jpg`)||`png`,!0);let n=t.getAsFile();if(!n)return;ee=n,I(E,ie(Date.now().toString()),!0),I(T,!0);return}let n=Array.from(e.clipboardData?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(n.length){e.preventDefault();let t=H(i).selectionStart,r=H(i).selectionEnd;(async()=>{for(let e of n)await Ce(e,t,r)})()}}function ye(e){let t=Array.from(e.dataTransfer?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(!t.length)return;e.preventDefault(),e.stopPropagation();let n=H(i).selectionStart,r=H(i).selectionEnd;(async()=>{for(let e of t)await Ce(e,n,r)})()}function be(e){e.dataTransfer?.types?.includes(`Files`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)}function xe(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function Se(e,t,n){let r=H(b).slice(0,t),a=H(b).slice(n);I(b,r+e+a),requestAnimationFrame(()=>{H(i).selectionStart=H(i).selectionEnd=t+e.length,H(i).focus()})}async function Ce(e,t,n){if(e.size>19922944){I(x,{text:Y(`doc.file_too_large`)+` (${(e.size/1024/1024).toFixed(1)} MB, max 19 MB)`,cls:`text-red-500 dark:text-red-400`},!0);return}I(x,{text:Y(`doc.uploading_file`),cls:`text-gray-400`},!0);try{let r=await xe(e),i=await fetch(`/api/files/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:r,name:e.name})});if(!i.ok){let e=``;try{e=(await i.json()).error||``}catch{e=await i.text()}throw Error(e||`HTTP ${i.status}`)}let{url:a,originalName:o}=await i.json();Se(`[📎 ${o||e.name}](${a})`,t,n),I(x,null)}catch(e){I(x,{text:Y(`doc.file_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}function we(){I(T,!1),ee=null}async function Te(){let e=ie(H(E))||Date.now().toString();if(I(T,!1),ee){I(x,{text:Y(`doc.uploading_image`),cls:`text-gray-400`},!0);try{let t=await xe(ee),n=await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:t,ext:H(D),name:e})});if(!n.ok)throw Error(await n.text());let{filename:r}=await n.json();Se(`![image](/images/${r})`,O,te),I(x,null)}catch(e){I(x,{text:Y(`doc.image_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}finally{ee=null}}}async function A(){try{await navigator.clipboard.writeText(location.href)}catch{}}async function Ee(){try{await navigator.clipboard.writeText(decodeURIComponent(t.doc.id)),I(w,!0),setTimeout(()=>I(w,!1),1800)}catch{}}function De(){window.print()}function Oe(e){let t=e.target.closest(`img`);!t||!e.shiftKey||(e.preventDefault(),e.stopPropagation(),I(k,t.src,!0),I(ne,t.alt||``,!0))}function ke(e){e.key===`Escape`&&H(k)&&I(k,null)}var Ae=km();Mr(`keydown`,an,ke);var j=z(Ae),je=R(j),M=R(je),Me=R(M),Ne=R(Me),Pe=R(Ne);$r(Pe,17,()=>t.doc.folder||[],Yr,(e,t)=>{var n=um(),r=R(n,!0);N(n),V(e=>{J(n,`title`,H(t)),K(r,e)},[()=>Bu(H(t))]),G(e,n)});var Fe=B(Pe,2),Ie=R(Fe,!0);N(Fe),N(Ne);var Le=B(Ne,2),Re=e=>{var n=dm(),r=R(n,!0);N(n),V(()=>K(r,t.doc.formattedDate)),G(e,n)};q(Le,e=>{t.doc.formattedDate&&e(Re)}),N(Me);var ze=B(Me,2),Be=R(ze),Ve=R(Be,!0);N(Be);var He=B(Be,2),Ue=R(He);N(He),N(ze),N(M);var We=B(M,2),qe=R(We),Je=e=>{var t=pm(),n=R(t),r=e=>{var t=fm(),n=R(t,!0);N(t),V(()=>{hi(t,1,`text-xs ${H(x).cls??``}`),K(n,H(x).text)}),G(e,t)};q(n,e=>{H(x)&&e(r)});var i=B(n,2),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var u=B(o,2),d=R(u,!0);N(u),N(t),V((e,t,n,r)=>{K(a,e),J(o,`title`,t),K(s,n),K(d,r)},[()=>Y(`common.cancel`),()=>Y(`doc.snippets`),()=>Y(`doc.snippets_btn`),()=>Y(`common.save`)]),U(`click`,i,ge),U(`click`,o,()=>{I(l,`insert`),I(c,!0)}),U(`click`,u,_e),G(e,t)},Ye=e=>{let t=P(()=>$.markerActive?`#fef08a`:`#bfdbfe`),n=P(()=>$.markerActive?`#fef08a`:`#93c5fd`),r=P(()=>$.markerActive?`#fde047`:`#93c5fd`);var i=gm(),a=R(i),o=e=>{var t=mm(),n=B(R(t),1,!0);N(t),V((e,r)=>{J(t,`title`,e),K(n,r)},[()=>Y(`doc.validate_mode`),()=>Y(`doc.validate_btn`)]),U(`click`,t,oe),G(e,t)};q(a,e=>{H(v)&&e(o)});var c=B(a,2),l=R(c),u=R(l),d=B(u),f=B(d),p=B(f),m=B(p,2),h=e=>{G(e,hm())};q(m,e=>{$.markerHidden&&e(h)}),N(l);var g=B(l,1,!0);N(c);var _=B(c,2),y=R(_);N(_);var b=B(_,2),x=B(R(b));N(b);var S=B(b,2),w=B(R(S));N(S);var T=B(S,2),E=B(R(T));N(T);var D=B(T,2),ee=B(R(D));N(D);var O=B(D,2);N(i),V((e,i,a,o,s,l,m,h,v,C,te,k,ne)=>{J(c,`title`,e),hi(c,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${$.markerActive?`border-yellow-400 bg-yellow-100 dark:bg-yellow-900/40 text-yellow-700 dark:text-yellow-300`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`),J(u,`fill`,H(t)),J(d,`fill`,H(n)),J(f,`fill`,H(r)),J(p,`fill`,H(r)),K(g,i),J(_,`title`,a),K(y,`📄 ${o??``}`),J(b,`title`,s),K(x,` ${l??``}`),J(S,`title`,m),K(w,` ${h??``}`),J(T,`title`,v),K(E,` ${C??``}`),J(D,`title`,te),K(ee,` ${k??``}`),J(O,`title`,ne),hi(O,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${H(se)?`border-blue-400 bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`)},[()=>Y(`doc.marker_mode`),()=>Y(`doc.marker_btn`),()=>Y(`doc.export_pdf`),()=>Y(`doc.export_pdf_btn`),()=>Y(`doc.copy_link`),()=>Y(`doc.copy_link_btn`),()=>Y(`metadata.button_title`),()=>Y(`metadata.button`),()=>Y(`doc.edit`),()=>Y(`doc.edit_btn`),()=>Y(`doc.delete`),()=>Y(`doc.delete_btn`),()=>Y(`doc.toc_toggle`)]),U(`click`,c,()=>$.toggleMarker()),U(`click`,_,De),U(`click`,b,A),U(`click`,S,()=>I(s,!0)),U(`click`,T,he),U(`click`,D,()=>I(C,!0)),U(`click`,O,pe),G(e,i)};q(qe,e=>{H(y)?e(Je):e(Ye,-1)}),N(We),N(je);var Xe=B(je,2),Ze=e=>{qd(e,{onopen:()=>I(s,!0)})};q(Xe,e=>{H(y)||e(Ze)});var Qe=B(Xe,2),$e=e=>{var r=ym();$r(r,21,n,Yr,(e,n,r)=>{var i=vm(),a=z(i),o=e=>{G(e,_m())};q(a,e=>{r>0&&e(o)});var s=B(a,2),c=R(s);N(s),V(()=>K(c,`← ${H(n).title??``}`)),U(`click`,s,()=>t.ongoback?.(r)),G(e,i)}),N(r),G(e,r)};q(Qe,e=>{!H(y)&&n().length&&e($e)});var et=B(Qe,2),tt=e=>{var t=xm(),n=R(t),r=R(n,!0);N(n);var i=B(n,2);$r(i,23,()=>H(m),e=>e.id,(e,t,n)=>{var r=bm(),i=R(r),a=R(i),o=R(a);N(a);var s=B(a),c=R(s,!0);N(s),N(i),N(r),V(()=>{K(o,`${H(n)+1}.`),K(c,H(t).snippet)}),U(`click`,i,()=>Bp(H(t).id)),G(e,r)}),N(i),N(t),V(()=>K(r,H(g))),G(e,t)};q(et,e=>{!H(y)&&H(m).length&&$.searchQuery&&e(tt)}),Li(B(et,2),e=>I(p,e),()=>H(p)),N(j);var nt=B(j,2),rt=R(nt),it=R(rt),at=e=>{var t=Sm();vn(t),Li(t,e=>I(i,e),()=>H(i)),Mr(`paste`,t,ve),Mr(`drop`,t,ye),Mr(`dragover`,t,be),Mi(t,()=>H(b),e=>I(b,e)),G(e,t)},ot=e=>{var t=Cm();Li(t,e=>I(r,e),()=>H(r)),V(()=>hi(t,1,`prose prose-gray dark:prose-invert max-w-none prose-headings:scroll-mt-4 prose-a:text-blue-600 dark:prose-a:text-blue-400 prose-code:before:content-none prose-code:after:content-none ${$.codeBlockLightTheme?`prose-pre:bg-[#f6f8fa] prose-pre:text-gray-800 prose-pre:border prose-pre:border-gray-200 prose-pre:rounded-lg dark:prose-pre:bg-[#0d1117] dark:prose-pre:text-gray-100 dark:prose-pre:border-gray-700`:`prose-pre:bg-[#0d1117] prose-pre:border prose-pre:border-gray-700`} ${$.imageRoundedCorners?`[&_img]:rounded-xl`:``} ${$.imageCentered?`[&_img]:mx-auto [&_img]:block`:``} ${$.imageBorder?`[&_img]:[box-shadow:0_0_0_1px_rgba(0,0,0,0.10),0_4px_12px_rgba(0,0,0,0.04)] dark:[&_img]:[box-shadow:0_0_0_1px_rgba(255,255,255,0.08),0_4px_12px_rgba(255,255,255,0.25)]`:``}`)),U(`click`,t,Oe),G(e,t)};q(it,e=>{H(y)?e(at):e(ot,-1)}),N(rt);var st=B(rt,2),ct=e=>{var t=Tm(),n=z(t),r=B(n,2);_i(r,`width: 224px`);var i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o);$r(s,21,()=>H(ce),Yr,(e,t)=>{var n=wm(),r=R(n),i=R(r,!0);N(r),N(n),V(()=>{_i(n,`padding-left: ${(H(t).level-1)*.75}rem`),J(r,`href`,`#${H(t).id??``}`),J(r,`title`,H(t).text),K(i,H(t).text)}),U(`click`,r,e=>{e.preventDefault(),me(H(t).id)}),G(e,n)}),N(s),N(o),N(r),Li(r,e=>I(de,e),()=>H(de)),V(e=>{hi(n,1,`no-print w-1 shrink-0 self-stretch cursor-col-resize select-none transition-colors ${H(ue)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),K(a,e)},[()=>Y(`doc.toc_title`)]),U(`mousedown`,n,fe),G(e,t)};q(st,e=>{H(se)&&H(ce).length>0&&e(ct)}),N(nt);var lt=B(nt,2);Li(zd(lt,{get contentEl(){return H(r)},get docId(){return t.doc.id}}),e=>I(a,e,!0),()=>H(a));var ut=B(lt,2);hf(ut,{get open(){return H(s)},get docId(){return t.doc.id},get content(){return t.doc.content},onclose:()=>I(s,!1)});var dt=B(ut,2);jp(dt,{get open(){return H(c)},get editor(){return H(i)},get mode(){return H(l)},get content(){return t.doc.content},get range(){return H(u)},get insertPos(){return H(d)},get onsave(){return t.onsave},onclose:()=>I(c,!1)});var ft=B(dt,2);Li(Dl(ft,{}),e=>I(o,e,!0),()=>H(o));var pt=B(ft,2),mt=e=>{var t=Em(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a),s=R(o),c=B(s),l=R(c,!0);N(c),N(o);var u=B(o,2),d=R(u);Ei(d);var f=B(d,2),p=R(f);N(f),N(u),N(a);var m=B(a,2),h=R(m),g=R(h,!0);N(h);var _=B(h,2),v=R(_,!0);N(_),N(m),N(n),N(t),V((e,t,n,r,a)=>{K(i,`🖼️ ${e??``}`),K(s,`${t??``} `),K(l,n),Di(d,H(E)),K(p,`.${H(D)??``}`),K(g,r),K(v,a)},[()=>Y(`modal.img_paste.title`),()=>Y(`modal.img_paste.filename_label`),()=>Y(`modal.img_paste.saved_hint`),()=>Y(`common.cancel`),()=>Y(`modal.img_paste.paste_btn`)]),U(`input`,d,e=>I(E,ie(e.target.value),!0)),U(`click`,h,we),U(`click`,_,Te),G(e,t)};q(pt,e=>{H(T)&&e(mt)});var ht=B(pt,2),gt=e=>{var n=Dm(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d,!0);N(d),N(c),N(r),N(n),V((e,n,r)=>{K(a,e),K(s,t.doc.title),K(u,n),K(f,r)},[()=>Y(`doc.confirm_delete`),()=>Y(`common.cancel`),()=>Y(`doc.confirm_delete_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&I(C,!1)}),U(`click`,l,()=>I(C,!1)),U(`click`,d,async()=>{I(C,!1),await t.ondelete()}),G(e,n)};q(ht,e=>{H(C)&&e(gt)});var _t=B(ht,2),vt=e=>{var t=Om(),n=R(t),r=B(n,2);N(t),V(()=>{J(n,`src`,H(k)),J(n,`alt`,H(ne))}),U(`click`,t,()=>I(k,null)),U(`click`,n,e=>e.stopPropagation()),U(`click`,r,()=>I(k,null)),G(e,t)};q(_t,e=>{H(k)&&e(vt)}),V(e=>{K(Ie,t.doc.category),K(Ve,t.doc.title),J(He,`title`,e),hi(He,1,`no-print inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition-colors hover:bg-gray-50 hover:text-blue-600 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-blue-400 ${H(w)?`text-green-600 dark:text-green-400`:``}`),hi(Ue,1,`fa-${H(w)?`solid fa-check`:`regular fa-copy`}`)},[()=>Y(`doc.copy_mcp_id`)]),U(`click`,He,Ee),G(e,Ae),Ke()}Nr([`click`,`mousedown`,`input`]);var jm=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),Mm=W(`<p class="px-3 py-3 text-xs text-red-400 text-center"> </p>`),Nm=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),Pm=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="truncate text-gray-700 dark:text-gray-300"> </span></button>`),Fm=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden text-sm"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="text-xs text-gray-500 dark:text-gray-400 font-mono truncate flex-1"> </span></div> <div class="max-h-40 overflow-y-auto divide-y divide-gray-100 dark:divide-gray-800"><!></div></div>`),Im=W(`<p class="text-xs text-red-500"> </p>`),Lm=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-md mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><svg width="16" height="16" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="inline-block mr-1 align-text-bottom"><path d="M2 5a2 2 0 012-2h3.586a1 1 0 01.707.293L9.707 4.707A1 1 0 0010.414 5H16a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V5z" stroke="currentColor" stroke-width="1.5" fill="none"></path><line x1="10" y1="8" x2="10" y2="14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line><line x1="7" y1="11" x2="13" y2="11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line></svg> <span> </span></h3> <div class="space-y-1.5"><label for="new-folder-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-folder-name" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 text-sm text-gray-600 dark:text-gray-300 font-mono truncate"> </span> <button class="text-xs px-2 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0"> </button></div> <!></div> <div class="space-y-1"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 truncate"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function Rm(e,t){Ge(t,!0);let n=F(``),r=F(null),i=F(null),a=F(``),o=F(``),s=F(`/ (root)`),c=F(!1),l=F(``),u=F(L([])),d=F(!1),f=F(!1),p=F(``),m=F(!1),h=F(null),g=!1;On(()=>{t.open&&!g?(g=!0,_()):t.open||(g=!1)});async function _(){try{I(n,(await fetch(`/api/config`).then(e=>e.json())).docsFolder||``,!0)}catch{I(n,``)}let e=``;if($.currentDocId){let t=decodeURIComponent($.currentDocId);if(!t.startsWith(`/`)){let n=t.split(`/`);n.length>1&&(e=n.slice(0,-1).join(`/`))}}I(a,e?H(n)+`/`+e:H(n),!0),I(r,H(a),!0),I(i,null),I(o,``),I(s,e?`/`+e:`/ (root)`,!0),I(c,!1),I(p,``),I(m,!1),setTimeout(()=>H(h)?.focus(),50)}let v=P(()=>{let e=H(o).trim();if(!e)return Y(`modal.new_folder.enter_name`);let t=H(a)||H(n),r=t.startsWith(H(n))?t.slice(H(n).length).replace(/^\//,``):``;return(r?r+`/`:``)+e});function y(){I(c,!H(c)),H(c)&&b(H(r)||H(n))}async function b(e){I(d,!0),I(f,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(r,t.current,!0),I(i,t.parent,!0),I(a,t.current,!0),I(l,t.current,!0),I(s,(t.current.startsWith(H(n)+`/`)?t.current.slice(H(n).length):t.current===H(n)?``:t.current)||`/ (root)`,!0),I(u,t.dirs||[],!0)}catch{I(f,!0),I(u,[],!0)}finally{I(d,!1)}}let x=P(()=>H(r)===H(n));function S(){H(i)&&b(H(i))}async function C(){let e=H(o).trim();if(I(p,``),!e){I(p,Y(`modal.new_folder.error_empty`),!0);return}if(!/^[a-zA-Z0-9_\-. ]+$/.test(e)){I(p,Y(`modal.new_folder.error_invalid_chars`),!0);return}let r=H(a)||H(n);if(r===H(n)&&(e===`files`||e===`images`)){I(p,Y(`modal.new_folder.error_reserved`),!0);return}let i=r.endsWith(`/`)?r+e:r+`/`+e;I(m,!0);try{let e=await fetch(`/api/browse/mkdir`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:i})});if(!e.ok)throw Error(await e.text());t.onclose(),t.onsuccess()}catch(e){I(m,!1),I(p,Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}}var w=Ur(),T=z(w),E=e=>{var n=Lm(),r=R(n),i=R(r),a=B(R(i),2),g=R(a,!0);N(a),N(i);var _=B(i,2),w=R(_),T=R(w,!0);N(w);var E=B(w,2);Ei(E),Li(E,e=>I(h,e),()=>H(h)),N(_);var D=B(_,2),ee=R(D),O=R(ee,!0);N(ee);var te=B(ee,2),k=R(te),ne=R(k,!0);N(k);var re=B(k,2),ie=R(re,!0);N(re),N(te);var ae=B(te,2),oe=e=>{var t=Fm(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),p=e=>{var t=jm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.loading`)]),G(e,t)},m=e=>{var t=Mm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`modal.new_folder.error_loading`)]),G(e,t)},h=e=>{var t=Nm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`modal.new_folder.no_subfolders`)]),G(e,t)},g=e=>{var t=Ur();$r(z(t),17,()=>H(u),e=>e.path,(e,t)=>{var n=Pm(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>b(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(d)?e(p):H(f)?e(m,1):H(u).length===0?e(h,2):e(g,-1)}),N(s),N(t),V(e=>{r.disabled=H(x),K(i,e),K(o,H(l))},[()=>Y(`common.up`)]),U(`click`,r,S),G(e,t)};q(ae,e=>{H(c)&&e(oe)}),N(D);var se=B(D,2),ce=R(se),le=R(ce,!0);N(ce);var ue=B(ce,2),de=R(ue,!0);N(ue),N(se);var fe=B(se,2),pe=e=>{var t=Im(),n=R(t,!0);N(t),V(()=>K(n,H(p))),G(e,t)};q(fe,e=>{H(p)&&e(pe)});var me=B(fe,2),he=R(me),ge=R(he,!0);N(he);var _e=B(he,2),ve=R(_e,!0);N(_e),N(me),N(r),N(n),V((e,t,n,r,i,a,o,c)=>{K(g,e),K(T,t),J(E,`placeholder`,n),K(O,r),K(ne,H(s)),K(ie,i),K(le,a),K(de,H(v)),K(ge,o),_e.disabled=H(m),K(ve,c)},[()=>Y(`modal.new_folder.title`),()=>Y(`modal.new_folder.name_label`),()=>Y(`modal.new_folder.name_placeholder`),()=>Y(`modal.new_folder.location_label`),()=>Y(`modal.new_folder.browse_btn`),()=>Y(`modal.new_folder.will_be_created`),()=>Y(`common.cancel`),()=>H(m)?Y(`modal.new_folder.creating_btn`):Y(`modal.new_folder.create_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),Mi(E,()=>H(o),e=>I(o,e)),U(`click`,re,y),U(`click`,he,function(...e){t.onclose?.apply(this,e)}),U(`click`,_e,C),G(e,n)};q(T,e=>{t.open&&e(E)}),G(e,w),Ke()}Nr([`click`]);var zm=W(`<option></option>`),Bm=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),Vm=W(`<p class="px-3 py-4 text-xs text-red-400 text-center"> </p>`),Hm=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),Um=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button>`),Wm=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-40 overflow-y-auto"><!></div> <div class="border-t border-gray-200 dark:border-gray-700 flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800/50"><input type="text" class="flex-1 px-2 py-1 text-xs rounded border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-blue-400"/> <button class="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors shrink-0"> </button></div></div>`),Gm=W(`<p class="text-xs text-red-500"> </p>`),Km=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-lg mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50">&#10133; <span> </span></h3> <div class="space-y-1.5"><label for="new-doc-title" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-title" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label for="new-doc-category" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-category" type="text" list="new-doc-category-options" autocomplete="off" placeholder="GENERAL" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <datalist id="new-doc-category-options"></datalist></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 px-3 py-2 text-xs rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-500 dark:text-gray-400 font-mono truncate"> </span> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">&#128193; <span> </span></button></div> <!></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 font-mono text-gray-600 dark:text-gray-300 break-all"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function qm(e,t){Ge(t,!0);let n=F(``),r=F(`YYYY_MM_DD_HH_mm_[Category]_title`),i=F(null),a=F(null),o=F(``),s=F(``),c=F(``),l=F(`/ (root)`),u=F(!1),d=F(``),f=F(L([])),p=F(!1),m=F(!1),h=F(``),g=F(L([])),_=F(``),v=F(!1),y=F(null);function b(e){return(e||``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toUpperCase().replace(/[^A-Z0-9_-]/g,``)}function x(e){let t=H(n);return e===t?``:e.startsWith(t+`/`)?e.slice(t.length+1):e}let S=!1;On(()=>{t.open&&!S?(S=!0,C()):t.open||(S=!1)});async function C(){try{let e=await fetch(`/api/config`).then(e=>e.json());I(n,e.docsFolder||``,!0),I(r,e.filenamePattern||`YYYY_MM_DD_HH_mm_[Category]_title`,!0)}catch{I(n,``),I(r,`YYYY_MM_DD_HH_mm_[Category]_title`)}let e=$.currentDocId&&$.allDocs.find(e=>e.id===$.currentDocId),t=b(e&&e.category||`General`)||`GENERAL`,d=``;if($.currentDocId){let e=decodeURIComponent($.currentDocId);if(!e.startsWith(`/`)){let t=e.split(`/`);t.length>1&&(d=t.slice(0,-1).join(`/`))}}let f=d?H(n)+`/`+d:``;I(o,d,!0),I(i,f||null,!0),I(a,null),w(),I(s,``),I(c,t,!0),I(l,d?`/`+d:`/ (root)`,!0),I(u,!1),I(h,``),I(_,``),I(v,!1),setTimeout(()=>H(y)?.focus(),50)}function w(){let e=new Set;($.allDocs||[]).forEach(t=>{let n=b(t.category||``);n&&e.add(n)}),I(g,Array.from(e).sort((e,t)=>e.localeCompare(t)),!0)}function T(){let e=b(H(c));H(c)!==e&&I(c,e,!0)}let E=P(()=>{let e=H(s).trim();if(!e)return Y(`modal.new_doc.title_placeholder`);let t=b(H(c))||`GENERAL`,n=new Date,i=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,`0`),l=String(n.getDate()).padStart(2,`0`),u=String(n.getHours()).padStart(2,`0`),d=String(n.getMinutes()).padStart(2,`0`),f=e.toLowerCase().replace(/\s+/g,`_`).replace(/[^a-z0-9_]/g,``).replace(/_+/g,`_`).replace(/^_|_$/g,``)||`document`,p=H(r).replace(`YYYY`,String(i)).replace(`MM`,a).replace(`DD`,l).replace(`HH`,u).replace(`mm`,d).replace(/\[Category\]/i,`[${t}]`).replace(/(?<![a-z0-9])(?:title_words|title)(?![a-z0-9])/i,f)+`.md`;return H(o)?H(o)+`/`+p:p});function D(){I(u,!H(u)),H(u)&&ee(H(i)||H(n))}async function ee(e){I(p,!0),I(m,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(i,t.current,!0),I(a,t.parent,!0),I(o,x(t.current),!0),I(d,t.current,!0),I(l,H(o)?`/`+H(o):`/ (root)`,!0),I(f,t.dirs||[],!0)}catch{I(m,!0),I(f,[],!0)}finally{I(p,!1)}}let O=P(()=>H(i)===H(n));function te(){H(i)!==H(n)&&H(a)&&ee(H(a))}function k(){let e=H(h).trim();if(!e)return;let t=H(i)||H(n);if(t===H(n)&&(e===`files`||e===`images`)){I(_,Y(`modal.new_folder.error_reserved`),!0);return}I(_,``);let r=(x(t)?x(t)+`/`:``)+e;I(o,r),I(l,`/`+r),I(h,``)}async function ne(){let e=H(s).trim(),n=b(H(c))||`GENERAL`;if(!e){I(_,Y(`modal.new_doc.error_empty_title`),!0);return}I(_,``),I(v,!0);try{let r=await fetch(`/api/documents`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:e,category:n,folder:H(o)})});if(!r.ok){let e=await r.json();throw Error(e.error||`Creation failed`)}let i=await r.json();t.onclose(),t.onsuccess(i.id)}catch(e){I(_,Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e))),I(v,!1)}}function re(e){e.key===`Enter`&&ne(),e.key===`Escape`&&t.onclose()}var ie=Ur(),ae=z(ie),oe=e=>{var n=Km(),r=R(n),i=R(r),a=B(R(i)),o=R(a,!0);N(a),N(i);var b=B(i,2),x=R(b),S=R(x,!0);N(x);var C=B(x,2);Ei(C),Li(C,e=>I(y,e),()=>H(y)),N(b);var w=B(b,2),ie=R(w),ae=R(ie,!0);N(ie);var oe=B(ie,2);Ei(oe);var se=B(oe,2);$r(se,20,()=>H(g),e=>e,(e,t)=>{var n=zm(),r={};V(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),G(e,n)}),N(se),N(w);var ce=B(w,2),le=R(ce),ue=R(le,!0);N(le);var de=B(le,2),fe=R(de),pe=R(fe,!0);N(fe);var me=B(fe,2),he=B(R(me)),ge=R(he,!0);N(he),N(me),N(de);var _e=B(de,2),ve=e=>{var t=Wm(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),l=e=>{var t=Bm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.loading`)]),G(e,t)},u=e=>{var t=Vm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.cannot_read_dir`)]),G(e,t)},g=e=>{var t=Hm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`modal.new_doc.no_subfolders`)]),G(e,t)},_=e=>{var t=Ur();$r(z(t),17,()=>H(f),e=>e.path,(e,t)=>{var n=Um(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>ee(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(p)?e(l):H(m)?e(u,1):H(f).length===0?e(g,2):e(_,-1)}),N(s);var v=B(s,2),y=R(v);Ei(y);var b=B(y,2),x=R(b,!0);N(b),N(v),N(t),V((e,t,n)=>{r.disabled=H(O),K(i,`↑ ${e??``}`),K(o,H(d)),J(y,`placeholder`,t),K(x,n)},[()=>Y(`common.up`),()=>Y(`modal.new_doc.new_folder_placeholder`),()=>Y(`modal.new_doc.create_folder_btn`)]),U(`click`,r,te),U(`keydown`,y,e=>{e.key===`Enter`&&k()}),Mi(y,()=>H(h),e=>I(h,e)),U(`click`,b,k),G(e,t)};q(_e,e=>{H(u)&&e(ve)}),N(ce);var ye=B(ce,2),be=R(ye),xe=R(be,!0);N(be);var Se=B(be,2),Ce=R(Se,!0);N(Se),N(ye);var we=B(ye,2),Te=e=>{var t=Gm(),n=R(t,!0);N(t),V(()=>K(n,H(_))),G(e,t)};q(we,e=>{H(_)&&e(Te)});var A=B(we,2),Ee=R(A),De=R(Ee,!0);N(Ee);var Oe=B(Ee,2),ke=R(Oe,!0);N(Oe),N(A),N(r),N(n),V((e,t,n,r,i,a,s,c,u)=>{K(o,e),K(S,t),J(C,`placeholder`,n),K(ae,r),K(ue,i),K(pe,H(l)),K(ge,a),K(xe,s),K(Ce,H(E)),K(De,c),Oe.disabled=H(v),K(ke,u)},[()=>Y(`modal.new_doc.title`),()=>Y(`modal.new_doc.title_label`),()=>Y(`modal.new_doc.title_placeholder`),()=>Y(`modal.new_doc.category_label`),()=>Y(`modal.new_doc.location_label`),()=>Y(`modal.new_doc.browse_btn`),()=>Y(`modal.new_doc.filename_label`),()=>Y(`common.cancel`),()=>H(v)?Y(`modal.new_folder.creating_btn`):Y(`common.create`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),U(`keydown`,C,re),Mi(C,()=>H(s),e=>I(s,e)),U(`input`,oe,T),U(`keydown`,oe,re),Mi(oe,()=>H(c),e=>I(c,e)),U(`click`,me,D),U(`click`,Ee,function(...e){t.onclose?.apply(this,e)}),U(`click`,Oe,ne),G(e,n)};q(ae,e=>{t.open&&e(oe)}),G(e,ie),Ke()}Nr([`click`,`keydown`,`input`]);var Jm=W(`<p class="text-sm text-gray-400 py-2"> </p>`),Ym=W(`<p class="text-sm text-red-500"> </p>`),Xm=W(`<label class="flex items-center gap-3 px-1 py-1.5 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer"><input type="checkbox" class="w-4 h-4 rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500"/> <span class="text-sm text-gray-700 dark:text-gray-300"> </span></label>`),Zm=W(`<div><div class="max-h-48 overflow-y-auto space-y-0.5 border border-gray-200 dark:border-gray-700 rounded-lg p-2"><!></div></div>`),Qm=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),$m=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg border border-blue-500 text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 font-semibold transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),eh=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><i class="fa-solid fa-file-export mr-2 text-blue-500"></i> <span> </span></h3> <div class="flex gap-0 border-b border-gray-200 dark:border-gray-700"><button> </button> <button> </button> <button> </button></div> <!> <!> <!> <!></div></div>`);function th(e,t){Ge(t,!0);let n=F(`markdown`),r=!1,i=F(!1),a=F(!1),o=F(L([])),s=F(L({})),c=F(!1),l=F(!1),u=F(!1),d=F(!1),f=!1;On(()=>{t.open&&!f?(f=!0,I(n,`markdown`),r=!1,I(o,[],!0),I(s,{},!0)):t.open||(f=!1)});function p(e){return String(e??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function m(e){I(n,e,!0),e===`html`&&h()}async function h(){if(!r){I(i,!0),I(a,!1);try{let e=await fetch(`/api/documents`).then(e=>e.json()),t=new Set;e.forEach(e=>t.add(e.folder?.[0]??e.category??`General`)),I(o,[...t].sort((e,t)=>e===`General`?-1:t===`General`?1:e.localeCompare(t)),!0),r=!0}catch{I(a,!0)}finally{I(i,!1)}}}async function g(){I(c,!0);try{let e=await fetch(`/api/export/markdown`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`});if(!e.ok)throw Error(await e.text());let n=await e.blob(),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`export-markdown.zip`,i.click(),URL.revokeObjectURL(r),t.onclose()}catch(e){alert(Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(c,!1)}}async function _(e){let n=H(o).filter(e=>H(s)[e]);if(n.length){I(e===`confluence`?u:l,!0);try{let r=await fetch(`/api/export/html`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folders:n,mode:e})});if(!r.ok)throw Error(await r.text());let i=await r.blob(),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=`export-${e}.zip`,o.click(),URL.revokeObjectURL(a),t.onclose()}catch(e){alert(Y(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(u,!1),I(l,!1)}}}async function v(){I(d,!0);try{let e=$.allDocs&&$.allDocs.length?$.allDocs:await fetch(`/api/documents`).then(e=>e.json()),n={};for(let t=0;t<e.length;t+=5){let r=e.slice(t,t+5),i=await Promise.all(r.map(e=>fetch(`/api/documents/`+e.id).then(e=>e.ok?e.json():null).catch(()=>null)));for(let r of i)r&&(n[r.id??e[t]?.id]=r);r.forEach((e,t)=>{i[t]&&(n[e.id]=i[t])})}function r(e){let t={categories:{},children:{}};for(let n of e){let e=t;for(let t of n.folder||[])e.children[t]||(e.children[t]={categories:{},children:{}}),e=e.children[t];e.categories[n.category]||(e.categories[n.category]=[]),e.categories[n.category].push(n)}return t}function i(e){let t=[];e.categories.General&&t.push(...e.categories.General);let n=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let r of n)t.push(...i(e.children[r]));let r=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let n of r)t.push(...e.categories[n]);return t}function a(e){return e.replace(/^\d+_/,``).replace(/[_-]+/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function o(e,t){let n=``,r=t*1.25,i=(e,i)=>{let a=t===0&&e===`General`?`General`:e;n+=`<li style="margin-left:${r}rem;margin-top:${t===0?`0.75`:`0.4`}rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#6b7280;">${a}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`;for(let e of i)n+=`<li style="margin-left:${r+.75}rem;padding:0.15rem 0;">`,n+=`<a href="#doc-${e.id}" style="color:#1d4ed8;text-decoration:none;font-size:0.875rem;">${p(e.title)}</a>`,e.formattedDate&&(n+=`<span style="color:#9ca3af;font-size:0.7rem;margin-left:0.5rem;">${p(e.formattedDate)}</span>`),n+=`</li>`;n+=`</ul></li>`};e.categories.General&&i(`General`,e.categories.General);let s=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let i of s)n+=`<li style="margin-left:${r}rem;margin-top:0.75rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#7c3aed;">&#128193; ${a(i)}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`,n+=o(e.children[i],t+1),n+=`</ul></li>`;let c=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let t of c)i(t,e.categories[t]);return n}function s(e){return e.replace(/href="[^"]*\?doc=([^"&#]+)(?:#[^"]*)?"/g,(e,t)=>`href="#doc-${t}"`)}let c=p(document.title||`Living Documentation`),l=r(e),u=i(l),d=`<!DOCTYPE html>
92
92
  <html>
93
93
  <head>
94
94
  <meta charset="UTF-8">
@@ -131,13 +131,13 @@ Texte`};case`link`:return{text:Ce(`snip-link-text`),textFallback:Y(`snippet.link
131
131
  setTimeout(() => window.print(), 800);
132
132
  <\/script>
133
133
  </body>
134
- </html>`,f=window.open(``,`_blank`);if(!f){alert(Y(`error.pdf_popup`));return}f.document.write(d),f.document.close(),t.onclose()}catch(e){alert(Y(`error.pdf_export`)+(e instanceof Error?e.message:String(e)))}finally{I(d,!1)}}let y=`px-4 py-2 text-sm border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 font-semibold transition-colors`,b=`px-4 py-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors`;var x=Ur(),S=z(x),C=e=>{var r=Qm(),f=R(r),p=R(f),h=B(R(p),2),x=R(h,!0);N(h),N(p);var S=B(p,2),C=R(S),w=R(C,!0);N(C);var T=B(C,2),E=R(T,!0);N(T);var D=B(T,2),ee=R(D,!0);N(D),N(S);var O=B(S,2),te=e=>{var t=Ym(),n=R(t),r=R(n),c=e=>{var t=Km(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.loading`)]),G(e,t)},l=e=>{var t=qm(),n=R(t);N(t),V(e=>K(n,`${e??``}failed to load folders`),[()=>Y(`common.error_prefix`)]),G(e,t)},u=e=>{var t=Ur();$r(z(t),16,()=>H(o),e=>e,(e,t)=>{var n=Jm(),r=R(n);Ei(r);var i,a=B(r,2),o=R(a,!0);N(a),N(n),V(()=>{i!==(i=t)&&(r.value=(r.__value=t)??``),K(o,t)}),Ni(r,()=>H(s)[t],e=>H(s)[t]=e),G(e,n)}),G(e,t)};q(r,e=>{H(i)?e(c):H(a)?e(l,1):e(u,-1)}),N(n),N(t),G(e,t)};q(O,e=>{H(n)===`html`&&e(te)});var k=B(O,2),ne=e=>{var n=Xm(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var l=B(o,2),u=R(l,!0);N(l),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),l.disabled=H(c),K(u,n)},[()=>Y(`modal.export.markdown_hint`),()=>Y(`common.cancel`),()=>H(c)?`⏳`:Y(`modal.export.markdown_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,l,g),G(e,n)};q(k,e=>{H(n)===`markdown`&&e(ne)});var re=B(k,2),ie=e=>{var n=Zm(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),d=R(c,!0);N(c);var f=B(c,2),p=R(f,!0);N(f),N(a),N(n),V((e,t,n,r)=>{K(i,e),K(s,t),c.disabled=H(l),K(d,n),f.disabled=H(u),K(p,r)},[()=>Y(`modal.export_html.hint`),()=>Y(`common.cancel`),()=>H(l)?`⏳`:Y(`modal.export_html.notion_btn`),()=>H(u)?`⏳`:Y(`modal.export_html.confluence_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,()=>_(`notion`)),U(`click`,f,()=>_(`confluence`)),G(e,n)};q(re,e=>{H(n)===`html`&&e(ie)});var ae=B(re,2),oe=e=>{var n=Xm(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),c.disabled=H(d),K(l,n)},[()=>Y(`modal.export.pdf_hint`),()=>Y(`common.cancel`),()=>H(d)?`⏳`:Y(`modal.export.pdf_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,v),G(e,n)};q(ae,e=>{H(n)===`pdf`&&e(oe)}),N(f),N(r),V((e,t,r,i)=>{K(x,e),hi(C,1,li(H(n)===`markdown`?y:b)),K(w,t),hi(T,1,li(H(n)===`html`?y:b)),K(E,r),hi(D,1,li(H(n)===`pdf`?y:b)),K(ee,i)},[()=>Y(`modal.export.title`),()=>Y(`modal.export.tab_markdown`),()=>Y(`modal.export.tab_html`),()=>Y(`modal.export.tab_pdf`)]),U(`click`,r,e=>{e.target===e.currentTarget&&t.onclose()}),U(`click`,C,()=>m(`markdown`)),U(`click`,T,()=>m(`html`)),U(`click`,D,()=>m(`pdf`)),G(e,r)};q(S,e=>{t.open&&e(C)}),G(e,x),Ke()}Nr([`click`]);var eh=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),th=W(`<p> </p>`),nh=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),rh=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-gray-500 dark:text-gray-400"><span class="shrink-0 opacity-40">&#128196;</span> <span class="truncate font-mono"> </span></span> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),ih=W(`<div class="border-t border-gray-200 dark:border-gray-700"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0">&#8593; Up</button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-52 overflow-y-auto"><!></div></div>`),ah=W(`<label class="flex items-center gap-1.5 text-xs text-gray-700 dark:text-gray-300 cursor-pointer"><input type="checkbox"/> </label>`),oh=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Exclude this folder" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 px-3 py-2 text-sm transition-opacity">⊖</button></div>`),sh=W(`<button class="w-full px-3 py-2 text-xs text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-950/30 text-left font-medium border-t border-gray-100 dark:border-gray-800">&#10003; Select: <span class="font-mono"> </span></button>`),ch=W(`<!> <!>`,1),lh=W(`<div> </div>`),uh=W(`<div> </div> <div> </div> <div> </div> <!>`,1),dh=W(`<div role="button" tabindex="0" class="flex items-center gap-2 px-3 py-1 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors"><span class="text-gray-400 dark:text-gray-600 w-5 text-right shrink-0 tabular-nums text-xs"></span> <div class="flex-1 min-w-0"><div class="flex items-center justify-between gap-1"><span class="text-gray-800 dark:text-gray-200 font-medium truncate text-xs"> </span> <span class="text-gray-400 dark:text-gray-600 tabular-nums shrink-0 text-xs"> </span></div> <div class="h-1 bg-gray-100 dark:bg-gray-800 rounded-full mt-0.5"><div class="h-1 bg-blue-400 dark:bg-blue-600 rounded-full"></div></div></div></div>`),fh=W(`<div class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 text-xs text-gray-500 dark:text-gray-400 space-y-0.5 border-b border-gray-100 dark:border-gray-800"><!></div> <div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center gap-2"><span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 cursor-help"> </span> <input type="number" min="1" max="20" class="w-12 px-1.5 py-0.5 text-xs rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-800 dark:text-gray-200 focus:outline-none"/> <button class="text-xs text-blue-600 dark:text-blue-400 hover:underline"> </button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto"></div></div>`),ph=W(`<p class="absolute inset-0 flex items-center justify-center text-gray-400 dark:text-gray-500 text-sm animate-pulse"> </p>`),mh=W(`<div class="flex items-center gap-1 group py-0.5"><span class="text-gray-600 dark:text-gray-400 break-all font-mono flex-1 text-xs"> </span> <button title="Exclude this file" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 text-xs leading-none px-1 transition-opacity">⊖</button></div>`),hh=W(`<div class="text-gray-400 text-center py-2">—</div>`),gh=W(`<div class="w-80 shrink-0 border-l border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between"><span class="font-bold text-sm text-gray-900 dark:text-gray-100"> </span> <button class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 text-xs leading-none">✕</button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto px-3 py-1 space-y-1 text-xs"><!></div></div>`),_h=W(`<div class="fixed inset-0 z-50 flex flex-col bg-white dark:bg-gray-950"><div class="flex items-center justify-between px-6 h-14 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><h2 class="font-semibold text-base"> </h2> <button class="text-sm px-3 py-1.5 rounded-lg text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"> </button></div> <div class="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><div class="flex items-center gap-3 px-6 py-3"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </label> <input type="text" readonly="" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono cursor-default focus:outline-none"/> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">&#128193; <span> </span></button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors shrink-0"> </button></div> <div class="flex items-start gap-3 px-6 pb-2"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0 pt-1.5"> </label> <textarea rows="3" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-1 focus:ring-blue-400 resize-y"></textarea> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">&#128193; <span> </span></button></div> <!> <div class="flex items-center gap-x-4 gap-y-2 px-6 pb-3 flex-wrap"><span class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </span> <label class="flex items-center gap-1.5 text-xs font-medium text-blue-600 dark:text-blue-400 cursor-pointer shrink-0"><input type="checkbox"/> </label> <!></div> <!></div> <div class="flex-1 overflow-hidden flex"><!> <div class="flex-1 relative overflow-hidden"><!> <canvas style="position: absolute; inset: 0"></canvas></div> <!></div></div>`);function vh(e,t){Ge(t,!0);let n=new Set(`the.a.an.and.or.but.not.nor.so.yet.both.either.neither.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.shall.should.may.might.can.could.must.need.dare.ought.used.to.of.in.for.on.with.at.by.from.up.about.into.through.during.before.after.above.below.between.out.off.over.under.again.further.then.once.here.there.when.where.why.how.all.each.few.more.most.other.some.such.no.only.own.same.than.too.very.just.also.still.already.always.never.often.sometimes.usually.this.that.these.those.its.your.our.their.his.her.him.she.you.they.we.me.my.it.who.which.what.whose.whom.if.though.although.because.since.while.unless.until.whether.as.like.via.per.i.am.he.us.see.now.new.old.got.let.put.say.said.says.get.use.make.made.take.come.came.go.went.know.think.look.want.give.seem.back.down.even.much.well.good.work.tell.keep.hold.turn.move.play.live.help.run.start.off.way.too.few.show.hear.etc.eg.ie.one.two.three.four.five.six.seven.eight.nine.ten.le.la.les.un.une.des.du.de.d.l.au.aux.ce.ci.cet.cette.ces.mon.ma.mes.ton.ta.tes.son.sa.ses.notre.nos.votre.vos.leur.leurs.je.tu.il.elle.on.nous.vous.ils.elles.me.te.se.lui.y.en.qui.que.quoi.dont.où.et.ou.mais.donc.or.ni.car.si.ne.pas.plus.moins.très.bien.mal.peu.beaucoup.trop.assez.aussi.comme.pour.par.avec.sans.dans.sur.sous.entre.vers.chez.contre.avant.après.pendant.depuis.selon.malgré.sauf.est.sont.était.être.avoir.fait.faire.dit.dire.peut.pouvoir.doit.devoir.veut.vouloir.sait.savoir.va.aller.vient.venir.tout.tous.toute.toutes.autre.autres.même.chaque.quel.quelle.quels.quelles.aucun.aucune.certain.certaine.plusieurs.quelque.quelques.tel.telle.tels.telles.cela.ceci.ça.celui.celle.ceux.celles.ici.voici.voilà.alors.ainsi.encore.déjà.jamais.toujours.souvent.parfois.rien.personne.chose.fois.jour.temps.part.cas.point.lieu.monde.cependant.néanmoins.pourtant.toutefois.quand.lorsque.puisque.parce.afin.puis.lors.notamment.surtout.seulement.vraiment.enfin.ensuite.ailleurs.là.ici.voici.voilà.dont.lequel.laquelle.lesquels.lesquelles`.split(`.`)),r=new Set(`public.private.protected.static.void.class.interface.abstract.final.const.let.var.function.return.if.else.for.while.do.switch.case.break.continue.try.catch.throw.throws.finally.new.this.self.super.import.export.from.package.module.require.include.using.namespace.struct.enum.trait.impl.fn.def.func.fun.val.mut.async.await.yield.lambda.extends.implements.override.virtual.sealed.data.object.companion.where.when.match.guard.defer.go.chan.select.type.alias.as.is.in.of.with.true.false.null.nil.none.undefined.println.printf.fmt.log.print.main.args.argv.init.setup.teardown.describe.test.expect.assert.before.after.not.and.or.delete.typeof.instanceof.readonly.keyof.infer.never.unknown.declare.satisfies.get.set.add.remove.update.create.find.fetch.load.save.put.post.patch.list.map.filter.reduce.sort.merge.parse.format.convert.transform.validate.check.handle.process.execute.start.stop.reset.clear.close.open.read.write.send.receive.emit.trigger.dispatch.subscribe.unsubscribe.listen.notify.register.unregister.bind.apply.call.invoke.callback.handler.listener.middleware.interceptor.resolver.provider.consumer.producer.builder.factory.adapter.wrapper.proxy.decorator.observer.visitor.strategy.command.controller.service.repository.dao.dto.entity.model.schema.config.context.state.store.action.reducer.selector.hook.ref.effect.memo.component.module.plugin.extension.util.utils.helper.helpers.common.shared.base.default.index.app.core.lib.src.test.spec.mock.stub.fixture.impl.internal.api.sdk.client.server.request.response.status.code.error.exception.message.result.data.value.key.name.label.title.description.item.element.node.child.parent.root.container.wrapper.layout.view.page.screen.panel.header.footer.sidebar.navbar.body.content.section.row.col.column.grid.flex.block.inline.span.div.input.output.param.params.arg.option.options.props.attr.attrs.field.fields.property.properties.method.methods.string.number.boolean.integer.float.double.long.short.byte.char.array.object.map.set.list.vector.queue.stack.hash.table.tree.graph.pair.tuple.optional.nullable.void.unit.any.bool.bytes.none.int.str.bool.all.each.every.some.many.single.multi.first.last.next.prev.previous.current.old.temp.tmp.new.top.bottom.left.right.center.middle.start.end.begin.min.max.count.total.sum.avg.size.length.width.height.depth.flag.num.idx.id.uid.uuid.num.str.val.obj.arr.fn.cb.ctx.req.res.err.msg.src.dst.evt.doc.db.io.fs.os.env.sys.http.https.url.uri.path.port.host.tcp.udp.ssl.tls.html.css.json.xml.yml.yaml.csv.sql.regex.utf.ascii.rgb.rgba.hex.px.em.rem.vh.vw.auto.inherit.initial.application.file.local.source.messages.logging.alerting.programmed.offset.offsets.zone.zoned.decimal.big.integer.constructor.mapper.captor.publisher.verify.subscriber.org.edr.ack.ref.ssr.ssg.csr.isr.mockito.junit.vitest.jest.mocha.rspec.pytest.cypress.playwright.captor.spy.given.then.verify.times.never.invocation.argumentcaptor.inorder.donothing.doreturn.ippon.springframework.jakarta.javax.todo.fixme.hack.note.deprecated.experimental.eslint.prettier.typescript.javascript.java.kotlin.python.golang.rust.csharp.swift.ruby.spring.boot.javax.jakarta.hibernate.lombok.gradle.maven.webpack.vite.react.angular.vue.svelte.nuxt.express.fastapi.flask.django.rails.fiber.gin.actix.tokio.asyncio.junit.jest.mocha.pytest.rspec.docker.kubernetes.aws.gcp.azure.terraform.ansible.nginx.apache.linux.nextjs.remix.astro.sveltekit.gatsby.nuxtjs.qwik.solid.vercel.netlify.cloudflare.supabase.firebase.mongodb.postgres.prisma.drizzle.typeorm.sequelize.mongoose.redis.neon.trpc.graphql.grpc.rest.openapi.swagger.zod.yup.valibot.tailwind.shadcn.radix.headless.chakra.mantine.antd.mui.tanstack.tanstackquery.zustand.jotai.recoil.redux.mobx.storybook.cypress.playwright.vitest.turbopack.turborepo.getserversideprops.getstaticprops.getstaticpaths.generatestaticparams.generatemetadata.serveraction.revalidate.notfound.redirect.permanentredirect.unstablecache.unstablenostore.cookies.headers.userouter.usepathname.usesearchparams.useparams.useformstate.useformstatus.useoptimistic.useserveraction.classname.onclick.onchange.onsubmit.onfocus.onblur.onkeydown.onkeyup.onmousedown.onmouseup.defaultvalue.htmlfor.tabindex.strokewidth.viewbox.fillopacity.strokeopacity.pathdata.children.fragment.portal.suspense.errorboundary.strictmode.createelement.createcontext.createref.forwardref.usestate.useeffect.useref.usecontext.usememo.usecallback.usereducer.useid.usetransition.usedeferredvalue.useimperativehandle.mutex.lock.thread.goroutine.coroutine.channel.buffer.stream.pipe.observable.promise.future.completable.deferred.disposable.lifecycle.scope.annotation.attribute.metadata.reflection.generic.template.macro.preprocessor.compiler.runtime.debug.release.production.development.staging.build.deploy.lint.coverage.report.the.and.for.are.but.not.you.all.this.that.with.have.from.they.will.been.can.has.was.its.our.their.more.also.when.what.about.which.would.into.than.then.each.just.over.after.such.here.some.were.very.only`.split(`.`));function i(e){return n.has(e)||r.has(e)||e.length<3||/^\d+$/.test(e)||/^[^a-z]/.test(e)}function a(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/([A-Z]+)([A-Z][a-z])/g,`$1 $2`).replace(/[_\-./]+/g,` `).toLowerCase().trim().split(/\s+/).filter(e=>e.length>=3)}function o(e){return e.toLowerCase().split(/[^a-zàâäéèêëïîôùûü]+/).filter(e=>e.length>=3)}let s=[{value:`adoc`,cat:`prose`},{value:`asciidoc`,cat:`prose`},{value:`asm`,cat:`code`},{value:`astro`,cat:`code`},{value:`avsc`,cat:`config`},{value:`bash`,cat:`code`},{value:`bat`,cat:`code`},{value:`bicep`,cat:`config`},{value:`c`,cat:`code`},{value:`cc`,cat:`code`},{value:`cfg`,cat:`config`},{value:`cjs`,cat:`code`},{value:`clj`,cat:`code`},{value:`cljs`,cat:`code`},{value:`cmake`,cat:`code`},{value:`cmd`,cat:`code`},{value:`conf`,cat:`config`},{value:`cpp`,cat:`code`},{value:`cql`,cat:`code`},{value:`cs`,cat:`code`},{value:`cshtml`,cat:`code`},{value:`css`,cat:`config`},{value:`cxx`,cat:`code`},{value:`dart`,cat:`code`},{value:`env`,cat:`config`},{value:`erb`,cat:`code`},{value:`erl`,cat:`code`},{value:`ex`,cat:`code`},{value:`exs`,cat:`code`},{value:`fish`,cat:`code`},{value:`fs`,cat:`code`},{value:`fsx`,cat:`code`},{value:`go`,cat:`code`},{value:`gql`,cat:`code`},{value:`gradle`,cat:`code`},{value:`graphql`,cat:`code`},{value:`groovy`,cat:`code`},{value:`h`,cat:`code`},{value:`hcl`,cat:`config`},{value:`hpp`,cat:`code`},{value:`hs`,cat:`code`},{value:`html`,cat:`config`},{value:`ini`,cat:`config`},{value:`java`,cat:`code`},{value:`jl`,cat:`code`},{value:`js`,cat:`code`},{value:`json`,cat:`config`},{value:`jsx`,cat:`code`,jsx:!0},{value:`kt`,cat:`code`},{value:`less`,cat:`config`},{value:`lua`,cat:`code`},{value:`m`,cat:`code`},{value:`md`,cat:`prose`,def:!0},{value:`mdx`,cat:`prose`},{value:`mjs`,cat:`code`},{value:`mk`,cat:`code`},{value:`ml`,cat:`code`},{value:`mli`,cat:`code`},{value:`mm`,cat:`code`},{value:`nim`,cat:`code`},{value:`php`,cat:`code`},{value:`pl`,cat:`code`},{value:`prisma`,cat:`code`},{value:`properties`,cat:`config`},{value:`proto`,cat:`code`},{value:`ps1`,cat:`code`},{value:`py`,cat:`code`},{value:`r`,cat:`code`},{value:`razor`,cat:`code`},{value:`rb`,cat:`code`},{value:`rs`,cat:`code`},{value:`rst`,cat:`prose`},{value:`s`,cat:`code`},{value:`scala`,cat:`code`},{value:`scss`,cat:`config`},{value:`sh`,cat:`code`},{value:`sol`,cat:`code`},{value:`sql`,cat:`code`},{value:`styl`,cat:`config`},{value:`svelte`,cat:`code`},{value:`swift`,cat:`code`},{value:`tex`,cat:`prose`},{value:`tf`,cat:`config`},{value:`tfvars`,cat:`config`},{value:`thrift`,cat:`code`},{value:`toml`,cat:`config`},{value:`ts`,cat:`code`},{value:`tsx`,cat:`code`,jsx:!0},{value:`txt`,cat:`prose`},{value:`v`,cat:`code`},{value:`vb`,cat:`code`},{value:`vue`,cat:`code`},{value:`xml`,cat:`config`},{value:`yaml`,cat:`config`},{value:`yml`,cat:`config`},{value:`zig`,cat:`code`},{value:`zsh`,cat:`code`}],c=new Set(s.filter(e=>e.cat===`prose`).map(e=>e.value)),l=new Set(s.filter(e=>e.cat===`code`).map(e=>e.value)),u=new Set(s.filter(e=>e.cat===`config`).map(e=>e.value)),d=new Set(s.filter(e=>e.jsx).map(e=>e.value));function f(e,t){let n=[];if(c.has(t)){let t=e.replace(/^\s*(import|export\s+\{[^}]*\}|export\s+\*|package|require|#include|from\s+['"][^'"]+['"]\s*(import)?)\b.*/gm,``).replace(/```[\s\S]*?```/g,` `).replace(/`[^`\n]+`/g,` `).replace(/!\[[^\]]*\]\([^)]*\)/g,` `).replace(/\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/https?:\/\/\S+/g,` `).replace(/[#*_~>`|!\[\](){}=+\-]/g,` `);n.push(...o(t))}else l.has(t)?(d.has(t)&&(e=e.replace(/<\/?[A-Z][A-Za-z0-9.]*[^>]*>/g,` `),e=e.replace(/<\/?(div|span|main|section|article|aside|nav|header|footer|form|input|button|select|option|textarea|table|thead|tbody|tr|td|th|ul|ol|li|a|img|p|h[1-6]|label|figure|figcaption|picture|video|audio|canvas|svg|path|circle|rect|g|defs|use|link|meta|head|html|body|script|style|br|hr|strong|em|code|pre|blockquote|small|sub|sup)\b[^>]*>/gi,` `),e=e.replace(/\b(className|onClick|onChange|onSubmit|onFocus|onBlur|onKeyDown|onKeyUp|onMouseDown|onMouseUp|htmlFor|tabIndex|strokeWidth|viewBox|fillOpacity|strokeOpacity|defaultValue|placeholder|disabled|checked|readOnly|required|multiple|autoFocus|autoComplete|type|href|src|alt|width|height|style|key|ref)\s*=/g,` =`)),e=e.replace(/^\s*(import\s+[\w.*{},\s'"@/-]+;?|from\s+['"][^'"]+['"]\s*;?|package\s+[\w.]+;?|namespace\s+[\w.]+;?|using\s+[\w.]+;?|require\s*\(?\s*['"][^'"]+['"]\s*\)?;?)\s*$/gm,``),e.replace(/(?:\/\/|#(?!.*[{}[\]<>])| -- )\s*(.+)$/gm,(e,t)=>(n.push(...o(t)),e)),e.replace(/\/\*[\s\S]*?\*\//g,e=>(n.push(...o(e)),e)),e.replace(/"""[\s\S]*?"""|'''[\s\S]*?'''/g,e=>(n.push(...o(e)),e)),e.replace(/["'`]([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ\s,.'éàèùâêîôûç]{3,})["'`]/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e))):u.has(t)&&(e.replace(/:\s*["']([^"']{3,})["']/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e)));return n.filter(e=>!i(e))}let p=F(``),m=F(``),h=F(1),g=F(``),_=F(!0),v=F(!1),y=F(L(s.map(e=>({value:e.value,label:`.`+e.value,checked:!!e.def}))));function b(){return H(y).filter(e=>e.checked).map(e=>e.value)}let x=P(()=>H(y).every(e=>e.checked)),S=F(null),C=F(null),w=F(0),T=F(null),E=F(L([])),D=F(L([])),ee=F(!1),O=F(``),te=F(0),k=F(L([]));function ne(){localStorage.setItem(`wc-exts`,JSON.stringify(b()))}function re(){let e=H(x);I(y,H(y).map(t=>({...t,checked:!e})),!0),ne()}function ie(){ne()}function ae(){return new Set((H(m)||``).split(/[\n,]/).map(e=>e.trim()).filter(Boolean))}function oe(e){let t=ae();t.has(e)||(t.add(e),I(m,[...t].join(`, `),!0),localStorage.setItem(`wc-exclude`,H(m)),H(de)&&ve(H(pe)),ce())}function se(){localStorage.setItem(`wc-exclude`,H(m)),H(de)&&ve(H(pe)),ce()}function ce(){H(ee)&&H(O)&&M(H(O))}function le(){H(S)&&je()}function ue(){let e=localStorage.getItem(`wc-root`);e&&(I(p,e,!0),I(Se,e,!0));let t=localStorage.getItem(`wc-exclude`);t&&I(m,t,!0);let n=localStorage.getItem(`wc-exts`);if(n)try{let e=JSON.parse(n);I(y,H(y).map(t=>({...t,checked:e.includes(t.value)})),!0)}catch{}}let de=F(!1),fe=F(null),pe=F(``),me=F(``),he=F(null),ge=F(``);function _e(){I(de,!H(de)),H(de)&&ve(H(pe)||H(p)||`/`)}async function ve(e){I(he,null),I(ge,`Loading…`);try{let t=await fetch(`/api/browse?all=1&path=`+encodeURIComponent(e)).then(e=>e.json());I(pe,t.current,!0),I(fe,t.parent,!0),I(me,t.current,!0);let n=H(p).trim(),r=(e,t)=>n&&e.startsWith(n+`/`)?e.slice(n.length+1):t,i=ae(),a=(t.dirs||[]).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`dir`,name:e.name,path:e.path,entry:r(e.path,e.name)})),o=b(),s=(t.files||[]).filter(e=>o.some(t=>e.name.endsWith(`.`+t))).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`file`,name:e.name,entry:r(e.path,e.name)})),c=[...a,...s];I(he,c,!0),I(ge,c.length?``:`Empty directory`,!0)}catch{I(he,[],!0),I(ge,`Cannot read directory`)}}function ye(){H(fe)&&ve(H(fe))}let be=F(!1),xe=F(null),Se=F(``),Ce=F(``),we=F(null),Te=F(``);function A(){I(be,!H(be)),H(be)&&Ee(H(Se)||H(p)||`/`)}async function Ee(e){I(we,null),I(Te,`Loading…`);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(Se,t.current,!0),I(xe,t.parent,!0),I(Ce,t.current,!0),I(we,(t.dirs||[]).map(e=>({name:e.name,path:e.path})),!0),I(Te,H(we).length?``:`No sub-folders`,!0)}catch{I(we,[],!0),I(Te,`Cannot read directory`)}}function De(){H(xe)&&Ee(H(xe))}function Oe(){I(p,H(Se),!0),localStorage.setItem(`wc-root`,H(Se)),I(be,!1),I(m,``),localStorage.removeItem(`wc-exclude`),I(pe,H(Se),!0)}let ke=F(null),Ae=F(null),j=F(!1);function je(){if(!H(S)||!H(C))return;let e=Math.max(1,H(h)||1),t=[...H(S).entries()].sort((e,t)=>t[1]-e[1]),n=t.filter(([t])=>(H(C).get(t)||new Set).size>=e).slice(0,150);if(!n.length){let n=t.length;I(g,n?`${n} domain word(s) found but none appear in ${e}+ file(s). Lower the "Min files" threshold to 1.`:`No domain words extracted. Try adding more file extensions or a broader folder.`,!0),I(_,!0),I(j,!1),I(v,!1);return}let r=[...H(S).keys()].filter(t=>(H(C).get(t)||new Set).size>=e).length;I(T,{scanned:H(w),unique:r,shown:n.length},!0);let i=n.slice(0,50),a=i[0][1];I(D,i.map(([e,t])=>({word:e,freq:t,pct:Math.round(t/a*100)})),!0),I(v,!0),I(_,!1);let o=document.documentElement.classList.contains(`dark`),s=o?[`#60a5fa`,`#34d399`,`#f9a8d4`,`#a78bfa`,`#fbbf24`,`#6ee7b7`,`#93c5fd`,`#fb923c`,`#4ade80`,`#f472b6`]:[`#1d4ed8`,`#047857`,`#7c3aed`,`#b45309`,`#be123c`,`#0369a1`,`#4338ca`,`#c2410c`,`#15803d`,`#9333ea`];requestAnimationFrame(()=>{if(!H(ke)||!H(Ae))return;let e=H(ke),t=H(Ae);e.width=Math.max(400,t.offsetWidth),e.height=Math.max(300,t.offsetHeight),e.style.width=e.width+`px`,e.style.height=e.height+`px`,I(j,!0);let n=Math.sqrt(e.width*e.height/(800*500)),r=Math.min(220,Math.round(72*n)),c=i.map(([e,t])=>[e,Math.max(12,Math.round(r*t/a))]);window.WordCloud?.(e,{list:c,gridSize:Math.round(4*e.width/1024),fontFamily:`ui-sans-serif, system-ui, sans-serif`,color:()=>s[Math.floor(Math.random()*s.length)],backgroundColor:o?`#030712`:`#ffffff`,rotateRatio:.2,minSize:6,shrinkToFit:!0,click:e=>M(e[0])})})}function M(e){if(!H(C)||!H(S))return;let t=[...H(C).get(e)||[]].sort(),n=H(S).get(e)||0;I(O,e,!0),I(te,n,!0),I(k,t,!0),I(ee,!0)}function Me(){I(ee,!1)}async function Ne(){let e=H(p).trim();if(!e){I(g,`Please select a root folder first.`),I(_,!0);return}let t=b();if(!t.length){I(g,`Please select at least one extension.`),I(_,!0);return}I(be,!1),I(v,!1),I(ee,!1),I(g,`Reading files…`),I(_,!0),I(j,!1);try{let n=H(m).trim(),r=n?n.split(/[\n,]/).map(e=>e.trim()).filter(Boolean):[];localStorage.setItem(`wc-exclude`,n);let i=new URLSearchParams({path:e});t.forEach(e=>i.append(`ext`,e)),r.forEach(e=>i.append(`exclude`,e));let a=await fetch(`/api/wordcloud?`+i);if(!a.ok){I(g,`Error: `+((await a.json()).error||a.statusText));return}let{files:o,fileTexts:s}=await a.json();I(g,`Analyzing ${o} file(s)…`);let c=new Map,l=new Map,u=new Set;I(w,o,!0);for(let{path:e,text:t}of s){let n=(e.split(`.`).pop()||``).toLowerCase();n&&u.add(n);let r=f(t,n),i=new Set;for(let t of r)c.set(t,(c.get(t)||0)+1),i.has(t)||(i.add(t),l.has(t)||l.set(t,new Set),l.get(t).add(e))}I(S,c,!0),I(C,l,!0),I(E,[...u].sort().map(e=>`.`+e),!0),je()}catch(e){I(g,`Error: `+e.message)}}let Pe=!1;On(()=>{t.open&&!Pe?(Pe=!0,I(g,`Choose a root folder and click Launch.`),I(_,!0),I(j,!1),I(v,!1),I(ee,!1),I(S,null),I(C,null),I(T,null),I(D,[],!0),I(be,!1),I(de,!1),I(h,1),ue(),H(p)||fetch(`/api/config`).then(e=>e.json()).then(e=>{e.docsFolder&&(I(p,e.docsFolder,!0),I(Se,e.docsFolder,!0))}).catch(()=>{})):t.open||(Pe=!1)});var Fe=Ur(),Ie=z(Fe),Le=e=>{var n=_h(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o),N(r);var c=B(r,2),l=R(c),u=R(l),d=R(u,!0);N(u);var f=B(u,2);Ei(f);var b=B(f,2),S=B(R(b)),C=R(S,!0);N(S),N(b);var w=B(b,2),ne=R(w,!0);N(w),N(l);var ae=B(l,2),ce=R(ae),ue=R(ce,!0);N(ce);var pe=B(ce,2);vn(pe);var Se=B(pe,2),je=B(R(Se)),Pe=R(je,!0);N(je),N(Se),N(ae);var Fe=B(ae,2),Ie=e=>{var t=ih(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=eh(),n=R(t,!0);N(t),V(()=>K(n,H(ge))),G(e,t)},l=e=>{var t=th(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(ge)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(ge))}),G(e,t)},u=e=>{var t=Ur();$r(z(t),17,()=>H(he),Yr,(e,t)=>{var n=Ur(),r=z(n),i=e=>{var n=nh(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>ve(H(t).path)),U(`click`,o,()=>oe(H(t).entry)),G(e,n)},a=e=>{var n=rh(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,o,()=>oe(H(t).entry)),G(e,n)};q(r,e=>{H(t).kind===`dir`?e(i):e(a,-1)}),G(e,n)}),G(e,t)};q(s,e=>{H(he)===null?e(c):H(he).length===0?e(l,1):e(u,-1)}),N(o),N(t),V(()=>{r.disabled=!H(fe),K(a,H(me))}),U(`click`,r,ye),G(e,t)};q(Fe,e=>{H(de)&&e(Ie)});var Le=B(Fe,2),Re=R(Le),ze=R(Re,!0);N(Re);var Be=B(Re,2),Ve=R(Be);Ei(Ve);var He=B(Ve);N(Be),$r(B(Be,2),17,()=>H(y),e=>e.value,(e,t,n)=>{var r=ah(),i=R(r);Ei(i);var a=B(i);N(r),V(()=>K(a,` ${H(t).label??``}`)),U(`change`,i,ie),Ni(i,()=>H(t).checked,e=>H(t).checked=e),G(e,r)}),N(Le);var Ue=B(Le,2),We=e=>{var t=ih(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=eh(),n=R(t,!0);N(t),V(()=>K(n,H(Te))),G(e,t)},l=e=>{var t=ch(),n=z(t),r=e=>{var t=th(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(Te)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(Te))}),G(e,t)},i=e=>{var t=Ur();$r(z(t),17,()=>H(we),Yr,(e,t)=>{var n=oh(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>Ee(H(t).path)),U(`click`,o,()=>oe(H(t).name)),G(e,n)}),G(e,t)};q(n,e=>{H(we).length===0?e(r):e(i,-1)});var a=B(n,2),o=e=>{var t=sh(),n=B(R(t)),r=R(n,!0);N(n),N(t),V(()=>K(r,H(Ce))),U(`click`,t,Oe),G(e,t)};q(a,e=>{H(Te)!==`Cannot read directory`&&e(o)}),G(e,t)};q(s,e=>{H(we)===null?e(c):e(l,-1)}),N(o),N(t),V(()=>{r.disabled=!H(xe),K(a,H(Ce))}),U(`click`,r,De),G(e,t)};q(Ue,e=>{H(be)&&e(We)}),N(c);var Ge=B(c,2),Ke=R(Ge),qe=e=>{var t=fh(),n=R(t),r=R(n),i=e=>{var t=uh(),n=z(t),r=R(n);N(n);var i=B(n,2),a=R(i);N(i);var o=B(i,2),s=R(o);N(o);var c=B(o,2),l=e=>{var t=lh(),n=R(t);N(t),V((e,r)=>{J(t,`title`,e),K(n,`${H(E).length??``} extension${H(E).length>1?`s`:``} found (${r??``})`)},[()=>H(E).join(`, `),()=>H(E).join(`, `)]),G(e,t)};q(c,e=>{H(E).length&&e(l)}),V(()=>{K(r,`${H(T).scanned??``} file(s) scanned`),K(a,`${H(T).unique??``} unique domain words`),K(s,`${H(T).shown??``} shown`)}),G(e,t)};q(r,e=>{H(T)&&e(i)}),N(n);var a=B(n,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2);Ei(c);var l=B(c,2),u=R(l,!0);N(l),N(a);var d=B(a,2),f=R(d,!0);N(d);var p=B(d,2);$r(p,21,()=>H(D),Yr,(e,t,n)=>{var r=dh(),i=R(r);i.textContent=n+1;var a=B(i,2),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(o);var d=B(o,2),f=R(d);N(d),N(a),N(r),V(()=>{K(c,H(t).word),K(u,H(t).freq),_i(f,`width:${H(t).pct??``}%`)}),U(`click`,r,()=>M(H(t).word)),G(e,r)}),N(p),N(t),V((e,t,n,r,i,a)=>{J(o,`title`,e),K(s,t),J(c,`title`,n),J(l,`title`,r),K(u,i),K(f,a)},[()=>Y(`wc.min_files_hint`),()=>Y(`wc.min_files_label`),()=>Y(`wc.min_files_hint`),()=>Y(`wc.apply_hint`),()=>Y(`wc.apply_btn`),()=>Y(`wc.top_words`)]),Mi(c,()=>H(h),e=>I(h,e)),U(`click`,l,le),G(e,t)};q(Ke,e=>{H(v)&&e(qe)});var Je=B(Ke,2),Ye=R(Je),Xe=e=>{var t=ph(),n=R(t,!0);N(t),V(()=>K(n,H(g))),G(e,t)};q(Ye,e=>{H(_)&&e(Xe)});var Ze=B(Ye,2);let Qe;Li(Ze,e=>I(ke,e),()=>H(ke)),N(Je),Li(Je,e=>I(Ae,e),()=>H(Ae));var $e=B(Je,2),et=e=>{var t=gh(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2);N(n);var o=B(n,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=e=>{var t=Ur();$r(z(t),17,()=>H(k),Yr,(e,t)=>{var n=mh(),r=R(n),i=R(r,!0);N(r);var a=B(r,2);N(n),V(()=>K(i,H(t))),U(`click`,a,()=>oe(H(t))),G(e,n)}),G(e,t)},d=e=>{G(e,hh())};q(l,e=>{H(k).length?e(u):e(d,-1)}),N(c),N(t),V(e=>{K(i,`${H(O)??``} ×${H(te)??``}`),K(s,e)},[()=>Y(`wc.found_in`)]),U(`click`,a,Me),G(e,t)};q($e,e=>{H(ee)&&e(et)}),N(Ge),N(n),V((e,t,n,r,i,o,c,l,u,f)=>{K(a,e),K(s,t),K(d,n),K(C,r),K(ne,i),K(ue,o),J(pe,`placeholder`,c),K(Pe,l),K(ze,u),Oi(Ve,H(x)),K(He,` ${f??``}`),Qe=hi(Ze,1,``,null,Qe,{hidden:!H(j)})},[()=>Y(`wc.title`),()=>Y(`wc.close_btn`),()=>Y(`wc.search_root_label`),()=>Y(`wc.browse_btn`),()=>Y(`wc.launch_btn`),()=>Y(`wc.exclude_label`),()=>Y(`wc.exclude_placeholder`),()=>Y(`wc.browse_btn`),()=>Y(`wc.extensions_label`),()=>Y(`wc.all_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),Mi(f,()=>H(p),e=>I(p,e)),U(`click`,b,A),U(`click`,w,Ne),U(`input`,pe,se),Mi(pe,()=>H(m),e=>I(m,e)),U(`click`,Se,_e),U(`change`,Ve,re),G(e,n)};q(Ie,e=>{t.open&&e(Le)}),G(e,Fe),Ke()}Nr([`click`,`input`,`change`]);var yh=W(`<button class="ghost-button"><i class="fa-solid fa-cloud"></i></button> <button title="Toggle dark mode" class="ghost-button" aria-label="Toggle dark mode"> </button>`,1),bh=W(`<div class="relative hidden sm:block"><input type="search" class="w-56 pl-8 pr-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="absolute left-2.5 top-2 text-gray-400 text-sm pointer-events-none">🔍</span></div>`),xh=W(`<p class="p-8 text-red-500"> </p>`),Sh=W(`<div class="h-full flex items-center justify-center p-8"><div class="max-w-md text-center"><div class="text-5xl mb-4 select-none" aria-hidden="true">📚</div> <h2 class="text-xl font-semibold text-gray-700 dark:text-gray-300 mb-2"> </h2> <p class="text-sm text-gray-500 dark:text-gray-500"> </p> <p class="mt-4 text-xs text-gray-400 dark:text-gray-600 font-mono bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 inline-block"> </p> <p class="mt-2 text-xs text-gray-400"> </p></div></div>`),Ch=W(`<div class="app-shell bg-gray-50 text-gray-900 dark:bg-gray-900 dark:text-gray-100"><!> <div class="flex overflow-hidden"><!> <main id="home-content-area" class="flex-1 overflow-y-auto"><!></main></div></div> <!> <!> <!> <!>`,1);function wh(e,t){Ge(t,!0);let n=F(!1),r=F(!1),i=F(!1),a=F(!1),o=F(null),s=F(!1),c=F(``),l=F(!1),u=F(`Living AI Documentation`),d=F(`YYYY_MM_DD_HH_mm_[Category]_title.md`),f=null;function p(){try{let e=localStorage.getItem(`ld-dark`);if(e!==null)return e===`true`}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches}function m(e){I(l,e,!0),document.documentElement.classList.toggle(`dark`,e)}function h(){m(!H(l));try{localStorage.setItem(`ld-dark`,String(H(l)))}catch{}}On(()=>{let e=document.getElementById(`hljs-dark`),t=document.getElementById(`hljs-light`);if(!e||!t)return;let n=$.codeBlockLightTheme&&!H(l);e.disabled=n,t.disabled=!n,document.body.classList.toggle(`ld-code-light`,n)});function g(e){let t=e.trim();if(f&&clearTimeout(f),!t){$.searchQuery=``,$.searchResults=null;return}$.searchQuery=t,$.searchResults=$.allDocs.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.category.toLowerCase().includes(t.toLowerCase())),f=window.setTimeout(async()=>{try{let e=await Fu(t);t===$.searchQuery&&($.searchResults=e)}catch{}},350)}let _=F(L([]));function v(e){let t=H(_)[e];t&&(I(_,H(_).slice(0,e),!0),y(t.id,!1,`restore`))}async function y(e,t=!1,n=!1,r=null){if(n===!0&&$.currentDocId&&$.currentDocId!==e){let t=H(_).findIndex(t=>t.id===e);if(t!==-1)I(_,H(_).slice(0,t),!0);else{let e=$.allDocs.find(e=>e.id===$.currentDocId);I(_,[...H(_),{id:$.currentDocId,title:e?e.title:$.currentDocId}],!0)}}else n||I(_,[],!0);$.currentDocId=e;let i=$.allDocs.find(t=>t.id===e);if(i&&$.revealDoc(i),!t){let t=new URL(location.href);t.searchParams.set(`doc`,e),t.hash=r?`#${r}`:``,history.pushState({docId:e,anchor:r||null},``,t)}I(s,!0),I(c,``);try{let t=await ju(e);t.id=e,I(o,t,!0),document.title=t.title,requestAnimationFrame(()=>{let e=document.getElementById(`home-content-area`);if(r){let t=document.getElementById(r);t&&e&&(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top-80)}else e&&(e.scrollTop=0)})}catch(e){I(c,Y(`doc.failed_to_load`)+(e instanceof Error?e.message:String(e)))}finally{I(s,!1)}}async function b(e){if(!H(o))return;let t=H(o).id,n=await fetch(`/api/documents/`+t,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({content:e})});if(!n.ok)throw Error(await n.text());let r=await ju(t);r.id=t,I(o,r,!0);let i=e.match(/\]\(\s*\.?\/files\/[^)\s]+/g),a={...$.fileAttachmentCounts};i&&i.length?a[t]=i.length:delete a[t],$.fileAttachmentCounts=a}async function x(){if(!H(o))return;let e=H(o).id;if(!(await fetch(`/api/documents/`+encodeURIComponent(e),{method:`DELETE`})).ok)return;$.allDocs=$.allDocs.filter(t=>t.id!==e),Array.isArray($.searchResults)&&($.searchResults=$.searchResults.filter(t=>t.id!==e));let t={...$.annotationCounts};delete t[e],$.annotationCounts=t;let n={...$.fileAttachmentCounts};delete n[e],$.fileAttachmentCounts=n,$.currentDocId=null,I(o,null),history.pushState({},``,location.pathname)}async function S(){let[e,t]=await Promise.all([ku(),Ou()]);if($.allDocs=e,t.docsFolder)try{$.allFolderPaths=await Au(t.docsFolder)}catch{$.allFolderPaths=[]}let[n,r,i]=await Promise.all([Mu(),Nu(),Pu()]);$.annotationCounts=n,$.fileAttachmentCounts=r,$.docStatuses=i}Vi(async()=>{m(p());let e=await Ou();await fa(e.language||`en`),e.title&&(document.title=e.title,I(u,e.title,!0)),e.filenamePattern&&I(d,e.filenamePattern+`.md`),$.exclusiveFolderExpansion=!!e.exclusiveFolderExpansion,$.exclusiveCategoryExpansion=!!e.exclusiveCategoryExpansion,$.codeBlockMaxHeight=typeof e.codeBlockMaxHeight==`number`?e.codeBlockMaxHeight:400,$.imageRoundedCorners=!!e.imageRoundedCorners,$.imageCentered=!!e.imageCentered,$.imageBorder=!!e.imageBorder,$.codeBlockLightTheme=!!e.codeBlockLightTheme,$.codeBlockMaxHeight>0&&document.documentElement.style.setProperty(`--ld-code-max-h`,$.codeBlockMaxHeight+`px`),$.expandedCategories.size===0&&($.expandedCategories=new Set([`General`])),await S();let t=new URLSearchParams(location.search).get(`doc`);if(t)y(t,!0,!1,location.hash?location.hash.slice(1):null);else{let e=$.allDocs.find(e=>e.category===`General`)??$.allDocs[0];e&&y(e.id,!0)}let n=e=>{let t=e.state?.docId||new URLSearchParams(location.search).get(`doc`),n=e.state?.anchor||(location.hash.length>1?location.hash.slice(1):null);t&&y(t,!0,!1,n)};return window.addEventListener(`popstate`,n),()=>window.removeEventListener(`popstate`,n)});var C=Ch(),w=z(C),T=R(w);ua(T,{get title(){return H(u)},subtitle:``,actions:e=>{var t=yh(),n=z(t),r=B(n,2),i=R(r,!0);N(r),V((e,t)=>{J(n,`title`,e),J(n,`aria-label`,t),K(i,H(l)?`☀`:`☾`)},[()=>Y(`nav.word_cloud`),()=>Y(`nav.word_cloud`)]),U(`click`,n,()=>I(a,!0)),U(`click`,r,h),G(e,t)},children:(e,t)=>{var n=bh(),r=R(n);Ei(r),Pe(2),N(n),V(e=>{J(r,`placeholder`,e),Di(r,$.searchQuery)},[()=>Y(`nav.search_placeholder`)]),U(`input`,r,e=>g(e.target.value)),G(e,n)},$$slots:{actions:!0,default:!0}});var E=B(T,2),D=R(E);sd(D,{onopen:e=>y(e),onsearch:g,onexport:()=>I(i,!0),onnewfolder:()=>I(n,!0),onnewdoc:()=>I(r,!0)});var ee=B(D,2),O=R(ee),te=e=>{var t=Ur(),n=z(t),r=e=>{var t=xh(),n=R(t,!0);N(t),V(()=>K(n,H(c))),G(e,t)},i=e=>{Om(e,{get doc(){return H(o)},get navHistory(){return H(_)},ongoback:v,onopen:(e,t)=>y(e,!1,!0,t),onsave:b,ondelete:x})};q(n,e=>{H(c)?e(r):e(i,-1)}),G(e,t)},k=e=>{var t=Sh(),n=R(t),r=B(R(n),2),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(n),N(t),V((e,t,n)=>{K(i,e),K(o,t),K(c,H(d)),K(u,n)},[()=>Y(`welcome.title`),()=>Y(`welcome.hint`),()=>Y(`welcome.pattern_hint`)]),G(e,t)};q(O,e=>{H(o)?e(te):e(k,-1)}),N(ee),N(E),N(w);var ne=B(w,2);Im(ne,{get open(){return H(n)},onclose:()=>I(n,!1),onsuccess:S});var re=B(ne,2);Gm(re,{get open(){return H(r)},onclose:()=>I(r,!1),onsuccess:async e=>{await S(),y(e)}});var ie=B(re,2);$m(ie,{get open(){return H(i)},onclose:()=>I(i,!1)}),vh(B(ie,2),{get open(){return H(a)},onclose:()=>I(a,!1)}),G(e,C),Ke()}Nr([`click`,`input`]);var Th=`modulepreload`,Eh=function(e){return`/`+e},Dh={},Oh=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Eh(t,n),t in Dh)return;Dh[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Th,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},kh=W(`<div class="flex flex-col h-screen overflow-hidden bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"><header class="flex items-center gap-1 px-2 h-12 shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-sm z-10"><button class="tool-btn !w-auto px-2 text-xs font-medium text-gray-500 dark:text-gray-400"> </button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSidebar" class="tool-btn">☰</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnCopyDiagramId" class="tool-btn"><svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="5" width="8" height="9" rx="1.5"></rect><path d="M3 11V3a1 1 0 0 1 1-1h7"></path></svg></button> <button id="toolSelect" class="tool-btn tool-active"><svg width="11" height="13" viewBox="0 0 11 13" fill="currentColor" stroke="none"><path d="M1 1 L1 12 L4 9 L6.5 13 L8 12.2 L5.5 8.2 L10 8.2 Z"></path></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolBox" class="tool-btn"><svg width="15" height="10" viewBox="0 0 15 10" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="1" y="1" width="13" height="8" rx="1"></rect></svg></button> <button id="toolEllipse" class="tool-btn"><svg width="16" height="10" viewBox="0 0 16 10" fill="none" stroke="currentColor" stroke-width="1.5"><ellipse cx="8" cy="5" rx="7" ry="4"></ellipse></svg></button> <button id="toolDatabase" class="tool-btn"><svg width="12" height="16" viewBox="0 0 12 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><ellipse cx="6" cy="3" rx="5" ry="2"></ellipse><path d="M1 3v10c0 1.1 2.2 2 5 2s5-.9 5-2V3"></path><path d="M11 7.5c0 1.1-2.2 2-5 2s-5-.9-5-2"></path></svg></button> <button id="toolCircle" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="6.5" cy="6.5" r="5.5"></circle></svg></button> <button id="toolActor" class="tool-btn"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="6" cy="3" r="2.2"></circle><line x1="6" y1="5.2" x2="6" y2="10"></line><line x1="1.5" y1="7.5" x2="10.5" y2="7.5"></line><line x1="6" y1="10" x2="2.5" y2="15"></line><line x1="6" y1="10" x2="9.5" y2="15"></line></svg></button> <button id="toolPostIt" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4"><path d="M1 1 H9 L12 4 V12 H1 Z"></path><path d="M9 1 V4 H12" stroke-opacity="0.5"></path></svg></button> <button id="toolTextFree" class="tool-btn" style="font-size:11px; font-weight:600;">T</button> <button id="toolImage" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" rx="1.5"></rect><circle cx="4.5" cy="4.5" r="1.2"></circle><path d="M1 9.5 L4 6.5 L6.5 9 L9 7 L13 10.5"></path></svg></button> <a href="/shape-editor" class="tool-btn">✦</a> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolArrow" class="tool-btn">→</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDelete" class="tool-btn"><svg width="11" height="11" viewBox="0 0 11 11" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><line x1="1" y1="1" x2="10" y2="10"></line><line x1="10" y1="1" x2="1" y2="10"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDiagramDefaults" class="tool-btn"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button> <button id="btnAlign" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4"><line x1="0.5" y1="7.5" x2="13.5" y2="7.5"></line><line x1="3.5" y1="0.5" x2="3.5" y2="13.5" stroke-dasharray="1.5 1.5"></line><line x1="10.5" y1="0.5" x2="10.5" y2="13.5" stroke-dasharray="1.5 1.5"></line></svg></button> <button id="btnGrid" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.2"><line x1="5" y1="1" x2="5" y2="13"></line><line x1="9" y1="1" x2="9" y2="13"></line><line x1="1" y1="5" x2="13" y2="5"></line><line x1="1" y1="9" x2="13" y2="9"></line><rect x="1" y="1" width="12" height="12" rx="1"></rect></svg></button> <button id="btnEdgeStraight" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><line x1="2" y1="12" x2="12" y2="2"></line><polyline points="8,2 12,2 12,6"></polyline></svg></button> <button id="btnEvidenceMode" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 1.5 H8.5 L11 4 V12.5 H4 Z"></path><path d="M8.5 1.5 V4 H11"></path><path d="M1.5 5.5 H6.5"></path><path d="M1.5 8 H6.5"></path><path d="M1.5 10.5 H5"></path></svg></button> <button id="btnResizeMode" class="tool-btn active-tool"><svg id="icon-resize-corner" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="7,10 10,10 10,7"></polyline></svg> <svg id="icon-resize-center" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="hidden"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="4,6.5 4,4 6.5,4"></polyline><polyline points="10,7.5 10,10 7.5,10"></polyline><line x1="10" y1="4" x2="4" y2="10"></line><polyline points="7.5,4 10,4 10,6.5"></polyline><polyline points="4,7.5 4,10 6.5,10"></polyline></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <input id="diagramTitle" type="text" class="flex-1 min-w-0 px-2 py-1 text-sm bg-transparent border-0 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded text-gray-700 dark:text-gray-300 placeholder:text-gray-400"/> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnZoomOut" class="tool-btn">−</button> <span id="zoomLevel" class="text-xs text-gray-500 dark:text-gray-400 w-10 text-center tabular-nums select-none">100%</span> <button id="btnZoomIn" class="tool-btn">+</button> <button id="btnZoomReset" class="tool-btn">⊡</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDark" class="tool-btn"><span id="darkIcon">☽</span></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDebug" class="hidden tool-btn text-xs font-mono">dbg</button> <div id="sepDebug" class="hidden w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnExportDrawio" class="tool-btn"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSave" disabled="" class="px-3 py-1.5 text-xs font-semibold rounded-lg bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-40 disabled:cursor-not-allowed shrink-0 transition-colors"><span> </span></button></header> <div class="flex flex-1 overflow-hidden"><div id="sidebar" class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 flex flex-col overflow-hidden" style="transition: width 0.2s ease"><div class="flex items-center justify-between px-3 py-2 border-b border-gray-200 dark:border-gray-700 shrink-0"><span class="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider"> </span> <button id="btnNewDiagram" class="text-xs font-medium text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors"> </button></div> <div id="diagramList" class="flex-1 overflow-y-auto py-1"></div></div> <div role="separator" aria-orientation="vertical"></div> <div class="relative flex-1 overflow-hidden bg-gray-50 dark:bg-gray-950"><div id="vis-canvas" class="w-full h-full"></div> <div id="customShapeBar" class="hidden"><div id="customShapeBarBody"></div></div> <div id="debugLayer"></div> <div id="evidenceLayer" class="hidden"></div> <div id="stampOverlay" style="position:absolute;inset:0;display:none;z-index:11;cursor:crosshair;"></div> <div id="selectionOverlay"><div id="rh-tl" class="resize-handle" style="top: -5px; left: -5px; cursor: nw-resize"></div> <div id="rh-tr" class="resize-handle" style="top: -5px; right: -5px; cursor: ne-resize"></div> <div id="rh-bl" class="resize-handle" style="bottom: -5px; left: -5px; cursor: sw-resize"></div> <div id="rh-br" class="resize-handle" style="bottom: -5px; right: -5px; cursor: se-resize"></div> <div id="rh-rotate">↻</div> <div id="rh-label-rotate" style="left: 0; top: -28px;"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><g transform="rotate(25,5,5)"><line x1="2.5" y1="3" x2="7.5" y2="3"></line><line x1="5" y1="3" x2="5" y2="8"></line></g></svg></div></div> <aside id="evidencePanel" class="hidden absolute top-0 right-0 bottom-0 w-80 max-w-[85vw] z-30 bg-gray-50 dark:bg-gray-900 border-l border-gray-200 dark:border-gray-700 shadow-xl flex flex-col"><div class="flex items-center justify-between gap-2 px-4 py-3 border-b border-gray-200 dark:border-gray-700"><h2 id="evidencePanelTitle" class="text-sm font-semibold text-gray-800 dark:text-gray-100"> </h2> <button id="btnEvidenceClose" class="tool-btn !w-7 !h-7">×</button></div> <div id="evidencePanelBody" class="flex-1 overflow-y-auto p-3 space-y-3"></div></aside> <div id="nodePanel" class="float-panel hidden"><button id="btnNodeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="nodePanelControls" class="contents"><button id="nodeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#f5f5f4;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <input id="nodeBgOpacity" type="range" min="0" max="100" step="5" value="100" class="w-16 h-1 accent-orange-500 cursor-pointer"/> <div class="panel-sep"></div> <button id="btnNodeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnNodeLink" class="tool-btn !w-6 !h-6"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5a3.5 3.5 0 0 0 5 0l1.5-1.5a3.5 3.5 0 0 0-5-5L5 2.5"></path><path d="M8 5.5a3.5 3.5 0 0 0-5 0L1.5 7a3.5 3.5 0 0 0 5 5L8 10.5"></path></svg></button> <div class="panel-sep"></div> <button id="btnNodeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="nodeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">13</span> <button id="btnNodeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnAlignLeft" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="1" y1="5" x2="7" y2="5"></line><line x1="1" y1="8" x2="9" y2="8"></line></svg></button> <button id="btnAlignCenter" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="2.5" y1="5" x2="9.5" y2="5"></line><line x1="1.5" y1="8" x2="10.5" y2="8"></line></svg></button> <button id="btnAlignRight" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="5" y1="5" x2="11" y2="5"></line><line x1="3" y1="8" x2="11" y2="8"></line></svg></button> <div class="panel-sep"></div> <button id="btnValignTop" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="1.5" x2="9" y2="1.5" stroke-width="2"></line><line x1="1" y1="5" x2="8" y2="5" stroke-width="1.3"></line><line x1="1" y1="8.5" x2="6" y2="8.5" stroke-width="1.3"></line></svg></button> <button id="btnValignMiddle" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="2.5" x2="8" y2="2.5" stroke-width="1.3"></line><line x1="1" y1="6" x2="9" y2="6" stroke-width="2"></line><line x1="1" y1="9.5" x2="6" y2="9.5" stroke-width="1.3"></line></svg></button> <button id="btnValignBottom" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="3.5" x2="8" y2="3.5" stroke-width="1.3"></line><line x1="1" y1="7" x2="6" y2="7" stroke-width="1.3"></line><line x1="1" y1="10.5" x2="9" y2="10.5" stroke-width="2"></line></svg></button> <div class="panel-sep"></div> <div id="customShapeLabelPlacementControls" class="hidden"><button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="above">T↑</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="below">T↓</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="left">←T</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="right">T→</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="center">T□</button> <div class="panel-sep"></div></div> <button id="btnZOrderBack" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1"></rect><rect x="5" y="1" width="8" height="8" rx="1" stroke-opacity="0.35"></rect></svg></button> <button id="btnZOrderFront" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1" stroke-opacity="0.35"></rect><rect x="5" y="1" width="8" height="8" rx="1"></rect></svg></button> <div class="panel-sep"></div> <button id="btnStampColor" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M7 2 C7 2 3 6.5 3 9 a4 4 0 0 0 8 0 C11 6.5 7 2 7 2 Z" fill="currentColor" fill-opacity="0.25"></path></svg></button> <button id="btnStampFontSize" class="tool-btn !w-7 !h-6 font-mono text-xs font-bold">Aa</button> <button id="btnStampSize" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="6" height="6" rx="0.8" fill="currentColor" fill-opacity="0.25"></rect><path d="M10 2 L12 2 L12 4"></path><path d="M12 2 L9 5"></path><path d="M10 12 L12 12 L12 10"></path><path d="M12 12 L9 9"></path></svg></button> <div class="panel-sep"></div> <button id="btnRotateCCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↺</button> <button id="btnRotateCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↻</button> <div class="panel-sep"></div> <button id="btnCopyPng" class="tool-btn !h-6 px-1.5 font-mono text-xs font-semibold flex items-center gap-0.5"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="7" x2="5" y2="1"></line><polyline points="2,4 5,1 8,4"></polyline><line x1="1" y1="9" x2="9" y2="9"></line></svg> PNG</button> <div class="panel-sep"></div> <button id="btnGroup" class="tool-btn !w-8 !h-7"><svg width="22" height="14" viewBox="0 0 22 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="20.6" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="4" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="15" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <button id="btnUngroup" class="tool-btn !w-8 !h-7"><svg width="26" height="14" viewBox="0 0 26 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="3" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="16.3" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="19" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <div class="panel-sep"></div> <button id="btnSaveShapeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <div id="linkPanel" class="float-panel hidden" style="min-width:260px; flex-direction:column; align-items:stretch; gap:0.5rem; padding:0.75rem;"><div class="text-xs font-semibold text-gray-500 dark:text-gray-400 mb-1"> </div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeUrl" value="url" class="accent-orange-500"/> <span> </span></label> <div id="linkUrlRow"><input id="linkUrlInput" type="url" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeDiagram" value="diagram" class="accent-orange-500"/> <span> </span></label> <div id="linkDiagramRow" class="hidden"><select id="linkDiagramSelect" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"></select></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeNew" value="new" class="accent-orange-500"/> <span> </span></label> <div id="linkNewRow" class="hidden"><input id="linkNewName" type="text" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <div class="flex gap-1 mt-1"><button id="btnLinkSave" class="flex-1 text-xs bg-orange-500 hover:bg-orange-600 text-white rounded px-2 py-1"> </button> <button id="btnLinkRemove" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-red-50 dark:hover:bg-red-900/20 hover:text-red-600"> </button> <button id="btnLinkCancel" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-gray-100 dark:hover:bg-gray-700">✕</button></div></div> <div id="edgePanel" class="float-panel hidden"><button id="btnEdgeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="edgePanelControls" class="contents"><button id="edgeBtnNone" class="tool-btn !w-7 !h-6 font-mono text-xs">—</button> <button id="edgeBtnFrom" class="tool-btn !w-7 !h-6 text-xs">←</button> <button id="edgeBtnTo" class="tool-btn !w-7 !h-6 text-xs">→</button> <button id="edgeBtnBoth" class="tool-btn !w-8 !h-6 text-xs">←→</button> <div class="panel-sep"></div> <button id="edgeBtnSolid" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round"></line></svg></button> <button id="edgeBtnDashed" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-dasharray="4,3"></line></svg></button> <div class="panel-sep"></div> <button id="btnEdgeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="edgeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">11</span> <button id="btnEdgeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnEdgeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnEdgeLabelWidthReset" class="tool-btn !w-6 !h-6 text-xs">↔</button> <div class="panel-sep"></div> <button id="btnEdgeLabelRotateCCW" class="tool-btn !w-7 !h-6 text-sm">↺</button> <button id="btnEdgeLabelRotateCW" class="tool-btn !w-7 !h-6 text-sm">↻</button> <div class="panel-sep"></div> <button id="btnEdgeLabelOffsetLeft" class="tool-btn !w-6 !h-6 text-sm">←</button> <button id="btnEdgeLabelOffsetRight" class="tool-btn !w-6 !h-6 text-sm">→</button> <button id="btnEdgeLabelOffsetUp" class="tool-btn !w-6 !h-6 text-sm">↑</button> <button id="btnEdgeLabelOffsetDown" class="tool-btn !w-6 !h-6 text-sm">↓</button> <button id="btnEdgeLabelOffsetReset" class="tool-btn !w-6 !h-6 text-xs">⊙</button> <div class="panel-sep"></div> <button id="btnEdgeWidthDecrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W−</button> <button id="btnEdgeWidthIncrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W+</button> <div class="panel-sep"></div> <button id="edgeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#a8a29e;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <button id="btnEdgeClearPorts" class="tool-btn !w-8 !h-6 text-xs">⊗</button> <div class="panel-sep"></div> <button id="btnSaveEdgeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <textarea id="labelInput" class="hidden" rows="1"></textarea> <div id="emptyState" class="absolute inset-0 flex flex-col items-center justify-center text-gray-400 dark:text-gray-600 pointer-events-none select-none"><svg width="52" height="44" viewBox="0 0 52 44" fill="none" stroke="currentColor" stroke-width="1.5" class="mb-3 opacity-50"><rect x="2" y="4" width="18" height="12" rx="2"></rect><rect x="32" y="28" width="18" height="12" rx="2"></rect><line x1="20" y1="10" x2="32" y2="34" stroke-dasharray="4,3"></line><rect x="17" y="16" width="18" height="12" rx="2"></rect><line x1="26" y1="16" x2="26" y2="10" stroke-dasharray="4,3"></line></svg> <p class="text-sm"> </p></div></div></div> <div id="toastContainer"></div> <div id="imageNameModal" style="display:none;position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,0.5);" class="flex items-center justify-center"><div class="bg-white dark:bg-gray-800 rounded-xl shadow-2xl p-6 w-80 flex flex-col gap-3"><p class="text-sm font-semibold text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-400 dark:text-gray-500">Lettres, chiffres, <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">_</code> et <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">-</code> uniquement.
134
+ </html>`,f=window.open(``,`_blank`);if(!f){alert(Y(`error.pdf_popup`));return}f.document.write(d),f.document.close(),t.onclose()}catch(e){alert(Y(`error.pdf_export`)+(e instanceof Error?e.message:String(e)))}finally{I(d,!1)}}let y=`px-4 py-2 text-sm border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 font-semibold transition-colors`,b=`px-4 py-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors`;var x=Ur(),S=z(x),C=e=>{var r=eh(),f=R(r),p=R(f),h=B(R(p),2),x=R(h,!0);N(h),N(p);var S=B(p,2),C=R(S),w=R(C,!0);N(C);var T=B(C,2),E=R(T,!0);N(T);var D=B(T,2),ee=R(D,!0);N(D),N(S);var O=B(S,2),te=e=>{var t=Zm(),n=R(t),r=R(n),c=e=>{var t=Jm(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>Y(`common.loading`)]),G(e,t)},l=e=>{var t=Ym(),n=R(t);N(t),V(e=>K(n,`${e??``}failed to load folders`),[()=>Y(`common.error_prefix`)]),G(e,t)},u=e=>{var t=Ur();$r(z(t),16,()=>H(o),e=>e,(e,t)=>{var n=Xm(),r=R(n);Ei(r);var i,a=B(r,2),o=R(a,!0);N(a),N(n),V(()=>{i!==(i=t)&&(r.value=(r.__value=t)??``),K(o,t)}),Ni(r,()=>H(s)[t],e=>H(s)[t]=e),G(e,n)}),G(e,t)};q(r,e=>{H(i)?e(c):H(a)?e(l,1):e(u,-1)}),N(n),N(t),G(e,t)};q(O,e=>{H(n)===`html`&&e(te)});var k=B(O,2),ne=e=>{var n=Qm(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var l=B(o,2),u=R(l,!0);N(l),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),l.disabled=H(c),K(u,n)},[()=>Y(`modal.export.markdown_hint`),()=>Y(`common.cancel`),()=>H(c)?`⏳`:Y(`modal.export.markdown_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,l,g),G(e,n)};q(k,e=>{H(n)===`markdown`&&e(ne)});var re=B(k,2),ie=e=>{var n=$m(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),d=R(c,!0);N(c);var f=B(c,2),p=R(f,!0);N(f),N(a),N(n),V((e,t,n,r)=>{K(i,e),K(s,t),c.disabled=H(l),K(d,n),f.disabled=H(u),K(p,r)},[()=>Y(`modal.export_html.hint`),()=>Y(`common.cancel`),()=>H(l)?`⏳`:Y(`modal.export_html.notion_btn`),()=>H(u)?`⏳`:Y(`modal.export_html.confluence_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,()=>_(`notion`)),U(`click`,f,()=>_(`confluence`)),G(e,n)};q(re,e=>{H(n)===`html`&&e(ie)});var ae=B(re,2),oe=e=>{var n=Qm(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),c.disabled=H(d),K(l,n)},[()=>Y(`modal.export.pdf_hint`),()=>Y(`common.cancel`),()=>H(d)?`⏳`:Y(`modal.export.pdf_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,v),G(e,n)};q(ae,e=>{H(n)===`pdf`&&e(oe)}),N(f),N(r),V((e,t,r,i)=>{K(x,e),hi(C,1,li(H(n)===`markdown`?y:b)),K(w,t),hi(T,1,li(H(n)===`html`?y:b)),K(E,r),hi(D,1,li(H(n)===`pdf`?y:b)),K(ee,i)},[()=>Y(`modal.export.title`),()=>Y(`modal.export.tab_markdown`),()=>Y(`modal.export.tab_html`),()=>Y(`modal.export.tab_pdf`)]),U(`click`,r,e=>{e.target===e.currentTarget&&t.onclose()}),U(`click`,C,()=>m(`markdown`)),U(`click`,T,()=>m(`html`)),U(`click`,D,()=>m(`pdf`)),G(e,r)};q(S,e=>{t.open&&e(C)}),G(e,x),Ke()}Nr([`click`]);var nh=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),rh=W(`<p> </p>`),ih=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),ah=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-gray-500 dark:text-gray-400"><span class="shrink-0 opacity-40">&#128196;</span> <span class="truncate font-mono"> </span></span> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),oh=W(`<div class="border-t border-gray-200 dark:border-gray-700"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0">&#8593; Up</button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-52 overflow-y-auto"><!></div></div>`),sh=W(`<label class="flex items-center gap-1.5 text-xs text-gray-700 dark:text-gray-300 cursor-pointer"><input type="checkbox"/> </label>`),ch=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">&#128193;</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Exclude this folder" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 px-3 py-2 text-sm transition-opacity">⊖</button></div>`),lh=W(`<button class="w-full px-3 py-2 text-xs text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-950/30 text-left font-medium border-t border-gray-100 dark:border-gray-800">&#10003; Select: <span class="font-mono"> </span></button>`),uh=W(`<!> <!>`,1),dh=W(`<div> </div>`),fh=W(`<div> </div> <div> </div> <div> </div> <!>`,1),ph=W(`<div role="button" tabindex="0" class="flex items-center gap-2 px-3 py-1 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors"><span class="text-gray-400 dark:text-gray-600 w-5 text-right shrink-0 tabular-nums text-xs"></span> <div class="flex-1 min-w-0"><div class="flex items-center justify-between gap-1"><span class="text-gray-800 dark:text-gray-200 font-medium truncate text-xs"> </span> <span class="text-gray-400 dark:text-gray-600 tabular-nums shrink-0 text-xs"> </span></div> <div class="h-1 bg-gray-100 dark:bg-gray-800 rounded-full mt-0.5"><div class="h-1 bg-blue-400 dark:bg-blue-600 rounded-full"></div></div></div></div>`),mh=W(`<div class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 text-xs text-gray-500 dark:text-gray-400 space-y-0.5 border-b border-gray-100 dark:border-gray-800"><!></div> <div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center gap-2"><span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 cursor-help"> </span> <input type="number" min="1" max="20" class="w-12 px-1.5 py-0.5 text-xs rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-800 dark:text-gray-200 focus:outline-none"/> <button class="text-xs text-blue-600 dark:text-blue-400 hover:underline"> </button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto"></div></div>`),hh=W(`<p class="absolute inset-0 flex items-center justify-center text-gray-400 dark:text-gray-500 text-sm animate-pulse"> </p>`),gh=W(`<div class="flex items-center gap-1 group py-0.5"><span class="text-gray-600 dark:text-gray-400 break-all font-mono flex-1 text-xs"> </span> <button title="Exclude this file" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 text-xs leading-none px-1 transition-opacity">⊖</button></div>`),_h=W(`<div class="text-gray-400 text-center py-2">—</div>`),vh=W(`<div class="w-80 shrink-0 border-l border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between"><span class="font-bold text-sm text-gray-900 dark:text-gray-100"> </span> <button class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 text-xs leading-none">✕</button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto px-3 py-1 space-y-1 text-xs"><!></div></div>`),yh=W(`<div class="fixed inset-0 z-50 flex flex-col bg-white dark:bg-gray-950"><div class="flex items-center justify-between px-6 h-14 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><h2 class="font-semibold text-base"> </h2> <button class="text-sm px-3 py-1.5 rounded-lg text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"> </button></div> <div class="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><div class="flex items-center gap-3 px-6 py-3"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </label> <input type="text" readonly="" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono cursor-default focus:outline-none"/> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">&#128193; <span> </span></button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors shrink-0"> </button></div> <div class="flex items-start gap-3 px-6 pb-2"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0 pt-1.5"> </label> <textarea rows="3" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-1 focus:ring-blue-400 resize-y"></textarea> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">&#128193; <span> </span></button></div> <!> <div class="flex items-center gap-x-4 gap-y-2 px-6 pb-3 flex-wrap"><span class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </span> <label class="flex items-center gap-1.5 text-xs font-medium text-blue-600 dark:text-blue-400 cursor-pointer shrink-0"><input type="checkbox"/> </label> <!></div> <!></div> <div class="flex-1 overflow-hidden flex"><!> <div class="flex-1 relative overflow-hidden"><!> <canvas style="position: absolute; inset: 0"></canvas></div> <!></div></div>`);function bh(e,t){Ge(t,!0);let n=new Set(`the.a.an.and.or.but.not.nor.so.yet.both.either.neither.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.shall.should.may.might.can.could.must.need.dare.ought.used.to.of.in.for.on.with.at.by.from.up.about.into.through.during.before.after.above.below.between.out.off.over.under.again.further.then.once.here.there.when.where.why.how.all.each.few.more.most.other.some.such.no.only.own.same.than.too.very.just.also.still.already.always.never.often.sometimes.usually.this.that.these.those.its.your.our.their.his.her.him.she.you.they.we.me.my.it.who.which.what.whose.whom.if.though.although.because.since.while.unless.until.whether.as.like.via.per.i.am.he.us.see.now.new.old.got.let.put.say.said.says.get.use.make.made.take.come.came.go.went.know.think.look.want.give.seem.back.down.even.much.well.good.work.tell.keep.hold.turn.move.play.live.help.run.start.off.way.too.few.show.hear.etc.eg.ie.one.two.three.four.five.six.seven.eight.nine.ten.le.la.les.un.une.des.du.de.d.l.au.aux.ce.ci.cet.cette.ces.mon.ma.mes.ton.ta.tes.son.sa.ses.notre.nos.votre.vos.leur.leurs.je.tu.il.elle.on.nous.vous.ils.elles.me.te.se.lui.y.en.qui.que.quoi.dont.où.et.ou.mais.donc.or.ni.car.si.ne.pas.plus.moins.très.bien.mal.peu.beaucoup.trop.assez.aussi.comme.pour.par.avec.sans.dans.sur.sous.entre.vers.chez.contre.avant.après.pendant.depuis.selon.malgré.sauf.est.sont.était.être.avoir.fait.faire.dit.dire.peut.pouvoir.doit.devoir.veut.vouloir.sait.savoir.va.aller.vient.venir.tout.tous.toute.toutes.autre.autres.même.chaque.quel.quelle.quels.quelles.aucun.aucune.certain.certaine.plusieurs.quelque.quelques.tel.telle.tels.telles.cela.ceci.ça.celui.celle.ceux.celles.ici.voici.voilà.alors.ainsi.encore.déjà.jamais.toujours.souvent.parfois.rien.personne.chose.fois.jour.temps.part.cas.point.lieu.monde.cependant.néanmoins.pourtant.toutefois.quand.lorsque.puisque.parce.afin.puis.lors.notamment.surtout.seulement.vraiment.enfin.ensuite.ailleurs.là.ici.voici.voilà.dont.lequel.laquelle.lesquels.lesquelles`.split(`.`)),r=new Set(`public.private.protected.static.void.class.interface.abstract.final.const.let.var.function.return.if.else.for.while.do.switch.case.break.continue.try.catch.throw.throws.finally.new.this.self.super.import.export.from.package.module.require.include.using.namespace.struct.enum.trait.impl.fn.def.func.fun.val.mut.async.await.yield.lambda.extends.implements.override.virtual.sealed.data.object.companion.where.when.match.guard.defer.go.chan.select.type.alias.as.is.in.of.with.true.false.null.nil.none.undefined.println.printf.fmt.log.print.main.args.argv.init.setup.teardown.describe.test.expect.assert.before.after.not.and.or.delete.typeof.instanceof.readonly.keyof.infer.never.unknown.declare.satisfies.get.set.add.remove.update.create.find.fetch.load.save.put.post.patch.list.map.filter.reduce.sort.merge.parse.format.convert.transform.validate.check.handle.process.execute.start.stop.reset.clear.close.open.read.write.send.receive.emit.trigger.dispatch.subscribe.unsubscribe.listen.notify.register.unregister.bind.apply.call.invoke.callback.handler.listener.middleware.interceptor.resolver.provider.consumer.producer.builder.factory.adapter.wrapper.proxy.decorator.observer.visitor.strategy.command.controller.service.repository.dao.dto.entity.model.schema.config.context.state.store.action.reducer.selector.hook.ref.effect.memo.component.module.plugin.extension.util.utils.helper.helpers.common.shared.base.default.index.app.core.lib.src.test.spec.mock.stub.fixture.impl.internal.api.sdk.client.server.request.response.status.code.error.exception.message.result.data.value.key.name.label.title.description.item.element.node.child.parent.root.container.wrapper.layout.view.page.screen.panel.header.footer.sidebar.navbar.body.content.section.row.col.column.grid.flex.block.inline.span.div.input.output.param.params.arg.option.options.props.attr.attrs.field.fields.property.properties.method.methods.string.number.boolean.integer.float.double.long.short.byte.char.array.object.map.set.list.vector.queue.stack.hash.table.tree.graph.pair.tuple.optional.nullable.void.unit.any.bool.bytes.none.int.str.bool.all.each.every.some.many.single.multi.first.last.next.prev.previous.current.old.temp.tmp.new.top.bottom.left.right.center.middle.start.end.begin.min.max.count.total.sum.avg.size.length.width.height.depth.flag.num.idx.id.uid.uuid.num.str.val.obj.arr.fn.cb.ctx.req.res.err.msg.src.dst.evt.doc.db.io.fs.os.env.sys.http.https.url.uri.path.port.host.tcp.udp.ssl.tls.html.css.json.xml.yml.yaml.csv.sql.regex.utf.ascii.rgb.rgba.hex.px.em.rem.vh.vw.auto.inherit.initial.application.file.local.source.messages.logging.alerting.programmed.offset.offsets.zone.zoned.decimal.big.integer.constructor.mapper.captor.publisher.verify.subscriber.org.edr.ack.ref.ssr.ssg.csr.isr.mockito.junit.vitest.jest.mocha.rspec.pytest.cypress.playwright.captor.spy.given.then.verify.times.never.invocation.argumentcaptor.inorder.donothing.doreturn.ippon.springframework.jakarta.javax.todo.fixme.hack.note.deprecated.experimental.eslint.prettier.typescript.javascript.java.kotlin.python.golang.rust.csharp.swift.ruby.spring.boot.javax.jakarta.hibernate.lombok.gradle.maven.webpack.vite.react.angular.vue.svelte.nuxt.express.fastapi.flask.django.rails.fiber.gin.actix.tokio.asyncio.junit.jest.mocha.pytest.rspec.docker.kubernetes.aws.gcp.azure.terraform.ansible.nginx.apache.linux.nextjs.remix.astro.sveltekit.gatsby.nuxtjs.qwik.solid.vercel.netlify.cloudflare.supabase.firebase.mongodb.postgres.prisma.drizzle.typeorm.sequelize.mongoose.redis.neon.trpc.graphql.grpc.rest.openapi.swagger.zod.yup.valibot.tailwind.shadcn.radix.headless.chakra.mantine.antd.mui.tanstack.tanstackquery.zustand.jotai.recoil.redux.mobx.storybook.cypress.playwright.vitest.turbopack.turborepo.getserversideprops.getstaticprops.getstaticpaths.generatestaticparams.generatemetadata.serveraction.revalidate.notfound.redirect.permanentredirect.unstablecache.unstablenostore.cookies.headers.userouter.usepathname.usesearchparams.useparams.useformstate.useformstatus.useoptimistic.useserveraction.classname.onclick.onchange.onsubmit.onfocus.onblur.onkeydown.onkeyup.onmousedown.onmouseup.defaultvalue.htmlfor.tabindex.strokewidth.viewbox.fillopacity.strokeopacity.pathdata.children.fragment.portal.suspense.errorboundary.strictmode.createelement.createcontext.createref.forwardref.usestate.useeffect.useref.usecontext.usememo.usecallback.usereducer.useid.usetransition.usedeferredvalue.useimperativehandle.mutex.lock.thread.goroutine.coroutine.channel.buffer.stream.pipe.observable.promise.future.completable.deferred.disposable.lifecycle.scope.annotation.attribute.metadata.reflection.generic.template.macro.preprocessor.compiler.runtime.debug.release.production.development.staging.build.deploy.lint.coverage.report.the.and.for.are.but.not.you.all.this.that.with.have.from.they.will.been.can.has.was.its.our.their.more.also.when.what.about.which.would.into.than.then.each.just.over.after.such.here.some.were.very.only`.split(`.`));function i(e){return n.has(e)||r.has(e)||e.length<3||/^\d+$/.test(e)||/^[^a-z]/.test(e)}function a(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/([A-Z]+)([A-Z][a-z])/g,`$1 $2`).replace(/[_\-./]+/g,` `).toLowerCase().trim().split(/\s+/).filter(e=>e.length>=3)}function o(e){return e.toLowerCase().split(/[^a-zàâäéèêëïîôùûü]+/).filter(e=>e.length>=3)}let s=[{value:`adoc`,cat:`prose`},{value:`asciidoc`,cat:`prose`},{value:`asm`,cat:`code`},{value:`astro`,cat:`code`},{value:`avsc`,cat:`config`},{value:`bash`,cat:`code`},{value:`bat`,cat:`code`},{value:`bicep`,cat:`config`},{value:`c`,cat:`code`},{value:`cc`,cat:`code`},{value:`cfg`,cat:`config`},{value:`cjs`,cat:`code`},{value:`clj`,cat:`code`},{value:`cljs`,cat:`code`},{value:`cmake`,cat:`code`},{value:`cmd`,cat:`code`},{value:`conf`,cat:`config`},{value:`cpp`,cat:`code`},{value:`cql`,cat:`code`},{value:`cs`,cat:`code`},{value:`cshtml`,cat:`code`},{value:`css`,cat:`config`},{value:`cxx`,cat:`code`},{value:`dart`,cat:`code`},{value:`env`,cat:`config`},{value:`erb`,cat:`code`},{value:`erl`,cat:`code`},{value:`ex`,cat:`code`},{value:`exs`,cat:`code`},{value:`fish`,cat:`code`},{value:`fs`,cat:`code`},{value:`fsx`,cat:`code`},{value:`go`,cat:`code`},{value:`gql`,cat:`code`},{value:`gradle`,cat:`code`},{value:`graphql`,cat:`code`},{value:`groovy`,cat:`code`},{value:`h`,cat:`code`},{value:`hcl`,cat:`config`},{value:`hpp`,cat:`code`},{value:`hs`,cat:`code`},{value:`html`,cat:`config`},{value:`ini`,cat:`config`},{value:`java`,cat:`code`},{value:`jl`,cat:`code`},{value:`js`,cat:`code`},{value:`json`,cat:`config`},{value:`jsx`,cat:`code`,jsx:!0},{value:`kt`,cat:`code`},{value:`less`,cat:`config`},{value:`lua`,cat:`code`},{value:`m`,cat:`code`},{value:`md`,cat:`prose`,def:!0},{value:`mdx`,cat:`prose`},{value:`mjs`,cat:`code`},{value:`mk`,cat:`code`},{value:`ml`,cat:`code`},{value:`mli`,cat:`code`},{value:`mm`,cat:`code`},{value:`nim`,cat:`code`},{value:`php`,cat:`code`},{value:`pl`,cat:`code`},{value:`prisma`,cat:`code`},{value:`properties`,cat:`config`},{value:`proto`,cat:`code`},{value:`ps1`,cat:`code`},{value:`py`,cat:`code`},{value:`r`,cat:`code`},{value:`razor`,cat:`code`},{value:`rb`,cat:`code`},{value:`rs`,cat:`code`},{value:`rst`,cat:`prose`},{value:`s`,cat:`code`},{value:`scala`,cat:`code`},{value:`scss`,cat:`config`},{value:`sh`,cat:`code`},{value:`sol`,cat:`code`},{value:`sql`,cat:`code`},{value:`styl`,cat:`config`},{value:`svelte`,cat:`code`},{value:`swift`,cat:`code`},{value:`tex`,cat:`prose`},{value:`tf`,cat:`config`},{value:`tfvars`,cat:`config`},{value:`thrift`,cat:`code`},{value:`toml`,cat:`config`},{value:`ts`,cat:`code`},{value:`tsx`,cat:`code`,jsx:!0},{value:`txt`,cat:`prose`},{value:`v`,cat:`code`},{value:`vb`,cat:`code`},{value:`vue`,cat:`code`},{value:`xml`,cat:`config`},{value:`yaml`,cat:`config`},{value:`yml`,cat:`config`},{value:`zig`,cat:`code`},{value:`zsh`,cat:`code`}],c=new Set(s.filter(e=>e.cat===`prose`).map(e=>e.value)),l=new Set(s.filter(e=>e.cat===`code`).map(e=>e.value)),u=new Set(s.filter(e=>e.cat===`config`).map(e=>e.value)),d=new Set(s.filter(e=>e.jsx).map(e=>e.value));function f(e,t){let n=[];if(c.has(t)){let t=e.replace(/^\s*(import|export\s+\{[^}]*\}|export\s+\*|package|require|#include|from\s+['"][^'"]+['"]\s*(import)?)\b.*/gm,``).replace(/```[\s\S]*?```/g,` `).replace(/`[^`\n]+`/g,` `).replace(/!\[[^\]]*\]\([^)]*\)/g,` `).replace(/\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/https?:\/\/\S+/g,` `).replace(/[#*_~>`|!\[\](){}=+\-]/g,` `);n.push(...o(t))}else l.has(t)?(d.has(t)&&(e=e.replace(/<\/?[A-Z][A-Za-z0-9.]*[^>]*>/g,` `),e=e.replace(/<\/?(div|span|main|section|article|aside|nav|header|footer|form|input|button|select|option|textarea|table|thead|tbody|tr|td|th|ul|ol|li|a|img|p|h[1-6]|label|figure|figcaption|picture|video|audio|canvas|svg|path|circle|rect|g|defs|use|link|meta|head|html|body|script|style|br|hr|strong|em|code|pre|blockquote|small|sub|sup)\b[^>]*>/gi,` `),e=e.replace(/\b(className|onClick|onChange|onSubmit|onFocus|onBlur|onKeyDown|onKeyUp|onMouseDown|onMouseUp|htmlFor|tabIndex|strokeWidth|viewBox|fillOpacity|strokeOpacity|defaultValue|placeholder|disabled|checked|readOnly|required|multiple|autoFocus|autoComplete|type|href|src|alt|width|height|style|key|ref)\s*=/g,` =`)),e=e.replace(/^\s*(import\s+[\w.*{},\s'"@/-]+;?|from\s+['"][^'"]+['"]\s*;?|package\s+[\w.]+;?|namespace\s+[\w.]+;?|using\s+[\w.]+;?|require\s*\(?\s*['"][^'"]+['"]\s*\)?;?)\s*$/gm,``),e.replace(/(?:\/\/|#(?!.*[{}[\]<>])| -- )\s*(.+)$/gm,(e,t)=>(n.push(...o(t)),e)),e.replace(/\/\*[\s\S]*?\*\//g,e=>(n.push(...o(e)),e)),e.replace(/"""[\s\S]*?"""|'''[\s\S]*?'''/g,e=>(n.push(...o(e)),e)),e.replace(/["'`]([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ\s,.'éàèùâêîôûç]{3,})["'`]/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e))):u.has(t)&&(e.replace(/:\s*["']([^"']{3,})["']/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e)));return n.filter(e=>!i(e))}let p=F(``),m=F(``),h=F(1),g=F(``),_=F(!0),v=F(!1),y=F(L(s.map(e=>({value:e.value,label:`.`+e.value,checked:!!e.def}))));function b(){return H(y).filter(e=>e.checked).map(e=>e.value)}let x=P(()=>H(y).every(e=>e.checked)),S=F(null),C=F(null),w=F(0),T=F(null),E=F(L([])),D=F(L([])),ee=F(!1),O=F(``),te=F(0),k=F(L([]));function ne(){localStorage.setItem(`wc-exts`,JSON.stringify(b()))}function re(){let e=H(x);I(y,H(y).map(t=>({...t,checked:!e})),!0),ne()}function ie(){ne()}function ae(){return new Set((H(m)||``).split(/[\n,]/).map(e=>e.trim()).filter(Boolean))}function oe(e){let t=ae();t.has(e)||(t.add(e),I(m,[...t].join(`, `),!0),localStorage.setItem(`wc-exclude`,H(m)),H(de)&&ve(H(pe)),ce())}function se(){localStorage.setItem(`wc-exclude`,H(m)),H(de)&&ve(H(pe)),ce()}function ce(){H(ee)&&H(O)&&M(H(O))}function le(){H(S)&&je()}function ue(){let e=localStorage.getItem(`wc-root`);e&&(I(p,e,!0),I(Se,e,!0));let t=localStorage.getItem(`wc-exclude`);t&&I(m,t,!0);let n=localStorage.getItem(`wc-exts`);if(n)try{let e=JSON.parse(n);I(y,H(y).map(t=>({...t,checked:e.includes(t.value)})),!0)}catch{}}let de=F(!1),fe=F(null),pe=F(``),me=F(``),he=F(null),ge=F(``);function _e(){I(de,!H(de)),H(de)&&ve(H(pe)||H(p)||`/`)}async function ve(e){I(he,null),I(ge,`Loading…`);try{let t=await fetch(`/api/browse?all=1&path=`+encodeURIComponent(e)).then(e=>e.json());I(pe,t.current,!0),I(fe,t.parent,!0),I(me,t.current,!0);let n=H(p).trim(),r=(e,t)=>n&&e.startsWith(n+`/`)?e.slice(n.length+1):t,i=ae(),a=(t.dirs||[]).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`dir`,name:e.name,path:e.path,entry:r(e.path,e.name)})),o=b(),s=(t.files||[]).filter(e=>o.some(t=>e.name.endsWith(`.`+t))).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`file`,name:e.name,entry:r(e.path,e.name)})),c=[...a,...s];I(he,c,!0),I(ge,c.length?``:`Empty directory`,!0)}catch{I(he,[],!0),I(ge,`Cannot read directory`)}}function ye(){H(fe)&&ve(H(fe))}let be=F(!1),xe=F(null),Se=F(``),Ce=F(``),we=F(null),Te=F(``);function A(){I(be,!H(be)),H(be)&&Ee(H(Se)||H(p)||`/`)}async function Ee(e){I(we,null),I(Te,`Loading…`);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(Se,t.current,!0),I(xe,t.parent,!0),I(Ce,t.current,!0),I(we,(t.dirs||[]).map(e=>({name:e.name,path:e.path})),!0),I(Te,H(we).length?``:`No sub-folders`,!0)}catch{I(we,[],!0),I(Te,`Cannot read directory`)}}function De(){H(xe)&&Ee(H(xe))}function Oe(){I(p,H(Se),!0),localStorage.setItem(`wc-root`,H(Se)),I(be,!1),I(m,``),localStorage.removeItem(`wc-exclude`),I(pe,H(Se),!0)}let ke=F(null),Ae=F(null),j=F(!1);function je(){if(!H(S)||!H(C))return;let e=Math.max(1,H(h)||1),t=[...H(S).entries()].sort((e,t)=>t[1]-e[1]),n=t.filter(([t])=>(H(C).get(t)||new Set).size>=e).slice(0,150);if(!n.length){let n=t.length;I(g,n?`${n} domain word(s) found but none appear in ${e}+ file(s). Lower the "Min files" threshold to 1.`:`No domain words extracted. Try adding more file extensions or a broader folder.`,!0),I(_,!0),I(j,!1),I(v,!1);return}let r=[...H(S).keys()].filter(t=>(H(C).get(t)||new Set).size>=e).length;I(T,{scanned:H(w),unique:r,shown:n.length},!0);let i=n.slice(0,50),a=i[0][1];I(D,i.map(([e,t])=>({word:e,freq:t,pct:Math.round(t/a*100)})),!0),I(v,!0),I(_,!1);let o=document.documentElement.classList.contains(`dark`),s=o?[`#60a5fa`,`#34d399`,`#f9a8d4`,`#a78bfa`,`#fbbf24`,`#6ee7b7`,`#93c5fd`,`#fb923c`,`#4ade80`,`#f472b6`]:[`#1d4ed8`,`#047857`,`#7c3aed`,`#b45309`,`#be123c`,`#0369a1`,`#4338ca`,`#c2410c`,`#15803d`,`#9333ea`];requestAnimationFrame(()=>{if(!H(ke)||!H(Ae))return;let e=H(ke),t=H(Ae);e.width=Math.max(400,t.offsetWidth),e.height=Math.max(300,t.offsetHeight),e.style.width=e.width+`px`,e.style.height=e.height+`px`,I(j,!0);let n=Math.sqrt(e.width*e.height/(800*500)),r=Math.min(220,Math.round(72*n)),c=i.map(([e,t])=>[e,Math.max(12,Math.round(r*t/a))]);window.WordCloud?.(e,{list:c,gridSize:Math.round(4*e.width/1024),fontFamily:`ui-sans-serif, system-ui, sans-serif`,color:()=>s[Math.floor(Math.random()*s.length)],backgroundColor:o?`#030712`:`#ffffff`,rotateRatio:.2,minSize:6,shrinkToFit:!0,click:e=>M(e[0])})})}function M(e){if(!H(C)||!H(S))return;let t=[...H(C).get(e)||[]].sort(),n=H(S).get(e)||0;I(O,e,!0),I(te,n,!0),I(k,t,!0),I(ee,!0)}function Me(){I(ee,!1)}async function Ne(){let e=H(p).trim();if(!e){I(g,`Please select a root folder first.`),I(_,!0);return}let t=b();if(!t.length){I(g,`Please select at least one extension.`),I(_,!0);return}I(be,!1),I(v,!1),I(ee,!1),I(g,`Reading files…`),I(_,!0),I(j,!1);try{let n=H(m).trim(),r=n?n.split(/[\n,]/).map(e=>e.trim()).filter(Boolean):[];localStorage.setItem(`wc-exclude`,n);let i=new URLSearchParams({path:e});t.forEach(e=>i.append(`ext`,e)),r.forEach(e=>i.append(`exclude`,e));let a=await fetch(`/api/wordcloud?`+i);if(!a.ok){I(g,`Error: `+((await a.json()).error||a.statusText));return}let{files:o,fileTexts:s}=await a.json();I(g,`Analyzing ${o} file(s)…`);let c=new Map,l=new Map,u=new Set;I(w,o,!0);for(let{path:e,text:t}of s){let n=(e.split(`.`).pop()||``).toLowerCase();n&&u.add(n);let r=f(t,n),i=new Set;for(let t of r)c.set(t,(c.get(t)||0)+1),i.has(t)||(i.add(t),l.has(t)||l.set(t,new Set),l.get(t).add(e))}I(S,c,!0),I(C,l,!0),I(E,[...u].sort().map(e=>`.`+e),!0),je()}catch(e){I(g,`Error: `+e.message)}}let Pe=!1;On(()=>{t.open&&!Pe?(Pe=!0,I(g,`Choose a root folder and click Launch.`),I(_,!0),I(j,!1),I(v,!1),I(ee,!1),I(S,null),I(C,null),I(T,null),I(D,[],!0),I(be,!1),I(de,!1),I(h,1),ue(),H(p)||fetch(`/api/config`).then(e=>e.json()).then(e=>{e.docsFolder&&(I(p,e.docsFolder,!0),I(Se,e.docsFolder,!0))}).catch(()=>{})):t.open||(Pe=!1)});var Fe=Ur(),Ie=z(Fe),Le=e=>{var n=yh(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o),N(r);var c=B(r,2),l=R(c),u=R(l),d=R(u,!0);N(u);var f=B(u,2);Ei(f);var b=B(f,2),S=B(R(b)),C=R(S,!0);N(S),N(b);var w=B(b,2),ne=R(w,!0);N(w),N(l);var ae=B(l,2),ce=R(ae),ue=R(ce,!0);N(ce);var pe=B(ce,2);vn(pe);var Se=B(pe,2),je=B(R(Se)),Pe=R(je,!0);N(je),N(Se),N(ae);var Fe=B(ae,2),Ie=e=>{var t=oh(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=nh(),n=R(t,!0);N(t),V(()=>K(n,H(ge))),G(e,t)},l=e=>{var t=rh(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(ge)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(ge))}),G(e,t)},u=e=>{var t=Ur();$r(z(t),17,()=>H(he),Yr,(e,t)=>{var n=Ur(),r=z(n),i=e=>{var n=ih(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>ve(H(t).path)),U(`click`,o,()=>oe(H(t).entry)),G(e,n)},a=e=>{var n=ah(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,o,()=>oe(H(t).entry)),G(e,n)};q(r,e=>{H(t).kind===`dir`?e(i):e(a,-1)}),G(e,n)}),G(e,t)};q(s,e=>{H(he)===null?e(c):H(he).length===0?e(l,1):e(u,-1)}),N(o),N(t),V(()=>{r.disabled=!H(fe),K(a,H(me))}),U(`click`,r,ye),G(e,t)};q(Fe,e=>{H(de)&&e(Ie)});var Le=B(Fe,2),Re=R(Le),ze=R(Re,!0);N(Re);var Be=B(Re,2),Ve=R(Be);Ei(Ve);var He=B(Ve);N(Be),$r(B(Be,2),17,()=>H(y),e=>e.value,(e,t,n)=>{var r=sh(),i=R(r);Ei(i);var a=B(i);N(r),V(()=>K(a,` ${H(t).label??``}`)),U(`change`,i,ie),Ni(i,()=>H(t).checked,e=>H(t).checked=e),G(e,r)}),N(Le);var Ue=B(Le,2),We=e=>{var t=oh(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=nh(),n=R(t,!0);N(t),V(()=>K(n,H(Te))),G(e,t)},l=e=>{var t=uh(),n=z(t),r=e=>{var t=rh(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(Te)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(Te))}),G(e,t)},i=e=>{var t=Ur();$r(z(t),17,()=>H(we),Yr,(e,t)=>{var n=ch(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>Ee(H(t).path)),U(`click`,o,()=>oe(H(t).name)),G(e,n)}),G(e,t)};q(n,e=>{H(we).length===0?e(r):e(i,-1)});var a=B(n,2),o=e=>{var t=lh(),n=B(R(t)),r=R(n,!0);N(n),N(t),V(()=>K(r,H(Ce))),U(`click`,t,Oe),G(e,t)};q(a,e=>{H(Te)!==`Cannot read directory`&&e(o)}),G(e,t)};q(s,e=>{H(we)===null?e(c):e(l,-1)}),N(o),N(t),V(()=>{r.disabled=!H(xe),K(a,H(Ce))}),U(`click`,r,De),G(e,t)};q(Ue,e=>{H(be)&&e(We)}),N(c);var Ge=B(c,2),Ke=R(Ge),qe=e=>{var t=mh(),n=R(t),r=R(n),i=e=>{var t=fh(),n=z(t),r=R(n);N(n);var i=B(n,2),a=R(i);N(i);var o=B(i,2),s=R(o);N(o);var c=B(o,2),l=e=>{var t=dh(),n=R(t);N(t),V((e,r)=>{J(t,`title`,e),K(n,`${H(E).length??``} extension${H(E).length>1?`s`:``} found (${r??``})`)},[()=>H(E).join(`, `),()=>H(E).join(`, `)]),G(e,t)};q(c,e=>{H(E).length&&e(l)}),V(()=>{K(r,`${H(T).scanned??``} file(s) scanned`),K(a,`${H(T).unique??``} unique domain words`),K(s,`${H(T).shown??``} shown`)}),G(e,t)};q(r,e=>{H(T)&&e(i)}),N(n);var a=B(n,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2);Ei(c);var l=B(c,2),u=R(l,!0);N(l),N(a);var d=B(a,2),f=R(d,!0);N(d);var p=B(d,2);$r(p,21,()=>H(D),Yr,(e,t,n)=>{var r=ph(),i=R(r);i.textContent=n+1;var a=B(i,2),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(o);var d=B(o,2),f=R(d);N(d),N(a),N(r),V(()=>{K(c,H(t).word),K(u,H(t).freq),_i(f,`width:${H(t).pct??``}%`)}),U(`click`,r,()=>M(H(t).word)),G(e,r)}),N(p),N(t),V((e,t,n,r,i,a)=>{J(o,`title`,e),K(s,t),J(c,`title`,n),J(l,`title`,r),K(u,i),K(f,a)},[()=>Y(`wc.min_files_hint`),()=>Y(`wc.min_files_label`),()=>Y(`wc.min_files_hint`),()=>Y(`wc.apply_hint`),()=>Y(`wc.apply_btn`),()=>Y(`wc.top_words`)]),Mi(c,()=>H(h),e=>I(h,e)),U(`click`,l,le),G(e,t)};q(Ke,e=>{H(v)&&e(qe)});var Je=B(Ke,2),Ye=R(Je),Xe=e=>{var t=hh(),n=R(t,!0);N(t),V(()=>K(n,H(g))),G(e,t)};q(Ye,e=>{H(_)&&e(Xe)});var Ze=B(Ye,2);let Qe;Li(Ze,e=>I(ke,e),()=>H(ke)),N(Je),Li(Je,e=>I(Ae,e),()=>H(Ae));var $e=B(Je,2),et=e=>{var t=vh(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2);N(n);var o=B(n,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=e=>{var t=Ur();$r(z(t),17,()=>H(k),Yr,(e,t)=>{var n=gh(),r=R(n),i=R(r,!0);N(r);var a=B(r,2);N(n),V(()=>K(i,H(t))),U(`click`,a,()=>oe(H(t))),G(e,n)}),G(e,t)},d=e=>{G(e,_h())};q(l,e=>{H(k).length?e(u):e(d,-1)}),N(c),N(t),V(e=>{K(i,`${H(O)??``} ×${H(te)??``}`),K(s,e)},[()=>Y(`wc.found_in`)]),U(`click`,a,Me),G(e,t)};q($e,e=>{H(ee)&&e(et)}),N(Ge),N(n),V((e,t,n,r,i,o,c,l,u,f)=>{K(a,e),K(s,t),K(d,n),K(C,r),K(ne,i),K(ue,o),J(pe,`placeholder`,c),K(Pe,l),K(ze,u),Oi(Ve,H(x)),K(He,` ${f??``}`),Qe=hi(Ze,1,``,null,Qe,{hidden:!H(j)})},[()=>Y(`wc.title`),()=>Y(`wc.close_btn`),()=>Y(`wc.search_root_label`),()=>Y(`wc.browse_btn`),()=>Y(`wc.launch_btn`),()=>Y(`wc.exclude_label`),()=>Y(`wc.exclude_placeholder`),()=>Y(`wc.browse_btn`),()=>Y(`wc.extensions_label`),()=>Y(`wc.all_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),Mi(f,()=>H(p),e=>I(p,e)),U(`click`,b,A),U(`click`,w,Ne),U(`input`,pe,se),Mi(pe,()=>H(m),e=>I(m,e)),U(`click`,Se,_e),U(`change`,Ve,re),G(e,n)};q(Ie,e=>{t.open&&e(Le)}),G(e,Fe),Ke()}Nr([`click`,`input`,`change`]);var xh=W(`<button class="ghost-button"><i class="fa-solid fa-cloud"></i></button> <button title="Toggle dark mode" class="ghost-button" aria-label="Toggle dark mode"> </button>`,1),Sh=W(`<div class="relative hidden sm:block"><input type="search" class="w-56 pl-8 pr-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="absolute left-2.5 top-2 text-gray-400 text-sm pointer-events-none">🔍</span></div>`),Ch=W(`<p class="p-8 text-red-500"> </p>`),wh=W(`<div class="h-full flex items-center justify-center p-8"><div class="max-w-md text-center"><div class="text-5xl mb-4 select-none" aria-hidden="true">📚</div> <h2 class="text-xl font-semibold text-gray-700 dark:text-gray-300 mb-2"> </h2> <p class="text-sm text-gray-500 dark:text-gray-500"> </p> <p class="mt-4 text-xs text-gray-400 dark:text-gray-600 font-mono bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 inline-block"> </p> <p class="mt-2 text-xs text-gray-400"> </p></div></div>`),Th=W(`<div class="app-shell bg-gray-50 text-gray-900 dark:bg-gray-900 dark:text-gray-100"><!> <div class="flex overflow-hidden"><!> <main id="home-content-area" class="flex-1 overflow-y-auto"><!></main></div></div> <!> <!> <!> <!>`,1);function Eh(e,t){Ge(t,!0);let n=F(!1),r=F(!1),i=F(!1),a=F(!1),o=F(null),s=F(!1),c=F(``),l=F(!1),u=F(`Living AI Documentation`),d=F(`YYYY_MM_DD_HH_mm_[Category]_title.md`),f=null;function p(){try{let e=localStorage.getItem(`ld-dark`);if(e!==null)return e===`true`}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches}function m(e){I(l,e,!0),document.documentElement.classList.toggle(`dark`,e)}function h(){m(!H(l));try{localStorage.setItem(`ld-dark`,String(H(l)))}catch{}}On(()=>{let e=document.getElementById(`hljs-dark`),t=document.getElementById(`hljs-light`);if(!e||!t)return;let n=$.codeBlockLightTheme&&!H(l);e.disabled=n,t.disabled=!n,document.body.classList.toggle(`ld-code-light`,n)});function g(e){let t=e.trim();if(f&&clearTimeout(f),!t){$.searchQuery=``,$.searchResults=null;return}$.searchQuery=t,$.searchResults=$.allDocs.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.category.toLowerCase().includes(t.toLowerCase())),f=window.setTimeout(async()=>{try{let e=await Fu(t);t===$.searchQuery&&($.searchResults=e)}catch{}},350)}let _=F(L([]));function v(e){let t=H(_)[e];t&&(I(_,H(_).slice(0,e),!0),y(t.id,!1,`restore`))}async function y(e,t=!1,n=!1,r=null){if(n===!0&&$.currentDocId&&$.currentDocId!==e){let t=H(_).findIndex(t=>t.id===e);if(t!==-1)I(_,H(_).slice(0,t),!0);else{let e=$.allDocs.find(e=>e.id===$.currentDocId);I(_,[...H(_),{id:$.currentDocId,title:e?e.title:$.currentDocId}],!0)}}else n||I(_,[],!0);$.currentDocId=e;let i=$.allDocs.find(t=>t.id===e);if(i&&$.revealDoc(i),!t){let t=new URL(location.href);t.searchParams.set(`doc`,e),t.hash=r?`#${r}`:``,history.pushState({docId:e,anchor:r||null},``,t)}I(s,!0),I(c,``);try{let t=await ju(e);t.id=e,I(o,t,!0),document.title=t.title,requestAnimationFrame(()=>{let e=document.getElementById(`home-content-area`);if(r){let t=document.getElementById(r);t&&e&&(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top-80)}else e&&(e.scrollTop=0)})}catch(e){I(c,Y(`doc.failed_to_load`)+(e instanceof Error?e.message:String(e)))}finally{I(s,!1)}}async function b(e){if(!H(o))return;let t=H(o).id,n=await fetch(`/api/documents/`+t,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({content:e})});if(!n.ok)throw Error(await n.text());let r=await ju(t);r.id=t,I(o,r,!0);let i=e.match(/\]\(\s*\.?\/files\/[^)\s]+/g),a={...$.fileAttachmentCounts};i&&i.length?a[t]=i.length:delete a[t],$.fileAttachmentCounts=a}async function x(){if(!H(o))return;let e=H(o).id;if(!(await fetch(`/api/documents/`+encodeURIComponent(e),{method:`DELETE`})).ok)return;$.allDocs=$.allDocs.filter(t=>t.id!==e),Array.isArray($.searchResults)&&($.searchResults=$.searchResults.filter(t=>t.id!==e));let t={...$.annotationCounts};delete t[e],$.annotationCounts=t;let n={...$.fileAttachmentCounts};delete n[e],$.fileAttachmentCounts=n,$.currentDocId=null,I(o,null),history.pushState({},``,location.pathname)}async function S(){let[e,t]=await Promise.all([ku(),Ou()]);if($.allDocs=e,t.docsFolder)try{$.allFolderPaths=await Au(t.docsFolder)}catch{$.allFolderPaths=[]}let[n,r,i]=await Promise.all([Mu(),Nu(),Pu()]);$.annotationCounts=n,$.fileAttachmentCounts=r,$.docStatuses=i}Vi(async()=>{m(p());let e=await Ou();await fa(e.language||`en`),e.title&&(document.title=e.title,I(u,e.title,!0)),e.filenamePattern&&I(d,e.filenamePattern+`.md`),$.exclusiveFolderExpansion=!!e.exclusiveFolderExpansion,$.exclusiveCategoryExpansion=!!e.exclusiveCategoryExpansion,$.codeBlockMaxHeight=typeof e.codeBlockMaxHeight==`number`?e.codeBlockMaxHeight:400,$.imageRoundedCorners=!!e.imageRoundedCorners,$.imageCentered=!!e.imageCentered,$.imageBorder=!!e.imageBorder,$.codeBlockLightTheme=!!e.codeBlockLightTheme,$.codeBlockMaxHeight>0&&document.documentElement.style.setProperty(`--ld-code-max-h`,$.codeBlockMaxHeight+`px`),$.expandedCategories.size===0&&($.expandedCategories=new Set([`General`])),await S();let t=new URLSearchParams(location.search).get(`doc`);if(t)y(t,!0,!1,location.hash?location.hash.slice(1):null);else{let e=$.allDocs.find(e=>e.category===`General`)??$.allDocs[0];e&&y(e.id,!0)}let n=e=>{let t=e.state?.docId||new URLSearchParams(location.search).get(`doc`),n=e.state?.anchor||(location.hash.length>1?location.hash.slice(1):null);t&&y(t,!0,!1,n)};return window.addEventListener(`popstate`,n),()=>window.removeEventListener(`popstate`,n)});var C=Th(),w=z(C),T=R(w);ua(T,{get title(){return H(u)},subtitle:``,actions:e=>{var t=xh(),n=z(t),r=B(n,2),i=R(r,!0);N(r),V((e,t)=>{J(n,`title`,e),J(n,`aria-label`,t),K(i,H(l)?`☀`:`☾`)},[()=>Y(`nav.word_cloud`),()=>Y(`nav.word_cloud`)]),U(`click`,n,()=>I(a,!0)),U(`click`,r,h),G(e,t)},children:(e,t)=>{var n=Sh(),r=R(n);Ei(r),Pe(2),N(n),V(e=>{J(r,`placeholder`,e),Di(r,$.searchQuery)},[()=>Y(`nav.search_placeholder`)]),U(`input`,r,e=>g(e.target.value)),G(e,n)},$$slots:{actions:!0,default:!0}});var E=B(T,2),D=R(E);sd(D,{onopen:e=>y(e),onsearch:g,onexport:()=>I(i,!0),onnewfolder:()=>I(n,!0),onnewdoc:()=>I(r,!0)});var ee=B(D,2),O=R(ee),te=e=>{var t=Ur(),n=z(t),r=e=>{var t=Ch(),n=R(t,!0);N(t),V(()=>K(n,H(c))),G(e,t)},i=e=>{Am(e,{get doc(){return H(o)},get navHistory(){return H(_)},ongoback:v,onopen:(e,t)=>y(e,!1,!0,t),onsave:b,ondelete:x})};q(n,e=>{H(c)?e(r):e(i,-1)}),G(e,t)},k=e=>{var t=wh(),n=R(t),r=B(R(n),2),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(n),N(t),V((e,t,n)=>{K(i,e),K(o,t),K(c,H(d)),K(u,n)},[()=>Y(`welcome.title`),()=>Y(`welcome.hint`),()=>Y(`welcome.pattern_hint`)]),G(e,t)};q(O,e=>{H(o)?e(te):e(k,-1)}),N(ee),N(E),N(w);var ne=B(w,2);Rm(ne,{get open(){return H(n)},onclose:()=>I(n,!1),onsuccess:S});var re=B(ne,2);qm(re,{get open(){return H(r)},onclose:()=>I(r,!1),onsuccess:async e=>{await S(),y(e)}});var ie=B(re,2);th(ie,{get open(){return H(i)},onclose:()=>I(i,!1)}),bh(B(ie,2),{get open(){return H(a)},onclose:()=>I(a,!1)}),G(e,C),Ke()}Nr([`click`,`input`]);var Dh=`modulepreload`,Oh=function(e){return`/`+e},kh={},Ah=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Oh(t,n),t in kh)return;kh[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Dh,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},jh=W(`<div class="flex flex-col h-screen overflow-hidden bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"><header class="flex items-center gap-1 px-2 h-12 shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-sm z-10"><button class="tool-btn !w-auto px-2 text-xs font-medium text-gray-500 dark:text-gray-400"> </button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSidebar" class="tool-btn">☰</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnCopyDiagramId" class="tool-btn"><svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="5" width="8" height="9" rx="1.5"></rect><path d="M3 11V3a1 1 0 0 1 1-1h7"></path></svg></button> <button id="toolSelect" class="tool-btn tool-active"><svg width="11" height="13" viewBox="0 0 11 13" fill="currentColor" stroke="none"><path d="M1 1 L1 12 L4 9 L6.5 13 L8 12.2 L5.5 8.2 L10 8.2 Z"></path></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolBox" class="tool-btn"><svg width="15" height="10" viewBox="0 0 15 10" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="1" y="1" width="13" height="8" rx="1"></rect></svg></button> <button id="toolEllipse" class="tool-btn"><svg width="16" height="10" viewBox="0 0 16 10" fill="none" stroke="currentColor" stroke-width="1.5"><ellipse cx="8" cy="5" rx="7" ry="4"></ellipse></svg></button> <button id="toolDatabase" class="tool-btn"><svg width="12" height="16" viewBox="0 0 12 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><ellipse cx="6" cy="3" rx="5" ry="2"></ellipse><path d="M1 3v10c0 1.1 2.2 2 5 2s5-.9 5-2V3"></path><path d="M11 7.5c0 1.1-2.2 2-5 2s-5-.9-5-2"></path></svg></button> <button id="toolCircle" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="6.5" cy="6.5" r="5.5"></circle></svg></button> <button id="toolActor" class="tool-btn"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="6" cy="3" r="2.2"></circle><line x1="6" y1="5.2" x2="6" y2="10"></line><line x1="1.5" y1="7.5" x2="10.5" y2="7.5"></line><line x1="6" y1="10" x2="2.5" y2="15"></line><line x1="6" y1="10" x2="9.5" y2="15"></line></svg></button> <button id="toolPostIt" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4"><path d="M1 1 H9 L12 4 V12 H1 Z"></path><path d="M9 1 V4 H12" stroke-opacity="0.5"></path></svg></button> <button id="toolTextFree" class="tool-btn" style="font-size:11px; font-weight:600;">T</button> <button id="toolImage" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" rx="1.5"></rect><circle cx="4.5" cy="4.5" r="1.2"></circle><path d="M1 9.5 L4 6.5 L6.5 9 L9 7 L13 10.5"></path></svg></button> <a href="/shape-editor" class="tool-btn">✦</a> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolArrow" class="tool-btn">→</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDelete" class="tool-btn"><svg width="11" height="11" viewBox="0 0 11 11" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><line x1="1" y1="1" x2="10" y2="10"></line><line x1="10" y1="1" x2="1" y2="10"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDiagramDefaults" class="tool-btn"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button> <button id="btnAlign" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4"><line x1="0.5" y1="7.5" x2="13.5" y2="7.5"></line><line x1="3.5" y1="0.5" x2="3.5" y2="13.5" stroke-dasharray="1.5 1.5"></line><line x1="10.5" y1="0.5" x2="10.5" y2="13.5" stroke-dasharray="1.5 1.5"></line></svg></button> <button id="btnGrid" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.2"><line x1="5" y1="1" x2="5" y2="13"></line><line x1="9" y1="1" x2="9" y2="13"></line><line x1="1" y1="5" x2="13" y2="5"></line><line x1="1" y1="9" x2="13" y2="9"></line><rect x="1" y="1" width="12" height="12" rx="1"></rect></svg></button> <button id="btnEdgeStraight" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><line x1="2" y1="12" x2="12" y2="2"></line><polyline points="8,2 12,2 12,6"></polyline></svg></button> <button id="btnEvidenceMode" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 1.5 H8.5 L11 4 V12.5 H4 Z"></path><path d="M8.5 1.5 V4 H11"></path><path d="M1.5 5.5 H6.5"></path><path d="M1.5 8 H6.5"></path><path d="M1.5 10.5 H5"></path></svg></button> <button id="btnResizeMode" class="tool-btn active-tool"><svg id="icon-resize-corner" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="7,10 10,10 10,7"></polyline></svg> <svg id="icon-resize-center" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="hidden"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="4,6.5 4,4 6.5,4"></polyline><polyline points="10,7.5 10,10 7.5,10"></polyline><line x1="10" y1="4" x2="4" y2="10"></line><polyline points="7.5,4 10,4 10,6.5"></polyline><polyline points="4,7.5 4,10 6.5,10"></polyline></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <input id="diagramTitle" type="text" class="flex-1 min-w-0 px-2 py-1 text-sm bg-transparent border-0 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded text-gray-700 dark:text-gray-300 placeholder:text-gray-400"/> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnZoomOut" class="tool-btn">−</button> <span id="zoomLevel" class="text-xs text-gray-500 dark:text-gray-400 w-10 text-center tabular-nums select-none">100%</span> <button id="btnZoomIn" class="tool-btn">+</button> <button id="btnZoomReset" class="tool-btn">⊡</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDark" class="tool-btn"><span id="darkIcon">☽</span></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDebug" class="hidden tool-btn text-xs font-mono">dbg</button> <div id="sepDebug" class="hidden w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnExportDrawio" class="tool-btn"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSave" disabled="" class="px-3 py-1.5 text-xs font-semibold rounded-lg bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-40 disabled:cursor-not-allowed shrink-0 transition-colors"><span> </span></button></header> <div class="flex flex-1 overflow-hidden"><div id="sidebar" class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 flex flex-col overflow-hidden" style="transition: width 0.2s ease"><div class="flex items-center justify-between px-3 py-2 border-b border-gray-200 dark:border-gray-700 shrink-0"><span class="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider"> </span> <button id="btnNewDiagram" class="text-xs font-medium text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors"> </button></div> <div id="diagramList" class="flex-1 overflow-y-auto py-1"></div></div> <div role="separator" aria-orientation="vertical"></div> <div class="relative flex-1 overflow-hidden bg-gray-50 dark:bg-gray-950"><div id="vis-canvas" class="w-full h-full"></div> <div id="customShapeBar" class="hidden"><div id="customShapeBarBody"></div></div> <div id="debugLayer"></div> <div id="evidenceLayer" class="hidden"></div> <div id="stampOverlay" style="position:absolute;inset:0;display:none;z-index:11;cursor:crosshair;"></div> <div id="selectionOverlay"><div id="rh-tl" class="resize-handle" style="top: -5px; left: -5px; cursor: nw-resize"></div> <div id="rh-tr" class="resize-handle" style="top: -5px; right: -5px; cursor: ne-resize"></div> <div id="rh-bl" class="resize-handle" style="bottom: -5px; left: -5px; cursor: sw-resize"></div> <div id="rh-br" class="resize-handle" style="bottom: -5px; right: -5px; cursor: se-resize"></div> <div id="rh-rotate">↻</div> <div id="rh-label-rotate" style="left: 0; top: -28px;"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><g transform="rotate(25,5,5)"><line x1="2.5" y1="3" x2="7.5" y2="3"></line><line x1="5" y1="3" x2="5" y2="8"></line></g></svg></div></div> <aside id="evidencePanel" class="hidden absolute top-0 right-0 bottom-0 w-80 max-w-[85vw] z-30 bg-gray-50 dark:bg-gray-900 border-l border-gray-200 dark:border-gray-700 shadow-xl flex flex-col"><div class="flex items-center justify-between gap-2 px-4 py-3 border-b border-gray-200 dark:border-gray-700"><h2 id="evidencePanelTitle" class="text-sm font-semibold text-gray-800 dark:text-gray-100"> </h2> <button id="btnEvidenceClose" class="tool-btn !w-7 !h-7">×</button></div> <div id="evidencePanelBody" class="flex-1 overflow-y-auto p-3 space-y-3"></div></aside> <div id="nodePanel" class="float-panel hidden"><button id="btnNodeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="nodePanelControls" class="contents"><button id="nodeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#f5f5f4;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <input id="nodeBgOpacity" type="range" min="0" max="100" step="5" value="100" class="w-16 h-1 accent-orange-500 cursor-pointer"/> <div class="panel-sep"></div> <button id="btnNodeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnNodeLink" class="tool-btn !w-6 !h-6"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5a3.5 3.5 0 0 0 5 0l1.5-1.5a3.5 3.5 0 0 0-5-5L5 2.5"></path><path d="M8 5.5a3.5 3.5 0 0 0-5 0L1.5 7a3.5 3.5 0 0 0 5 5L8 10.5"></path></svg></button> <div class="panel-sep"></div> <button id="btnNodeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="nodeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">13</span> <button id="btnNodeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnAlignLeft" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="1" y1="5" x2="7" y2="5"></line><line x1="1" y1="8" x2="9" y2="8"></line></svg></button> <button id="btnAlignCenter" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="2.5" y1="5" x2="9.5" y2="5"></line><line x1="1.5" y1="8" x2="10.5" y2="8"></line></svg></button> <button id="btnAlignRight" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="5" y1="5" x2="11" y2="5"></line><line x1="3" y1="8" x2="11" y2="8"></line></svg></button> <div class="panel-sep"></div> <button id="btnValignTop" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="1.5" x2="9" y2="1.5" stroke-width="2"></line><line x1="1" y1="5" x2="8" y2="5" stroke-width="1.3"></line><line x1="1" y1="8.5" x2="6" y2="8.5" stroke-width="1.3"></line></svg></button> <button id="btnValignMiddle" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="2.5" x2="8" y2="2.5" stroke-width="1.3"></line><line x1="1" y1="6" x2="9" y2="6" stroke-width="2"></line><line x1="1" y1="9.5" x2="6" y2="9.5" stroke-width="1.3"></line></svg></button> <button id="btnValignBottom" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="3.5" x2="8" y2="3.5" stroke-width="1.3"></line><line x1="1" y1="7" x2="6" y2="7" stroke-width="1.3"></line><line x1="1" y1="10.5" x2="9" y2="10.5" stroke-width="2"></line></svg></button> <div class="panel-sep"></div> <div id="customShapeLabelPlacementControls" class="hidden"><button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="above">T↑</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="below">T↓</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="left">←T</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="right">T→</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="center">T□</button> <div class="panel-sep"></div></div> <button id="btnZOrderBack" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1"></rect><rect x="5" y="1" width="8" height="8" rx="1" stroke-opacity="0.35"></rect></svg></button> <button id="btnZOrderFront" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1" stroke-opacity="0.35"></rect><rect x="5" y="1" width="8" height="8" rx="1"></rect></svg></button> <div class="panel-sep"></div> <button id="btnStampColor" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M7 2 C7 2 3 6.5 3 9 a4 4 0 0 0 8 0 C11 6.5 7 2 7 2 Z" fill="currentColor" fill-opacity="0.25"></path></svg></button> <button id="btnStampFontSize" class="tool-btn !w-7 !h-6 font-mono text-xs font-bold">Aa</button> <button id="btnStampSize" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="6" height="6" rx="0.8" fill="currentColor" fill-opacity="0.25"></rect><path d="M10 2 L12 2 L12 4"></path><path d="M12 2 L9 5"></path><path d="M10 12 L12 12 L12 10"></path><path d="M12 12 L9 9"></path></svg></button> <div class="panel-sep"></div> <button id="btnRotateCCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↺</button> <button id="btnRotateCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↻</button> <div class="panel-sep"></div> <button id="btnCopyPng" class="tool-btn !h-6 px-1.5 font-mono text-xs font-semibold flex items-center gap-0.5"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="7" x2="5" y2="1"></line><polyline points="2,4 5,1 8,4"></polyline><line x1="1" y1="9" x2="9" y2="9"></line></svg> PNG</button> <div class="panel-sep"></div> <button id="btnGroup" class="tool-btn !w-8 !h-7"><svg width="22" height="14" viewBox="0 0 22 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="20.6" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="4" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="15" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <button id="btnUngroup" class="tool-btn !w-8 !h-7"><svg width="26" height="14" viewBox="0 0 26 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="3" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="16.3" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="19" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <div class="panel-sep"></div> <button id="btnSaveShapeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <div id="linkPanel" class="float-panel hidden" style="min-width:260px; flex-direction:column; align-items:stretch; gap:0.5rem; padding:0.75rem;"><div class="text-xs font-semibold text-gray-500 dark:text-gray-400 mb-1"> </div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeUrl" value="url" class="accent-orange-500"/> <span> </span></label> <div id="linkUrlRow"><input id="linkUrlInput" type="url" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeDiagram" value="diagram" class="accent-orange-500"/> <span> </span></label> <div id="linkDiagramRow" class="hidden"><select id="linkDiagramSelect" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"></select></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeNew" value="new" class="accent-orange-500"/> <span> </span></label> <div id="linkNewRow" class="hidden"><input id="linkNewName" type="text" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <div class="flex gap-1 mt-1"><button id="btnLinkSave" class="flex-1 text-xs bg-orange-500 hover:bg-orange-600 text-white rounded px-2 py-1"> </button> <button id="btnLinkRemove" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-red-50 dark:hover:bg-red-900/20 hover:text-red-600"> </button> <button id="btnLinkCancel" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-gray-100 dark:hover:bg-gray-700">✕</button></div></div> <div id="edgePanel" class="float-panel hidden"><button id="btnEdgeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="edgePanelControls" class="contents"><button id="edgeBtnNone" class="tool-btn !w-7 !h-6 font-mono text-xs">—</button> <button id="edgeBtnFrom" class="tool-btn !w-7 !h-6 text-xs">←</button> <button id="edgeBtnTo" class="tool-btn !w-7 !h-6 text-xs">→</button> <button id="edgeBtnBoth" class="tool-btn !w-8 !h-6 text-xs">←→</button> <div class="panel-sep"></div> <button id="edgeBtnSolid" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round"></line></svg></button> <button id="edgeBtnDashed" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-dasharray="4,3"></line></svg></button> <div class="panel-sep"></div> <button id="btnEdgeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="edgeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">11</span> <button id="btnEdgeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnEdgeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnEdgeLabelWidthReset" class="tool-btn !w-6 !h-6 text-xs">↔</button> <div class="panel-sep"></div> <button id="btnEdgeLabelRotateCCW" class="tool-btn !w-7 !h-6 text-sm">↺</button> <button id="btnEdgeLabelRotateCW" class="tool-btn !w-7 !h-6 text-sm">↻</button> <div class="panel-sep"></div> <button id="btnEdgeLabelOffsetLeft" class="tool-btn !w-6 !h-6 text-sm">←</button> <button id="btnEdgeLabelOffsetRight" class="tool-btn !w-6 !h-6 text-sm">→</button> <button id="btnEdgeLabelOffsetUp" class="tool-btn !w-6 !h-6 text-sm">↑</button> <button id="btnEdgeLabelOffsetDown" class="tool-btn !w-6 !h-6 text-sm">↓</button> <button id="btnEdgeLabelOffsetReset" class="tool-btn !w-6 !h-6 text-xs">⊙</button> <div class="panel-sep"></div> <button id="btnEdgeWidthDecrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W−</button> <button id="btnEdgeWidthIncrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W+</button> <div class="panel-sep"></div> <button id="edgeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#a8a29e;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <button id="btnEdgeClearPorts" class="tool-btn !w-8 !h-6 text-xs">⊗</button> <div class="panel-sep"></div> <button id="btnSaveEdgeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <textarea id="labelInput" class="hidden" rows="1"></textarea> <div id="emptyState" class="absolute inset-0 flex flex-col items-center justify-center text-gray-400 dark:text-gray-600 pointer-events-none select-none"><svg width="52" height="44" viewBox="0 0 52 44" fill="none" stroke="currentColor" stroke-width="1.5" class="mb-3 opacity-50"><rect x="2" y="4" width="18" height="12" rx="2"></rect><rect x="32" y="28" width="18" height="12" rx="2"></rect><line x1="20" y1="10" x2="32" y2="34" stroke-dasharray="4,3"></line><rect x="17" y="16" width="18" height="12" rx="2"></rect><line x1="26" y1="16" x2="26" y2="10" stroke-dasharray="4,3"></line></svg> <p class="text-sm"> </p></div></div></div> <div id="toastContainer"></div> <div id="imageNameModal" style="display:none;position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,0.5);" class="flex items-center justify-center"><div class="bg-white dark:bg-gray-800 rounded-xl shadow-2xl p-6 w-80 flex flex-col gap-3"><p class="text-sm font-semibold text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-400 dark:text-gray-500">Lettres, chiffres, <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">_</code> et <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">-</code> uniquement.
135
135
  Laisser vide pour un nom automatique.</p> <div class="flex items-center gap-1"><input id="imageNameInput" type="text" autocomplete="off" spellcheck="false" class="flex-1 rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700
136
136
  text-gray-900 dark:text-gray-100 text-sm px-2 py-1 outline-none focus:ring-2 focus:ring-blue-400"/> <span class="text-xs text-gray-400 dark:text-gray-500 whitespace-nowrap">.png</span></div> <p id="imageNameError" class="text-xs text-red-500 hidden"> </p> <div class="flex gap-2 justify-end"><button id="imageNameCancel" class="px-3 py-1 text-xs rounded border border-gray-300 dark:border-gray-600
137
- text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"> </button> <button id="imageNameConfirm" class="px-3 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600"> </button></div></div></div></div>`);function Ah(e,t){Ge(t,!0),Vi(()=>{let e;return(async()=>{let t=`en`;try{t=(await fetch(`/api/config`).then(e=>e.json())).language||`en`}catch{}await fa(t);let{initDiagram:r}=await Oh(async()=>{let{initDiagram:e}=await import(`./main-BiuW0-3f.js`);return{initDiagram:e}},[]);e=r();let i=document.getElementById(`sidebar`),a=parseInt(localStorage.getItem(n)||``,10);i&&Number.isFinite(a)&&(i.style.width=a+`px`)})(),()=>e?.()});let n=`ld-diagram-sidebar-w`,r=F(!1);function i(e){e.preventDefault();let t=document.getElementById(`sidebar`);if(!t)return;let i=e.clientX,a=t.getBoundingClientRect().width;I(r,!0),t.style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let o=e=>{let n=Math.max(160,Math.min(480,a+e.clientX-i));t.style.width=n+`px`},s=()=>{document.removeEventListener(`mousemove`,o),document.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``,I(r,!1),t.style.transition=``;try{localStorage.setItem(n,String(parseInt(t.style.width,10)))}catch{}};document.addEventListener(`mousemove`,o),document.addEventListener(`mouseup`,s)}var a=kh(),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,4),u=B(l,4),d=B(u,2),f=B(d,4),p=B(f,2),m=B(p,2),h=B(m,2),g=B(h,2),_=B(g,2),v=B(_,2),y=B(v,2),b=B(y,2),x=B(b,4),S=B(x,4),C=B(S,4),w=B(C,2),T=B(w,2),E=B(T,2),D=B(E,2),ee=B(D,2),O=B(ee,4),te=B(O,4),k=B(te,4),ne=B(k,2),re=B(ne,8),ie=B(re,4),ae=B(ie,4),oe=R(ae),se=R(oe,!0);N(oe),N(ae),N(o);var ce=B(o,2),le=R(ce),ue=R(le),de=R(ue),fe=R(de,!0);N(de);var pe=B(de,2),me=R(pe,!0);N(pe),N(ue),Pe(2),N(le);var he=B(le,2),ge=B(he,2),_e=B(R(ge),10),ve=B(R(_e),8),ye=B(ve,2);N(_e);var be=B(_e,2),xe=R(be),Se=R(xe),Ce=R(Se,!0);N(Se);var we=B(Se,2);N(xe),Pe(2),N(be);var Te=B(be,2),A=R(Te),Ee=B(A,4),De=R(Ee),Oe=B(De,4),ke=B(Oe,4),Ae=B(ke,2),j=B(Ae,4),je=B(j,2),M=B(je,2),Me=B(M,4),Ne=B(Me,2),Fe=B(Ne,2),Ie=B(Fe,4),Le=B(Ie,2),Re=B(Le,2),ze=B(Re,4),Be=R(ze),Ve=B(Be,2),He=B(Ve,2),Ue=B(He,2),We=B(Ue,2);Pe(2),N(ze);var qe=B(ze,2),Je=B(qe,2),Ye=B(Je,4),Xe=B(Ye,2),Ze=B(Xe,2),Qe=B(Ze,4),$e=B(Qe,2),et=B($e,4),tt=B(et,4),nt=B(tt,2),rt=B(nt,4);N(Ee),N(Te);var it=B(Te,2),at=R(it),ot=R(at,!0);N(at);var st=B(at,2),ct=B(R(st),2),lt=R(ct,!0);N(ct),N(st);var ut=B(st,2),dt=R(ut);N(ut);var ft=B(ut,2),pt=B(R(ft),2),mt=R(pt,!0);N(pt),N(ft);var ht=B(ft,4),gt=B(R(ht),2),_t=R(gt,!0);N(gt),N(ht);var vt=B(ht,2),yt=R(vt);N(vt);var bt=B(vt,2),xt=R(bt),St=R(xt,!0);N(xt);var Ct=B(xt,2),wt=R(Ct,!0);N(Ct),Pe(2),N(bt),N(it);var Tt=B(it,2),Et=R(Tt),Dt=B(Et,4),Ot=R(Dt),kt=B(Ot,2),At=B(kt,2),jt=B(At,2),Mt=B(jt,4),Nt=B(Mt,2),Pt=B(Nt,4),Ft=B(Pt,2),It=B(Ft,2),Lt=B(It,4),Rt=B(Lt,2),zt=B(Rt,4),Bt=B(zt,2),P=B(Bt,4),Vt=B(P,2),Ht=B(Vt,2),Ut=B(Ht,2),Wt=B(Ut,2),Gt=B(Wt,4),Kt=B(Gt,2),qt=B(Kt,4),Jt=B(qt,4),Yt=B(Jt,4);N(Dt),N(Tt);var Xt=B(Tt,2),Zt=B(Xt,2),Qt=B(R(Zt),2),$t=R(Qt,!0);N(Qt),N(Zt),N(ge),N(ce);var en=B(ce,4),tn=R(en),L=R(tn),nn=R(L,!0);N(L);var rn=B(L,4),an=R(rn);Pe(2),N(rn);var on=B(rn,2),sn=R(on,!0);N(on);var cn=B(on,2),ln=R(cn),un=R(ln,!0);N(ln);var dn=B(ln,2),fn=R(dn,!0);N(dn),N(cn),N(tn),N(en),N(a),V((e,t,n,i,a,o,s,ae,oe,ce,le,ue,de,pe,ge,_e,be,xe,Se,Te,Ee,N,Pe,ze,Ge,Ke,it,at,st,ct,ut,ft,pt,ht,gt,vt,bt,xt,Ct,Tt,Dt,F,Zt,I,Qt,en,tn,L,rn,on,cn,ln,dn,R,z,B,pn,mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn,On,kn,An,jn,Mn,Nn,Pn,V,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn,qn,Jn,Yn,Xn,Zn,Qn,$n,er,tr,nr,rr,ir)=>{K(c,e),J(l,`title`,t),J(u,`title`,n),J(d,`title`,i),J(f,`title`,a),J(p,`title`,o),J(m,`title`,s),J(h,`title`,ae),J(g,`title`,oe),J(_,`title`,ce),J(v,`title`,le),J(y,`title`,ue),J(b,`title`,de),J(x,`title`,pe),J(S,`title`,ge),J(C,`title`,_e),J(w,`title`,be),J(T,`title`,xe),J(E,`title`,Se),J(D,`title`,Te),J(ee,`title`,Ee),J(O,`placeholder`,N),J(te,`title`,Pe),J(k,`title`,ze),J(ne,`title`,Ge),J(re,`title`,Ke),J(ie,`title`,it),K(se,at),K(fe,st),K(me,ct),hi(he,1,`w-1 shrink-0 cursor-col-resize select-none transition-colors ${H(r)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),J(ve,`title`,ut),J(ye,`title`,ft),K(Ce,pt),J(we,`title`,ht),J(A,`title`,gt),J(De,`title`,vt),J(Oe,`title`,bt),J(ke,`title`,xt),J(Ae,`title`,Ct),J(j,`title`,Tt),J(je,`title`,Dt),J(M,`title`,F),J(Me,`title`,Zt),J(Ne,`title`,I),J(Fe,`title`,Qt),J(Ie,`title`,en),J(Le,`title`,tn),J(Re,`title`,L),J(Be,`title`,rn),J(Ve,`title`,on),J(He,`title`,cn),J(Ue,`title`,ln),J(We,`title`,dn),J(qe,`title`,R),J(Je,`title`,z),J(Ye,`title`,B),J(Xe,`title`,pn),J(Ze,`title`,mn),J(Qe,`title`,hn),J($e,`title`,gn),J(et,`title`,_n),J(tt,`title`,vn),J(nt,`title`,yn),J(rt,`title`,bn),K(ot,xn),K(lt,Sn),J(dt,`placeholder`,Cn),K(mt,wn),K(_t,Tn),J(yt,`placeholder`,En),K(St,Dn),K(wt,On),J(Et,`title`,kn),J(Ot,`title`,An),J(kt,`title`,jn),J(At,`title`,Mn),J(jt,`title`,Nn),J(Mt,`title`,Pn),J(Nt,`title`,V),J(Pt,`title`,Fn),J(Ft,`title`,In),J(It,`title`,Ln),J(Lt,`title`,Rn),J(Rt,`title`,zn),J(zt,`title`,Bn),J(Bt,`title`,Vn),J(P,`title`,Hn),J(Vt,`title`,Un),J(Ht,`title`,Wn),J(Ut,`title`,Gn),J(Wt,`title`,Kn),J(Gt,`title`,qn),J(Kt,`title`,Jn),J(qt,`title`,Yn),J(Jt,`title`,Xn),J(Yt,`title`,Zn),J(Xt,`placeholder`,Qn),K($t,$n),K(nn,er),J(an,`placeholder`,tr),K(sn,nr),K(un,rr),K(fn,ir)},[()=>Y(`diagram.back_btn`),()=>Y(`diagram.diagrams_list_title`),()=>Y(`diagram.toolbar.copy_mcp_id`),()=>Y(`diagram.toolbar.select`),()=>Y(`diagram.toolbar.box`),()=>Y(`diagram.toolbar.ellipse`),()=>Y(`diagram.toolbar.database`),()=>Y(`diagram.toolbar.circle`),()=>Y(`diagram.toolbar.actor`),()=>Y(`diagram.toolbar.postit`),()=>Y(`diagram.toolbar.text_free`),()=>Y(`diagram.toolbar.image`),()=>Y(`diagram.toolbar.shape_editor`),()=>Y(`diagram.toolbar.arrow`),()=>Y(`diagram.toolbar.delete`),()=>Y(`diagram.toolbar.defaults`),()=>Y(`diagram.toolbar.align_guides`),()=>Y(`diagram.toolbar.grid`),()=>Y(`diagram.toolbar.edge_style`),()=>Y(`diagram.toolbar.evidence_mode`),()=>Y(`diagram.toolbar.resize_corner`),()=>Y(`diagram.toolbar.title_placeholder`),()=>Y(`diagram.toolbar.zoom_out`),()=>Y(`diagram.toolbar.zoom_in`),()=>Y(`diagram.toolbar.fit`),()=>Y(`diagram.toolbar.debug`),()=>Y(`diagram.toolbar.export_drawio`),()=>Y(`diagram.toolbar.save`),()=>Y(`diagram.sidebar.title`),()=>Y(`diagram.sidebar.new_btn`),()=>Y(`diagram.selection.rotate_shape`),()=>Y(`diagram.selection.rotate_text`),()=>Y(`diagram.evidence.panel_title`),()=>Y(`diagram.evidence.close`),()=>Y(`diagram.node_panel.lock`),()=>Y(`diagram.node_panel.color`),()=>Y(`diagram.node_panel.bg_opacity`),()=>Y(`diagram.node_panel.edit_label`),()=>Y(`diagram.node_panel.edit_link`),()=>Y(`diagram.node_panel.font_decrease`),()=>Y(`diagram.node_panel.font_size_value`),()=>Y(`diagram.node_panel.font_increase`),()=>Y(`diagram.node_panel.align_left`),()=>Y(`diagram.node_panel.align_center`),()=>Y(`diagram.node_panel.align_right`),()=>Y(`diagram.node_panel.align_top`),()=>Y(`diagram.node_panel.align_middle`),()=>Y(`diagram.node_panel.align_bottom`),()=>Y(`diagram.node_panel.custom_label_above`),()=>Y(`diagram.node_panel.custom_label_below`),()=>Y(`diagram.node_panel.custom_label_left`),()=>Y(`diagram.node_panel.custom_label_right`),()=>Y(`diagram.node_panel.custom_label_center`),()=>Y(`diagram.node_panel.send_back`),()=>Y(`diagram.node_panel.bring_front`),()=>Y(`diagram.node_panel.stamp_color`),()=>Y(`diagram.node_panel.stamp_font`),()=>Y(`diagram.node_panel.stamp_size`),()=>Y(`diagram.node_panel.rotate_ccw`),()=>Y(`diagram.node_panel.rotate_cw`),()=>Y(`diagram.node_panel.copy_png`),()=>Y(`diagram.node_panel.group`),()=>Y(`diagram.node_panel.ungroup`),()=>Y(`diagram.node_panel.save_as_default`),()=>Y(`diagram.link_panel.title`),()=>Y(`diagram.link_panel.external`),()=>Y(`diagram.link_panel.url_placeholder`),()=>Y(`diagram.link_panel.existing_diagram`),()=>Y(`diagram.link_panel.new_diagram`),()=>Y(`diagram.link_panel.diagram_name_placeholder`),()=>Y(`diagram.link_panel.save_btn`),()=>Y(`diagram.link_panel.remove_btn`),()=>Y(`diagram.edge_panel.lock`),()=>Y(`diagram.edge_panel.no_arrow`),()=>Y(`diagram.edge_panel.arrow_from`),()=>Y(`diagram.edge_panel.arrow_to`),()=>Y(`diagram.edge_panel.arrow_both`),()=>Y(`diagram.edge_panel.solid`),()=>Y(`diagram.edge_panel.dashed`),()=>Y(`diagram.edge_panel.font_decrease`),()=>Y(`diagram.edge_panel.font_size_value`),()=>Y(`diagram.edge_panel.font_increase`),()=>Y(`diagram.edge_panel.edit_label`),()=>Y(`diagram.edge_panel.reset_label_width`),()=>Y(`diagram.edge_panel.rotate_label_ccw`),()=>Y(`diagram.edge_panel.rotate_label_cw`),()=>Y(`diagram.edge_panel.offset_label_left`),()=>Y(`diagram.edge_panel.offset_label_right`),()=>Y(`diagram.edge_panel.offset_label_up`),()=>Y(`diagram.edge_panel.offset_label_down`),()=>Y(`diagram.edge_panel.offset_label_reset`),()=>Y(`diagram.edge_panel.width_decrease`),()=>Y(`diagram.edge_panel.width_increase`),()=>Y(`diagram.edge_panel.color`),()=>Y(`diagram.edge_panel.clear_ports`),()=>Y(`diagram.edge_panel.save_as_default`),()=>Y(`diagram.label_input.placeholder`),()=>Y(`diagram.empty_state`),()=>Y(`diagram.image_modal.title`),()=>Y(`diagram.image_modal.placeholder`),()=>Y(`diagram.image_modal.error_chars`),()=>Y(`diagram.image_modal.cancel_btn`),()=>Y(`diagram.image_modal.paste_btn`)]),U(`click`,s,()=>history.back()),U(`mousedown`,he,i),G(e,a),Ke()}Nr([`click`,`mousedown`]),He();var jh={network:null,nodes:null,edges:null,diagrams:[],currentDiagramId:null,currentTool:`select`,pendingShape:`box`,selectedNodeIds:[],selectedEdgeIds:[],alignGuides:!0,gridEnabled:!0,debugMode:!1,isDirty:!1,sidebarOpen:!0,editingNodeId:null,editingEdgeId:null,resizeDrag:null,rotateDrag:null,labelRotateDrag:null,activeStamp:null,stampTargetIds:[],clipboard:null,canonicalOrder:[],edgesStraight:!1,resizeSymmetric:!1,nodeColorOverrides:{},customShapeLibraries:[],customShapeDefs:new Map,edgeLabelCanvasPos:{},edgeLabelBBox:{},freeArrowFirstPoint:null,exportingPng:!1,evidenceMode:!1};function Mh(){jh.isDirty=!0,document.getElementById(`btnSave`).disabled=!1}var Nh=`custom-shape`,Ph=`custom-shape:`,Fh=[{id:`N`,x:.5,y:0},{id:`NE`,x:1,y:0},{id:`E`,x:1,y:.5},{id:`SE`,x:1,y:1},{id:`S`,x:.5,y:1},{id:`SW`,x:0,y:1},{id:`W`,x:0,y:.5},{id:`NW`,x:0,y:0}];function Ih(e){return typeof e==`string`&&e.startsWith(`custom-shape:`)}function Lh(e){return Ih(e)?e.slice(13):null}function Rh(e){return e&&jh.customShapeDefs&&jh.customShapeDefs.get(e)||null}function zh(e){let t=Rh(e);return[t&&t.width||65,t&&t.height||65]}function Bh(e){let t=Rh(e);return t&&Array.isArray(t.anchors)&&t.anchors.length?t.anchors:Fh}function Vh(e){let t=Rh(e);return t&&[`center`,`below`,`above`,`right`,`left`].includes(t.labelPlacement)?t.labelPlacement:`below`}async function Hh(){try{let e=await fetch(`/api/shape-libraries`);if(!e.ok)throw Error(`shape libraries unavailable`);let t=await e.json(),n=Array.isArray(t.libraries)?t.libraries:[];jh.customShapeLibraries=n,jh.customShapeDefs=new Map,n.forEach(e=>{(e.shapes||[]).forEach(e=>jh.customShapeDefs.set(e.id,e))})}catch{jh.customShapeLibraries=[],jh.customShapeDefs=new Map}}function Uh(){let e=document.getElementById(`customShapeBar`),t=document.getElementById(`customShapeBarBody`);if(!e||!t)return;t.innerHTML=``;let n=(jh.customShapeLibraries||[]).flatMap(e=>(e.shapes||[]).filter(e=>e.showInDiagram!==!1).map(t=>({...t,libraryName:e.name})));e.classList.toggle(`hidden`,n.length===0),n.forEach(e=>{let n=document.createElement(`button`);n.type=`button`,n.className=`custom-shape-btn`,n.title=`${e.libraryName||``}${e.libraryName?` · `:``}${e.name}`,n.dataset.customShapeId=e.id;let r=document.createElement(`img`);r.src=e.imageSrc,r.alt=``,r.draggable=!1,n.appendChild(r),n.addEventListener(`click`,()=>{window.dispatchEvent(new CustomEvent(`diagram:setTool`,{detail:{tool:`addNode`,shape:`${Ph}${e.id}`}}))}),t.appendChild(n)})}function Wh(){let e={saveState:document.getElementById(`saveState`),librarySelect:document.getElementById(`librarySelect`),libraryName:document.getElementById(`libraryName`),shapeList:document.getElementById(`shapeList`),previewStage:document.getElementById(`previewStage`),previewImage:document.getElementById(`previewImage`),shapeName:document.getElementById(`shapeName`),imageFile:document.getElementById(`imageFile`),shapeWidth:document.getElementById(`shapeWidth`),shapeHeight:document.getElementById(`shapeHeight`),labelPlacement:document.getElementById(`labelPlacement`),shapeShowInDiagram:document.getElementById(`shapeShowInDiagram`),anchorList:document.getElementById(`anchorList`),anchorCount:document.getElementById(`anchorCount`)},t={libraries:[]},n=null,r=null,i=null,a=null,o=e=>`${e}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,s=()=>t.libraries.find(e=>e.id===n)||null,c=()=>s()?.shapes.find(e=>e.id===r)||null,l=e=>Math.max(0,Math.min(1,e)),u=e=>[`below`,`above`,`right`,`left`,`center`].includes(e)?e:`below`,d=e=>String(e??``).replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e]);function f(t){e.saveState.textContent=t,t&&setTimeout(()=>{e.saveState.textContent===t&&(e.saveState.textContent=``)},1800)}async function p(){t=await(await fetch(`/api/shape-libraries`)).json(),Array.isArray(t.libraries)||(t.libraries=[]),t.libraries.length||t.libraries.push({id:o(`lib`),name:`My shapes`,shapes:[]}),n=t.libraries[0].id,r=t.libraries[0].shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}async function m(){t=await(await fetch(`/api/shape-libraries`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})).json(),f(`Saved`)}function h(){return{id:o(`shape`),name:`New shape`,imageSrc:``,width:65,height:65,labelPlacement:`below`,showInDiagram:!0,anchors:structuredClone(Fh)}}function g(){_(),v(),y()}function _(){e.librarySelect.innerHTML=``,t.libraries.forEach(t=>{let r=document.createElement(`option`);r.value=t.id,r.textContent=t.name,r.selected=t.id===n,e.librarySelect.appendChild(r)}),e.libraryName.value=s()?.name||``}function v(){let t=s();e.shapeList.innerHTML=``,(t?.shapes||[]).forEach(t=>{let n=document.createElement(`button`);n.type=`button`,n.className=`shape-item w-full flex items-center gap-2 px-2 py-1.5 rounded text-sm text-left hover:bg-gray-100 ${t.id===r?`active`:``}`;let a=document.createElement(`img`);a.src=t.imageSrc,a.alt=``,a.className=`w-6 h-6 object-contain shrink-0`;let o=document.createElement(`span`);o.className=`truncate`,o.textContent=t.name,n.append(a,o),n.addEventListener(`click`,()=>{r=t.id,i=structuredClone(t),g()}),e.shapeList.appendChild(n)}),t?.shapes?.length||(e.shapeList.innerHTML=`<p class="text-xs text-gray-400 px-2 py-2">No shape yet.</p>`)}function y(){i||=h(),e.previewStage.style.aspectRatio=`${Math.max(16,Number(i.width)||65)} / ${Math.max(16,Number(i.height)||65)}`,e.previewImage.src=i.imageSrc||``,e.previewImage.style.display=i.imageSrc?`block`:`none`,e.shapeName.value=i.name||``,e.shapeWidth.value=i.width||65,e.shapeHeight.value=i.height||65,e.labelPlacement.value=u(i.labelPlacement),e.shapeShowInDiagram.checked=i.showInDiagram!==!1,b()}function b(){e.previewStage.querySelectorAll(`.anchor-dot`).forEach(e=>e.remove()),e.anchorList.innerHTML=``;let t=i.anchors||[];e.anchorCount.textContent=`${t.length} anchor${t.length>1?`s`:``}`,t.forEach((t,n)=>{let r=document.createElement(`button`);r.type=`button`,r.className=`anchor-dot`,r.style.left=`${t.x*100}%`,r.style.top=`${t.y*100}%`,r.dataset.anchorId=t.id,r.innerHTML=`<span>${t.id}</span>`,r.addEventListener(`pointerdown`,e=>{e.preventDefault(),a=t.id,r.setPointerCapture(e.pointerId)}),e.previewStage.appendChild(r);let o=document.createElement(`div`);o.className=`grid grid-cols-[4.5rem_1fr_1fr_2rem] gap-2 items-center`,o.innerHTML=`
137
+ text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"> </button> <button id="imageNameConfirm" class="px-3 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600"> </button></div></div></div></div>`);function Mh(e,t){Ge(t,!0),Vi(()=>{let e;return(async()=>{let t=`en`;try{t=(await fetch(`/api/config`).then(e=>e.json())).language||`en`}catch{}await fa(t);let{initDiagram:r}=await Ah(async()=>{let{initDiagram:e}=await import(`./main-DHEytvxK.js`);return{initDiagram:e}},[]);e=r();let i=document.getElementById(`sidebar`),a=parseInt(localStorage.getItem(n)||``,10);i&&Number.isFinite(a)&&(i.style.width=a+`px`)})(),()=>e?.()});let n=`ld-diagram-sidebar-w`,r=F(!1);function i(e){e.preventDefault();let t=document.getElementById(`sidebar`);if(!t)return;let i=e.clientX,a=t.getBoundingClientRect().width;I(r,!0),t.style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let o=e=>{let n=Math.max(160,Math.min(480,a+e.clientX-i));t.style.width=n+`px`},s=()=>{document.removeEventListener(`mousemove`,o),document.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``,I(r,!1),t.style.transition=``;try{localStorage.setItem(n,String(parseInt(t.style.width,10)))}catch{}};document.addEventListener(`mousemove`,o),document.addEventListener(`mouseup`,s)}var a=jh(),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,4),u=B(l,4),d=B(u,2),f=B(d,4),p=B(f,2),m=B(p,2),h=B(m,2),g=B(h,2),_=B(g,2),v=B(_,2),y=B(v,2),b=B(y,2),x=B(b,4),S=B(x,4),C=B(S,4),w=B(C,2),T=B(w,2),E=B(T,2),D=B(E,2),ee=B(D,2),O=B(ee,4),te=B(O,4),k=B(te,4),ne=B(k,2),re=B(ne,8),ie=B(re,4),ae=B(ie,4),oe=R(ae),se=R(oe,!0);N(oe),N(ae),N(o);var ce=B(o,2),le=R(ce),ue=R(le),de=R(ue),fe=R(de,!0);N(de);var pe=B(de,2),me=R(pe,!0);N(pe),N(ue),Pe(2),N(le);var he=B(le,2),ge=B(he,2),_e=B(R(ge),10),ve=B(R(_e),8),ye=B(ve,2);N(_e);var be=B(_e,2),xe=R(be),Se=R(xe),Ce=R(Se,!0);N(Se);var we=B(Se,2);N(xe),Pe(2),N(be);var Te=B(be,2),A=R(Te),Ee=B(A,4),De=R(Ee),Oe=B(De,4),ke=B(Oe,4),Ae=B(ke,2),j=B(Ae,4),je=B(j,2),M=B(je,2),Me=B(M,4),Ne=B(Me,2),Fe=B(Ne,2),Ie=B(Fe,4),Le=B(Ie,2),Re=B(Le,2),ze=B(Re,4),Be=R(ze),Ve=B(Be,2),He=B(Ve,2),Ue=B(He,2),We=B(Ue,2);Pe(2),N(ze);var qe=B(ze,2),Je=B(qe,2),Ye=B(Je,4),Xe=B(Ye,2),Ze=B(Xe,2),Qe=B(Ze,4),$e=B(Qe,2),et=B($e,4),tt=B(et,4),nt=B(tt,2),rt=B(nt,4);N(Ee),N(Te);var it=B(Te,2),at=R(it),ot=R(at,!0);N(at);var st=B(at,2),ct=B(R(st),2),lt=R(ct,!0);N(ct),N(st);var ut=B(st,2),dt=R(ut);N(ut);var ft=B(ut,2),pt=B(R(ft),2),mt=R(pt,!0);N(pt),N(ft);var ht=B(ft,4),gt=B(R(ht),2),_t=R(gt,!0);N(gt),N(ht);var vt=B(ht,2),yt=R(vt);N(vt);var bt=B(vt,2),xt=R(bt),St=R(xt,!0);N(xt);var Ct=B(xt,2),wt=R(Ct,!0);N(Ct),Pe(2),N(bt),N(it);var Tt=B(it,2),Et=R(Tt),Dt=B(Et,4),Ot=R(Dt),kt=B(Ot,2),At=B(kt,2),jt=B(At,2),Mt=B(jt,4),Nt=B(Mt,2),Pt=B(Nt,4),Ft=B(Pt,2),It=B(Ft,2),Lt=B(It,4),Rt=B(Lt,2),zt=B(Rt,4),Bt=B(zt,2),P=B(Bt,4),Vt=B(P,2),Ht=B(Vt,2),Ut=B(Ht,2),Wt=B(Ut,2),Gt=B(Wt,4),Kt=B(Gt,2),qt=B(Kt,4),Jt=B(qt,4),Yt=B(Jt,4);N(Dt),N(Tt);var Xt=B(Tt,2),Zt=B(Xt,2),Qt=B(R(Zt),2),$t=R(Qt,!0);N(Qt),N(Zt),N(ge),N(ce);var en=B(ce,4),tn=R(en),L=R(tn),nn=R(L,!0);N(L);var rn=B(L,4),an=R(rn);Pe(2),N(rn);var on=B(rn,2),sn=R(on,!0);N(on);var cn=B(on,2),ln=R(cn),un=R(ln,!0);N(ln);var dn=B(ln,2),fn=R(dn,!0);N(dn),N(cn),N(tn),N(en),N(a),V((e,t,n,i,a,o,s,ae,oe,ce,le,ue,de,pe,ge,_e,be,xe,Se,Te,Ee,N,Pe,ze,Ge,Ke,it,at,st,ct,ut,ft,pt,ht,gt,vt,bt,xt,Ct,Tt,Dt,F,Zt,I,Qt,en,tn,L,rn,on,cn,ln,dn,R,z,B,pn,mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn,On,kn,An,jn,Mn,Nn,Pn,V,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn,qn,Jn,Yn,Xn,Zn,Qn,$n,er,tr,nr,rr,ir)=>{K(c,e),J(l,`title`,t),J(u,`title`,n),J(d,`title`,i),J(f,`title`,a),J(p,`title`,o),J(m,`title`,s),J(h,`title`,ae),J(g,`title`,oe),J(_,`title`,ce),J(v,`title`,le),J(y,`title`,ue),J(b,`title`,de),J(x,`title`,pe),J(S,`title`,ge),J(C,`title`,_e),J(w,`title`,be),J(T,`title`,xe),J(E,`title`,Se),J(D,`title`,Te),J(ee,`title`,Ee),J(O,`placeholder`,N),J(te,`title`,Pe),J(k,`title`,ze),J(ne,`title`,Ge),J(re,`title`,Ke),J(ie,`title`,it),K(se,at),K(fe,st),K(me,ct),hi(he,1,`w-1 shrink-0 cursor-col-resize select-none transition-colors ${H(r)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),J(ve,`title`,ut),J(ye,`title`,ft),K(Ce,pt),J(we,`title`,ht),J(A,`title`,gt),J(De,`title`,vt),J(Oe,`title`,bt),J(ke,`title`,xt),J(Ae,`title`,Ct),J(j,`title`,Tt),J(je,`title`,Dt),J(M,`title`,F),J(Me,`title`,Zt),J(Ne,`title`,I),J(Fe,`title`,Qt),J(Ie,`title`,en),J(Le,`title`,tn),J(Re,`title`,L),J(Be,`title`,rn),J(Ve,`title`,on),J(He,`title`,cn),J(Ue,`title`,ln),J(We,`title`,dn),J(qe,`title`,R),J(Je,`title`,z),J(Ye,`title`,B),J(Xe,`title`,pn),J(Ze,`title`,mn),J(Qe,`title`,hn),J($e,`title`,gn),J(et,`title`,_n),J(tt,`title`,vn),J(nt,`title`,yn),J(rt,`title`,bn),K(ot,xn),K(lt,Sn),J(dt,`placeholder`,Cn),K(mt,wn),K(_t,Tn),J(yt,`placeholder`,En),K(St,Dn),K(wt,On),J(Et,`title`,kn),J(Ot,`title`,An),J(kt,`title`,jn),J(At,`title`,Mn),J(jt,`title`,Nn),J(Mt,`title`,Pn),J(Nt,`title`,V),J(Pt,`title`,Fn),J(Ft,`title`,In),J(It,`title`,Ln),J(Lt,`title`,Rn),J(Rt,`title`,zn),J(zt,`title`,Bn),J(Bt,`title`,Vn),J(P,`title`,Hn),J(Vt,`title`,Un),J(Ht,`title`,Wn),J(Ut,`title`,Gn),J(Wt,`title`,Kn),J(Gt,`title`,qn),J(Kt,`title`,Jn),J(qt,`title`,Yn),J(Jt,`title`,Xn),J(Yt,`title`,Zn),J(Xt,`placeholder`,Qn),K($t,$n),K(nn,er),J(an,`placeholder`,tr),K(sn,nr),K(un,rr),K(fn,ir)},[()=>Y(`diagram.back_btn`),()=>Y(`diagram.diagrams_list_title`),()=>Y(`diagram.toolbar.copy_mcp_id`),()=>Y(`diagram.toolbar.select`),()=>Y(`diagram.toolbar.box`),()=>Y(`diagram.toolbar.ellipse`),()=>Y(`diagram.toolbar.database`),()=>Y(`diagram.toolbar.circle`),()=>Y(`diagram.toolbar.actor`),()=>Y(`diagram.toolbar.postit`),()=>Y(`diagram.toolbar.text_free`),()=>Y(`diagram.toolbar.image`),()=>Y(`diagram.toolbar.shape_editor`),()=>Y(`diagram.toolbar.arrow`),()=>Y(`diagram.toolbar.delete`),()=>Y(`diagram.toolbar.defaults`),()=>Y(`diagram.toolbar.align_guides`),()=>Y(`diagram.toolbar.grid`),()=>Y(`diagram.toolbar.edge_style`),()=>Y(`diagram.toolbar.evidence_mode`),()=>Y(`diagram.toolbar.resize_corner`),()=>Y(`diagram.toolbar.title_placeholder`),()=>Y(`diagram.toolbar.zoom_out`),()=>Y(`diagram.toolbar.zoom_in`),()=>Y(`diagram.toolbar.fit`),()=>Y(`diagram.toolbar.debug`),()=>Y(`diagram.toolbar.export_drawio`),()=>Y(`diagram.toolbar.save`),()=>Y(`diagram.sidebar.title`),()=>Y(`diagram.sidebar.new_btn`),()=>Y(`diagram.selection.rotate_shape`),()=>Y(`diagram.selection.rotate_text`),()=>Y(`diagram.evidence.panel_title`),()=>Y(`diagram.evidence.close`),()=>Y(`diagram.node_panel.lock`),()=>Y(`diagram.node_panel.color`),()=>Y(`diagram.node_panel.bg_opacity`),()=>Y(`diagram.node_panel.edit_label`),()=>Y(`diagram.node_panel.edit_link`),()=>Y(`diagram.node_panel.font_decrease`),()=>Y(`diagram.node_panel.font_size_value`),()=>Y(`diagram.node_panel.font_increase`),()=>Y(`diagram.node_panel.align_left`),()=>Y(`diagram.node_panel.align_center`),()=>Y(`diagram.node_panel.align_right`),()=>Y(`diagram.node_panel.align_top`),()=>Y(`diagram.node_panel.align_middle`),()=>Y(`diagram.node_panel.align_bottom`),()=>Y(`diagram.node_panel.custom_label_above`),()=>Y(`diagram.node_panel.custom_label_below`),()=>Y(`diagram.node_panel.custom_label_left`),()=>Y(`diagram.node_panel.custom_label_right`),()=>Y(`diagram.node_panel.custom_label_center`),()=>Y(`diagram.node_panel.send_back`),()=>Y(`diagram.node_panel.bring_front`),()=>Y(`diagram.node_panel.stamp_color`),()=>Y(`diagram.node_panel.stamp_font`),()=>Y(`diagram.node_panel.stamp_size`),()=>Y(`diagram.node_panel.rotate_ccw`),()=>Y(`diagram.node_panel.rotate_cw`),()=>Y(`diagram.node_panel.copy_png`),()=>Y(`diagram.node_panel.group`),()=>Y(`diagram.node_panel.ungroup`),()=>Y(`diagram.node_panel.save_as_default`),()=>Y(`diagram.link_panel.title`),()=>Y(`diagram.link_panel.external`),()=>Y(`diagram.link_panel.url_placeholder`),()=>Y(`diagram.link_panel.existing_diagram`),()=>Y(`diagram.link_panel.new_diagram`),()=>Y(`diagram.link_panel.diagram_name_placeholder`),()=>Y(`diagram.link_panel.save_btn`),()=>Y(`diagram.link_panel.remove_btn`),()=>Y(`diagram.edge_panel.lock`),()=>Y(`diagram.edge_panel.no_arrow`),()=>Y(`diagram.edge_panel.arrow_from`),()=>Y(`diagram.edge_panel.arrow_to`),()=>Y(`diagram.edge_panel.arrow_both`),()=>Y(`diagram.edge_panel.solid`),()=>Y(`diagram.edge_panel.dashed`),()=>Y(`diagram.edge_panel.font_decrease`),()=>Y(`diagram.edge_panel.font_size_value`),()=>Y(`diagram.edge_panel.font_increase`),()=>Y(`diagram.edge_panel.edit_label`),()=>Y(`diagram.edge_panel.reset_label_width`),()=>Y(`diagram.edge_panel.rotate_label_ccw`),()=>Y(`diagram.edge_panel.rotate_label_cw`),()=>Y(`diagram.edge_panel.offset_label_left`),()=>Y(`diagram.edge_panel.offset_label_right`),()=>Y(`diagram.edge_panel.offset_label_up`),()=>Y(`diagram.edge_panel.offset_label_down`),()=>Y(`diagram.edge_panel.offset_label_reset`),()=>Y(`diagram.edge_panel.width_decrease`),()=>Y(`diagram.edge_panel.width_increase`),()=>Y(`diagram.edge_panel.color`),()=>Y(`diagram.edge_panel.clear_ports`),()=>Y(`diagram.edge_panel.save_as_default`),()=>Y(`diagram.label_input.placeholder`),()=>Y(`diagram.empty_state`),()=>Y(`diagram.image_modal.title`),()=>Y(`diagram.image_modal.placeholder`),()=>Y(`diagram.image_modal.error_chars`),()=>Y(`diagram.image_modal.cancel_btn`),()=>Y(`diagram.image_modal.paste_btn`)]),U(`click`,s,()=>history.back()),U(`mousedown`,he,i),G(e,a),Ke()}Nr([`click`,`mousedown`]),He();var Nh={network:null,nodes:null,edges:null,diagrams:[],currentDiagramId:null,currentTool:`select`,pendingShape:`box`,selectedNodeIds:[],selectedEdgeIds:[],alignGuides:!0,gridEnabled:!0,debugMode:!1,isDirty:!1,sidebarOpen:!0,editingNodeId:null,editingEdgeId:null,resizeDrag:null,rotateDrag:null,labelRotateDrag:null,activeStamp:null,stampTargetIds:[],clipboard:null,canonicalOrder:[],edgesStraight:!1,resizeSymmetric:!1,nodeColorOverrides:{},customShapeLibraries:[],customShapeDefs:new Map,edgeLabelCanvasPos:{},edgeLabelBBox:{},freeArrowFirstPoint:null,exportingPng:!1,evidenceMode:!1};function Ph(){Nh.isDirty=!0,document.getElementById(`btnSave`).disabled=!1}var Fh=`custom-shape`,Ih=`custom-shape:`,Lh=[{id:`N`,x:.5,y:0},{id:`NE`,x:1,y:0},{id:`E`,x:1,y:.5},{id:`SE`,x:1,y:1},{id:`S`,x:.5,y:1},{id:`SW`,x:0,y:1},{id:`W`,x:0,y:.5},{id:`NW`,x:0,y:0}];function Rh(e){return typeof e==`string`&&e.startsWith(`custom-shape:`)}function zh(e){return Rh(e)?e.slice(13):null}function Bh(e){return e&&Nh.customShapeDefs&&Nh.customShapeDefs.get(e)||null}function Vh(e){let t=Bh(e);return[t&&t.width||65,t&&t.height||65]}function Hh(e){let t=Bh(e);return t&&Array.isArray(t.anchors)&&t.anchors.length?t.anchors:Lh}function Uh(e){let t=Bh(e);return t&&[`center`,`below`,`above`,`right`,`left`].includes(t.labelPlacement)?t.labelPlacement:`below`}async function Wh(){try{let e=await fetch(`/api/shape-libraries`);if(!e.ok)throw Error(`shape libraries unavailable`);let t=await e.json(),n=Array.isArray(t.libraries)?t.libraries:[];Nh.customShapeLibraries=n,Nh.customShapeDefs=new Map,n.forEach(e=>{(e.shapes||[]).forEach(e=>Nh.customShapeDefs.set(e.id,e))})}catch{Nh.customShapeLibraries=[],Nh.customShapeDefs=new Map}}function Gh(){let e=document.getElementById(`customShapeBar`),t=document.getElementById(`customShapeBarBody`);if(!e||!t)return;t.innerHTML=``;let n=(Nh.customShapeLibraries||[]).flatMap(e=>(e.shapes||[]).filter(e=>e.showInDiagram!==!1).map(t=>({...t,libraryName:e.name})));e.classList.toggle(`hidden`,n.length===0),n.forEach(e=>{let n=document.createElement(`button`);n.type=`button`,n.className=`custom-shape-btn`,n.title=`${e.libraryName||``}${e.libraryName?` · `:``}${e.name}`,n.dataset.customShapeId=e.id;let r=document.createElement(`img`);r.src=e.imageSrc,r.alt=``,r.draggable=!1,n.appendChild(r),n.addEventListener(`click`,()=>{window.dispatchEvent(new CustomEvent(`diagram:setTool`,{detail:{tool:`addNode`,shape:`${Ih}${e.id}`}}))}),t.appendChild(n)})}function Kh(){let e={saveState:document.getElementById(`saveState`),librarySelect:document.getElementById(`librarySelect`),libraryName:document.getElementById(`libraryName`),shapeList:document.getElementById(`shapeList`),previewStage:document.getElementById(`previewStage`),previewImage:document.getElementById(`previewImage`),shapeName:document.getElementById(`shapeName`),imageFile:document.getElementById(`imageFile`),shapeWidth:document.getElementById(`shapeWidth`),shapeHeight:document.getElementById(`shapeHeight`),labelPlacement:document.getElementById(`labelPlacement`),shapeShowInDiagram:document.getElementById(`shapeShowInDiagram`),anchorList:document.getElementById(`anchorList`),anchorCount:document.getElementById(`anchorCount`)},t={libraries:[]},n=null,r=null,i=null,a=null,o=e=>`${e}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,s=()=>t.libraries.find(e=>e.id===n)||null,c=()=>s()?.shapes.find(e=>e.id===r)||null,l=e=>Math.max(0,Math.min(1,e)),u=e=>[`below`,`above`,`right`,`left`,`center`].includes(e)?e:`below`,d=e=>String(e??``).replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e]);function f(t){e.saveState.textContent=t,t&&setTimeout(()=>{e.saveState.textContent===t&&(e.saveState.textContent=``)},1800)}async function p(){t=await(await fetch(`/api/shape-libraries`)).json(),Array.isArray(t.libraries)||(t.libraries=[]),t.libraries.length||t.libraries.push({id:o(`lib`),name:`My shapes`,shapes:[]}),n=t.libraries[0].id,r=t.libraries[0].shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}async function m(){t=await(await fetch(`/api/shape-libraries`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})).json(),f(`Saved`)}function h(){return{id:o(`shape`),name:`New shape`,imageSrc:``,width:65,height:65,labelPlacement:`below`,showInDiagram:!0,anchors:structuredClone(Lh)}}function g(){_(),v(),y()}function _(){e.librarySelect.innerHTML=``,t.libraries.forEach(t=>{let r=document.createElement(`option`);r.value=t.id,r.textContent=t.name,r.selected=t.id===n,e.librarySelect.appendChild(r)}),e.libraryName.value=s()?.name||``}function v(){let t=s();e.shapeList.innerHTML=``,(t?.shapes||[]).forEach(t=>{let n=document.createElement(`button`);n.type=`button`,n.className=`shape-item w-full flex items-center gap-2 px-2 py-1.5 rounded text-sm text-left hover:bg-gray-100 ${t.id===r?`active`:``}`;let a=document.createElement(`img`);a.src=t.imageSrc,a.alt=``,a.className=`w-6 h-6 object-contain shrink-0`;let o=document.createElement(`span`);o.className=`truncate`,o.textContent=t.name,n.append(a,o),n.addEventListener(`click`,()=>{r=t.id,i=structuredClone(t),g()}),e.shapeList.appendChild(n)}),t?.shapes?.length||(e.shapeList.innerHTML=`<p class="text-xs text-gray-400 px-2 py-2">No shape yet.</p>`)}function y(){i||=h(),e.previewStage.style.aspectRatio=`${Math.max(16,Number(i.width)||65)} / ${Math.max(16,Number(i.height)||65)}`,e.previewImage.src=i.imageSrc||``,e.previewImage.style.display=i.imageSrc?`block`:`none`,e.shapeName.value=i.name||``,e.shapeWidth.value=i.width||65,e.shapeHeight.value=i.height||65,e.labelPlacement.value=u(i.labelPlacement),e.shapeShowInDiagram.checked=i.showInDiagram!==!1,b()}function b(){e.previewStage.querySelectorAll(`.anchor-dot`).forEach(e=>e.remove()),e.anchorList.innerHTML=``;let t=i.anchors||[];e.anchorCount.textContent=`${t.length} anchor${t.length>1?`s`:``}`,t.forEach((t,n)=>{let r=document.createElement(`button`);r.type=`button`,r.className=`anchor-dot`,r.style.left=`${t.x*100}%`,r.style.top=`${t.y*100}%`,r.dataset.anchorId=t.id,r.innerHTML=`<span>${t.id}</span>`,r.addEventListener(`pointerdown`,e=>{e.preventDefault(),a=t.id,r.setPointerCapture(e.pointerId)}),e.previewStage.appendChild(r);let o=document.createElement(`div`);o.className=`grid grid-cols-[4.5rem_1fr_1fr_2rem] gap-2 items-center`,o.innerHTML=`
138
138
  <input class="field !h-7 text-xs" value="${d(t.id)}">
139
139
  <input class="field !h-7 text-xs" type="number" min="0" max="100" step="1" value="${Math.round(t.x*100)}">
140
140
  <input class="field !h-7 text-xs" type="number" min="0" max="100" step="1" value="${Math.round(t.y*100)}">
141
141
  <button class="btn btn-danger !h-7 !px-0">×</button>
142
- `;let[s,c,u]=o.querySelectorAll(`input`);s.addEventListener(`input`,()=>{t.id=s.value.trim()||`p${n+1}`,b()}),c.addEventListener(`input`,()=>{t.x=l(Number(c.value)/100),b()}),u.addEventListener(`input`,()=>{t.y=l(Number(u.value)/100),b()}),o.querySelector(`button`).addEventListener(`click`,()=>{i.anchors=i.anchors.filter(e=>e!==t),b()}),e.anchorList.appendChild(o)})}function x(t,n){let r=e.previewStage.getBoundingClientRect();t.x=l((n.clientX-r.left)/r.width),t.y=l((n.clientY-r.top)/r.height)}let S=[],C=(e,t,n,r)=>{e.addEventListener(t,n,r),S.push(()=>e.removeEventListener(t,n,r))};return C(e.previewStage,`pointermove`,e=>{if(!a||!i)return;let t=i.anchors.find(e=>e.id===a);t&&(x(t,e),b())}),C(window,`pointerup`,()=>{a=null}),C(e.previewStage,`click`,e=>{if(e.target.closest(`.anchor-dot`)||a||!i)return;let t={id:`p${(i.anchors||[]).length+1}`,x:.5,y:.5};x(t,e),i.anchors=[...i.anchors||[],t],b()}),C(document.getElementById(`btnAddLibrary`),`click`,async()=>{let e={id:o(`lib`),name:`New library`,shapes:[]};t.libraries.push(e),n=e.id,r=null,i=h(),g(),await m()}),C(e.librarySelect,`change`,()=>{n=e.librarySelect.value,r=s()?.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}),C(e.libraryName,`change`,async()=>{let t=s();t&&(t.name=e.libraryName.value.trim()||t.name,_(),await m())}),C(document.getElementById(`btnNewShape`),`click`,()=>{r=null,i=h(),g()}),C(document.getElementById(`btnDeleteShape`),`click`,async()=>{let e=s();!e||!r||(e.shapes=e.shapes.filter(e=>e.id!==r),r=e.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g(),await m())}),C(document.getElementById(`btnDefaultAnchors`),`click`,()=>{i.anchors=structuredClone(Fh),b()}),C(document.getElementById(`btnClearAnchors`),`click`,()=>{i.anchors=[],b()}),C(document.getElementById(`btnSaveShape`),`click`,async()=>{let t=s();if(!t||!i||!i.imageSrc)return;i.name=e.shapeName.value.trim()||`Untitled shape`,i.width=Math.max(16,Math.min(1200,Math.round(Number(e.shapeWidth.value)||65))),i.height=Math.max(16,Math.min(1200,Math.round(Number(e.shapeHeight.value)||65))),i.labelPlacement=u(e.labelPlacement.value),i.showInDiagram=e.shapeShowInDiagram.checked;let n=t.shapes.findIndex(e=>e.id===i.id);n>=0?t.shapes[n]=structuredClone(i):t.shapes.push(structuredClone(i)),r=i.id,g(),await m()}),[`shapeName`,`shapeWidth`,`shapeHeight`,`labelPlacement`,`shapeShowInDiagram`].forEach(t=>{C(document.getElementById(t),`input`,()=>{i.name=e.shapeName.value,i.width=Number(e.shapeWidth.value)||65,i.height=Number(e.shapeHeight.value)||65,i.labelPlacement=u(e.labelPlacement.value),i.showInDiagram=e.shapeShowInDiagram.checked})}),C(e.imageFile,`change`,async()=>{let t=e.imageFile.files&&e.imageFile.files[0];if(!t||!i)return;let n=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=n,r.readAsDataURL(t)}),r=(t.name.split(`.`).pop()||`png`).toLowerCase().replace(/[^a-z0-9]/g,``)||`png`,a=t.name.replace(/\.[^.]+$/,``).slice(0,60),o=await(await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:n,ext:r,name:a})})).json();i.imageSrc=`/images/${o.filename}`,(!e.shapeName.value||e.shapeName.value===`New shape`)&&(i.name=a||i.name),y()}),p(),()=>{S.forEach(e=>e()),S.length=0}}var Gh=W(`<div class="ld-shape-editor h-screen overflow-hidden bg-gray-50 text-gray-900"><header class="h-12 border-b border-gray-200 bg-white flex items-center gap-2 px-3"><button class="btn">← Back</button> <h1 class="text-sm font-semibold">Shape editor</h1> <span id="saveState" class="ml-auto text-xs text-gray-500"></span></header> <main class="h-[calc(100vh-3rem)] grid grid-cols-[17rem_1fr] overflow-hidden"><aside class="border-r border-gray-200 bg-white flex flex-col min-h-0"><div class="p-3 border-b border-gray-200 space-y-2"><label class="block text-xs font-semibold text-gray-500">Library</label> <div class="flex gap-2"><select id="librarySelect" class="field flex-1"></select> <button id="btnAddLibrary" class="btn">+</button></div> <input id="libraryName" class="field w-full" placeholder="Library name"/></div> <div class="p-3 border-b border-gray-200 flex gap-2"><button id="btnNewShape" class="btn btn-primary flex-1">New shape</button> <button id="btnDeleteShape" class="btn btn-danger">Delete</button></div> <div id="shapeList" class="flex-1 overflow-y-auto p-2 space-y-1"></div></aside> <section class="min-w-0 min-h-0 overflow-y-auto p-5"><div class="grid grid-cols-[minmax(20rem,34rem)_minmax(20rem,1fr)] gap-5 items-start"><div class="space-y-3"><div id="previewStage"><img id="previewImage" alt=""/></div> <p class="text-xs text-gray-500">Click on the image to add an anchor. Drag anchors to refine their
143
- position.</p></div> <div class="space-y-4"><div class="grid grid-cols-2 gap-3"><label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Shape name</span> <input id="shapeName" class="field w-full" placeholder="Shape name"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Image / SVG</span> <input id="imageFile" type="file" accept="image/*,.svg" class="block w-full text-sm"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Width</span> <input id="shapeWidth" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Height</span> <input id="shapeHeight" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1 col-span-2"><span class="block text-xs font-semibold text-gray-500">Text placement</span> <select id="labelPlacement" class="field w-full"><option> </option><option> </option><option> </option><option> </option><option> </option></select></label> <label class="col-span-2 flex items-start gap-2 rounded-md border border-gray-200 bg-white px-2 py-2 text-sm"><input id="shapeShowInDiagram" type="checkbox" class="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600"/> <span class="space-y-0.5"><span class="block font-semibold text-gray-700"> </span> <span class="block text-xs text-gray-500"> </span></span></label></div> <div class="flex flex-wrap gap-2"><button id="btnDefaultAnchors" class="btn">Use 8 default anchors</button> <button id="btnClearAnchors" class="btn">Clear anchors</button> <button id="btnSaveShape" class="btn btn-primary">Save shape</button></div> <div><div class="flex items-center justify-between mb-2"><h2 class="text-xs font-semibold uppercase tracking-wide text-gray-500">Anchors</h2> <span id="anchorCount" class="text-xs text-gray-500"></span></div> <div id="anchorList" class="space-y-1"></div></div></div></div></section></main></div>`);function Kh(e,t){Ge(t,!1),Vi(async()=>{try{await fa((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{await fa(`en`)}return Wh()}),Ri();var n=Gh(),r=R(n),i=R(r);Pe(4),N(r);var a=B(r,2),o=B(R(a),2),s=R(o),c=B(R(s),2),l=R(c),u=B(R(l),8),d=B(R(u),2),f=R(d),p=R(f,!0);N(f),f.value=f.__value=`below`;var m=B(f),h=R(m,!0);N(m),m.value=m.__value=`above`;var g=B(m),_=R(g,!0);N(g),g.value=g.__value=`right`;var v=B(g),y=R(v,!0);N(v),v.value=v.__value=`left`;var b=B(v),x=R(b,!0);N(b),b.value=b.__value=`center`,N(d),N(u);var S=B(u,2),C=B(R(S),2),w=R(C),T=R(w,!0);N(w);var E=B(w,2),D=R(E,!0);N(E),N(C),N(S),N(l),Pe(4),N(c),N(s),N(o),N(a),N(n),V((e,t,n,r,i,a,o)=>{K(p,e),K(h,t),K(_,n),K(y,r),K(x,i),K(T,a),K(D,o)},[()=>Y(`shape_editor.label_placement.below`),()=>Y(`shape_editor.label_placement.above`),()=>Y(`shape_editor.label_placement.right`),()=>Y(`shape_editor.label_placement.left`),()=>Y(`shape_editor.label_placement.center`),()=>Y(`shape_editor.show_in_diagram_label`),()=>Y(`shape_editor.show_in_diagram_hint`)]),U(`click`,i,()=>history.back()),G(e,n),Ke()}Nr([`click`]);var qh=W(`<p style="padding:2rem"> </p>`);function Jh(e,t){Ge(t,!0);function n(e){return e.length>1?e.replace(/\/+$/,``):e}let r=F(L(n(window.location.pathname)));window.addEventListener(`popstate`,()=>{I(r,n(window.location.pathname),!0)}),On(()=>{H(r)===`/blueprint`?document.documentElement.setAttribute(`data-blueprint`,``):document.documentElement.removeAttribute(`data-blueprint`)});function i(e){history.pushState(null,``,e),I(r,n(e),!0)}var a=Ur(),o=z(a),s=e=>{Ca(e,{navigate:i})},c=e=>{ao(e,{})},l=e=>{Sl(e,{})},u=e=>{Fl(e,{})},d=e=>{hu(e,{navigate:i})},f=e=>{Tu(e,{})},p=e=>{Ah(e,{})},m=e=>{Kh(e,{})},h=e=>{wh(e,{})},g=e=>{var t=qh(),n=R(t);N(t),V(()=>K(n,`Route "${H(r)??``}" — not yet migrated.`)),G(e,t)};q(o,e=>{H(r)===`/admin`?e(s):H(r)===`/blueprint`?e(c,1):H(r)===`/workspace`?e(l,2):H(r)===`/files`?e(u,3):H(r)===`/context`?e(d,4):H(r)===`/agents`?e(f,5):H(r)===`/diagram`?e(p,6):H(r)===`/shape-editor`?e(m,7):H(r)===`/`?e(h,8):e(g,-1)}),G(e,a),Ke()}Wr(Jh,{target:document.getElementById(`app`)});export{Rh as a,Hh as c,jh as d,fa as f,zh as i,Uh as l,Lh as n,Vh as o,Y as p,Bh as r,Ih as s,Nh as t,Mh as u};
142
+ `;let[s,c,u]=o.querySelectorAll(`input`);s.addEventListener(`input`,()=>{t.id=s.value.trim()||`p${n+1}`,b()}),c.addEventListener(`input`,()=>{t.x=l(Number(c.value)/100),b()}),u.addEventListener(`input`,()=>{t.y=l(Number(u.value)/100),b()}),o.querySelector(`button`).addEventListener(`click`,()=>{i.anchors=i.anchors.filter(e=>e!==t),b()}),e.anchorList.appendChild(o)})}function x(t,n){let r=e.previewStage.getBoundingClientRect();t.x=l((n.clientX-r.left)/r.width),t.y=l((n.clientY-r.top)/r.height)}let S=[],C=(e,t,n,r)=>{e.addEventListener(t,n,r),S.push(()=>e.removeEventListener(t,n,r))};return C(e.previewStage,`pointermove`,e=>{if(!a||!i)return;let t=i.anchors.find(e=>e.id===a);t&&(x(t,e),b())}),C(window,`pointerup`,()=>{a=null}),C(e.previewStage,`click`,e=>{if(e.target.closest(`.anchor-dot`)||a||!i)return;let t={id:`p${(i.anchors||[]).length+1}`,x:.5,y:.5};x(t,e),i.anchors=[...i.anchors||[],t],b()}),C(document.getElementById(`btnAddLibrary`),`click`,async()=>{let e={id:o(`lib`),name:`New library`,shapes:[]};t.libraries.push(e),n=e.id,r=null,i=h(),g(),await m()}),C(e.librarySelect,`change`,()=>{n=e.librarySelect.value,r=s()?.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}),C(e.libraryName,`change`,async()=>{let t=s();t&&(t.name=e.libraryName.value.trim()||t.name,_(),await m())}),C(document.getElementById(`btnNewShape`),`click`,()=>{r=null,i=h(),g()}),C(document.getElementById(`btnDeleteShape`),`click`,async()=>{let e=s();!e||!r||(e.shapes=e.shapes.filter(e=>e.id!==r),r=e.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g(),await m())}),C(document.getElementById(`btnDefaultAnchors`),`click`,()=>{i.anchors=structuredClone(Lh),b()}),C(document.getElementById(`btnClearAnchors`),`click`,()=>{i.anchors=[],b()}),C(document.getElementById(`btnSaveShape`),`click`,async()=>{let t=s();if(!t||!i||!i.imageSrc)return;i.name=e.shapeName.value.trim()||`Untitled shape`,i.width=Math.max(16,Math.min(1200,Math.round(Number(e.shapeWidth.value)||65))),i.height=Math.max(16,Math.min(1200,Math.round(Number(e.shapeHeight.value)||65))),i.labelPlacement=u(e.labelPlacement.value),i.showInDiagram=e.shapeShowInDiagram.checked;let n=t.shapes.findIndex(e=>e.id===i.id);n>=0?t.shapes[n]=structuredClone(i):t.shapes.push(structuredClone(i)),r=i.id,g(),await m()}),[`shapeName`,`shapeWidth`,`shapeHeight`,`labelPlacement`,`shapeShowInDiagram`].forEach(t=>{C(document.getElementById(t),`input`,()=>{i.name=e.shapeName.value,i.width=Number(e.shapeWidth.value)||65,i.height=Number(e.shapeHeight.value)||65,i.labelPlacement=u(e.labelPlacement.value),i.showInDiagram=e.shapeShowInDiagram.checked})}),C(e.imageFile,`change`,async()=>{let t=e.imageFile.files&&e.imageFile.files[0];if(!t||!i)return;let n=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=n,r.readAsDataURL(t)}),r=(t.name.split(`.`).pop()||`png`).toLowerCase().replace(/[^a-z0-9]/g,``)||`png`,a=t.name.replace(/\.[^.]+$/,``).slice(0,60),o=await(await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:n,ext:r,name:a})})).json();i.imageSrc=`/images/${o.filename}`,(!e.shapeName.value||e.shapeName.value===`New shape`)&&(i.name=a||i.name),y()}),p(),()=>{S.forEach(e=>e()),S.length=0}}var qh=W(`<div class="ld-shape-editor h-screen overflow-hidden bg-gray-50 text-gray-900"><header class="h-12 border-b border-gray-200 bg-white flex items-center gap-2 px-3"><button class="btn">← Back</button> <h1 class="text-sm font-semibold">Shape editor</h1> <span id="saveState" class="ml-auto text-xs text-gray-500"></span></header> <main class="h-[calc(100vh-3rem)] grid grid-cols-[17rem_1fr] overflow-hidden"><aside class="border-r border-gray-200 bg-white flex flex-col min-h-0"><div class="p-3 border-b border-gray-200 space-y-2"><label class="block text-xs font-semibold text-gray-500">Library</label> <div class="flex gap-2"><select id="librarySelect" class="field flex-1"></select> <button id="btnAddLibrary" class="btn">+</button></div> <input id="libraryName" class="field w-full" placeholder="Library name"/></div> <div class="p-3 border-b border-gray-200 flex gap-2"><button id="btnNewShape" class="btn btn-primary flex-1">New shape</button> <button id="btnDeleteShape" class="btn btn-danger">Delete</button></div> <div id="shapeList" class="flex-1 overflow-y-auto p-2 space-y-1"></div></aside> <section class="min-w-0 min-h-0 overflow-y-auto p-5"><div class="grid grid-cols-[minmax(20rem,34rem)_minmax(20rem,1fr)] gap-5 items-start"><div class="space-y-3"><div id="previewStage"><img id="previewImage" alt=""/></div> <p class="text-xs text-gray-500">Click on the image to add an anchor. Drag anchors to refine their
143
+ position.</p></div> <div class="space-y-4"><div class="grid grid-cols-2 gap-3"><label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Shape name</span> <input id="shapeName" class="field w-full" placeholder="Shape name"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Image / SVG</span> <input id="imageFile" type="file" accept="image/*,.svg" class="block w-full text-sm"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Width</span> <input id="shapeWidth" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Height</span> <input id="shapeHeight" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1 col-span-2"><span class="block text-xs font-semibold text-gray-500">Text placement</span> <select id="labelPlacement" class="field w-full"><option> </option><option> </option><option> </option><option> </option><option> </option></select></label> <label class="col-span-2 flex items-start gap-2 rounded-md border border-gray-200 bg-white px-2 py-2 text-sm"><input id="shapeShowInDiagram" type="checkbox" class="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600"/> <span class="space-y-0.5"><span class="block font-semibold text-gray-700"> </span> <span class="block text-xs text-gray-500"> </span></span></label></div> <div class="flex flex-wrap gap-2"><button id="btnDefaultAnchors" class="btn">Use 8 default anchors</button> <button id="btnClearAnchors" class="btn">Clear anchors</button> <button id="btnSaveShape" class="btn btn-primary">Save shape</button></div> <div><div class="flex items-center justify-between mb-2"><h2 class="text-xs font-semibold uppercase tracking-wide text-gray-500">Anchors</h2> <span id="anchorCount" class="text-xs text-gray-500"></span></div> <div id="anchorList" class="space-y-1"></div></div></div></div></section></main></div>`);function Jh(e,t){Ge(t,!1),Vi(async()=>{try{await fa((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{await fa(`en`)}return Kh()}),Ri();var n=qh(),r=R(n),i=R(r);Pe(4),N(r);var a=B(r,2),o=B(R(a),2),s=R(o),c=B(R(s),2),l=R(c),u=B(R(l),8),d=B(R(u),2),f=R(d),p=R(f,!0);N(f),f.value=f.__value=`below`;var m=B(f),h=R(m,!0);N(m),m.value=m.__value=`above`;var g=B(m),_=R(g,!0);N(g),g.value=g.__value=`right`;var v=B(g),y=R(v,!0);N(v),v.value=v.__value=`left`;var b=B(v),x=R(b,!0);N(b),b.value=b.__value=`center`,N(d),N(u);var S=B(u,2),C=B(R(S),2),w=R(C),T=R(w,!0);N(w);var E=B(w,2),D=R(E,!0);N(E),N(C),N(S),N(l),Pe(4),N(c),N(s),N(o),N(a),N(n),V((e,t,n,r,i,a,o)=>{K(p,e),K(h,t),K(_,n),K(y,r),K(x,i),K(T,a),K(D,o)},[()=>Y(`shape_editor.label_placement.below`),()=>Y(`shape_editor.label_placement.above`),()=>Y(`shape_editor.label_placement.right`),()=>Y(`shape_editor.label_placement.left`),()=>Y(`shape_editor.label_placement.center`),()=>Y(`shape_editor.show_in_diagram_label`),()=>Y(`shape_editor.show_in_diagram_hint`)]),U(`click`,i,()=>history.back()),G(e,n),Ke()}Nr([`click`]);var Yh=W(`<p style="padding:2rem"> </p>`);function Xh(e,t){Ge(t,!0);function n(e){return e.length>1?e.replace(/\/+$/,``):e}let r=F(L(n(window.location.pathname)));window.addEventListener(`popstate`,()=>{I(r,n(window.location.pathname),!0)}),On(()=>{H(r)===`/blueprint`?document.documentElement.setAttribute(`data-blueprint`,``):document.documentElement.removeAttribute(`data-blueprint`)});function i(e){history.pushState(null,``,e),I(r,n(e),!0)}var a=Ur(),o=z(a),s=e=>{Ca(e,{navigate:i})},c=e=>{ao(e,{})},l=e=>{Sl(e,{})},u=e=>{Fl(e,{})},d=e=>{hu(e,{navigate:i})},f=e=>{Tu(e,{})},p=e=>{Mh(e,{})},m=e=>{Jh(e,{})},h=e=>{Eh(e,{})},g=e=>{var t=Yh(),n=R(t);N(t),V(()=>K(n,`Route "${H(r)??``}" — not yet migrated.`)),G(e,t)};q(o,e=>{H(r)===`/admin`?e(s):H(r)===`/blueprint`?e(c,1):H(r)===`/workspace`?e(l,2):H(r)===`/files`?e(u,3):H(r)===`/context`?e(d,4):H(r)===`/agents`?e(f,5):H(r)===`/diagram`?e(p,6):H(r)===`/shape-editor`?e(m,7):H(r)===`/`?e(h,8):e(g,-1)}),G(e,a),Ke()}Wr(Xh,{target:document.getElementById(`app`)});export{Bh as a,Wh as c,Nh as d,fa as f,Vh as i,Gh as l,zh as n,Uh as o,Y as p,Hh as r,Rh as s,Fh as t,Ph as u};
@@ -1,4 +1,4 @@
1
- import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./index-XQ6TfVnr.js";var p={select:`toolSelect`,"addNode:box":`toolBox`,"addNode:ellipse":`toolEllipse`,"addNode:database":`toolDatabase`,"addNode:circle":`toolCircle`,"addNode:actor":`toolActor`,"addNode:post-it":`toolPostIt`,"addNode:text-free":`toolTextFree`,"addNode:image":`toolImage`,addEdge:`toolArrow`},m={"c-gray":{bg:`#f5f5f4`,border:`#a8a29e`,font:`#292524`,hbg:`#e7e5e4`,hborder:`#78716c`},"c-blue":{bg:`#dbeafe`,border:`#3b82f6`,font:`#1e40af`,hbg:`#bfdbfe`,hborder:`#2563eb`},"c-green":{bg:`#dcfce7`,border:`#22c55e`,font:`#166534`,hbg:`#bbf7d0`,hborder:`#16a34a`},"c-amber":{bg:`#fef9c3`,border:`#f59e0b`,font:`#78350f`,hbg:`#fef08a`,hborder:`#d97706`},"c-rose":{bg:`#ffe4e6`,border:`#f43f5e`,font:`#881337`,hbg:`#fecdd3`,hborder:`#e11d48`},"c-purple":{bg:`#ede9fe`,border:`#8b5cf6`,font:`#4c1d95`,hbg:`#ddd6fe`,hborder:`#7c3aed`},"c-teal":{bg:`#ccfbf1`,border:`#14b8a6`,font:`#134e4a`,hbg:`#99f6e4`,hborder:`#0d9488`},"c-orange":{bg:`#ffedd5`,border:`#f97316`,font:`#7c2d12`,hbg:`#fed7aa`,hborder:`#ea580c`},"c-cyan":{bg:`#cffafe`,border:`#06b6d4`,font:`#164e63`,hbg:`#a5f3fc`,hborder:`#0891b2`},"c-indigo":{bg:`#e0e7ff`,border:`#6366f1`,font:`#312e81`,hbg:`#c7d2fe`,hborder:`#4f46e5`},"c-pink":{bg:`#fce7f3`,border:`#ec4899`,font:`#831843`,hbg:`#fbcfe8`,hborder:`#db2777`},"c-lime":{bg:`#ecfccb`,border:`#84cc16`,font:`#365314`,hbg:`#d9f99d`,hborder:`#65a30d`},"c-red":{bg:`#fee2e2`,border:`#ef4444`,font:`#7f1d1d`,hbg:`#fecaca`,hborder:`#dc2626`},"c-sky":{bg:`#e0f2fe`,border:`#0ea5e9`,font:`#0c4a6e`,hbg:`#bae6fd`,hborder:`#0284c7`},"c-slate":{bg:`#f1f5f9`,border:`#64748b`,font:`#0f172a`,hbg:`#e2e8f0`,hborder:`#475569`}},h=[`c-gray`,`c-slate`,`c-blue`,`c-sky`,`c-cyan`,`c-teal`,`c-green`,`c-lime`,`c-amber`,`c-orange`,`c-red`,`c-rose`,`c-pink`,`c-purple`,`c-indigo`],g=[`#a8a29e`,`#374151`,`#3b82f6`,`#14b8a6`,`#22c55e`,`#f97316`,`#ef4444`,`#a855f7`],_={"c-gray":.667,"c-slate":.488,"c-blue":.645,"c-sky":.518,"c-cyan":.473,"c-teal":.448,"c-green":.489,"c-lime":.496,"c-amber":.57,"c-orange":.578,"c-red":.64,"c-rose":.636,"c-pink":.638,"c-purple":.694,"c-indigo":.71};function v(e,t=.6){let n=parseInt(e.slice(1,3),16)/255,r=parseInt(e.slice(3,5),16)/255,i=parseInt(e.slice(5,7),16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=(a+o)/2,c=a-o,l=0,u=0;c>0&&(u=s>.5?c/(2-a-o):c/(a+o),l=a===n?((r-i)/c+(r<i?6:0))/6:a===r?((i-n)/c+2)/6:((n-r)/c+4)/6);function d(e,t,n){let r,i,a;if(t===0)r=i=a=n;else{let o=(e,t,n)=>(n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e),s=n<.5?n*(1+t):n+t-n*t,c=2*n-s;r=o(c,s,e+1/3),i=o(c,s,e),a=o(c,s,e-1/3)}return`#`+[r,i,a].map(e=>Math.max(0,Math.min(255,Math.round(e*255))).toString(16).padStart(2,`0`)).join(``)}let f=s*t,p=s*.93,m=f*.89;return{bg:e,border:d(l,u,f),font:s>.5?`#292524`:`#fafaf9`,hbg:d(l,u,Math.min(s,p)),hborder:d(l,u,Math.min(f,m))}}function y(e){return n.nodeColorOverrides[e]||m[e]||m[`c-gray`]}function b(e,t){return typeof e!=`string`||e.charAt(0)!==`#`||e.length!==7?e:`rgba(${parseInt(e.slice(1,3),16)},${parseInt(e.slice(3,5),16)},${parseInt(e.slice(5,7),16)},${t})`}function x(e,t,r,i){let a=n.nodes&&n.nodes.get(t);if(!a||!a.nodeLink)return;let o=r/2-7,s=i/2-7;e.save(),e.fillStyle=a.nodeLink.type===`url`?`#3b82f6`:`#f97316`,e.strokeStyle=`#fff`,e.lineWidth=1,e.beginPath(),e.arc(o,s,7,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle=`#fff`,e.lineWidth=1.2,e.lineCap=`round`,e.beginPath(),e.moveTo(o-1.5,s+1.5),e.lineTo(o+1.5,s-1.5),e.moveTo(o-2.5,s-.5),e.lineTo(o-.5,s-2.5),e.moveTo(o+.5,s+2.5),e.lineTo(o+2.5,s+.5),e.stroke(),e.restore()}function S(e,t,n){if(!t)return[``];let r=t.split(` `),i=[],a=``;for(let t of r){let r=a?a+` `+t:t;a&&e.measureText(r).width>n?(i.push(a),a=t):a=r}return a&&i.push(a),i.length?i:[``]}function C(e,t,n,r,i,a,o,s,c){if(!t)return;e.save(),e.font=`${n}px system-ui,-apple-system,sans-serif`,e.fillStyle=r,e.textBaseline=`middle`;let l=0;i===`left`?(e.textAlign=`left`,l=o?-o/2+8:-40):i===`right`?(e.textAlign=`right`,l=o?o/2-8:40):(e.textAlign=`center`,l=0);let u=o?o-16:1/0,d=String(t).split(`
1
+ import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./index-PuqCKNdT.js";var p={select:`toolSelect`,"addNode:box":`toolBox`,"addNode:ellipse":`toolEllipse`,"addNode:database":`toolDatabase`,"addNode:circle":`toolCircle`,"addNode:actor":`toolActor`,"addNode:post-it":`toolPostIt`,"addNode:text-free":`toolTextFree`,"addNode:image":`toolImage`,addEdge:`toolArrow`},m={"c-gray":{bg:`#f5f5f4`,border:`#a8a29e`,font:`#292524`,hbg:`#e7e5e4`,hborder:`#78716c`},"c-blue":{bg:`#dbeafe`,border:`#3b82f6`,font:`#1e40af`,hbg:`#bfdbfe`,hborder:`#2563eb`},"c-green":{bg:`#dcfce7`,border:`#22c55e`,font:`#166534`,hbg:`#bbf7d0`,hborder:`#16a34a`},"c-amber":{bg:`#fef9c3`,border:`#f59e0b`,font:`#78350f`,hbg:`#fef08a`,hborder:`#d97706`},"c-rose":{bg:`#ffe4e6`,border:`#f43f5e`,font:`#881337`,hbg:`#fecdd3`,hborder:`#e11d48`},"c-purple":{bg:`#ede9fe`,border:`#8b5cf6`,font:`#4c1d95`,hbg:`#ddd6fe`,hborder:`#7c3aed`},"c-teal":{bg:`#ccfbf1`,border:`#14b8a6`,font:`#134e4a`,hbg:`#99f6e4`,hborder:`#0d9488`},"c-orange":{bg:`#ffedd5`,border:`#f97316`,font:`#7c2d12`,hbg:`#fed7aa`,hborder:`#ea580c`},"c-cyan":{bg:`#cffafe`,border:`#06b6d4`,font:`#164e63`,hbg:`#a5f3fc`,hborder:`#0891b2`},"c-indigo":{bg:`#e0e7ff`,border:`#6366f1`,font:`#312e81`,hbg:`#c7d2fe`,hborder:`#4f46e5`},"c-pink":{bg:`#fce7f3`,border:`#ec4899`,font:`#831843`,hbg:`#fbcfe8`,hborder:`#db2777`},"c-lime":{bg:`#ecfccb`,border:`#84cc16`,font:`#365314`,hbg:`#d9f99d`,hborder:`#65a30d`},"c-red":{bg:`#fee2e2`,border:`#ef4444`,font:`#7f1d1d`,hbg:`#fecaca`,hborder:`#dc2626`},"c-sky":{bg:`#e0f2fe`,border:`#0ea5e9`,font:`#0c4a6e`,hbg:`#bae6fd`,hborder:`#0284c7`},"c-slate":{bg:`#f1f5f9`,border:`#64748b`,font:`#0f172a`,hbg:`#e2e8f0`,hborder:`#475569`}},h=[`c-gray`,`c-slate`,`c-blue`,`c-sky`,`c-cyan`,`c-teal`,`c-green`,`c-lime`,`c-amber`,`c-orange`,`c-red`,`c-rose`,`c-pink`,`c-purple`,`c-indigo`],g=[`#a8a29e`,`#374151`,`#3b82f6`,`#14b8a6`,`#22c55e`,`#f97316`,`#ef4444`,`#a855f7`],_={"c-gray":.667,"c-slate":.488,"c-blue":.645,"c-sky":.518,"c-cyan":.473,"c-teal":.448,"c-green":.489,"c-lime":.496,"c-amber":.57,"c-orange":.578,"c-red":.64,"c-rose":.636,"c-pink":.638,"c-purple":.694,"c-indigo":.71};function v(e,t=.6){let n=parseInt(e.slice(1,3),16)/255,r=parseInt(e.slice(3,5),16)/255,i=parseInt(e.slice(5,7),16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=(a+o)/2,c=a-o,l=0,u=0;c>0&&(u=s>.5?c/(2-a-o):c/(a+o),l=a===n?((r-i)/c+(r<i?6:0))/6:a===r?((i-n)/c+2)/6:((n-r)/c+4)/6);function d(e,t,n){let r,i,a;if(t===0)r=i=a=n;else{let o=(e,t,n)=>(n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e),s=n<.5?n*(1+t):n+t-n*t,c=2*n-s;r=o(c,s,e+1/3),i=o(c,s,e),a=o(c,s,e-1/3)}return`#`+[r,i,a].map(e=>Math.max(0,Math.min(255,Math.round(e*255))).toString(16).padStart(2,`0`)).join(``)}let f=s*t,p=s*.93,m=f*.89;return{bg:e,border:d(l,u,f),font:s>.5?`#292524`:`#fafaf9`,hbg:d(l,u,Math.min(s,p)),hborder:d(l,u,Math.min(f,m))}}function y(e){return n.nodeColorOverrides[e]||m[e]||m[`c-gray`]}function b(e,t){return typeof e!=`string`||e.charAt(0)!==`#`||e.length!==7?e:`rgba(${parseInt(e.slice(1,3),16)},${parseInt(e.slice(3,5),16)},${parseInt(e.slice(5,7),16)},${t})`}function x(e,t,r,i){let a=n.nodes&&n.nodes.get(t);if(!a||!a.nodeLink)return;let o=r/2-7,s=i/2-7;e.save(),e.fillStyle=a.nodeLink.type===`url`?`#3b82f6`:`#f97316`,e.strokeStyle=`#fff`,e.lineWidth=1,e.beginPath(),e.arc(o,s,7,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle=`#fff`,e.lineWidth=1.2,e.lineCap=`round`,e.beginPath(),e.moveTo(o-1.5,s+1.5),e.lineTo(o+1.5,s-1.5),e.moveTo(o-2.5,s-.5),e.lineTo(o-.5,s-2.5),e.moveTo(o+.5,s+2.5),e.lineTo(o+2.5,s+.5),e.stroke(),e.restore()}function S(e,t,n){if(!t)return[``];let r=t.split(` `),i=[],a=``;for(let t of r){let r=a?a+` `+t:t;a&&e.measureText(r).width>n?(i.push(a),a=t):a=r}return a&&i.push(a),i.length?i:[``]}function C(e,t,n,r,i,a,o,s,c){if(!t)return;e.save(),e.font=`${n}px system-ui,-apple-system,sans-serif`,e.fillStyle=r,e.textBaseline=`middle`;let l=0;i===`left`?(e.textAlign=`left`,l=o?-o/2+8:-40):i===`right`?(e.textAlign=`right`,l=o?o/2-8:40):(e.textAlign=`center`,l=0);let u=o?o-16:1/0,d=String(t).split(`
2
2
  `).flatMap(t=>S(e,t,u)),f=n*1.3,p;p=o&&s?a===`top`?-(s/2-n/2-8):a===`bottom`?s/2-n/2-8-(d.length-1)*f:-((d.length-1)*f)/2:-((d.length-1)*f)/2,c&&e.rotate(c),d.forEach((t,n)=>e.fillText(t,l,p+n*f)),e.restore()}function w(e,t,n,r,i,a){a=Math.min(a,r/2,i/2),e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.quadraticCurveTo(t+r,n,t+r,n+a),e.lineTo(t+r,n+i-a),e.quadraticCurveTo(t+r,n+i,t+r-a,n+i),e.lineTo(t+a,n+i),e.quadraticCurveTo(t,n+i,t,n+i-a),e.lineTo(t,n+a),e.quadraticCurveTo(t,n,t+a,n),e.closePath()}function T(e,t,r,i){let a=n.nodes&&n.nodes.get(e),o=a&&a.colorKey||i||`c-gray`,s=a&&a.bgOpacity,c=typeof s==`number`?Math.max(0,Math.min(1,s)):1,l=y(o),u=c<1?{...l,bg:b(l.bg,c),hbg:b(l.hbg,c)}:l;return{W:a&&a.nodeWidth||t,H:a&&a.nodeHeight||r,rotation:a&&a.rotation||0,labelRotation:a&&a.labelRotation||0,textAlign:a&&a.textAlign||`center`,textValign:a&&a.textValign||`middle`,fontSize:a&&a.fontSize||13,bgOpacity:c,colorKey:o,c:u}}function ee(e){return e?String(e).split(`
3
3
  `):[]}function E(e){return[`center`,`below`,`above`,`right`,`left`].includes(e)?e:null}function te(e){return[`above`,`below`,`right`,`left`].includes(e)}function D(e,t,n){let r=`${t}px system-ui,-apple-system,sans-serif`;if(n){let t=n.font;n.font=r;let i=n.measureText(e).width;return n.font=t,i}return typeof document>`u`?String(e).length*t*.58:(D._ctx||=document.createElement(`canvas`).getContext(`2d`),D._ctx.font=r,D._ctx.measureText(e).width)}function ne(t,n,r){let i=e(t&&t.customShapeId),a=t&&t.nodeWidth||i&&i.width||65,o=t&&t.nodeHeight||i&&i.height||65,s=E(t&&t.labelPlacement)||E(i&&i.labelPlacement)||`below`,c=t&&t.fontSize||13,l=ee(n),u=c*1.3;if(!l.length||!te(s))return{placement:s,lines:l,lineH:u,imageOffsetX:0,imageOffsetY:0,labelBlockW:0,labelBlockH:0,totalW:a,totalH:o};let d=Math.max(...l.map(e=>D(e,c,r)))+16,f=l.length*u+8,p=s===`left`||s===`right`,m=p?a+d:Math.max(a,d),h=p?Math.max(o,f):o+f;return{placement:s,lines:l,lineH:u,imageOffsetX:s===`right`?-d/2:s===`left`?d/2:0,imageOffsetY:s===`below`?-f/2:s===`above`?f/2:0,labelBlockW:d,labelBlockH:f,totalW:m,totalH:h}}function re(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,H:c,rotation:l,labelRotation:u,textAlign:d,textValign:f,fontSize:p,c:m}=T(i,100,40,e);return{drawNode(){t.save(),t.translate(n,r),t.rotate(l),t.strokeStyle=a.selected?`#f97316`:m.border,t.fillStyle=a.selected?m.hbg:m.bg,t.lineWidth=1.5,w(t,-s/2,-c/2,s,c,4),t.fill(),t.stroke(),C(t,o,p,m.font,d,f,s,c,u),x(t,i,s,c),t.restore()},nodeDimensions:{width:s,height:c}}}}function ie(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,H:c,rotation:l,labelRotation:u,textAlign:d,textValign:f,fontSize:p,c:m}=T(i,110,50,e);return{drawNode(){t.save(),t.translate(n,r),t.rotate(l),t.strokeStyle=a.selected?`#f97316`:m.border,t.fillStyle=a.selected?m.hbg:m.bg,t.lineWidth=1.5,t.beginPath(),t.ellipse(0,0,s/2,c/2,0,0,Math.PI*2),t.fill(),t.stroke(),C(t,o,p,m.font,d,f,s,c,u),x(t,i,s,c),t.restore()},nodeDimensions:{width:s,height:c}}}}function ae(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,rotation:c,labelRotation:l,textAlign:u,textValign:d,fontSize:f,c:p}=T(i,55,55,e),m=s/2;return{drawNode(){t.save(),t.translate(n,r),t.rotate(c),t.strokeStyle=a.selected?`#f97316`:p.border,t.fillStyle=a.selected?p.hbg:p.bg,t.lineWidth=1.5,t.beginPath(),t.arc(0,0,m,0,Math.PI*2),t.fill(),t.stroke(),C(t,o,f,p.font,u,d,s,s,l),x(t,i,s,s),t.restore()},nodeDimensions:{width:s,height:s}}}}function oe(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,H:c,rotation:l,labelRotation:u,textAlign:d,textValign:f,fontSize:p,c:m}=T(i,50,70,e),h=s/2,g=Math.max(c*.12,6),_=-c/2+g,v=c/2-g;return{drawNode(){t.save(),t.translate(n,r),t.rotate(l),t.strokeStyle=a.selected?`#f97316`:m.border,t.fillStyle=a.selected?m.hbg:m.bg,t.lineWidth=1.5,t.fillRect(-h,_,s,v-_),t.beginPath(),t.ellipse(0,v,h,g,0,0,Math.PI*2),t.fill(),t.stroke(),t.beginPath(),t.moveTo(-h,_),t.lineTo(-h,v),t.moveTo(h,_),t.lineTo(h,v),t.stroke(),t.beginPath(),t.ellipse(0,_,h,g,0,0,Math.PI*2),t.fill(),t.stroke(),C(t,o,p,m.font,d,f,s,c,u),x(t,i,s,c),t.restore()},nodeDimensions:{width:s,height:c}}}}function se(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,H:c,rotation:l,labelRotation:u,textAlign:d,textValign:f,fontSize:p,c:m}=T(i,120,100,e||`c-amber`),h=Math.min(s,c)*.18;return{drawNode(){t.save(),t.translate(n,r),t.rotate(l),t.strokeStyle=a.selected?`#f97316`:m.border,t.fillStyle=a.selected?m.hbg:m.bg,t.lineWidth=1.5,t.beginPath(),t.moveTo(-s/2,-c/2),t.lineTo(s/2-h,-c/2),t.lineTo(s/2,-c/2+h),t.lineTo(s/2,c/2),t.lineTo(-s/2,c/2),t.closePath(),t.fill(),t.stroke(),t.globalAlpha=.3,t.fillStyle=m.border,t.beginPath(),t.moveTo(s/2-h,-c/2),t.lineTo(s/2,-c/2+h),t.lineTo(s/2-h,-c/2+h),t.closePath(),t.fill(),t.globalAlpha=1,t.beginPath(),t.moveTo(s/2-h,-c/2),t.lineTo(s/2-h,-c/2+h),t.lineTo(s/2,-c/2+h),t.stroke(),C(t,o,p,m.font,d,f,s,c,u),x(t,i,s,c),t.restore()},nodeDimensions:{width:s,height:c}}}}function ce(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,H:c,rotation:l,labelRotation:u,textAlign:d,textValign:f,fontSize:p,c:m}=T(i,80,30,e);return{drawNode(){t.save(),t.translate(n,r),t.rotate(l),(a.selected||a.hover)&&(t.strokeStyle=`#f97316`,t.lineWidth=1,t.setLineDash([4,3]),w(t,-s/2,-c/2,s,c,3),t.stroke(),t.setLineDash([])),C(t,o,p,m.font,d,f,s,c,u),x(t,i,s,c),t.restore()},nodeDimensions:{width:s,height:c}}}}var le=30,ue=52;function de(e){return function({ctx:t,x:n,y:r,id:i,state:a,label:o}){let{W:s,H:c,rotation:l,labelRotation:u,fontSize:d,c:f}=T(i,le,ue,e),p=s/le,m=c/ue;return{drawNode(){if(t.save(),t.translate(n,r),t.rotate(l),t.strokeStyle=a.selected?`#f97316`:f.border,t.fillStyle=a.selected?f.hbg:f.bg,t.lineWidth=2,t.lineCap=`round`,t.beginPath(),t.arc(0,-20*m,8*m,0,Math.PI*2),t.fill(),t.stroke(),t.beginPath(),t.moveTo(0,-12*m),t.lineTo(0,8*m),t.stroke(),t.beginPath(),t.moveTo(-13*p,0*m),t.lineTo(13*p,0*m),t.stroke(),t.beginPath(),t.moveTo(0,8*m),t.lineTo(-10*p,24*m),t.stroke(),t.beginPath(),t.moveTo(0,8*m),t.lineTo(10*p,24*m),t.stroke(),o){t.save(),u&&t.rotate(u),t.font=`${d}px system-ui,-apple-system,sans-serif`,t.fillStyle=f.font,t.textAlign=`center`,t.textBaseline=`top`;let e=String(o).split(`
4
4
  `),n=d*1.3,r=24*m+4;e.forEach((e,i)=>t.fillText(e,0,r+i*n)),t.restore()}x(t,i,s,c),t.restore()},nodeDimensions:{width:s,height:c}}}}var fe=new Map;function pe(e,t){if(!e)return null;let n=fe.get(e);if(n===`loading`||n===`error`)return null;if(n)return n;fe.set(e,`loading`);let r=new Image;return r.onload=()=>{fe.set(e,r),t&&t()},r.onerror=()=>{fe.set(e,`error`)},r.src=e,null}function me(e){return function({ctx:t,x:r,y:i,id:a,state:o,label:s}){let{W:c,H:l,rotation:u,labelRotation:d,textAlign:f,textValign:p,fontSize:m,c:h}=T(a,160,120,e||`c-gray`),g=n.nodes&&n.nodes.get(a),_=g&&g.imageSrc,v=pe(_,()=>n.network&&n.network.redraw());return{drawNode(){if(t.save(),t.translate(r,i),t.rotate(u),t.strokeStyle=o.selected?`#f97316`:h.border,t.lineWidth=o.selected?2:1,w(t,-c/2,-l/2,c,l,4),t.stroke(),v?(t.save(),w(t,-c/2,-l/2,c,l,4),t.clip(),t.drawImage(v,-c/2,-l/2,c,l),t.restore()):(t.fillStyle=o.selected?h.hbg:h.bg,w(t,-c/2,-l/2,c,l,4),t.fill(),t.fillStyle=h.border,t.font=`${Math.round(Math.min(c,l)*.25)}px system-ui`,t.textAlign=`center`,t.textBaseline=`middle`,t.fillText(_?`…`:`🖼`,0,0)),s){let e=String(s).split(`
@@ -521,6 +521,8 @@
521
521
  "admin.appearance.code_max_height_hint": "Longer code blocks get a collapse/expand button. Set to 0 to disable.",
522
522
  "admin.appearance.soft_breaks_label": "Treat every newline as a line break",
523
523
  "admin.appearance.soft_breaks_hint": "<strong>Unchecked (CommonMark, default):</strong> a single newline in the source is rendered as a space — two adjacent lines merge into one paragraph. To force a line break without leaving a blank line, end the previous line with <code>two spaces</code> then newline, or use <code>&lt;br/&gt;</code>.<br/><strong>Checked (GitHub-flavoured):</strong> every single newline becomes a real line break in the rendered output. Convenient for chat-style writing, but you can no longer hard-wrap long paragraphs in the source file without visible breaks.",
524
+ "doc.toc_toggle": "Table of contents",
525
+ "doc.toc_title": "On this page",
524
526
  "admin.appearance.image_rounded_label": "Rounded image corners",
525
527
  "admin.appearance.image_rounded_hint": "Adds rounded corners to all images rendered in document view.",
526
528
  "admin.appearance.image_centered_label": "Center images horizontally",
@@ -521,6 +521,8 @@
521
521
  "admin.appearance.code_max_height_hint": "Les blocs plus longs reçoivent un bouton « Afficher plus / Réduire ». Mettre 0 pour désactiver.",
522
522
  "admin.appearance.soft_breaks_label": "Traiter chaque retour à la ligne comme un saut de ligne",
523
523
  "admin.appearance.soft_breaks_hint": "<strong>Décoché (CommonMark, défaut) :</strong> un seul retour à la ligne dans la source est rendu comme un espace — deux lignes adjacentes fusionnent dans un même paragraphe. Pour forcer un saut de ligne sans ligne vide, terminer la ligne précédente par <code>deux espaces</code> puis retour à la ligne, ou utiliser <code>&lt;br/&gt;</code>.<br/><strong>Coché (GitHub-flavoured) :</strong> chaque retour à la ligne devient un vrai saut de ligne dans le rendu. Pratique pour un style d'écriture « chat », mais vous ne pourrez plus couper un long paragraphe sur plusieurs lignes dans la source sans voir le saut apparaître.",
524
+ "doc.toc_toggle": "Table des matières",
525
+ "doc.toc_title": "Sur cette page",
524
526
  "admin.appearance.image_rounded_label": "Coins arrondis sur les images",
525
527
  "admin.appearance.image_rounded_hint": "Ajoute des coins arrondis à toutes les images affichées dans la vue document.",
526
528
  "admin.appearance.image_centered_label": "Centrer les images horizontalement",
@@ -15,8 +15,8 @@
15
15
  <link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css" disabled />
16
16
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
17
17
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>
18
- <script type="module" crossorigin src="/assets/index-XQ6TfVnr.js"></script>
19
- <link rel="stylesheet" crossorigin href="/assets/index-DcPLoj99.css">
18
+ <script type="module" crossorigin src="/assets/index-PuqCKNdT.js"></script>
19
+ <link rel="stylesheet" crossorigin href="/assets/index-DemWpj2z.css">
20
20
  </head>
21
21
  <body>
22
22
  <div id="app"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "living-ai-documentation",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "Local Markdown documentation hub with a built-in MCP server — coding agents create ADRs, draw diagrams and detect drift while you code.",
5
5
  "main": "dist/src/server.js",
6
6
  "bin": {