feat: add shared Toolbox header and themes

This commit is contained in:
2026-07-23 00:29:21 +02:00
parent 8f8a59e76c
commit d5574a0a44
16 changed files with 451 additions and 176 deletions

View File

@@ -5,21 +5,19 @@
}
:root {
color-scheme: light;
font-family:
system-ui,
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
sans-serif;
background: #f3f4f6;
color: #111827;
background: #f6f7fb;
}
body {
margin: 0;
min-width: 1180px;
background: #f3f4f6;
background: #f6f7fb;
}
button,
@@ -36,14 +34,112 @@ kbd {
}
.xslt-app-shell {
color-scheme: light;
--toolbox-background: #f3f4f6;
--toolbox-surface: #ffffff;
--toolbox-text: #111827;
--toolbox-muted: #6b7280;
--toolbox-border: #d1d5db;
--toolbox-accent: #2563eb;
--toolbox-accent-contrast: #ffffff;
--app-surface: var(--toolbox-surface);
--app-surface-soft: var(--toolbox-surface-soft);
--app-text: var(--toolbox-text);
--app-text-secondary: #374151;
--app-muted: var(--toolbox-muted);
--app-border: var(--toolbox-border);
--app-border-soft: #e5e7eb;
--app-control: #e5e7eb;
--app-control-hover: #d1d5db;
--app-primary: #2563eb;
--app-primary-contrast: #ffffff;
--app-danger: #dc2626;
--app-danger-surface: #fff1f2;
--app-danger-text: #991b1b;
--app-danger-ink: #881337;
--app-danger-border: #fecaca;
--app-danger-border-strong: #fca5a5;
--app-success-surface: #f0fdf4;
--app-success-text: #14532d;
--app-success-border: #86efac;
--app-warning-surface: #fffbeb;
--app-warning-text: #92400e;
--app-info-surface: #eff6ff;
--app-info-text: #1e40af;
--app-focus: #bfdbfe;
--app-accent-border: #c7d2fe;
--app-backdrop: rgb(15 23 42 / 60%);
--app-card-shadow: 0 1px 3px rgb(15 23 42 / 12%);
--app-float-shadow: 0 12px 30px rgb(15 23 42 / 22%);
--app-dialog-shadow: 0 24px 60px rgb(15 23 42 / 40%);
--app-small-shadow: 0 1px 2px rgb(15 23 42 / 25%);
--app-focus-ring: rgb(37 99 235 / 22%);
--app-editor-background: #ffffff;
--app-editor-text: #111827;
--app-editor-gutter: #f9fafb;
--app-editor-active-line: rgb(37 99 235 / 8%);
}
[data-toolbox-theme='dark'].xslt-app-shell {
--app-text-secondary: #c8d1e4;
--app-border-soft: #303a50;
--app-control: #293247;
--app-control-hover: #37435c;
--app-primary: #a9b7ff;
--app-primary-contrast: #11182a;
--app-danger: #fb7185;
--app-danger-surface: #3b1d27;
--app-danger-text: #fecdd3;
--app-danger-ink: #fecdd3;
--app-danger-border: #7f3344;
--app-danger-border-strong: #a84457;
--app-success-surface: #123424;
--app-success-text: #bbf7d0;
--app-success-border: #23734a;
--app-warning-surface: #3a290e;
--app-warning-text: #fde68a;
--app-info-surface: #172554;
--app-info-text: #bfdbfe;
--app-focus: #7dd3fc;
--app-accent-border: #4c5c91;
--app-backdrop: rgb(0 0 0 / 72%);
--app-card-shadow: 0 1px 4px rgb(0 0 0 / 32%);
--app-float-shadow: 0 14px 34px rgb(0 0 0 / 46%);
--app-dialog-shadow: 0 24px 64px rgb(0 0 0 / 58%);
--app-small-shadow: 0 1px 2px rgb(0 0 0 / 45%);
--app-focus-ring: rgb(125 211 252 / 24%);
--app-editor-background: #20252e;
--app-editor-text: #abb2bf;
--app-editor-gutter: #171b22;
--app-editor-active-line: rgb(255 255 255 / 6%);
}
@media (prefers-color-scheme: dark) {
[data-toolbox-theme='system'].xslt-app-shell {
--app-text-secondary: #c8d1e4;
--app-border-soft: #303a50;
--app-control: #293247;
--app-control-hover: #37435c;
--app-primary: #a9b7ff;
--app-primary-contrast: #11182a;
--app-danger: #fb7185;
--app-danger-surface: #3b1d27;
--app-danger-text: #fecdd3;
--app-danger-ink: #fecdd3;
--app-danger-border: #7f3344;
--app-danger-border-strong: #a84457;
--app-success-surface: #123424;
--app-success-text: #bbf7d0;
--app-success-border: #23734a;
--app-warning-surface: #3a290e;
--app-warning-text: #fde68a;
--app-info-surface: #172554;
--app-info-text: #bfdbfe;
--app-focus: #7dd3fc;
--app-accent-border: #4c5c91;
--app-backdrop: rgb(0 0 0 / 72%);
--app-card-shadow: 0 1px 4px rgb(0 0 0 / 32%);
--app-float-shadow: 0 14px 34px rgb(0 0 0 / 46%);
--app-dialog-shadow: 0 24px 64px rgb(0 0 0 / 58%);
--app-small-shadow: 0 1px 2px rgb(0 0 0 / 45%);
--app-focus-ring: rgb(125 211 252 / 24%);
--app-editor-background: #20252e;
--app-editor-text: #abb2bf;
--app-editor-gutter: #171b22;
--app-editor-active-line: rgb(255 255 255 / 6%);
}
}
.xslt-app-shell > .toolbox-shell__main {
@@ -52,29 +148,11 @@ kbd {
gap: 0.75rem;
}
.app-help-button {
border: 1px solid var(--toolbox-border);
border-radius: 999px;
background: transparent;
color: var(--toolbox-text);
padding: 0.35rem 0.65rem;
font-size: 0.85rem;
font-weight: 600;
cursor: pointer;
line-height: 1;
}
.app-help-button:hover,
.app-help-button:focus-visible {
background: var(--toolbox-background);
outline: none;
}
.card {
width: 100%;
background: #ffffff;
background: var(--app-surface);
border-radius: 0.75rem;
box-shadow: 0 1px 3px rgba(15, 23, 42, 0.12);
box-shadow: var(--app-card-shadow);
}
.button,
@@ -102,32 +180,32 @@ kbd {
}
.button.primary {
background: #2563eb;
color: #ffffff;
background: var(--app-primary);
color: var(--app-primary-contrast);
}
.button.secondary {
background: #e5e7eb;
color: #111827;
background: var(--app-control);
color: var(--app-text);
}
.button.danger {
background: #dc2626;
color: #ffffff;
background: var(--app-danger);
color: var(--app-primary-contrast);
}
.button.danger-outline {
border: 1px solid #fecaca;
background: #fff1f2;
color: #991b1b;
border: 1px solid var(--app-danger-border);
background: var(--app-danger-surface);
color: var(--app-danger-text);
}
.icon-button {
width: 1.9rem;
height: 1.9rem;
border-radius: 999px;
background: #e5e7eb;
color: #111827;
background: var(--app-control);
color: var(--app-text);
font-size: 1.2rem;
line-height: 1;
display: inline-flex;
@@ -155,7 +233,7 @@ kbd {
.toolbar-options {
align-items: center;
color: #374151;
color: var(--app-text-secondary);
font-size: 0.85rem;
}
@@ -168,15 +246,15 @@ kbd {
}
.stylesheet-trust-status.is-untrusted {
border-color: #fca5a5;
background: #fff1f2;
color: #881337;
border-color: var(--app-danger-border-strong);
background: var(--app-danger-surface);
color: var(--app-danger-ink);
}
.stylesheet-trust-status.is-trusted {
border-color: #86efac;
background: #f0fdf4;
color: #14532d;
border-color: var(--app-success-border);
background: var(--app-success-surface);
color: var(--app-success-text);
}
.toggle-option {
@@ -199,7 +277,7 @@ kbd {
width: 2.35rem;
height: 1.25rem;
border-radius: 999px;
background: #d1d5db;
background: var(--app-control-hover);
transition:
background 0.15s ease,
box-shadow 0.15s ease;
@@ -213,13 +291,13 @@ kbd {
width: 0.91rem;
height: 0.91rem;
border-radius: 999px;
background: #ffffff;
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.25);
background: var(--app-surface);
box-shadow: var(--app-small-shadow);
transition: transform 0.15s ease;
}
.toggle-option input:checked + .toggle-slider {
background: #2563eb;
background: var(--app-primary);
}
.toggle-option input:checked + .toggle-slider::before {
@@ -227,12 +305,12 @@ kbd {
}
.toggle-option input:focus-visible + .toggle-slider {
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.22);
box-shadow: 0 0 0 3px var(--app-focus-ring);
}
.toolbar-meta {
justify-content: space-between;
color: #6b7280;
color: var(--app-muted);
font-size: 0.85rem;
}
@@ -241,24 +319,25 @@ kbd {
align-items: center;
gap: 0.5rem;
font-weight: 600;
color: #374151;
color: var(--app-text-secondary);
}
.toolbar-meta select {
min-width: 18rem;
padding: 0.35rem 0.5rem;
border: 1px solid #d1d5db;
border: 1px solid var(--app-border);
border-radius: 0.5rem;
background: #ffffff;
background: var(--app-surface);
color: var(--app-text);
}
.status-banner {
border-left: 4px solid #2563eb;
border-left: 4px solid var(--app-primary);
border-radius: 0.65rem;
background: #eff6ff;
color: #1e3a8a;
background: var(--app-info-surface);
color: var(--app-info-text);
padding: 0.65rem 0.8rem;
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);
box-shadow: var(--app-card-shadow);
}
.runtime-diagnostics {
@@ -298,15 +377,15 @@ kbd {
}
.editor-panel small {
color: #6b7280;
color: var(--app-muted);
font-size: 0.78rem;
}
.diagnostics-badge {
flex: 0 0 auto;
border-radius: 999px;
background: #f3f4f6;
color: #4b5563;
background: var(--app-surface-soft);
color: var(--app-text-secondary);
padding: 0.3rem 0.55rem;
font-size: 0.75rem;
font-weight: 700;
@@ -318,9 +397,9 @@ kbd {
flex-wrap: wrap;
align-items: center;
padding: 0.25rem;
border: 1px solid #e5e7eb;
border: 1px solid var(--app-border-soft);
border-radius: 0.55rem;
background: #f9fafb;
background: var(--app-surface-soft);
}
.editor-tool-button {
@@ -328,7 +407,7 @@ kbd {
height: 1.9rem;
border-radius: 0.4rem;
background: transparent;
color: #374151;
color: var(--app-text-secondary);
display: inline-flex;
align-items: center;
justify-content: center;
@@ -342,7 +421,7 @@ kbd {
.editor-tool-button:hover:not(:disabled),
.editor-tool-button:focus-visible {
background: #e5e7eb;
background: var(--app-control);
outline: none;
}
@@ -351,14 +430,14 @@ kbd {
align-self: stretch;
min-height: 1.45rem;
margin: 0 0.2rem;
background: #d1d5db;
background: var(--app-border);
}
.mini-button,
.snippet-button {
border-radius: 0.4rem;
background: #f3f4f6;
color: #374151;
background: var(--app-surface-soft);
color: var(--app-text-secondary);
padding: 0.28rem 0.48rem;
font-size: 0.78rem;
font-weight: 600;
@@ -366,14 +445,14 @@ kbd {
.mini-button:hover,
.snippet-button:hover {
background: #e5e7eb;
background: var(--app-control-hover);
}
.editor-host {
overflow: hidden;
border: 1px solid #d1d5db;
border: 1px solid var(--app-border);
border-radius: 0.65rem;
background: #ffffff;
background: var(--app-editor-background);
}
.editor-host .cm-editor {
@@ -382,7 +461,7 @@ kbd {
}
.editor-host .cm-focused {
outline: 2px solid #bfdbfe;
outline: 2px solid var(--app-focus);
outline-offset: -2px;
}
@@ -412,15 +491,15 @@ kbd {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.35rem;
padding: 0.55rem;
border: 1px solid #c7d2fe;
border: 1px solid var(--app-accent-border);
border-radius: 0.65rem;
background: #ffffff;
box-shadow: 0 12px 30px rgba(15, 23, 42, 0.22);
background: var(--app-surface);
box-shadow: var(--app-float-shadow);
}
.diagnostics-empty {
margin: 0;
color: #6b7280;
color: var(--app-muted);
font-size: 0.82rem;
}
@@ -448,18 +527,18 @@ kbd {
}
.diagnostic-error {
background: #fef2f2;
color: #991b1b;
background: var(--app-danger-surface);
color: var(--app-danger-text);
}
.diagnostic-warning {
background: #fffbeb;
color: #92400e;
background: var(--app-warning-surface);
color: var(--app-warning-text);
}
.diagnostic-info {
background: #eff6ff;
color: #1e40af;
background: var(--app-info-surface);
color: var(--app-info-text);
}
.trace-panel {
@@ -481,18 +560,18 @@ kbd {
.trace-header p {
margin: 0.2rem 0 0;
color: #6b7280;
color: var(--app-muted);
font-size: 0.86rem;
}
.trace-header small {
color: #6b7280;
color: var(--app-muted);
white-space: nowrap;
}
.trace-table-wrap {
overflow: auto;
border: 1px solid #e5e7eb;
border: 1px solid var(--app-border-soft);
border-radius: 0.65rem;
}
@@ -505,14 +584,14 @@ kbd {
.trace-table th,
.trace-table td {
padding: 0.5rem;
border-bottom: 1px solid #e5e7eb;
border-bottom: 1px solid var(--app-border-soft);
text-align: left;
vertical-align: top;
}
.trace-table th {
background: #f9fafb;
color: #374151;
background: var(--app-surface-soft);
color: var(--app-text-secondary);
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.04em;
@@ -523,7 +602,7 @@ kbd {
position: fixed;
inset: 0;
z-index: 70;
background: rgba(15, 23, 42, 0.6);
background: var(--app-backdrop);
display: flex;
align-items: center;
justify-content: center;
@@ -532,9 +611,9 @@ kbd {
.action-dialog-panel {
width: min(440px, 100%);
background: #ffffff;
background: var(--app-surface);
border-radius: 0.75rem;
box-shadow: 0 20px 40px rgba(15, 23, 42, 0.35);
box-shadow: var(--app-dialog-shadow);
padding: 1rem;
display: flex;
flex-direction: column;
@@ -556,7 +635,7 @@ kbd {
}
.action-dialog-body {
color: #4b5563;
color: var(--app-text-secondary);
font-size: 0.9rem;
line-height: 1.45;
}
@@ -580,9 +659,9 @@ kbd {
width: min(900px, 100%);
max-height: min(88vh, 760px);
overflow: auto;
background: #ffffff;
background: var(--app-surface);
border-radius: 0.9rem;
box-shadow: 0 24px 60px rgba(15, 23, 42, 0.4);
box-shadow: var(--app-dialog-shadow);
}
.help-dialog-header {
@@ -590,18 +669,18 @@ kbd {
top: 0;
z-index: 1;
padding: 1rem;
background: #ffffff;
border-bottom: 1px solid #e5e7eb;
background: var(--app-surface);
border-bottom: 1px solid var(--app-border-soft);
}
.help-dialog-header p {
margin: 0.2rem 0 0;
color: #6b7280;
color: var(--app-muted);
}
.help-dialog-content {
padding: 1rem;
color: #374151;
color: var(--app-text-secondary);
line-height: 1.5;
}
@@ -614,10 +693,10 @@ kbd {
}
kbd {
border: 1px solid #d1d5db;
border: 1px solid var(--app-border);
border-bottom-width: 2px;
border-radius: 0.3rem;
background: #f9fafb;
background: var(--app-surface-soft);
padding: 0.05rem 0.25rem;
font-size: 0.82em;
}