@mdwrk/mdwrkspace 1.3.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -0
- package/dist/en-BlzdGtuY.js +53 -0
- package/dist/en-By8I4mXs.js +29 -0
- package/dist/en-ClsGDxfD.js +99 -0
- package/dist/es-B5IZFwGp.js +53 -0
- package/dist/es-Bzp0qZ24.js +56 -0
- package/dist/es-Ct01NcRs.js +29 -0
- package/dist/esm-entry-4cxl0H9w.js +95628 -0
- package/dist/favicon.svg +19 -0
- package/dist/icons/icon-192.svg +19 -0
- package/dist/icons/icon-512.svg +19 -0
- package/dist/manifest.webmanifest +24 -0
- package/dist/mdwrkspace.css +1 -0
- package/dist/mdwrkspace.js +7 -0
- package/dist/sw.js +334 -0
- package/package.json +74 -0
package/dist/favicon.svg
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-label="Lattice Architect">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="latticeGrad" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0%" stop-color="#e55b2d"/>
|
|
5
|
+
<stop offset="100%" stop-color="#f2c94c"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="512" height="512" rx="96" fill="#0b0f13"/>
|
|
9
|
+
<rect x="96" y="96" width="320" height="320" rx="48" fill="url(#latticeGrad)" opacity="0.12"/>
|
|
10
|
+
<g stroke="url(#latticeGrad)" stroke-width="22" stroke-linecap="square">
|
|
11
|
+
<path d="M128 176h256"/>
|
|
12
|
+
<path d="M128 256h256"/>
|
|
13
|
+
<path d="M128 336h256"/>
|
|
14
|
+
<path d="M176 128v256"/>
|
|
15
|
+
<path d="M256 128v256"/>
|
|
16
|
+
<path d="M336 128v256"/>
|
|
17
|
+
</g>
|
|
18
|
+
<path d="M178 196h156v120h-68v-52h-88z" fill="#e55b2d"/>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-label="Lattice Architect">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="latticeGrad" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0%" stop-color="#e55b2d"/>
|
|
5
|
+
<stop offset="100%" stop-color="#f2c94c"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="512" height="512" rx="96" fill="#0b0f13"/>
|
|
9
|
+
<rect x="96" y="96" width="320" height="320" rx="48" fill="url(#latticeGrad)" opacity="0.12"/>
|
|
10
|
+
<g stroke="url(#latticeGrad)" stroke-width="22" stroke-linecap="square">
|
|
11
|
+
<path d="M128 176h256"/>
|
|
12
|
+
<path d="M128 256h256"/>
|
|
13
|
+
<path d="M128 336h256"/>
|
|
14
|
+
<path d="M176 128v256"/>
|
|
15
|
+
<path d="M256 128v256"/>
|
|
16
|
+
<path d="M336 128v256"/>
|
|
17
|
+
</g>
|
|
18
|
+
<path d="M178 196h156v120h-68v-52h-88z" fill="#e55b2d"/>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-label="Lattice Architect">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="latticeGrad" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0%" stop-color="#e55b2d"/>
|
|
5
|
+
<stop offset="100%" stop-color="#f2c94c"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="512" height="512" rx="96" fill="#0b0f13"/>
|
|
9
|
+
<rect x="96" y="96" width="320" height="320" rx="48" fill="url(#latticeGrad)" opacity="0.12"/>
|
|
10
|
+
<g stroke="url(#latticeGrad)" stroke-width="22" stroke-linecap="square">
|
|
11
|
+
<path d="M128 176h256"/>
|
|
12
|
+
<path d="M128 256h256"/>
|
|
13
|
+
<path d="M128 336h256"/>
|
|
14
|
+
<path d="M176 128v256"/>
|
|
15
|
+
<path d="M256 128v256"/>
|
|
16
|
+
<path d="M336 128v256"/>
|
|
17
|
+
</g>
|
|
18
|
+
<path d="M178 196h156v120h-68v-52h-88z" fill="#e55b2d"/>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Lattice Architect",
|
|
3
|
+
"short_name": "Lattice",
|
|
4
|
+
"description": "A high-density, offline-first Markdown workspace with a milled-zinc console aesthetic and hierarchical file management.",
|
|
5
|
+
"start_url": "/",
|
|
6
|
+
"display": "standalone",
|
|
7
|
+
"background_color": "#000000",
|
|
8
|
+
"theme_color": "#000000",
|
|
9
|
+
"icons": [
|
|
10
|
+
{
|
|
11
|
+
"src": "/icons/icon-192.svg",
|
|
12
|
+
"sizes": "192x192",
|
|
13
|
+
"type": "image/svg+xml"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"src": "/icons/icon-512.svg",
|
|
17
|
+
"sizes": "512x512",
|
|
18
|
+
"type": "image/svg+xml"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"developer": {
|
|
22
|
+
"name": "GroupSum"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--ui-scale: 1;--header-height: calc(32px * var(--ui-scale));--rail-width: calc(44px * var(--ui-scale));--rail-height: calc(44px * var(--ui-scale));--sidebar-width: calc(200px * var(--ui-scale));--status-height: calc(20px * var(--ui-scale));--tab-height: var(--header-height);--panel-header-height: calc(30px * var(--ui-scale));--rail-btn-size: calc(30px * var(--ui-scale));--bg-app: #c0c0c0;--bg-panel: #ececec;--bg-inset: #dcdcdc;--border-color: #000000;--border-width: 2px;--fg-primary: #000000;--fg-secondary: #333333;--fg-muted: #666666;--accent: #ff3e00;--table-header-bg: var(--bg-inset);--table-header-fg: var(--fg-primary);--table-row-primary-bg: var(--bg-panel);--table-row-secondary-bg: var(--bg-inset);--status-ok: #00cc00;--status-warn: #ff8800;--status-error: #cc0000;--app-gap: calc(4px * var(--ui-scale));--texture-opacity: .05;--editor-padding: calc(24px * var(--ui-scale));--file-indent-base: calc(12px * var(--ui-scale));--file-indent-unit: calc(12px * var(--ui-scale));--c-explorer-hover: rgba(0, 0, 0, .06);--c-explorer-selected: var(--accent);--c-explorer-selected-text: #ffffff;--c-explorer-drag-bg: rgba(255, 255, 255, .08);--font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-mono: "JetBrains Mono", "IBM Plex Mono", Menlo, monospace;--font-head: "Inter", sans-serif}body{background-color:var(--bg-app);color:var(--fg-primary);font-family:var(--font-ui);font-size:calc(12px * var(--ui-scale));margin:0;overflow:hidden;cursor:default;-webkit-font-smoothing:antialiased}*{box-sizing:border-box;border-radius:0!important}input,textarea,button{font-family:inherit;font-size:inherit;outline:none}button{cursor:pointer;text-transform:uppercase;font-weight:900;letter-spacing:.02em}svg.lucide{display:inline-block}svg.lucide[width="10"]{width:calc(10px * var(--ui-scale));height:calc(10px * var(--ui-scale))}svg.lucide[width="12"]{width:calc(12px * var(--ui-scale));height:calc(12px * var(--ui-scale))}svg.lucide[width="14"]{width:calc(14px * var(--ui-scale));height:calc(14px * var(--ui-scale))}svg.lucide[width="16"]{width:calc(16px * var(--ui-scale));height:calc(16px * var(--ui-scale))}svg.lucide[width="18"]{width:calc(18px * var(--ui-scale));height:calc(18px * var(--ui-scale))}svg.lucide[width="24"]{width:calc(24px * var(--ui-scale));height:calc(24px * var(--ui-scale))}svg.lucide[width="48"]{width:calc(48px * var(--ui-scale));height:calc(48px * var(--ui-scale))}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--bg-app);border-left:var(--border-width) solid var(--border-color)}::-webkit-scrollbar-thumb{background:var(--fg-primary);border:2px solid var(--bg-panel)}::-webkit-scrollbar-thumb:hover{background:var(--accent)}.markdown-body{font-family:var(--font-ui);line-height:1.6;font-size:calc(.95rem * var(--ui-scale));color:var(--fg-primary);overflow-wrap:anywhere;word-break:break-word}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-family:var(--font-head);color:var(--fg-primary);margin-top:1.5em;margin-bottom:.5em;font-weight:700}.markdown-body h1{font-size:calc(2em * var(--ui-scale));border-bottom:1px solid var(--border-color);padding-bottom:.3em}.markdown-body h2{font-size:calc(1.5em * var(--ui-scale))}.markdown-body h3{font-size:calc(1.2em * var(--ui-scale))}.markdown-body h4{font-size:calc(1.05em * var(--ui-scale))}.markdown-body h5{font-size:calc(.95em * var(--ui-scale));text-transform:uppercase;letter-spacing:.04em}.markdown-body h6{font-size:calc(.85em * var(--ui-scale));text-transform:uppercase;letter-spacing:.06em;color:var(--fg-muted)}.markdown-body p{margin-bottom:1em}.markdown-body strong{font-weight:700}.markdown-body em{font-style:italic}.markdown-body u,.markdown-body ins{text-decoration:underline;text-underline-offset:.15em}.markdown-body del{color:var(--fg-muted)}.markdown-body code{font-family:var(--font-mono);background:var(--bg-inset);padding:.2em .4em;border-radius:3px;font-size:calc(.85em * var(--ui-scale));color:var(--fg-secondary)}.markdown-body pre{background:var(--bg-inset);padding:1em;overflow-x:auto;border-radius:4px;border:1px solid var(--border-color)}.markdown-body pre code{background:transparent;padding:0;font-size:calc(.85em * var(--ui-scale));color:inherit}.markdown-body blockquote{border-left:4px solid var(--accent);padding-left:1em;color:var(--fg-muted);margin-left:0}.markdown-body hr{border:none;border-top:1px solid var(--border-color);margin:2em 0}.markdown-body ul,.markdown-body ol{margin:.6em 0 1em;padding-left:1.8em}.markdown-body ul{list-style:disc outside}.markdown-body ol{list-style:decimal outside}.markdown-body li{display:list-item;margin:.3em 0;padding-left:.15em}.markdown-body li>p{margin:.2em 0}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ul,.markdown-body ol ol{margin:.35em 0 .15em;padding-left:1.5em}.markdown-body ul ul{list-style-type:circle}.markdown-body ul ul ul{list-style-type:square}.markdown-body ol ol{list-style-type:lower-alpha}.markdown-body ol ol ol{list-style-type:lower-roman}.markdown-body .md-task-list-item{list-style:none;padding-left:.1em}.markdown-body .md-task-list-item>.md-checkbox,.markdown-body .md-task-list-item>input[type=checkbox]{margin:.15em .6em 0 0;transform:translate(-.35em)}.markdown-body .md-checkbox,.markdown-body input[type=checkbox]{vertical-align:middle}.markdown-body li::marker{color:var(--fg-muted)}.markdown-body li[data-has-nested-list=true]::marker{content:""}.markdown-body a{color:var(--accent);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:.2em;cursor:pointer}.markdown-body a:visited{color:var(--fg-secondary)}.markdown-body a:hover,.markdown-body a:focus-visible{color:var(--fg-primary);text-decoration-color:var(--accent)}.markdown-body a::selection{background:var(--accent);color:var(--bg-panel)}.markdown-body img{max-width:100%}.markdown-body figure{margin:1.5em 0}.markdown-body figcaption{color:var(--fg-muted);font-size:calc(.85em * var(--ui-scale));text-align:center}.markdown-body sup,.markdown-body sub{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}.markdown-body sup{top:-.4em}.markdown-body sub{bottom:-.2em}.markdown-body table,.markdown-body .md-table{width:100%;border-collapse:collapse;margin-bottom:1em}.markdown-body th,.markdown-body td,.markdown-body .md-table-header,.markdown-body .md-table-cell{border:1px solid var(--border-color);padding:6px 12px}.markdown-body th,.markdown-body .md-table-header{background-color:var(--table-header-bg);color:var(--table-header-fg);font-weight:700;text-align:left}.markdown-body caption,.markdown-body .md-table-caption{caption-side:top;text-align:left;font-weight:700;margin-bottom:.5em;color:var(--fg-secondary)}.markdown-body thead th,.markdown-body .md-table-head .md-table-header{background:var(--table-header-bg);color:var(--table-header-fg)}.markdown-body tbody tr:nth-child(2n),.markdown-body .md-table-body .md-table-row:nth-child(2n){background:var(--table-row-secondary-bg)}.markdown-body tbody tr:nth-child(odd),.markdown-body .md-table-body .md-table-row:nth-child(odd){background:var(--table-row-primary-bg)}.markdown-body pre>div{background:transparent!important;padding:0!important}.md-code-block{display:flex;flex-direction:column;gap:8px;padding:12px;background:var(--bg-panel);border:none;border-radius:6px;margin-bottom:1em;overflow:hidden}.md-code-header{background:var(--bg-inset);padding:4px 12px;font-family:var(--font-mono);font-size:calc(.7rem * var(--ui-scale));border-bottom:1px solid var(--border-color);color:var(--fg-muted);text-transform:uppercase}.md-code-surface{background:var(--code-block-bg, var(--bg-inset));padding:12px 14px;border-radius:6px}.md-code-surface pre,.md-code-surface pre>code,.md-code-surface>div{background:transparent!important;padding:0!important;margin:0!important}@media print{.markdown-body{font-size:calc(11pt * var(--ui-scale))}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{break-after:avoid;page-break-after:avoid}.markdown-body table,.markdown-body pre,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body img,.markdown-body .md-code-block,.markdown-body .md-table{break-inside:avoid;page-break-inside:avoid}}:root{--viewbox-aspect: square;--viewbox-width: md;--viewbox-height: md;--viewbox-device: precision;--viewbox-safe-top: 10px;--viewbox-safe-right: 10px;--viewbox-safe-bottom: 10px;--viewbox-safe-left: 10px}@media(max-aspect-ratio:3/4){:root{--viewbox-aspect: portrait;--viewbox-safe-top: 8px;--viewbox-safe-right: 8px;--viewbox-safe-bottom: 12px;--viewbox-safe-left: 8px}}@media(min-aspect-ratio:3/4)and (max-aspect-ratio:4/3){:root{--viewbox-aspect: square;--viewbox-safe-top: 10px;--viewbox-safe-right: 10px;--viewbox-safe-bottom: 10px;--viewbox-safe-left: 10px}}@media(min-aspect-ratio:4/3)and (max-aspect-ratio:16/9){:root{--viewbox-aspect: landscape;--viewbox-safe-top: 12px;--viewbox-safe-right: 12px;--viewbox-safe-bottom: 12px;--viewbox-safe-left: 12px}}@media(min-aspect-ratio:16/9)and (max-aspect-ratio:21/9){:root{--viewbox-aspect: wide;--viewbox-safe-top: 14px;--viewbox-safe-right: 18px;--viewbox-safe-bottom: 14px;--viewbox-safe-left: 18px}}@media(min-aspect-ratio:21/9){:root{--viewbox-aspect: ultrawide;--viewbox-safe-top: 16px;--viewbox-safe-right: 24px;--viewbox-safe-bottom: 16px;--viewbox-safe-left: 24px}}@media(max-width:480px){:root{--viewbox-width: xs}}@media(max-width:640px){:root{--viewbox-width: sm}}@media(max-width:900px){:root{--viewbox-width: md}}@media(max-width:1200px){:root{--viewbox-width: lg}}@media(min-width:1600px){:root{--viewbox-width: xl}}@media(min-width:1920px){:root{--viewbox-width: xxl}}@media(max-height:520px){:root{--viewbox-height: short;--viewbox-safe-top: 6px;--viewbox-safe-bottom: 6px}}@media(max-height:720px){:root{--viewbox-height: compact}}@media(min-height:900px){:root{--viewbox-height: tall}}@media(min-height:1200px){:root{--viewbox-height: ultra-tall}}@media(hover:none)and (pointer:coarse){:root{--viewbox-device: touch}}@media(hover:hover)and (pointer:fine){:root{--viewbox-device: precision}}.tab-bar{display:flex;align-items:stretch;overflow-x:auto}.tab-item{display:flex;align-items:center;gap:4px;padding:0 8px;border-right:var(--border-width) solid var(--border-color);background:var(--bg-inset);height:var(--tab-height);font-size:calc(9px * var(--ui-scale));font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--fg-secondary);cursor:pointer;flex-shrink:0}.tab-item.active{background:var(--bg-panel);color:var(--fg-primary);border-bottom:none}.tab-item.expanded{background:var(--bg-panel)}.tab-label{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-close{border:1px solid transparent;background:transparent;color:inherit;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.tab-close:hover{border-color:var(--border-color);background:var(--bg-panel)}.status-led{width:10px;height:10px;border-radius:999px!important;border:1px solid var(--border-color);background:var(--status-ok)}.status-led.warn{background:var(--status-warn)}.status-led.error{background:var(--status-error)}.status-led.offline{background:var(--fg-muted)}.zoom-control{display:flex;align-items:center;gap:4px;border:1px solid var(--border-color);padding:2px 4px;background:var(--bg-inset);font-size:calc(10px * var(--ui-scale));font-weight:800;text-transform:uppercase;height:24px}.zoom-btn{border:none;background:transparent;width:16px;height:16px;display:flex;align-items:center;justify-content:center;color:var(--fg-primary)}.zoom-display{min-width:42px;text-align:center}@media(max-width:640px){.tab-label{max-width:90px}.tab-item{padding:0 6px;font-size:calc(8px * var(--ui-scale))}}.toast-container{position:fixed;top:12px;right:12px;display:flex;flex-direction:column;gap:8px;z-index:4000;max-width:min(320px,90vw)}.toast-message{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);font-size:calc(10px * var(--ui-scale));font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-primary);box-shadow:6px 6px #0006}.toast-message.info{border-left:4px solid var(--accent)}.toast-message.success{border-left:4px solid var(--status-ok)}.toast-message.warning{border-left:4px solid var(--status-warn)}.toast-close-btn{width:20px;height:20px;border:1px solid transparent;background:transparent;color:inherit;display:inline-flex;align-items:center;justify-content:center}.toast-close-btn:hover{border-color:var(--border-color);background:var(--bg-inset)}.editor-pane-container{height:100%;min-height:0;min-width:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(40px,auto);grid-template-rows:1fr;position:relative;background:var(--bg-app)}.editor-pane-shell{grid-column:1;grid-row:1;min-height:0;min-width:0;display:flex;position:relative;flex-direction:column;overflow:hidden}.view-toolbar{grid-column:2;grid-row:1;width:40px;height:100%;min-height:0;background:var(--bg-inset);border-left:var(--border-width) solid var(--border-color);display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:10px 6px;z-index:50;flex-shrink:0;overflow-y:auto;overscroll-behavior:contain}.view-toolbar-group{display:flex;flex-direction:column;gap:6px;align-items:center;width:100%}.view-toolbar-btn{width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--fg-muted);border:1px solid transparent}.view-toolbar-btn:hover:not(:disabled){border-color:var(--border-color);color:var(--fg-primary)}.view-toolbar-btn.active{background:var(--border-color);color:#fff}.view-toolbar-btn:disabled{opacity:.2;cursor:not-allowed}.view-toolbar-divider{width:18px;height:1px;background:var(--border-color);margin:6px 0}.editor-pane-body{flex:1;display:flex;min-height:0;min-width:0;overflow:hidden;background:var(--bg-app)}.editor-pane-column{height:100%;background:var(--bg-panel);overflow:hidden;display:flex;flex-direction:column}.editor-layout-wrapper{flex:1;display:flex;overflow:hidden;position:relative}.editor-gutter{width:48px;background:var(--bg-inset);border-right:var(--border-width) solid var(--border-color);display:flex;flex-direction:column;align-items:flex-end;padding:calc(var(--editor-padding) - 8px) 8px;font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted);overflow-y:hidden;-webkit-user-select:none;user-select:none}.line-num{height:1.5rem;line-height:1.5rem}.editor-textarea{flex:1;background:var(--bg-panel);border:none;resize:none;padding:var(--editor-padding);font-family:var(--font-mono);font-size:calc(13px * var(--ui-scale));line-height:1.5rem;color:var(--fg-primary);outline:none;overflow-y:auto}.editor-splitter{width:var(--app-gap);background:var(--border-color);cursor:col-resize;position:relative;transition:background .1s}.editor-splitter:hover,.editor-splitter.dragging{background:var(--accent)}.editor-splitter-handle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2px;height:24px;background:#ffffff4d}.preview-pane{flex:1;overflow-y:auto;background:var(--bg-panel)}@media(max-width:900px){.editor-pane-container{grid-template-columns:1fr;grid-template-rows:auto 1fr}.editor-pane-shell{grid-row:2}.editor-pane-body{flex-direction:column}.editor-pane-body .editor-pane-column{width:100%!important;height:100%}.editor-pane-body.is-split .editor-pane-column{height:50%}.editor-splitter{width:100%;height:var(--app-gap);cursor:row-resize}.editor-splitter-handle{width:24px;height:2px}.view-toolbar{width:100%;height:auto;min-height:unset;grid-column:1;grid-row:1;flex-direction:row;align-items:center;justify-content:flex-start;border-left:0;border-bottom:var(--border-width) solid var(--border-color);overflow-x:auto;overflow-y:hidden}.view-toolbar-group{flex-direction:row;flex-wrap:wrap;justify-content:flex-start}.view-toolbar-divider{width:1px;height:18px;margin:0 6px}}@media(max-height:520px){.editor-pane-container{grid-template-columns:1fr;grid-template-rows:auto 1fr}.editor-pane-shell{grid-row:2}.view-toolbar{width:100%;height:auto;min-height:unset;grid-column:1;grid-row:1;flex-direction:row;align-items:center;justify-content:flex-start;border-left:0;border-bottom:var(--border-width) solid var(--border-color);overflow-x:auto;overflow-y:hidden}.view-toolbar-group{flex-direction:row;flex-wrap:wrap;justify-content:flex-start}.view-toolbar-divider{width:1px;height:18px;margin:0 6px}}@media(max-width:640px){.editor-gutter{width:40px;font-size:calc(9px * var(--ui-scale))}.editor-textarea{font-size:calc(12px * var(--ui-scale))}.view-toolbar-btn--split{display:none}}.file-tree-container{display:flex;flex-direction:column;padding:6px 0 16px;font-size:calc(11px * var(--ui-scale));color:var(--fg-secondary)}.file-tree-item{display:flex;align-items:center;gap:6px;height:26px;padding:0 8px;cursor:pointer;border-bottom:1px solid rgba(0,0,0,.05);text-transform:uppercase;letter-spacing:.08em}.file-tree-item:hover{background:var(--c-explorer-hover)}.file-tree-item.selected{background:var(--c-explorer-selected);color:var(--c-explorer-selected-text)}.file-tree-item.is-active{box-shadow:inset 0 0 0 1px var(--accent)}.file-tree-item.folder{font-weight:800;font-size:calc(10px * var(--ui-scale))}.file-tree-icon{display:flex;align-items:center;justify-content:center;width:16px;color:currentColor;cursor:pointer}.file-tree-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-tree-empty{padding:12px 8px;font-size:calc(10px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase;letter-spacing:.12em}.file-tree-buffer{flex:1}.chassis-root{position:relative;width:100vw;height:100dvh;min-height:100vh;background-color:var(--bg-app);overflow:hidden;border:var(--border-width) solid var(--border-color);box-sizing:border-box;padding-bottom:env(safe-area-inset-bottom);padding-top:env(safe-area-inset-top)}.texture-overlay{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;opacity:var(--texture-opacity);background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");z-index:9999}.chassis-scaler{display:grid;grid-template-areas:"rail top" "rail main" "rail foot";grid-template-columns:var(--rail-width) 1fr;grid-template-rows:var(--header-height) 1fr var(--status-height);width:100%;height:100%;background-color:var(--bg-app);gap:var(--app-gap)}.chassis-body{width:100%;height:100%;display:contents}.app-root,.app-grid{display:contents}.app-header{grid-area:top;background:var(--bg-panel);border-bottom:var(--border-width) solid var(--border-color);display:flex;align-items:center;height:var(--header-height);padding:0 8px;gap:8px;z-index:10}.action-rail{grid-area:rail;background:var(--bg-inset);border-right:var(--border-width) solid var(--border-color);display:flex;flex-direction:column;align-items:center;padding:4px 3px;gap:6px}.status-bar{grid-area:foot;background:var(--bg-panel);border-top:var(--border-width) solid var(--border-color);display:flex;align-items:center;justify-content:space-between;padding:0 6px;height:var(--status-height);font-size:calc(9px * var(--ui-scale));font-weight:700;text-transform:uppercase;letter-spacing:.08em;gap:8px}.workspace-manifold{grid-area:main;display:flex;background-color:var(--bg-app);overflow:hidden;gap:var(--app-gap);height:100%}.git-workspace{grid-area:main;height:100%;display:flex;background-color:var(--bg-app);overflow:hidden;gap:var(--app-gap);border-top:var(--border-width) solid var(--border-color)}.workspace-sidebar{width:var(--sidebar-width);background-color:var(--bg-panel);display:flex;flex-direction:column;flex-shrink:0;transition:width .15s cubic-bezier(.4,0,.2,1);overflow:hidden;border-right:var(--border-width) solid var(--border-color);min-width:160px}.workspace-sidebar.is-collapsed{width:0;min-width:0;border-right-width:0}.workspace-stage{flex:1;background-color:var(--bg-panel);display:flex;flex-direction:column;overflow:hidden;min-width:0}.workspace-sidebar-resizer{width:6px;cursor:col-resize;flex-shrink:0;position:relative;z-index:3;touch-action:none}.workspace-sidebar-resizer:after{content:"";position:absolute;top:0;bottom:0;left:2px;width:2px;background:var(--border-color);opacity:.35}.workspace-sidebar-resizer:hover:after{opacity:.85;background:var(--accent)}.workspace-sidebar-resizer.is-hidden{width:0;overflow:hidden}body.is-resizing-sidebar,body.is-resizing-sidebar *{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}.panel-toolbar{height:32px;background:var(--bg-inset);border-bottom:var(--border-width) solid var(--border-color);display:flex;align-items:center;justify-content:space-between;padding:0 12px;gap:12px;flex-shrink:0}.git-sidebar{width:300px;background:linear-gradient(180deg,var(--bg-panel) 0%,var(--bg-inset) 100%);border-right:2px solid var(--border-color);box-shadow:inset -1px 0 #00000014;display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.git-header-title{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;text-transform:uppercase;letter-spacing:.08em;color:var(--fg-primary)}.git-header-icon{color:var(--accent)}.git-close-btn{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;color:var(--fg-muted);background:var(--bg-panel);border:var(--border-width) solid var(--border-color);border-radius:6px}.git-close-btn:hover{color:var(--fg-primary);border-color:var(--border-color)}.git-body{flex:1;display:flex;flex-direction:column;gap:12px;padding:12px;overflow-y:auto;background:transparent}@media print{@page{size:auto;margin:12mm}body,.chassis-root{background:#fff;-webkit-print-color-adjust:exact;print-color-adjust:exact}body{margin:0}.texture-overlay,.action-rail,.app-header,.status-bar,.workspace-sidebar,.view-toolbar,.panel-toolbar,.git-workspace,.update-banner,.toast-container{display:none!important}.chassis-root{border:none}.chassis-scaler{grid-template-areas:"main";grid-template-columns:1fr;grid-template-rows:1fr;gap:0}.workspace-manifold{gap:0}.workspace-stage,.editor-pane-shell,.editor-pane-body,.preview-pane{overflow:visible}.editor-layout-wrapper,.editor-textarea,.editor-gutter,.editor-splitter{display:none!important}.editor-pane-container{height:auto}.editor-pane-column{width:100%!important}.preview-pane{padding:0!important;background:transparent}}.git-branch-info{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);border-left:3px solid var(--accent);border-radius:8px;text-transform:uppercase;font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));font-weight:700}.git-branch-row{display:inline-flex;align-items:center;gap:8px;color:var(--fg-primary)}.git-branch-name{font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900}.git-branch-stats{display:inline-flex;align-items:center;gap:10px;color:var(--fg-muted)}.git-section{display:flex;flex-direction:column;gap:8px}.git-section-title{display:flex;align-items:center;justify-content:space-between;font-family:var(--font-head);font-size:calc(11px * var(--ui-scale));font-weight:900;text-transform:uppercase;letter-spacing:.08em;color:var(--fg-primary);margin:0}.git-section-title span{padding:2px 6px;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);font-family:var(--font-mono);font-size:calc(9px * var(--ui-scale))}.git-empty-msg{padding:10px 12px;font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase;letter-spacing:.08em;background:var(--bg-panel);border:1px dashed var(--border-color);border-radius:8px}.git-item{display:grid;grid-template-columns:16px 1fr auto 24px;align-items:center;gap:8px;padding:8px 10px;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);border-left:3px solid var(--accent);border-radius:8px;font-family:var(--font-mono);font-size:calc(11px * var(--ui-scale))}.git-item__icon{color:var(--accent)}.git-item__name{color:var(--fg-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-item__status{padding:2px 6px;border:var(--border-width) solid var(--border-color);background:var(--bg-panel);font-size:calc(9px * var(--ui-scale));font-weight:900;letter-spacing:.08em}.git-stage-btn{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);border-radius:6px;color:var(--fg-primary)}.git-stage-btn:hover{background:var(--accent);color:#fff}.git-commit-area{display:flex;flex-direction:column;gap:8px}.git-commit-input{min-height:80px;resize:vertical;padding:8px;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);border-radius:8px;color:var(--fg-primary);font-family:var(--font-mono);font-size:calc(12px * var(--ui-scale))}.git-commit-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:8px 10px;border:var(--border-width) solid var(--border-color);background:var(--accent);color:#fff;font-size:calc(11px * var(--ui-scale));border-radius:8px}.git-commit-btn:disabled{background:var(--bg-inset);color:var(--fg-muted);cursor:not-allowed}.git-sync-area{margin-top:auto;padding-top:6px;border-top:var(--border-width) solid var(--border-color)}.git-sync-btn{width:100%;display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:8px 10px;border:var(--border-width) solid var(--border-color);background:var(--bg-panel);color:var(--fg-primary);font-size:calc(11px * var(--ui-scale));border-radius:8px}.git-sync-btn:hover{background:var(--bg-inset)}.git-diff-view{flex:1;display:flex;flex-direction:column;background:linear-gradient(180deg,var(--bg-panel) 0%,var(--bg-inset) 100%);border-left:2px solid var(--border-color);min-width:0}.git-diff-title{font-family:var(--font-head);font-size:calc(11px * var(--ui-scale));font-weight:900;text-transform:uppercase;letter-spacing:.08em;color:var(--fg-primary)}.git-diff-legend{display:inline-flex;align-items:center;gap:12px;font-family:var(--font-mono);font-size:calc(9px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase;letter-spacing:.08em}.git-diff-actions{display:inline-flex;align-items:center;gap:12px}.git-diff-toolbar{display:inline-flex;align-items:center;gap:6px;padding:2px;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);border-radius:999px}.git-icon-btn{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;border:var(--border-width) solid transparent;background:transparent;color:var(--fg-muted);border-radius:999px}.git-icon-btn:hover{color:var(--fg-primary);border-color:var(--border-color);background:var(--bg-inset)}.git-view-toggle.is-active{background:var(--accent);color:#fff;border-color:var(--border-color)}.git-diff-legend-item{display:inline-flex;align-items:center;gap:6px}.git-legend-icon-del,.git-legend-icon-add{width:10px;height:10px;border:var(--border-width) solid var(--border-color)}.git-legend-icon-del{background:var(--status-error)}.git-legend-icon-add{background:var(--status-ok)}.git-diff-content{flex:1;display:flex;flex-direction:column;overflow:auto;background:transparent;padding:12px}.git-diff-stage{display:flex;flex-direction:column;min-height:100%;gap:12px;font-family:var(--font-mono);font-size:calc(12px * var(--ui-scale))}.git-diff-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.git-diff-panel{display:flex;flex-direction:column;border:var(--border-width) solid var(--border-color);background:var(--bg-panel);border-radius:12px;overflow:hidden;box-shadow:inset 0 0 0 1px #ffffff05}.git-diff-panel--preview{background:var(--bg-inset)}.git-diff-panel__header{padding:8px 12px;font-family:var(--font-head);font-size:calc(10px * var(--ui-scale));font-weight:900;letter-spacing:.18em;text-transform:uppercase;color:var(--fg-primary);background:var(--bg-inset);border-bottom:var(--border-width) solid var(--border-color)}.git-diff-panel__content{display:flex;flex-direction:column;gap:6px;padding:12px;min-width:0}.git-preview-pane .preview-pane{background:transparent;padding:0}.git-preview-pane .markdown-body{padding:12px}.git-diff-meta{font-family:var(--font-head);font-size:calc(11px * var(--ui-scale));font-weight:900;text-transform:uppercase;letter-spacing:.08em;color:var(--fg-muted)}.git-diff-marker{display:inline-block;width:16px;font-weight:900}.git-diff-row,.git-diff-line,.git-diff-preview-line{display:flex;align-items:flex-start;gap:6px;padding:6px 8px;border-radius:6px}.diff-removed{background:#ff000014;border-left:3px solid var(--status-error)}.diff-added{background:#00ff0014;border-left:3px solid var(--status-ok)}.diff-context{background:var(--bg-inset);border:var(--border-width) dashed var(--border-color)}.git-diff-line--removed{background:#ff000014;border-left:3px solid var(--status-error)}.git-diff-line--added{background:#00ff0014;border-left:3px solid var(--status-ok)}.git-line-num{width:18px;text-align:right;color:var(--fg-muted);font-size:calc(10px * var(--ui-scale));flex-shrink:0}.git-diff-preview-line--muted{color:var(--fg-muted)}.git-diff-placeholder{flex:1;display:flex;align-items:center;justify-content:center;font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;letter-spacing:.2em;color:var(--fg-muted);background:var(--bg-panel);text-transform:uppercase}.workspace-panel-header{height:var(--panel-header-height);background:var(--bg-inset);border-bottom:var(--border-width) solid var(--border-color);display:flex;align-items:center;justify-content:space-between;padding:0 10px;flex-shrink:0;font-size:calc(10px * var(--ui-scale));font-weight:800;letter-spacing:.12em;text-transform:uppercase}.workspace-panel-content{flex:1;overflow-y:auto}.panel-icon-btn{width:22px;height:22px;display:flex;align-items:center;justify-content:center;color:var(--fg-muted);border:1px solid transparent}.panel-icon-btn:hover{color:var(--fg-primary);border-color:var(--border-color);background:var(--bg-panel)}.panel-icon-btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.header-left,.header-right{display:flex;align-items:center;gap:8px;height:100%}.header-left{min-width:120px}.header-center{flex:1;display:flex;align-items:stretch;height:100%;min-width:0;overflow:hidden;padding-left:6px}.header-right{min-width:200px;justify-content:flex-end;border-left:var(--border-width) solid var(--border-color);padding-left:12px}.header-brand{display:flex;align-items:center;gap:8px;cursor:pointer}.header-brand-title{display:flex;align-items:center;gap:6px;font-size:calc(11px * var(--ui-scale));font-weight:900;text-transform:uppercase;letter-spacing:.06em}.header-brand-subtitle{font-size:calc(8px * var(--ui-scale));font-weight:700;text-transform:uppercase;letter-spacing:.2em;color:var(--fg-muted)}.header-btn{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border-color);background:var(--bg-panel);color:var(--fg-primary)}.header-tabs{flex:1;min-width:0;overflow-x:auto;overflow-y:hidden}.header-controls{display:flex;align-items:center;gap:8px}.header-btn-group{display:inline-flex;align-items:center;gap:2px;padding:1px;border:1px solid var(--border-color);background:var(--bg-inset)}.header-btn:hover{background:var(--bg-inset)}.header-btn:disabled{opacity:.5;cursor:not-allowed}.rail-group{display:flex;flex-direction:column;gap:4px;align-items:center;width:100%}.rail-spacer{flex:1}.rail-btn{width:var(--rail-btn-size);height:var(--rail-btn-size);display:flex;align-items:center;justify-content:center;background:transparent;border:1px solid transparent;color:var(--fg-muted);position:relative}.rail-btn svg{width:calc(18px * var(--ui-scale));height:calc(18px * var(--ui-scale));stroke-width:2.2px}.rail-btn:hover{border-color:var(--border-color);background:var(--bg-panel);color:var(--fg-primary)}.rail-btn.is-active{background:var(--accent);border-color:var(--border-color);color:#fff}.rail-btn--status{border-style:dashed}.status-left,.status-right{display:flex;align-items:center;gap:8px}.status-item{display:flex;align-items:center;gap:4px}.status-item__icon{opacity:.7}.status-label{color:var(--fg-muted)}.status-kv{font-weight:800}.status-sep{width:1px;height:12px;background:var(--border-color)}.status-text-bold{font-weight:900}.status-text--on{color:var(--status-ok)}.status-text--warn{color:var(--status-warn)}.status-online{display:flex;align-items:center;gap:4px;color:var(--status-ok)}.status-offline{display:flex;align-items:center;gap:4px;color:var(--status-error)}.status-dot{width:6px;height:6px;border-radius:999px!important;background:var(--accent)}.badge-unsaved{padding:2px 6px;border:1px solid var(--border-color);background:var(--bg-inset);font-size:calc(9px * var(--ui-scale));letter-spacing:.08em}.panel-toolbar{height:var(--panel-header-height);background:var(--bg-inset);border-bottom:var(--border-width) solid var(--border-color);display:flex;align-items:center;justify-content:space-between;padding:0 10px;font-size:calc(10px * var(--ui-scale));font-weight:800;text-transform:uppercase;letter-spacing:.12em}.git-sidebar{width:300px;min-width:220px;display:flex;flex-direction:column;background:linear-gradient(180deg,var(--bg-panel) 0%,var(--bg-inset) 100%);border-right:2px solid var(--border-color);box-shadow:inset -1px 0 #00000014}.git-body{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px;background:transparent}.git-header-title,.git-diff-title{display:flex;align-items:center;gap:6px}.git-close-btn{border:1px solid var(--border-color);background:var(--bg-panel);width:26px;height:26px;display:flex;align-items:center;justify-content:center;border-radius:6px}.git-section-title{display:flex;justify-content:space-between;font-size:calc(10px * var(--ui-scale));font-weight:800;text-transform:uppercase;letter-spacing:.12em;margin:0;padding-bottom:4px;border-bottom:1px solid var(--border-color)}.git-list{display:flex;flex-direction:column;gap:6px}.git-item{display:grid;grid-template-columns:16px 1fr 16px 22px;align-items:center;gap:6px;padding:8px 10px;border:1px solid var(--border-color);background:var(--bg-panel);border-left:3px solid var(--accent);border-radius:8px;font-size:calc(11px * var(--ui-scale))}.git-item__status{font-weight:900;text-align:center}.git-stage-btn{border:1px solid var(--border-color);background:var(--bg-inset);width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:6px}.git-empty-msg{font-size:calc(10px * var(--ui-scale));text-transform:uppercase;color:var(--fg-muted);background:var(--bg-panel);border:1px dashed var(--border-color);padding:10px 12px;border-radius:8px}.git-branch-info{display:flex;justify-content:space-between;align-items:center;border:1px solid var(--border-color);padding:10px 12px;background:var(--bg-panel);font-size:calc(10px * var(--ui-scale));border-left:3px solid var(--accent);border-radius:8px}.git-branch-row{display:flex;align-items:center;gap:6px;font-weight:800;text-transform:uppercase}.git-branch-stats{display:flex;align-items:center;gap:8px;color:var(--fg-muted)}.git-stat-item{display:inline-flex;align-items:center;gap:4px}.git-commit-area{display:flex;flex-direction:column;gap:6px}.git-commit-input{min-height:80px;border:1px solid var(--border-color);background:var(--bg-panel);padding:8px;font-family:var(--font-mono);font-size:calc(11px * var(--ui-scale));color:var(--fg-primary);border-radius:8px}.git-commit-btn,.git-sync-btn{border:1px solid var(--border-color);background:var(--bg-inset);padding:8px 10px;font-size:calc(10px * var(--ui-scale));font-weight:900;letter-spacing:.12em;text-transform:uppercase;display:inline-flex;align-items:center;gap:6px;border-radius:8px}.git-commit-btn:disabled{opacity:.4;cursor:not-allowed}.git-diff-view{flex:1;display:flex;flex-direction:column;background:linear-gradient(180deg,var(--bg-panel) 0%,var(--bg-inset) 100%)}.git-diff-content{flex:1;overflow:auto;padding:12px}.git-diff-legend{display:flex;align-items:center;gap:10px;font-size:calc(9px * var(--ui-scale));color:var(--fg-muted)}.git-diff-legend-item{display:flex;align-items:center;gap:4px}.git-legend-icon-del,.git-legend-icon-add{width:10px;height:10px;border:1px solid var(--border-color)}.git-legend-icon-del{background:#f003}.git-legend-icon-add{background:#0f03}.git-diff-container{display:flex;border:1px solid var(--border-color);background:var(--bg-inset)}.git-diff-gutter{padding:10px 6px;background:var(--bg-panel);border-right:1px solid var(--border-color);font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted)}.git-diff-code{flex:1;padding:10px;font-family:var(--font-mono);font-size:calc(11px * var(--ui-scale));display:flex;flex-direction:column;gap:6px}.git-diff-meta{font-weight:800;text-transform:uppercase;letter-spacing:.1em}.diff-removed{background:#ff000014;border-left:3px solid var(--status-error);padding:6px 8px}.diff-added{background:#00ff0014;border-left:3px solid var(--status-ok);padding:6px 8px}.git-diff-placeholder{font-size:calc(11px * var(--ui-scale));text-transform:uppercase;color:var(--fg-muted);display:flex;align-items:center;justify-content:center;height:100%}.workspace-idle-state{height:100%;display:flex;align-items:center;justify-content:center;background:var(--bg-panel)}.idle-indicator{display:flex;flex-direction:column;align-items:center;text-align:center}.idle-text-stack{display:flex;flex-direction:column;gap:4px}.idle-primary{font-family:var(--font-head);font-weight:950;font-size:calc(24px * var(--ui-scale));letter-spacing:-.05em;text-transform:uppercase}.idle-secondary{font-family:var(--font-mono);font-size:calc(9px * var(--ui-scale));color:var(--fg-muted);letter-spacing:.2em}.idle-action-btn{margin-top:24px;padding:8px 16px;border:var(--border-width) solid var(--border-color);background:var(--bg-inset);font-size:calc(10px * var(--ui-scale));font-weight:900}.idle-action-btn:hover{background:var(--accent);color:#fff}@media(max-width:1200px){:root{--rail-width: 42px;--sidebar-width: 190px;--panel-header-height: 30px;--app-gap: 3px;--editor-padding: 18px}}@media(max-width:1024px){:root{--rail-width: 40px;--sidebar-width: 180px;--header-height: 34px;--status-height: 22px;--panel-header-height: 28px;--rail-btn-size: 28px;--editor-padding: 14px}.header-right{min-width:170px}}@media(max-width:640px){:root{--rail-width: 100%;--sidebar-width: 100%;--header-height: 44px;--status-height: 24px;--panel-header-height: 28px;--rail-btn-size: 32px;--app-gap: 2px;--editor-padding: 12px;--rail-height: 40px}.chassis-scaler{grid-template-areas:"top" "main" "rail" "foot";grid-template-columns:1fr;grid-template-rows:var(--header-height) minmax(0,1fr) var(--rail-height) var(--status-height)}.action-rail{flex-direction:row;border-right:0;border-top:var(--border-width) solid var(--border-color);justify-content:space-between;padding:2px 4px}.rail-group{flex-direction:row;width:auto}.rail-spacer{flex:1}.app-header{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"brand controls" "tabs tabs";align-items:center;height:auto;padding:0;gap:6px;border-bottom:0}.header-left,.header-right{min-width:0;width:auto;justify-content:space-between;padding:6px}.header-left{grid-area:brand}.header-center{grid-area:tabs;width:100%;border-top:var(--border-width) solid var(--border-color);border-bottom:var(--border-width) solid var(--border-color);padding:4px 6px;background:var(--bg-inset)}.header-right{grid-area:controls;margin-left:auto;border-left:0;border-top:0;padding:0;margin-top:0}.header-controls{justify-content:flex-end}.header-brand-title{font-size:calc(11px * var(--ui-scale))}.header-brand-subtitle{font-size:calc(8px * var(--ui-scale))}.header-btn{width:28px;height:28px}.workspace-manifold,.git-workspace{flex-direction:column-reverse}.app-grid.mode-work,.app-grid.mode-git{display:flex;flex-direction:column-reverse}.workspace-sidebar,.git-sidebar{width:100%;min-width:0;height:100%;border-right:0;border-bottom:var(--border-width) solid var(--border-color)}.workspace-sidebar.is-collapsed{height:0;min-height:0;border-bottom-width:0}.git-sidebar{height:100%}.workspace-sidebar:not(.is-collapsed)+.workspace-stage{display:none}.git-diff-view{display:none}.git-diff-view{border-left:0;border-top:var(--border-width) solid var(--border-color)}.status-bar{flex-wrap:wrap;height:auto;padding:4px 6px}.status-left,.status-right{width:100%;justify-content:space-between}}@media(max-width:640px)and (min-aspect-ratio:4/3){:root{--rail-width: 44px;--rail-height: auto}.chassis-scaler{grid-template-areas:"rail top" "rail main" "rail foot";grid-template-columns:var(--rail-width) 1fr;grid-template-rows:var(--header-height) minmax(0,1fr) var(--status-height)}.action-rail{flex-direction:column;border-top:0;border-right:var(--border-width) solid var(--border-color);justify-content:flex-start;padding:4px 3px}.rail-group{flex-direction:column;width:100%}.app-grid.mode-work,.app-grid.mode-git{display:contents;flex-direction:initial}.workspace-manifold,.git-workspace{flex-direction:row}}@media(min-width:1600px){:root{--sidebar-width: 230px;--rail-width: 48px;--header-height: 36px;--status-height: 22px;--panel-header-height: 34px;--rail-btn-size: 34px;--app-gap: 5px;--editor-padding: 22px}}@media(min-width:1920px){:root{--sidebar-width: 260px;--rail-width: 52px;--header-height: 44px;--status-height: 28px;--panel-header-height: 36px;--rail-btn-size: 36px;--app-gap: 6px;--editor-padding: 28px}}.project-selector-stage{width:100%;height:100%;position:relative;background:var(--bg-app);display:flex;align-items:center;justify-content:center;overflow:hidden;grid-column:1 / -1;grid-row:1 / -1}.project-selector-chassis{width:1000px;max-width:90%;height:80vh;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);box-shadow:16px 16px #000c,inset 0 0 0 1px color-mix(in srgb,var(--border-color) 55%,transparent);display:flex;flex-direction:column;z-index:10;position:relative}.project-selector-top{position:relative;display:flex;justify-content:space-between;align-items:center;padding:24px 32px;background:var(--bg-inset);border-bottom:var(--border-width) solid var(--border-color)}.project-title{font-family:var(--font-head);font-size:calc(1.6rem * var(--ui-scale));font-weight:950;line-height:1;margin:0;text-transform:uppercase;letter-spacing:-.02em}.project-subtitle{font-family:var(--font-mono);font-size:calc(9px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase;margin:6px 0 0;letter-spacing:.1em}.project-selector-body{flex:1;background:var(--bg-app);overflow-y:auto;display:flex;flex-direction:column}.project-selector-top:after{content:"";position:absolute;top:8px;right:8px;bottom:8px;left:8px;border:1px solid color-mix(in srgb,var(--border-color) 45%,transparent);pointer-events:none}.project-actions{border:var(--border-width) solid var(--border-color);background:var(--bg-panel);padding:6px;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 50%,transparent)}.project-header-info{min-width:0}.project-create-modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;display:flex;align-items:center;justify-content:center;padding:24px;z-index:2000}.project-delete-modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000094;display:flex;align-items:center;justify-content:center;padding:24px;z-index:2050}.theme-selector-modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;padding:24px;z-index:2100}.project-create-modal-surface{width:min(560px,92vw);background:var(--bg-panel);border:var(--border-width) solid var(--border-color);box-shadow:18px 18px #000000c7,inset 0 0 0 1px color-mix(in srgb,var(--border-color) 60%,transparent);display:flex;flex-direction:column}.project-delete-modal-surface{width:min(560px,94vw);background:var(--bg-panel);border:var(--border-width) solid var(--border-color);box-shadow:20px 20px #000000b8,inset 0 0 0 1px color-mix(in srgb,var(--border-color) 55%,transparent);display:flex;flex-direction:column}.theme-selector-modal-surface{width:min(720px,94vw);background:var(--bg-panel);border:var(--border-width) solid var(--border-color);box-shadow:20px 20px #000000b8,inset 0 0 0 1px color-mix(in srgb,var(--border-color) 55%,transparent);display:flex;flex-direction:column;max-height:86vh}.project-create-modal-header,.project-delete-modal-header,.theme-selector-modal-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-top:var(--border-width) solid var(--border-color);background:linear-gradient(180deg,var(--bg-inset),color-mix(in srgb,var(--bg-inset) 72%,var(--bg-panel)));border-bottom:var(--border-width) solid var(--border-color)}.project-create-title,.project-delete-title,.theme-selector-title{margin:0;font-family:var(--font-head);font-size:calc(1rem * var(--ui-scale));text-transform:uppercase;letter-spacing:.08em}.project-create-close,.project-delete-close,.theme-selector-close{border:var(--border-width) solid var(--border-color);background:var(--bg-panel);color:var(--fg-primary);padding:8px 12px;font-size:calc(11px * var(--ui-scale));font-weight:800;text-transform:uppercase;letter-spacing:.08em}.project-delete-modal-body{padding:24px;display:grid;grid-template-columns:auto 1fr;align-items:start;gap:16px 18px;border-bottom:var(--border-width) solid var(--border-color)}.project-delete-message{margin:0;grid-column:2;font-family:var(--font-head);font-size:calc(1rem * var(--ui-scale));letter-spacing:.06em;text-transform:uppercase;color:var(--fg-primary)}.project-delete-message span{color:var(--accent)}.project-delete-warning{margin:0;grid-column:2;font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));text-transform:uppercase;color:var(--fg-muted)}.project-delete-meta{margin:0;grid-column:2;font-family:var(--font-ui);font-size:calc(11px * var(--ui-scale));line-height:1.45;color:var(--fg-secondary)}.project-delete-icon-wrap{width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;border:var(--border-width) solid var(--status-error);color:var(--status-error);background:color-mix(in srgb,var(--status-error) 12%,var(--bg-panel))}.project-delete-actions{display:flex;justify-content:flex-end;gap:12px;padding:20px 24px;border-top:var(--border-width) solid var(--border-color);background:var(--bg-inset)}.project-delete-confirm{border-color:var(--status-error);color:var(--status-error)}.project-delete-kicker{margin:0;grid-column:2;font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));letter-spacing:.14em;color:var(--status-error);text-transform:uppercase}.project-delete-modal-surface{overflow:hidden}.project-delete-actions .project-btn-cancel,.project-delete-actions .project-btn-submit{min-width:160px}.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:calc(var(--app-gap) * 4);padding:calc(var(--app-gap) * 4);background:var(--bg-inset);border:var(--border-width) solid var(--border-color);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 50%,transparent);flex:1;align-content:start}.project-card{background:var(--bg-panel);height:220px;display:flex;flex-direction:column;cursor:pointer;transition:all .1s cubic-bezier(.17,.67,.83,.67);position:relative;border:var(--border-width) solid var(--border-color)}.project-card:hover{background:var(--bg-inset)}.project-card.is-active{box-shadow:inset 0 0 0 4px var(--accent)}.project-card-main{flex:1;padding:24px;display:flex;flex-direction:column}.project-card-icon{color:var(--accent)}.project-card-title{font-family:var(--font-head);font-size:calc(1.25rem * var(--ui-scale));font-weight:900;margin:0;text-transform:uppercase;letter-spacing:-.02em;color:var(--fg-primary)}.project-card-meta{font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted);display:flex;align-items:center;gap:8px;text-transform:uppercase;font-weight:700}.project-card-footer{padding:16px 24px;border-top:var(--border-width) solid var(--border-color);background:var(--bg-inset);display:flex;justify-content:space-between;align-items:center;font-family:var(--font-mono);font-size:calc(9px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase;font-weight:800}.project-btn-new{background:var(--accent);color:#fff;padding:0 24px;height:44px;font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;border:var(--border-width) solid var(--border-color);display:flex;align-items:center;gap:12px;transition:all .05s;text-transform:uppercase}.project-btn-new:hover{transform:translate(-2px,-2px);box-shadow:4px 4px 0 var(--border-color)}.project-btn-new:active{transform:translate(0);box-shadow:none}.theme-toggle-btn{width:44px;height:44px;display:flex;align-items:center;justify-content:center;border:var(--border-width) solid var(--border-color);background:linear-gradient(145deg,var(--bg-panel),var(--bg-inset));color:var(--fg-primary);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 55%,transparent)}.theme-toggle-btn:hover{border-color:var(--accent);color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 45%,transparent),3px 3px color-mix(in srgb,var(--border-color) 75%,transparent)}.theme-selector-modal-body{padding:24px;display:flex;flex-direction:column;gap:20px;overflow-y:auto;overflow-x:hidden}.theme-selector-meta{display:flex;flex-wrap:wrap;align-items:center;gap:10px;font-size:calc(10px * var(--ui-scale));text-transform:uppercase;letter-spacing:.08em}.theme-meta-label{color:var(--fg-muted);font-weight:800}.theme-meta-value{font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900}.theme-meta-count{padding:4px 8px;border:var(--border-width) solid var(--border-color);background:var(--bg-inset);font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted)}.theme-modal-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--app-gap)}.theme-modal-button{display:flex;flex-direction:column;gap:8px;padding:20px;background:var(--bg-panel);text-align:left;border:var(--border-width) solid var(--border-color);transition:background .1s ease}.theme-modal-button:hover{background:var(--bg-inset)}.theme-modal-button.is-active{background:var(--bg-inset);box-shadow:inset 0 0 0 2px var(--accent)}.theme-modal-button-top{display:flex;align-items:center;justify-content:space-between;gap:12px}.theme-name{font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));text-transform:uppercase;letter-spacing:.06em}.theme-desc{font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase;letter-spacing:.05em}.project-create-form{background:transparent;border:none;padding:24px}.project-input{width:100%;padding:16px;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);color:var(--fg-primary);font-family:var(--font-mono);font-weight:800;font-size:calc(16px * var(--ui-scale));text-transform:uppercase}.project-input-group{display:flex;flex-direction:column;gap:12px}.project-input-label{font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));text-transform:uppercase;letter-spacing:.08em;color:var(--fg-muted);font-weight:800}.project-theme-trigger{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:14px 16px;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);text-transform:uppercase}.project-theme-trigger-label{font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));letter-spacing:.08em;color:var(--fg-primary)}.project-theme-trigger-meta{font-family:var(--font-mono);font-size:calc(9px * var(--ui-scale));letter-spacing:.12em;color:var(--fg-muted)}.project-form-actions{margin-top:24px;display:flex;gap:12px;align-items:stretch}.project-btn-submit{flex:1;background:var(--accent);color:#fff;padding:16px;font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;border:var(--border-width) solid var(--border-color);text-transform:uppercase;cursor:pointer;transition:all .1s ease}.project-btn-submit:hover{background:var(--fg-primary);color:var(--bg-panel)}.project-btn-submit:active{transform:translate(2px,2px)}.project-btn-cancel{flex:1;padding:16px;background:var(--bg-panel);color:var(--fg-primary);border:var(--border-width) solid var(--border-color);font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;text-transform:uppercase;cursor:pointer;transition:all .1s ease}.project-btn-cancel:hover{background:var(--fg-primary);color:var(--bg-panel)}.project-btn-cancel:active{transform:translate(2px,2px)}@media(max-width:1200px){.project-selector-chassis{width:920px}}@media(max-width:900px){.project-selector-chassis{width:100%;max-width:92%;height:86vh}.project-selector-top{flex-direction:column;align-items:flex-start;gap:16px}.project-grid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}.theme-popover{width:320px}}@media(max-width:640px){.project-selector-chassis{max-width:100%;height:100%;box-shadow:none}.project-create-modal,.theme-selector-modal{padding:0}.project-create-modal-surface,.theme-selector-modal-surface{width:100%;height:100%;max-height:none;box-shadow:none;border-width:0}.project-selector-top{padding:16px}.project-title{font-size:calc(1.2rem * var(--ui-scale))}.project-grid{grid-template-columns:1fr}.project-card{height:auto;min-height:200px}.project-btn-new{width:100%;justify-content:center}.theme-popover{position:fixed;top:12px;right:12px;bottom:12px;left:12px;width:auto;margin-top:0}}@media(min-width:1920px){.project-selector-chassis{width:1200px;height:78vh}.project-grid{grid-template-columns:repeat(auto-fill,minmax(340px,1fr))}}@media(max-width:640px){.project-delete-modal{padding:0}.project-delete-modal-surface{width:100%;height:100%;border-width:0;box-shadow:none}.project-delete-modal-body{grid-template-columns:1fr}.project-delete-message,.project-delete-warning,.project-delete-meta{grid-column:1}}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:2000;padding:24px;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal-base{background:var(--bg-panel);border:var(--border-width) solid var(--border-color);box-shadow:12px 12px #0009;display:flex;flex-direction:column;max-width:100%;position:relative;overflow:hidden}.settings-modal{width:min(1240px,98vw);height:min(900px,96vh);background:linear-gradient(135deg,rgba(255,255,255,.02),transparent 55%);border-width:calc(var(--border-width) + 1px);box-shadow:18px 18px #000000a6}.settings-modal:before{content:"";position:absolute;top:10px;right:10px;bottom:10px;left:10px;border:1px dashed color-mix(in srgb,var(--border-color) 70%,transparent);pointer-events:none;opacity:.6}.modal-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;border-bottom:var(--border-width) solid var(--border-color);background-color:var(--bg-panel);flex-shrink:0}.modal-title{font-family:var(--font-head);font-weight:900;text-transform:uppercase;font-size:calc(15px * var(--ui-scale));letter-spacing:.1em;color:var(--fg-primary);display:flex;align-items:center;gap:12px}.modal-close{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:var(--border-width) solid var(--border-color);background:var(--bg-inset);cursor:pointer;transition:all .1s}.modal-close:hover{background:var(--status-error);color:#fff;transform:translate(2px,-2px);box-shadow:-2px 2px 0 var(--border-color)}.settings-layout{flex:1;display:flex;overflow:hidden;background:var(--bg-app);gap:var(--app-gap);padding:var(--app-gap)}.settings-sidebar{width:204px;background:linear-gradient(180deg,var(--bg-panel),var(--bg-inset));border:var(--border-width) solid var(--border-color);display:flex;flex-direction:column;flex-shrink:0;position:relative;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 65%,transparent)}.settings-sidebar-btn{width:100%;text-align:left;padding:16px 20px;display:flex;align-items:center;gap:14px;font-size:calc(12px * var(--ui-scale));font-weight:800;text-transform:uppercase;color:var(--fg-muted);border-bottom:var(--border-width) solid var(--border-color);transition:all .1s;background:transparent;position:relative}.settings-sidebar-icon{flex-shrink:0}.settings-sidebar-label{display:inline-flex;align-items:center;white-space:nowrap}.settings-sidebar-btn:hover{background:var(--bg-inset);color:var(--fg-primary)}.settings-sidebar-btn.active{background:var(--accent);color:#fff;border-bottom-color:var(--border-color);box-shadow:inset 4px 0 0 var(--fg-primary)}.settings-content{flex:1;background:linear-gradient(135deg,var(--bg-panel),var(--bg-inset));border:var(--border-width) solid var(--border-color);padding:24px;overflow:hidden;display:flex;flex-direction:column;gap:18px;position:relative;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 70%,transparent)}.settings-content:after{content:"";position:absolute;top:12px;right:12px;bottom:12px;left:12px;border:1px solid color-mix(in srgb,var(--border-color) 45%,transparent);pointer-events:none}.settings-content-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);text-transform:uppercase}.settings-content-title{display:flex;flex-direction:column;gap:6px}.settings-content-kicker{font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));letter-spacing:.2em;color:var(--fg-muted)}.settings-content-name{font-family:var(--font-head);font-size:calc(14px * var(--ui-scale));font-weight:900;letter-spacing:.08em;color:var(--fg-primary)}.settings-content-meta{display:flex;flex-direction:column;align-items:flex-end;gap:6px;padding:10px 14px;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 60%,transparent)}.settings-content-meta-label{font-size:calc(9px * var(--ui-scale));letter-spacing:.2em;color:var(--fg-muted);font-weight:900}.settings-content-meta-value{font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;color:var(--fg-primary)}.settings-content-frame{flex:1;overflow-y:auto;overflow-x:hidden;padding:6px 4px 4px}.settings-pane{display:flex;flex-direction:column;gap:20px}.settings-section-title{display:none;font-family:var(--font-head);font-size:calc(13px * var(--ui-scale));text-transform:uppercase;margin-bottom:8px;padding-bottom:12px;border-bottom:var(--border-width) solid var(--border-color);color:var(--fg-primary);letter-spacing:.05em}.settings-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--app-gap);background:var(--bg-app);padding:12px;border:var(--border-width) solid var(--border-color)}.settings-theme-btn{background:var(--bg-panel);border:var(--border-width) solid var(--border-color);padding:20px;text-align:left;cursor:pointer;display:flex;flex-direction:column;gap:10px;transition:transform .1s,box-shadow .1s;position:relative}.settings-theme-btn:hover{background:var(--bg-inset);transform:translateY(-2px);box-shadow:4px 4px 0 var(--border-color)}.settings-theme-btn.active{border-color:var(--accent);box-shadow:inset 0 0 0 2px var(--accent)}.settings-theme-header{display:flex;align-items:center;gap:12px}.settings-theme-name{font-family:var(--font-head);font-weight:900;text-transform:uppercase;font-size:calc(12px * var(--ui-scale))}.settings-theme-desc{font-size:calc(11px * var(--ui-scale));color:var(--fg-muted);line-height:1.5;font-family:var(--font-ui)}.settings-theme-controls{border:var(--border-width) solid var(--border-color);background:linear-gradient(90deg,var(--bg-panel),var(--bg-inset));padding:16px 18px;display:flex;justify-content:space-between;align-items:center;gap:16px;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 55%,transparent)}.settings-theme-meta{display:flex;flex-wrap:wrap;align-items:center;gap:12px;font-size:calc(10px * var(--ui-scale));text-transform:uppercase;letter-spacing:.08em}.settings-theme-label{font-weight:800;color:var(--fg-muted)}.settings-theme-value{font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));font-weight:900;color:var(--fg-primary)}.settings-theme-count{padding:4px 8px;border:var(--border-width) solid var(--border-color);background:var(--bg-inset);font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));color:var(--fg-muted)}.settings-theme-actions{display:flex;gap:12px;flex-shrink:0}.settings-theme-action-btn{border:var(--border-width) solid var(--border-color);background:var(--bg-inset);color:var(--fg-primary);padding:10px 14px;font-size:calc(10px * var(--ui-scale));font-weight:800;text-transform:uppercase;letter-spacing:.08em;box-shadow:3px 3px 0 var(--border-color);transition:transform .1s,box-shadow .1s}.settings-theme-action-btn:hover{transform:translate(2px,-2px);box-shadow:1px 1px 0 var(--border-color)}.settings-theme-action-btn-primary{background:var(--accent);color:#fff;border-color:color-mix(in srgb,var(--border-color) 70%,var(--accent))}.settings-card{border:var(--border-width) solid var(--border-color);background:var(--bg-panel);padding:18px;position:relative;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border-color) 50%,transparent)}.settings-card:after{content:"";position:absolute;top:10px;right:10px;width:8px;height:8px;border:1px solid var(--border-color);background:var(--bg-inset)}.settings-card-stack{display:flex;flex-direction:column;gap:16px}.settings-card-highlight{background:linear-gradient(140deg,var(--bg-inset),var(--bg-panel))}.settings-card-muted{background:color-mix(in srgb,var(--bg-panel) 70%,var(--bg-inset))}.settings-card-list{padding:0}.settings-keymap-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;padding:16px}.settings-keymap-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;border:var(--border-width) solid var(--border-color);background:var(--bg-panel);padding:12px;text-transform:uppercase;font-size:calc(11px * var(--ui-scale));font-weight:700;letter-spacing:.04em}.settings-keymap-label{min-width:0;line-height:1.3;overflow-wrap:anywhere}.settings-keymap-key{justify-self:end;display:inline-flex;align-items:center;white-space:nowrap;overflow-wrap:normal;padding:4px 8px;border:var(--border-width) solid var(--border-color);background:var(--bg-inset)}.settings-session-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.settings-session-item{padding:12px;border:var(--border-width) solid var(--border-color);background:var(--bg-panel);display:flex;flex-direction:column;gap:6px;text-transform:uppercase}.settings-session-label{font-size:calc(9px * var(--ui-scale));letter-spacing:.2em;color:var(--fg-muted);font-weight:800}.settings-session-value{font-size:calc(11px * var(--ui-scale));font-weight:800;color:var(--fg-primary)}.settings-action-row{display:flex;gap:12px;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);padding:12px}@media(max-width:820px){.settings-keymap-grid{grid-template-columns:1fr}}.cmd-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:#000c;z-index:3000;display:flex;justify-content:center;padding-top:15vh}.cmd-palette{width:680px;max-width:95%;background:var(--bg-app);border:var(--border-width) solid var(--border-color);box-shadow:16px 16px #000000b3;display:flex;flex-direction:column;max-height:55vh;gap:var(--app-gap);padding:var(--app-gap)}.cmd-header{background:var(--bg-panel);border:var(--border-width) solid var(--border-color);display:flex;align-items:center;padding:0 20px;height:64px;gap:16px;flex-shrink:0}.cmd-search-icon{color:var(--accent)}.cmd-input{flex:1;background:none;border:none;font-size:calc(18px * var(--ui-scale));font-family:var(--font-mono);color:var(--fg-primary);outline:none;font-weight:800;letter-spacing:-.02em}.cmd-badge{background:var(--bg-inset);border:1px solid var(--border-color);padding:4px 8px;font-family:var(--font-mono);font-size:calc(10px * var(--ui-scale));font-weight:900;color:var(--fg-muted)}.cmd-list{flex:1;overflow-y:auto;background:var(--bg-panel);border:var(--border-width) solid var(--border-color);display:flex;flex-direction:column}.cmd-item{padding:14px 20px;display:flex;align-items:center;gap:16px;cursor:pointer;border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:calc(13px * var(--ui-scale));font-weight:700;text-transform:uppercase;transition:all .05s}.cmd-item:hover{background:var(--bg-inset)}.cmd-item.active{background:var(--accent);color:#fff;transform:translate(4px)}.cmd-item-text{flex:1}.cmd-item-type{font-size:calc(10px * var(--ui-scale));background:var(--bg-inset);color:var(--fg-muted);padding:2px 8px;border:1px solid var(--border-color);font-weight:900}.cmd-item.active .cmd-item-type{background:#fff3;color:#fff;border-color:#fff}.cmd-empty{padding:40px;text-align:center;font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));color:var(--fg-muted);text-transform:uppercase}.input-modal{width:480px}.modal-content{padding:32px;background:var(--bg-panel)}.modal-input{width:100%;padding:16px;background:var(--bg-inset);border:var(--border-width) solid var(--border-color);color:var(--fg-primary);font-family:var(--font-mono);font-weight:700;font-size:calc(15px * var(--ui-scale));outline:none}.modal-input:focus{border-color:var(--accent);background:var(--bg-panel)}.modal-footer{padding:16px 20px;background:var(--bg-inset);border-top:var(--border-width) solid var(--border-color);display:flex;justify-content:flex-end;gap:12px;flex-shrink:0}.modal-btn{padding:10px 24px;border:var(--border-width) solid var(--border-color);font-family:var(--font-head);font-size:calc(12px * var(--ui-scale));text-transform:uppercase;cursor:pointer;font-weight:900;background:var(--bg-panel);color:var(--fg-primary);transition:all .1s}.modal-btn:hover{background:var(--fg-primary);color:var(--bg-panel)}.modal-btn-primary{background:var(--accent);color:#fff;border-color:var(--border-color)}.modal-btn-primary:hover{background:var(--fg-primary);color:#fff}.modal-btn:active{transform:translate(2px,2px)}.modal-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.modal-btn:disabled:hover{background:var(--bg-panel);color:var(--fg-primary)}.pwa-status-grid{display:grid;gap:10px;margin-bottom:16px}.pwa-status-row{display:flex;justify-content:space-between;align-items:center;padding:8px 10px;border:var(--border-width) solid var(--border-color);background:var(--bg-panel);font-size:10px;font-weight:700;letter-spacing:.12em}.pwa-status-label{color:var(--fg-muted)}.pwa-status-value{color:var(--fg-primary)}.pwa-status-value.is-ready{color:var(--accent)}.pwa-toggle{display:inline-flex;align-items:center;gap:10px;margin-top:12px;font-size:10px;font-weight:800;letter-spacing:.2em;color:var(--fg-primary);text-transform:uppercase;position:relative}.pwa-toggle input{position:absolute;opacity:0;pointer-events:none}.pwa-toggle-indicator{width:36px;height:18px;border:var(--border-width) solid var(--border-color);background:var(--bg-inset);position:relative;display:inline-flex;align-items:center;padding:2px}.pwa-toggle-indicator:after{content:"";width:12px;height:12px;background:var(--fg-muted);border:var(--border-width) solid var(--border-color);transition:transform .12s ease}.pwa-toggle input:checked+.pwa-toggle-indicator:after{transform:translate(16px);background:var(--accent)}@media(max-width:900px){.modal-overlay{padding:16px}.settings-modal{width:min(95vw,840px);height:min(90vh,700px);box-shadow:12px 12px #00000080}.settings-content{padding:18px}.settings-sidebar{width:76px}.settings-sidebar-btn{justify-content:center;padding:14px 10px;gap:0}.settings-sidebar-label{display:none}}@media(max-width:640px){.modal-overlay{padding:0}.modal-base{width:100%;height:100%;border-width:0;box-shadow:none}.modal-header{height:auto;padding:12px 16px;gap:12px}.modal-title{font-size:calc(12px * var(--ui-scale));letter-spacing:.08em}.modal-close{width:32px;height:32px}.settings-modal{width:100%;height:100%;box-shadow:none}.modal-content{padding:20px 16px;flex:1;overflow-y:auto}.modal-footer{padding:12px 16px}.settings-layout{flex-direction:column}.settings-sidebar{width:100%;flex-direction:row;overflow-x:hidden}.settings-sidebar-btn{flex:1 1 0;justify-content:center;padding:10px 6px;font-size:calc(10px * var(--ui-scale));border-bottom:0;border-right:var(--border-width) solid var(--border-color);gap:0;min-width:0}.settings-sidebar-label{display:none}.settings-sidebar-icon{width:14px;height:14px}.settings-sidebar-btn:last-child{border-right:0}.settings-sidebar-btn:hover{transform:none}.settings-content{padding:14px}.settings-grid-2,.settings-session-grid{grid-template-columns:1fr}.cmd-backdrop{padding-top:0}.cmd-palette{width:100%;height:100%;max-height:none;border-width:0;box-shadow:none}.cmd-header{height:auto;padding:12px 16px}}
|
package/dist/sw.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
const CACHE_PREFIX = 'lattice-architect-';
|
|
2
|
+
const META_CACHE = 'lattice-architect-meta';
|
|
3
|
+
const META_KEY = '/pwa-meta';
|
|
4
|
+
const CURRENT_VERSION = new URL(self.location.href).searchParams.get('version') || 'dev';
|
|
5
|
+
const CURRENT_CACHE = `${CACHE_PREFIX}${CURRENT_VERSION}`;
|
|
6
|
+
const CORE_ASSETS = [
|
|
7
|
+
'/',
|
|
8
|
+
'/index.html',
|
|
9
|
+
'/manifest.webmanifest',
|
|
10
|
+
'/favicon.svg',
|
|
11
|
+
'/icons/icon-192.svg',
|
|
12
|
+
'/icons/icon-512.svg',
|
|
13
|
+
];
|
|
14
|
+
const EXTERNAL_ASSETS = [
|
|
15
|
+
'https://cdn.tailwindcss.com',
|
|
16
|
+
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css',
|
|
17
|
+
'https://esm.sh/react@19.0.0',
|
|
18
|
+
'https://esm.sh/react-dom@19.0.0',
|
|
19
|
+
'https://esm.sh/react-dom@19.0.0/client',
|
|
20
|
+
'https://esm.sh/react@19.0.0/jsx-runtime',
|
|
21
|
+
'https://esm.sh/lucide-react@0.475.0',
|
|
22
|
+
'https://esm.sh/react-markdown@9.0.3?bundle',
|
|
23
|
+
'https://esm.sh/remark-gfm@4.0.1?bundle',
|
|
24
|
+
'https://esm.sh/remark-supersub@1.0.0?bundle',
|
|
25
|
+
'https://esm.sh/react-syntax-highlighter@15.6.1',
|
|
26
|
+
'https://esm.sh/react-syntax-highlighter@15.6.1/dist/esm/styles/prism',
|
|
27
|
+
'https://esm.sh/jszip@3.10.1',
|
|
28
|
+
'https://esm.sh/path@^0.12.7',
|
|
29
|
+
'https://esm.sh/url@^0.11.4',
|
|
30
|
+
'https://esm.sh/vite@^7.3.1',
|
|
31
|
+
'https://esm.sh/@vitejs/plugin-react@^5.1.2'
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
let metaState = {
|
|
35
|
+
lastKnownGoodVersion: null,
|
|
36
|
+
failedVersions: []
|
|
37
|
+
};
|
|
38
|
+
let failureTimer = null;
|
|
39
|
+
|
|
40
|
+
const readMeta = async () => {
|
|
41
|
+
const cache = await caches.open(META_CACHE);
|
|
42
|
+
const response = await cache.match(META_KEY);
|
|
43
|
+
if (!response) {
|
|
44
|
+
return metaState;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const data = await response.json();
|
|
48
|
+
metaState = {
|
|
49
|
+
lastKnownGoodVersion: typeof data.lastKnownGoodVersion === 'string' ? data.lastKnownGoodVersion : null,
|
|
50
|
+
failedVersions: Array.isArray(data.failedVersions)
|
|
51
|
+
? data.failedVersions.filter((version) => typeof version === 'string')
|
|
52
|
+
: []
|
|
53
|
+
};
|
|
54
|
+
} catch {
|
|
55
|
+
metaState = { lastKnownGoodVersion: null, failedVersions: [] };
|
|
56
|
+
}
|
|
57
|
+
return metaState;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const writeMeta = async () => {
|
|
61
|
+
const cache = await caches.open(META_CACHE);
|
|
62
|
+
const response = new Response(JSON.stringify(metaState), {
|
|
63
|
+
headers: { 'Content-Type': 'application/json' }
|
|
64
|
+
});
|
|
65
|
+
await cache.put(META_KEY, response);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const isFailedVersion = (version) => metaState.failedVersions.includes(version);
|
|
69
|
+
|
|
70
|
+
const getCacheNameForVersion = (version) => `${CACHE_PREFIX}${version}`;
|
|
71
|
+
|
|
72
|
+
const isAppCache = (name) => name.startsWith(CACHE_PREFIX);
|
|
73
|
+
|
|
74
|
+
const findFallbackResponse = async (request, cacheNames) => {
|
|
75
|
+
for (const cacheName of cacheNames) {
|
|
76
|
+
const cache = await caches.open(cacheName);
|
|
77
|
+
const cachedResponse = await cache.match(request);
|
|
78
|
+
if (cachedResponse) {
|
|
79
|
+
return cachedResponse;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const getFallbackCacheNames = async (activeCacheName) => {
|
|
86
|
+
const cacheNames = await caches.keys();
|
|
87
|
+
const appCacheNames = cacheNames.filter(isAppCache);
|
|
88
|
+
const prioritized = [];
|
|
89
|
+
|
|
90
|
+
if (activeCacheName && appCacheNames.includes(activeCacheName)) {
|
|
91
|
+
prioritized.push(activeCacheName);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (CURRENT_CACHE !== activeCacheName && appCacheNames.includes(CURRENT_CACHE)) {
|
|
95
|
+
prioritized.push(CURRENT_CACHE);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (metaState.lastKnownGoodVersion) {
|
|
99
|
+
const lastKnownGoodCache = getCacheNameForVersion(metaState.lastKnownGoodVersion);
|
|
100
|
+
if (!prioritized.includes(lastKnownGoodCache) && appCacheNames.includes(lastKnownGoodCache)) {
|
|
101
|
+
prioritized.push(lastKnownGoodCache);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
appCacheNames.forEach((cacheName) => {
|
|
106
|
+
if (!prioritized.includes(cacheName)) {
|
|
107
|
+
prioritized.push(cacheName);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return prioritized;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const getCachedAppShell = async (activeCacheName) => {
|
|
115
|
+
const fallbackCacheNames = await getFallbackCacheNames(activeCacheName);
|
|
116
|
+
return (
|
|
117
|
+
(await findFallbackResponse('/index.html', fallbackCacheNames)) ||
|
|
118
|
+
(await findFallbackResponse('/', fallbackCacheNames))
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const getActiveCacheName = () => {
|
|
123
|
+
if (isFailedVersion(CURRENT_VERSION) && metaState.lastKnownGoodVersion) {
|
|
124
|
+
return getCacheNameForVersion(metaState.lastKnownGoodVersion);
|
|
125
|
+
}
|
|
126
|
+
return CURRENT_CACHE;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const isSuccessfulResponse = (response) => Boolean(response) && response.ok;
|
|
130
|
+
|
|
131
|
+
const fetchAndCache = async ({ request, cache, cacheKey = request, allowOpaque = false }) => {
|
|
132
|
+
const response = await fetch(request);
|
|
133
|
+
if (isSuccessfulResponse(response) || (allowOpaque && response.type === 'opaque')) {
|
|
134
|
+
cache.put(cacheKey, response.clone());
|
|
135
|
+
return response;
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const notifyClients = async (payload) => {
|
|
141
|
+
const clients = await self.clients.matchAll({ type: 'window' });
|
|
142
|
+
clients.forEach((client) => client.postMessage(payload));
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const markVersionFailed = async (version) => {
|
|
146
|
+
if (!version || isFailedVersion(version)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
metaState.failedVersions = [...metaState.failedVersions, version];
|
|
150
|
+
await writeMeta();
|
|
151
|
+
await notifyClients({ type: 'PWA_UPDATE_FAILED', version });
|
|
152
|
+
const clients = await self.clients.matchAll({ type: 'window' });
|
|
153
|
+
clients.forEach((client) => client.navigate(client.url));
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
self.addEventListener('install', (event) => {
|
|
157
|
+
event.waitUntil(
|
|
158
|
+
(async () => {
|
|
159
|
+
const cache = await caches.open(CURRENT_CACHE);
|
|
160
|
+
const assetsToCache = CORE_ASSETS.concat(EXTERNAL_ASSETS);
|
|
161
|
+
await Promise.allSettled(assetsToCache.map((asset) => cache.add(asset)));
|
|
162
|
+
})()
|
|
163
|
+
);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const CHECK_FOR_UPDATES_TAG = 'check-for-updates';
|
|
167
|
+
|
|
168
|
+
const runUpdateCheck = async () => {
|
|
169
|
+
const clients = await self.clients.matchAll({ type: 'window' });
|
|
170
|
+
clients.forEach((client) => client.postMessage({ type: 'PWA_BACKGROUND_UPDATE_CHECK' }));
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
self.addEventListener('activate', (event) => {
|
|
174
|
+
event.waitUntil(
|
|
175
|
+
(async () => {
|
|
176
|
+
await readMeta();
|
|
177
|
+
const keys = await caches.keys();
|
|
178
|
+
const keep = new Set([CURRENT_CACHE, META_CACHE]);
|
|
179
|
+
if (metaState.lastKnownGoodVersion) {
|
|
180
|
+
keep.add(getCacheNameForVersion(metaState.lastKnownGoodVersion));
|
|
181
|
+
}
|
|
182
|
+
await Promise.all(keys.filter((key) => !keep.has(key)).map((key) => caches.delete(key)));
|
|
183
|
+
await self.clients.claim();
|
|
184
|
+
if ('periodicSync' in self.registration) {
|
|
185
|
+
try {
|
|
186
|
+
await self.registration.periodicSync.register(CHECK_FOR_UPDATES_TAG, {
|
|
187
|
+
minInterval: 1000 * 60 * 30,
|
|
188
|
+
});
|
|
189
|
+
} catch {
|
|
190
|
+
// Ignore unsupported permission states.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (failureTimer) {
|
|
194
|
+
clearTimeout(failureTimer);
|
|
195
|
+
}
|
|
196
|
+
if (
|
|
197
|
+
metaState.lastKnownGoodVersion &&
|
|
198
|
+
metaState.lastKnownGoodVersion !== CURRENT_VERSION &&
|
|
199
|
+
!isFailedVersion(CURRENT_VERSION)
|
|
200
|
+
) {
|
|
201
|
+
failureTimer = setTimeout(() => {
|
|
202
|
+
markVersionFailed(CURRENT_VERSION);
|
|
203
|
+
}, 15000);
|
|
204
|
+
}
|
|
205
|
+
})()
|
|
206
|
+
);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
self.addEventListener('periodicsync', (event) => {
|
|
210
|
+
if (event.tag !== CHECK_FOR_UPDATES_TAG) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
event.waitUntil(runUpdateCheck());
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
self.addEventListener('sync', (event) => {
|
|
217
|
+
if (event.tag !== CHECK_FOR_UPDATES_TAG) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
event.waitUntil(runUpdateCheck());
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
self.addEventListener('message', (event) => {
|
|
224
|
+
if (event.data && event.data.type === 'SKIP_WAITING') {
|
|
225
|
+
self.skipWaiting();
|
|
226
|
+
}
|
|
227
|
+
if (event.data && event.data.type === 'CLIENT_READY') {
|
|
228
|
+
const version = typeof event.data.version === 'string' ? event.data.version : null;
|
|
229
|
+
if (version) {
|
|
230
|
+
metaState.lastKnownGoodVersion = version;
|
|
231
|
+
metaState.failedVersions = metaState.failedVersions.filter((item) => item !== version);
|
|
232
|
+
if (failureTimer) {
|
|
233
|
+
clearTimeout(failureTimer);
|
|
234
|
+
failureTimer = null;
|
|
235
|
+
}
|
|
236
|
+
event.waitUntil(writeMeta());
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (event.data && event.data.type === 'MARK_FAILED_VERSION') {
|
|
240
|
+
const version = typeof event.data.version === 'string' ? event.data.version : null;
|
|
241
|
+
if (version) {
|
|
242
|
+
event.waitUntil(markVersionFailed(version));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
self.addEventListener('fetch', (event) => {
|
|
248
|
+
if (event.request.method !== 'GET') {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (event.request.destination === 'style') {
|
|
253
|
+
event.respondWith(
|
|
254
|
+
(async () => {
|
|
255
|
+
const cache = await caches.open(getActiveCacheName());
|
|
256
|
+
try {
|
|
257
|
+
const response = await fetchAndCache({ request: event.request, cache, allowOpaque: true });
|
|
258
|
+
if (!response) {
|
|
259
|
+
throw new Error('Network responded without a cacheable stylesheet response');
|
|
260
|
+
}
|
|
261
|
+
return response;
|
|
262
|
+
} catch (error) {
|
|
263
|
+
const cachedResponse = await cache.match(event.request);
|
|
264
|
+
if (cachedResponse) {
|
|
265
|
+
return cachedResponse;
|
|
266
|
+
}
|
|
267
|
+
const fallbackCacheNames = await getFallbackCacheNames(getActiveCacheName());
|
|
268
|
+
const crossCacheResponse = await findFallbackResponse(event.request, fallbackCacheNames);
|
|
269
|
+
if (crossCacheResponse) {
|
|
270
|
+
return crossCacheResponse;
|
|
271
|
+
}
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
})()
|
|
275
|
+
);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (event.request.mode === 'navigate') {
|
|
280
|
+
event.respondWith(
|
|
281
|
+
(async () => {
|
|
282
|
+
const activeCacheName = getActiveCacheName();
|
|
283
|
+
try {
|
|
284
|
+
const cache = await caches.open(activeCacheName);
|
|
285
|
+
const response = await fetchAndCache({
|
|
286
|
+
request: event.request,
|
|
287
|
+
cache,
|
|
288
|
+
cacheKey: '/index.html',
|
|
289
|
+
});
|
|
290
|
+
if (!response) {
|
|
291
|
+
throw new Error('Navigation response was not successful');
|
|
292
|
+
}
|
|
293
|
+
return response;
|
|
294
|
+
} catch (error) {
|
|
295
|
+
const cache = await caches.open(activeCacheName);
|
|
296
|
+
const cachedResponse = await cache.match('/index.html');
|
|
297
|
+
if (cachedResponse) {
|
|
298
|
+
return cachedResponse;
|
|
299
|
+
}
|
|
300
|
+
const crossCacheAppShell = await getCachedAppShell(activeCacheName);
|
|
301
|
+
if (crossCacheAppShell) {
|
|
302
|
+
return crossCacheAppShell;
|
|
303
|
+
}
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
})()
|
|
307
|
+
);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
event.respondWith(
|
|
312
|
+
(async () => {
|
|
313
|
+
const cache = await caches.open(getActiveCacheName());
|
|
314
|
+
const cachedResponse = await cache.match(event.request);
|
|
315
|
+
|
|
316
|
+
const fetchPromise = fetchAndCache({ request: event.request, cache, allowOpaque: true }).catch(() => undefined);
|
|
317
|
+
|
|
318
|
+
if (cachedResponse) {
|
|
319
|
+
event.waitUntil(fetchPromise);
|
|
320
|
+
return cachedResponse;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const response = await fetchPromise;
|
|
324
|
+
if (response) {
|
|
325
|
+
return response;
|
|
326
|
+
}
|
|
327
|
+
const cachedAppShell = await getCachedAppShell(getActiveCacheName());
|
|
328
|
+
if (cachedAppShell) {
|
|
329
|
+
return cachedAppShell;
|
|
330
|
+
}
|
|
331
|
+
return caches.match('/index.html');
|
|
332
|
+
})()
|
|
333
|
+
);
|
|
334
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mdwrk/mdwrkspace",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "1.3.51",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "tsc && vite build",
|
|
9
|
+
"build:lib": "tsc && vite build --config vite.lib.config.ts",
|
|
10
|
+
"preview": "vite preview",
|
|
11
|
+
"test": "vitest",
|
|
12
|
+
"test:ui": "vitest --ui",
|
|
13
|
+
"test:run": "vitest run",
|
|
14
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
15
|
+
"lint": "npm run typecheck",
|
|
16
|
+
"prepack": "npm run build:lib"
|
|
17
|
+
},
|
|
18
|
+
"module": "./dist/mdwrkspace.js",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"import": "./dist/mdwrkspace.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@mdwrk/extension-gemini-agent": "^1.0.1",
|
|
32
|
+
"@mdwrk/extension-host": "^1.0.1",
|
|
33
|
+
"@mdwrk/extension-manager": "^1.0.1",
|
|
34
|
+
"@mdwrk/extension-manifest": "^1.0.0",
|
|
35
|
+
"@mdwrk/extension-runtime": "^1.0.1",
|
|
36
|
+
"@mdwrk/i18n": "^1.0.0",
|
|
37
|
+
"@mdwrk/icons": "^1.0.0",
|
|
38
|
+
"@mdwrk/markdown-editor-react": "^1.0.2",
|
|
39
|
+
"@mdwrk/markdown-renderer-core": "^1.0.0",
|
|
40
|
+
"@mdwrk/markdown-renderer-react": "^1.0.1",
|
|
41
|
+
"@mdwrk/theme-contract": "^1.0.0",
|
|
42
|
+
"@mdwrk/ui-tokens": "^1.0.1",
|
|
43
|
+
"jszip": "^3.10.1",
|
|
44
|
+
"lucide-react": "^0.475.0",
|
|
45
|
+
"react": "^19.0.0",
|
|
46
|
+
"react-dom": "^19.0.0",
|
|
47
|
+
"react-syntax-highlighter": "^15.6.1",
|
|
48
|
+
"@mdwrk/extension-theme-studio": "^1.0.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@testing-library/dom": "^10.4.0",
|
|
52
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
53
|
+
"@testing-library/react": "^16.1.0",
|
|
54
|
+
"@types/node": "^22.13.5",
|
|
55
|
+
"@types/react": "^19.0.8",
|
|
56
|
+
"@types/react-dom": "^19.0.3",
|
|
57
|
+
"@types/react-syntax-highlighter": "^15.5.13",
|
|
58
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
59
|
+
"autoprefixer": "^10.4.20",
|
|
60
|
+
"jsdom": "^25.0.1",
|
|
61
|
+
"postcss": "^8.5.1",
|
|
62
|
+
"tailwindcss": "^3.4.17",
|
|
63
|
+
"typescript": "^5.7.3",
|
|
64
|
+
"vite": "^6.4.1",
|
|
65
|
+
"vitest": "^2.1.8"
|
|
66
|
+
},
|
|
67
|
+
"license": "Apache-2.0",
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=20 <23",
|
|
70
|
+
"npm": ">=10"
|
|
71
|
+
},
|
|
72
|
+
"author": "Jacob Stewart <jacob@swarmauri.com>",
|
|
73
|
+
"homepage": "https://mdwrk.com"
|
|
74
|
+
}
|