summaryrefslogtreecommitdiff
path: root/web/css/components.css
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-29 20:19:34 +0300
committerPaul Buetow <paul@buetow.org>2026-04-29 20:19:34 +0300
commit4a70c0ea083306cb79d0fa325d331ffa4333154a (patch)
tree84df7e2f781974ef45ac8c34f1a59e80fdd5c41d /web/css/components.css
parentcf30414c2a0696cc75c615f4da66ea85d0522c42 (diff)
feat: create web PWA frontend
Diffstat (limited to 'web/css/components.css')
-rw-r--r--web/css/components.css134
1 files changed, 134 insertions, 0 deletions
diff --git a/web/css/components.css b/web/css/components.css
new file mode 100644
index 0000000..6d2f074
--- /dev/null
+++ b/web/css/components.css
@@ -0,0 +1,134 @@
+/* Buttons */
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.35rem;
+ padding: 0.5rem 0.85rem;
+ border-radius: var(--radius-sm);
+ border: 1px solid transparent;
+ font-size: 0.85rem;
+ font-weight: 600;
+ line-height: 1.2;
+ cursor: pointer;
+ background: var(--bg-elevated);
+ color: var(--text-primary);
+ transition: background var(--transition-fast), border-color var(--transition-fast), transform 80ms ease;
+}
+.btn:hover { background: var(--bg-surface-hover); }
+.btn:active { transform: translateY(1px); }
+.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
+
+.btn-primary {
+ background: var(--accent);
+ color: #fff;
+ border-color: var(--accent-active);
+}
+.btn-primary:hover { background: var(--accent-hover); }
+.btn-danger {
+ background: var(--danger);
+ color: #fff;
+ border-color: #b91c1c;
+}
+.btn-danger:hover { background: #e04e4e; }
+.btn-ghost {
+ background: transparent;
+ color: var(--text-secondary);
+ border-color: var(--border);
+}
+.btn-ghost:hover { color: var(--text-primary); background: var(--bg-surface-hover); }
+.btn-sm { padding: 0.3rem 0.55rem; font-size: 0.78rem; }
+.btn-lg { padding: 0.65rem 1.1rem; font-size: 0.95rem; }
+
+/* Icon buttons */
+.icon-btn {
+ width: 2.25rem;
+ height: 2.25rem;
+ border-radius: var(--radius-sm);
+ background: transparent;
+ border: 1px solid transparent;
+ color: var(--text-secondary);
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.05rem;
+ line-height: 1;
+ padding: 0;
+ transition: background var(--transition-fast), color var(--transition-fast);
+}
+.icon-btn:hover { background: var(--bg-surface-hover); color: var(--text-primary); }
+.icon-btn.active { color: var(--accent); background: var(--accent-soft); }
+
+/* Forms */
+input, textarea, select {
+ font: inherit;
+ color: var(--text-primary);
+ background: var(--bg-elevated);
+ border: 1px solid var(--border);
+ border-radius: var(--radius-sm);
+ padding: 0.5rem 0.65rem;
+ width: 100%;
+}
+input:focus, textarea:focus, select:focus {
+ outline: none;
+ border-color: var(--accent);
+ box-shadow: 0 0 0 3px var(--accent-soft);
+}
+label {
+ display: block;
+ font-size: 0.8rem;
+ font-weight: 600;
+ margin: 0.35rem 0 0.2rem;
+ color: var(--text-secondary);
+}
+
+/* Error message */
+.error-message {
+ color: var(--danger);
+ font-size: 0.85rem;
+ min-height: 1.25rem;
+ margin: 0.35rem 0 0;
+}
+
+/* Search bar */
+.search-bar {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ background: var(--bg-elevated);
+ border: 1px solid var(--border);
+ border-radius: var(--radius-md);
+ padding: 0.25rem 0.6rem;
+ max-width: 22rem;
+ width: 100%;
+}
+.search-bar input {
+ background: transparent;
+ border: none;
+ padding: 0.35rem 0.2rem;
+ flex: 1 1 auto;
+}
+.search-bar input:focus { box-shadow: none; }
+
+/* Toast */
+.toast {
+ position: fixed;
+ bottom: 1rem;
+ right: 1rem;
+ background: var(--bg-surface);
+ color: var(--text-primary);
+ border: 1px solid var(--border-strong);
+ border-radius: var(--radius-md);
+ box-shadow: var(--shadow-lg);
+ padding: 0.65rem 0.9rem;
+ z-index: 110;
+ font-size: 0.85rem;
+ transform: translateY(120%);
+ opacity: 0;
+ transition: transform var(--transition-base), opacity var(--transition-base);
+}
+.toast.show { transform: translateY(0); opacity: 1; }
+.toast.info { border-left: 4px solid var(--accent); }
+.toast.success { border-left: 4px solid var(--success); }
+.toast.error { border-left: 4px solid var(--danger); }