diff --git a/public/healthz.json b/public/healthz.json index 06992bd..c22b4b9 100644 --- a/public/healthz.json +++ b/public/healthz.json @@ -2,7 +2,7 @@ "status": "ok", "service": "aitherboard", "version": "0.1.1", - "buildTime": "2026-02-05T09:41:28.201Z", + "buildTime": "2026-02-05T11:28:23.225Z", "gitCommit": "unknown", - "timestamp": 1770284488201 + "timestamp": 1770290903225 } \ No newline at end of file diff --git a/src/app.css b/src/app.css index b18deab..797eb06 100644 --- a/src/app.css +++ b/src/app.css @@ -12,15 +12,15 @@ } [data-text-size='small'] { - --text-size: 14px; + --text-size: 12px; } [data-text-size='medium'] { - --text-size: 16px; + --text-size: 14px; } [data-text-size='large'] { - --text-size: 18px; + --text-size: 16px; } [data-line-spacing='tight'] { @@ -103,24 +103,42 @@ p { /* Consistent heading sizes relative to base font size */ h1 { - font-size: clamp(1.5rem, 4vw, 2rem); + font-size: clamp(1.25rem, 3vw, 1.5rem); line-height: 1.2; - margin-bottom: 1rem; + margin-bottom: 1.5rem; margin-top: 0; + font-weight: 700; + color: var(--fog-text, #1f2937); +} + +:global(.dark) h1 { + color: var(--fog-dark-text, #f9fafb); } h2 { - font-size: clamp(1.25rem, 3vw, 1.5rem); + font-size: clamp(1.125rem, 2.5vw, 1.25rem); line-height: 1.3; margin-bottom: 0.875rem; margin-top: 0; + font-weight: 600; + color: var(--fog-text, #1f2937); +} + +:global(.dark) h2 { + color: var(--fog-dark-text, #f9fafb); } h3 { - font-size: clamp(1.125rem, 2.5vw, 1.25rem); + font-size: clamp(1rem, 2vw, 1.125rem); line-height: 1.4; - margin-bottom: 0.75rem; - margin-top: 0; + margin-bottom: 0.625rem; + margin-top: 1.25rem; + font-weight: 600; + color: var(--fog-text, #1f2937); +} + +:global(.dark) h3 { + color: var(--fog-dark-text, #f9fafb); } h4, h5, h6 { @@ -130,6 +148,210 @@ h4, h5, h6 { margin-top: 0; } +/* Common main container */ +main { + max-width: var(--content-width); + margin: 0 auto; +} + +/* Common loading and empty states */ +.loading-state, +.empty-state { + padding: 2rem; + text-align: center; + color: var(--fog-text, #1f2937); +} + +:global(.dark) .loading-state, +:global(.dark) .empty-state { + color: var(--fog-dark-text, #f9fafb); +} + +/* Common button styles */ +.write-button { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + border: 1px solid var(--fog-border, #e5e7eb); + border-radius: 0.375rem; + background: var(--fog-post, #ffffff); + color: var(--fog-text, #1f2937); + text-decoration: none; + transition: all 0.2s; + min-width: 2.5rem; + min-height: 2.5rem; + flex-shrink: 0; + cursor: pointer; +} + +:global(.dark) .write-button { + border-color: var(--fog-dark-border, #374151); + background: var(--fog-dark-post, #1f2937); + color: var(--fog-dark-text, #f9fafb); +} + +.write-button:hover { + background: var(--fog-highlight, #f3f4f6); + border-color: var(--fog-accent, #64748b); +} + +:global(.dark) .write-button:hover { + background: var(--fog-dark-highlight, #475569); + border-color: var(--fog-dark-accent, #94a3b8); +} + +/* Action buttons (accent background) */ +.find-button, +.create-rss-button, +.edit-rss-button, +.bulk-action-button, +.load-more-button, +.clear-kind-button { + padding: 0.75rem 1.5rem; + background: var(--fog-accent, #64748b); + color: white; + border: none; + border-radius: 0.375rem; + cursor: pointer; + font-size: 0.875em; + font-weight: 500; + text-decoration: none; + display: inline-block; + transition: opacity 0.2s; +} + +:global(.dark) .find-button, +:global(.dark) .create-rss-button, +:global(.dark) .edit-rss-button, +:global(.dark) .bulk-action-button, +:global(.dark) .load-more-button, +:global(.dark) .clear-kind-button { + background: var(--fog-dark-accent, #94a3b8); +} + +.find-button:hover:not(:disabled), +.create-rss-button:hover, +.edit-rss-button:hover, +.bulk-action-button:hover, +.load-more-button:hover:not(:disabled), +.clear-kind-button:hover { + opacity: 0.9; +} + +.find-button:disabled, +.load-more-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* Tab buttons */ +.tab-button { + padding: 0.75rem 1.5rem; + border: none; + background: transparent; + color: var(--fog-text-light, #6b7280); + cursor: pointer; + border-bottom: 2px solid transparent; + transition: all 0.2s; + font-size: 1rem; +} + +:global(.dark) .tab-button { + color: var(--fog-dark-text-light, #9ca3af); +} + +.tab-button:hover { + color: var(--fog-text, #1f2937); +} + +:global(.dark) .tab-button:hover { + color: var(--fog-dark-text, #f9fafb); +} + +.tab-button.active { + color: var(--fog-text, #1f2937); + border-bottom-color: var(--fog-accent, #64748b); +} + +:global(.dark) .tab-button.active { + color: var(--fog-dark-text, #f9fafb); + border-bottom-color: var(--fog-dark-accent, #94a3b8); +} + +/* Common emoji styles */ +.emoji { + font-size: 1.25rem; + line-height: 1; +} + +.emoji-grayscale { + filter: grayscale(100%); + opacity: 0.7; +} + +/* Common button styles */ +.action-button { + padding: 0.5rem 1rem; + background: var(--fog-highlight, #f3f4f6); + border: 1px solid var(--fog-border, #e5e7eb); + border-radius: 0.375rem; + color: var(--fog-text, #1f2937); + cursor: pointer; + font-size: 0.875em; + text-decoration: none; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} + +:global(.dark) .action-button { + background: var(--fog-dark-highlight, #475569); + border-color: var(--fog-dark-border, #475569); + color: var(--fog-dark-text, #f9fafb); +} + +.action-button:hover { + background: var(--fog-accent, #64748b); + color: white; + border-color: var(--fog-accent, #64748b); +} + +.action-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* Common form elements */ +.filter-select, +.filter-input { + padding: 0.5rem 0.75rem; + border: 1px solid var(--fog-border, #e5e7eb); + border-radius: 0.375rem; + background: var(--fog-post, #ffffff); + color: var(--fog-text, #1f2937); + font-size: 0.875em; +} + +:global(.dark) .filter-select, +:global(.dark) .filter-input { + background: var(--fog-dark-post, #334155); + border-color: var(--fog-dark-border, #475569); + color: var(--fog-dark-text, #f9fafb); +} + +.filter-label { + font-size: 0.875em; + font-weight: 500; + color: var(--fog-text, #1f2937); +} + +:global(.dark) .filter-label { + color: var(--fog-dark-text, #f9fafb); +} + /* Apply monospace font to all elements globally */ * { font-family: inherit; diff --git a/src/lib/components/layout/Header.svelte b/src/lib/components/layout/Header.svelte index 305015b..de52d5c 100644 --- a/src/lib/components/layout/Header.svelte +++ b/src/lib/components/layout/Header.svelte @@ -2,6 +2,8 @@ import { sessionManager, type UserSession } from '../../services/auth/session-manager.js'; import UserPreferences from '../preferences/UserPreferences.svelte'; import ProfileBadge from '../layout/ProfileBadge.svelte'; + import { page } from '$app/stores'; + import { goto } from '$app/navigation'; let currentSession = $state(sessionManager.session.value); let isLoggedIn = $derived(currentSession !== null); @@ -15,6 +17,18 @@ return unsubscribe; }); + function handleLogout() { + // Store current route before logging out + const currentRoute = $page.url.pathname + $page.url.search; + sessionManager.clearSession(currentRoute); + + // Redirect to stored login redirect if available, otherwise stay on current page + const loginRedirect = sessionManager.getLoginRedirect(); + if (loginRedirect) { + goto(loginRedirect); + } + } +
@@ -56,7 +70,7 @@