summaryrefslogtreecommitdiff
path: root/web/style.css
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-03-03 21:09:02 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-03-03 21:09:02 +0000
commitbdcc33f391441184c0b9cdbaecfdb8beb81b2652 (patch)
treedf170efc45149b781094563eee6360ed2338f419 /web/style.css
parent3881f800465a02895c7784c4932df6c094e66723 (diff)
Add clickable fold to expand hidden completed/failed tasks
Replace the static "N hidden tasks" label with a toggle button that expands an inline fold showing the hidden task cards dimmed at 0.6 opacity. Fold state is module-level so it survives poll cycles within a session but resets on reload. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'web/style.css')
-rw-r--r--web/style.css536
1 files changed, 535 insertions, 1 deletions
diff --git a/web/style.css b/web/style.css
index d868fdf..de8ce83 100644
--- a/web/style.css
+++ b/web/style.css
@@ -39,6 +39,10 @@ header {
position: sticky;
top: 0;
z-index: 10;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ max-width: 100%;
}
header h1 {
@@ -47,7 +51,40 @@ header h1 {
color: var(--accent);
letter-spacing: -0.01em;
max-width: 640px;
- margin: 0 auto;
+ margin: 0 auto 0 0;
+ flex: 1;
+}
+
+/* Tab bar */
+.tab-bar {
+ background: var(--surface);
+ border-bottom: 1px solid var(--border);
+ display: flex;
+ gap: 0;
+ padding: 0 1rem;
+ max-width: 100%;
+}
+
+.tab {
+ font-size: 0.88rem;
+ font-weight: 600;
+ padding: 0.65em 1.25em;
+ border: none;
+ border-bottom: 2px solid transparent;
+ background: transparent;
+ color: var(--text-muted);
+ cursor: pointer;
+ transition: color 0.15s, border-color 0.15s;
+ margin-bottom: -1px;
+}
+
+.tab:hover {
+ color: var(--text);
+}
+
+.tab.active {
+ color: var(--accent);
+ border-bottom-color: var(--accent);
}
/* Main layout */
@@ -57,6 +94,28 @@ main {
padding: 1rem;
}
+/* Panel header */
+.panel-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 1rem;
+}
+
+.panel-header h2 {
+ font-size: 1rem;
+ font-weight: 700;
+}
+
+/* Task list toolbar */
+.task-list-toolbar {
+ display: flex;
+ align-items: center;
+ padding: 0.5rem 0;
+ margin-bottom: 0.75rem;
+ border-bottom: 1px solid var(--border);
+}
+
/* Task list */
.task-list {
display: flex;
@@ -170,3 +229,478 @@ main {
font-size: 0.78rem;
color: var(--state-failed);
}
+
+.hidden-tasks-info {
+ font-size: 0.78rem;
+ color: var(--text-muted);
+ text-align: center;
+ padding: 0.5rem 0;
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ width: 100%;
+}
+
+.hidden-tasks-info:hover {
+ color: var(--text);
+}
+
+.hidden-tasks-fold {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ opacity: 0.6;
+ margin-top: 0.5rem;
+}
+
+/* Primary button */
+.btn-primary {
+ font-size: 0.85rem;
+ font-weight: 600;
+ padding: 0.4em 1em;
+ border-radius: 0.375rem;
+ border: none;
+ cursor: pointer;
+ background: #2563eb;
+ color: #fff;
+ transition: opacity 0.15s;
+}
+
+.btn-primary:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+/* Secondary button */
+.btn-secondary {
+ font-size: 0.85rem;
+ font-weight: 600;
+ padding: 0.4em 1em;
+ border-radius: 0.375rem;
+ border: 1px solid var(--border);
+ background: transparent;
+ color: var(--text-muted);
+ cursor: pointer;
+ transition: background 0.15s, color 0.15s;
+}
+
+.btn-secondary:hover {
+ background: var(--border);
+ color: var(--text);
+}
+
+.btn-secondary:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+/* Danger button */
+.btn-danger {
+ font-size: 0.85rem;
+ font-weight: 600;
+ padding: 0.4em 1em;
+ border-radius: 0.375rem;
+ border: none;
+ cursor: pointer;
+ background: var(--state-failed);
+ color: #0f172a;
+ transition: opacity 0.15s;
+}
+
+.btn-danger:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.btn-sm {
+ font-size: 0.78rem;
+ padding: 0.3em 0.75em;
+}
+
+/* Modal dialog */
+dialog {
+ background: var(--surface);
+ color: var(--text);
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ padding: 1.5rem;
+ max-width: 480px;
+ width: 100%;
+}
+
+dialog::backdrop {
+ background: rgba(0, 0, 0, 0.6);
+}
+
+dialog h2 {
+ font-size: 1.1rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+}
+
+/* Form labels and inputs */
+dialog label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+dialog label input,
+dialog label textarea,
+dialog label select {
+ display: block;
+ width: 100%;
+ margin-top: 4px;
+ background: var(--bg);
+ border: 1px solid var(--border);
+ border-radius: 0.375rem;
+ color: var(--text);
+ padding: 0.4em 0.6em;
+ font-size: 0.9rem;
+ font-family: inherit;
+}
+
+dialog label input:focus,
+dialog label textarea:focus,
+dialog label select:focus {
+ outline: 2px solid var(--accent);
+ outline-offset: 1px;
+}
+
+/* Form actions row */
+.form-actions {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-top: 16px;
+}
+
+.form-actions button[type="button"] {
+ font-size: 0.85rem;
+ padding: 0.4em 1em;
+ border-radius: 0.375rem;
+ border: 1px solid var(--border);
+ background: transparent;
+ color: var(--text-muted);
+ cursor: pointer;
+}
+
+.form-actions button[type="button"]:hover {
+ background: var(--border);
+ color: var(--text);
+}
+
+/* Inline form error */
+.form-error {
+ color: var(--state-failed);
+ font-size: 0.82rem;
+ margin-top: 8px;
+}
+
+/* Template list */
+.template-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+/* Template card */
+.template-card {
+ background: var(--surface);
+ border: 1px solid var(--border);
+ border-radius: 0.5rem;
+ padding: 0.875rem 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.375rem;
+}
+
+.template-name {
+ font-weight: 600;
+ font-size: 0.95rem;
+}
+
+.template-description {
+ font-size: 0.82rem;
+ color: var(--text-muted);
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.template-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.375rem;
+ margin-top: 0.125rem;
+}
+
+.tag-chip {
+ font-size: 0.7rem;
+ font-weight: 600;
+ padding: 0.2em 0.55em;
+ border-radius: 999px;
+ background: var(--border);
+ color: var(--text-muted);
+}
+
+.template-card-footer {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-top: 0.25rem;
+}
+
+/* ── Side panel ───────────────────────────────────────────────────────────── */
+
+.panel-backdrop {
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 20;
+}
+
+.task-panel {
+ position: fixed;
+ top: 0;
+ right: 0;
+ width: min(480px, 100vw);
+ height: 100dvh;
+ background: var(--surface);
+ border-left: 1px solid var(--border);
+ z-index: 30;
+ display: flex;
+ flex-direction: column;
+ transform: translateX(100%);
+ transition: transform 0.22s cubic-bezier(0.4, 0, 0.2, 1);
+ overflow: hidden;
+}
+
+.task-panel.open {
+ transform: translateX(0);
+}
+
+.task-panel-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 1.25rem;
+ border-bottom: 1px solid var(--border);
+ flex-shrink: 0;
+}
+
+.task-panel-header h2 {
+ font-size: 1rem;
+ font-weight: 700;
+ margin: 0;
+ flex: 1;
+ min-width: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.btn-close-panel {
+ background: transparent;
+ border: none;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 1.3rem;
+ line-height: 1;
+ padding: 0.15em 0.35em;
+ margin-left: 0.5rem;
+ border-radius: 0.25rem;
+ flex-shrink: 0;
+}
+
+.btn-close-panel:hover {
+ color: var(--text);
+ background: var(--border);
+}
+
+.task-panel-content {
+ flex: 1;
+ overflow-y: auto;
+ padding: 1.25rem;
+}
+
+/* Panel sections */
+.panel-section {
+ margin-bottom: 1.5rem;
+}
+
+.panel-section:last-child {
+ margin-bottom: 0;
+}
+
+.panel-section-title {
+ font-size: 0.68rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--text-muted);
+ margin-bottom: 0.625rem;
+ padding-bottom: 0.375rem;
+ border-bottom: 1px solid var(--border);
+}
+
+.meta-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 0.75rem 1rem;
+}
+
+.meta-item {
+ display: flex;
+ flex-direction: column;
+ gap: 0.15rem;
+}
+
+.meta-item.full-width {
+ grid-column: 1 / -1;
+}
+
+.meta-label {
+ font-size: 0.7rem;
+ font-weight: 600;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+}
+
+.meta-value {
+ font-size: 0.875rem;
+ word-break: break-all;
+}
+
+.meta-value.mono {
+ font-family: monospace;
+ font-size: 0.8rem;
+}
+
+.meta-value.muted {
+ color: var(--text-muted);
+}
+
+.panel-code {
+ background: var(--bg);
+ border: 1px solid var(--border);
+ border-radius: 0.375rem;
+ padding: 0.625rem 0.75rem;
+ font-family: monospace;
+ font-size: 0.8rem;
+ white-space: pre-wrap;
+ word-break: break-word;
+ color: var(--text);
+ max-height: 220px;
+ overflow-y: auto;
+ margin-top: 0.25rem;
+}
+
+.panel-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.375rem;
+ margin-top: 0.1rem;
+}
+
+/* Clickable task cards */
+.task-card {
+ cursor: pointer;
+}
+
+.task-card:hover {
+ border-color: var(--accent);
+}
+
+/* Panel loading / error */
+.panel-loading {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ padding: 2rem 0;
+ text-align: center;
+}
+
+.panel-fetch-error {
+ color: var(--state-failed);
+ font-size: 0.85rem;
+ padding: 1rem 0;
+}
+
+/* Executions list in panel */
+.executions-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.execution-row {
+ background: var(--bg);
+ border: 1px solid var(--border);
+ border-radius: 0.375rem;
+ padding: 0.625rem 0.75rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem 0.75rem;
+ flex-wrap: wrap;
+}
+
+.execution-id {
+ font-family: monospace;
+ font-size: 0.72rem;
+ color: var(--text-muted);
+ flex-shrink: 0;
+}
+
+.execution-times {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ flex: 1;
+ min-width: 120px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.execution-cost {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+}
+
+.execution-exit {
+ font-family: monospace;
+ font-size: 0.72rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+}
+
+.btn-view-logs {
+ font-size: 0.72rem;
+ font-weight: 600;
+ padding: 0.2em 0.55em;
+ border-radius: 0.25rem;
+ border: 1px solid var(--border);
+ background: transparent;
+ color: var(--text-muted);
+ cursor: pointer;
+ white-space: nowrap;
+ flex-shrink: 0;
+}
+
+.btn-view-logs:hover {
+ background: var(--border);
+ color: var(--text);
+}
+
+/* Execution logs modal */
+.logs-modal-body {
+ display: flex;
+ flex-direction: column;
+}
+
+.logs-modal-body .meta-grid {
+ row-gap: 0.625rem;
+}