summaryrefslogtreecommitdiff
path: root/web/style.css
diff options
context:
space:
mode:
Diffstat (limited to 'web/style.css')
-rw-r--r--web/style.css172
1 files changed, 172 insertions, 0 deletions
diff --git a/web/style.css b/web/style.css
new file mode 100644
index 0000000..d868fdf
--- /dev/null
+++ b/web/style.css
@@ -0,0 +1,172 @@
+/* Design tokens */
+:root {
+ --state-pending: #94a3b8;
+ --state-queued: #60a5fa;
+ --state-running: #f59e0b;
+ --state-completed: #34d399;
+ --state-failed: #f87171;
+ --state-timed-out: #c084fc;
+ --state-cancelled: #9ca3af;
+ --state-budget-exceeded: #fb923c;
+
+ --bg: #0f172a;
+ --surface: #1e293b;
+ --border: #334155;
+ --text: #e2e8f0;
+ --text-muted: #94a3b8;
+ --accent: #38bdf8;
+}
+
+/* Reset */
+*, *::before, *::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font-family: system-ui, -apple-system, sans-serif;
+ background: var(--bg);
+ color: var(--text);
+ min-height: 100dvh;
+}
+
+/* Header */
+header {
+ background: var(--surface);
+ border-bottom: 1px solid var(--border);
+ padding: 1rem;
+ position: sticky;
+ top: 0;
+ z-index: 10;
+}
+
+header h1 {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: var(--accent);
+ letter-spacing: -0.01em;
+ max-width: 640px;
+ margin: 0 auto;
+}
+
+/* Main layout */
+main {
+ max-width: 640px;
+ margin: 0 auto;
+ padding: 1rem;
+}
+
+/* Task list */
+.task-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+#loading {
+ color: var(--text-muted);
+ text-align: center;
+ padding: 2rem 0;
+ font-size: 0.9rem;
+}
+
+/* Task card */
+.task-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;
+}
+
+.task-card-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+}
+
+.task-name {
+ font-weight: 600;
+ font-size: 0.95rem;
+ flex: 1;
+ min-width: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+/* State badge */
+.state-badge {
+ display: inline-block;
+ font-size: 0.7rem;
+ font-weight: 600;
+ letter-spacing: 0.03em;
+ text-transform: uppercase;
+ padding: 0.2em 0.55em;
+ border-radius: 999px;
+ color: #0f172a;
+ white-space: nowrap;
+ flex-shrink: 0;
+}
+
+.state-badge[data-state="PENDING"] { background: var(--state-pending); }
+.state-badge[data-state="QUEUED"] { background: var(--state-queued); }
+.state-badge[data-state="RUNNING"] { background: var(--state-running); }
+.state-badge[data-state="COMPLETED"] { background: var(--state-completed); }
+.state-badge[data-state="FAILED"] { background: var(--state-failed); }
+.state-badge[data-state="TIMED_OUT"] { background: var(--state-timed-out); }
+.state-badge[data-state="CANCELLED"] { background: var(--state-cancelled); }
+.state-badge[data-state="BUDGET_EXCEEDED"] { background: var(--state-budget-exceeded); }
+
+/* Task meta */
+.task-meta {
+ font-size: 0.78rem;
+ color: var(--text-muted);
+ display: flex;
+ gap: 0.75rem;
+ flex-wrap: wrap;
+}
+
+.task-description {
+ font-size: 0.82rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+/* Run button */
+.task-card-footer {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-top: 0.25rem;
+ flex-wrap: wrap;
+}
+
+.btn-run {
+ font-size: 0.8rem;
+ font-weight: 600;
+ padding: 0.35em 0.85em;
+ border-radius: 0.375rem;
+ border: none;
+ cursor: pointer;
+ background: var(--accent);
+ color: #0f172a;
+ transition: opacity 0.15s;
+}
+
+.btn-run:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.task-error {
+ font-size: 0.78rem;
+ color: var(--state-failed);
+}