91e5cd58e9
Backend: - Scheduler lifecycle sync: create/update/delete tracker now syncs APScheduler jobs - Test-periodic/test-memory endpoints render actual Jinja2 templates with sample data - Cascade cleanup on tracker delete (TrackerState removed, EventLog nullified) - Fix user_id=0 FK violation for system-owned TemplateConfig (removed FK constraint) - Fix API key leak: only attach x-api-key header for internal provider URLs - Validate config ownership in tracker_targets create/update - Fix _response() double-emit of created_at in template/tracking configs - Add per-target-link test endpoints (test, test-periodic, test-memory) Frontend: - Fix orphaned provider on test exception in providers/new - Add submitting guard + disabled state to targets save button - Move test buttons from tracker card to per-target-link rows - Fix Svelte 5 async $state reactivity (spread reassignment for all Record mutations) - i18n for dashboard timeAgo and event type badges (EN + RU) - Add required attribute to chat select dropdown in targets - Fix font CSS vars to prioritize imported DM Sans / JetBrains Mono - Standardize empty states with centered icon + text across all 6 list pages - Add stagger-children animation class to all list containers - Fix slide transition duration consistency (200ms everywhere) - Standardize border-radius to rounded-md across all form inputs - Fix providers/new page structure (h2 + mb-8 spacing) - Fix tracker card action row overflow (flex-wrap justify-end) - JinjaEditor dark mode reactivity (recreate editor on theme change) - Add aria-labels to mobile nav items - Make ConfirmModal confirm button label/icon configurable - Remove double error reporting on providers page - Add telegram bot edit functionality (name editing via PUT) - i18n for External Domain label on provider forms Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
186 lines
5.4 KiB
CSS
186 lines
5.4 KiB
CSS
@import '@fontsource/dm-sans/300.css';
|
|
@import '@fontsource/dm-sans/400.css';
|
|
@import '@fontsource/dm-sans/500.css';
|
|
@import '@fontsource/dm-sans/600.css';
|
|
@import '@fontsource/dm-sans/700.css';
|
|
@import '@fontsource/jetbrains-mono/400.css';
|
|
@import '@fontsource/jetbrains-mono/500.css';
|
|
@import '@fontsource/jetbrains-mono/600.css';
|
|
@import 'tailwindcss';
|
|
|
|
@theme {
|
|
--color-background: #f8f9fb;
|
|
--color-foreground: #1a1a2e;
|
|
--color-muted: #eef0f4;
|
|
--color-muted-foreground: #6b7280;
|
|
--color-border: #e2e4ea;
|
|
--color-primary: #0d9488;
|
|
--color-primary-foreground: #ffffff;
|
|
--color-accent: #eef0f4;
|
|
--color-accent-foreground: #1a1a2e;
|
|
--color-destructive: #ef4444;
|
|
--color-card: #ffffff;
|
|
--color-card-foreground: #1a1a2e;
|
|
--color-success-bg: #ecfdf5;
|
|
--color-success-fg: #059669;
|
|
--color-warning-bg: #fffbeb;
|
|
--color-warning-fg: #d97706;
|
|
--color-error-bg: #fef2f2;
|
|
--color-error-fg: #dc2626;
|
|
--color-glow: rgba(13, 148, 136, 0.15);
|
|
--color-glow-strong: rgba(13, 148, 136, 0.3);
|
|
--color-sidebar: #ffffff;
|
|
--color-sidebar-active: rgba(13, 148, 136, 0.08);
|
|
--font-sans: 'DM Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
--font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Consolas', monospace;
|
|
--radius: 0.625rem;
|
|
}
|
|
|
|
/* Dark theme overrides */
|
|
[data-theme="dark"] {
|
|
--color-background: #0c0e14;
|
|
--color-foreground: #e4e6ed;
|
|
--color-muted: #1a1d28;
|
|
--color-muted-foreground: #8b8fa4;
|
|
--color-border: #252836;
|
|
--color-primary: #14b8a6;
|
|
--color-primary-foreground: #0c0e14;
|
|
--color-accent: #1a1d28;
|
|
--color-accent-foreground: #e4e6ed;
|
|
--color-destructive: #f87171;
|
|
--color-card: #13151e;
|
|
--color-card-foreground: #e4e6ed;
|
|
--color-success-bg: #052e16;
|
|
--color-success-fg: #34d399;
|
|
--color-warning-bg: #422006;
|
|
--color-warning-fg: #fbbf24;
|
|
--color-error-bg: #450a0a;
|
|
--color-error-fg: #f87171;
|
|
--color-glow: rgba(20, 184, 166, 0.12);
|
|
--color-glow-strong: rgba(20, 184, 166, 0.25);
|
|
--color-sidebar: #10121a;
|
|
--color-sidebar-active: rgba(20, 184, 166, 0.1);
|
|
}
|
|
|
|
body {
|
|
font-family: var(--font-sans);
|
|
background-color: var(--color-background);
|
|
color: var(--color-foreground);
|
|
transition: background-color 0.3s ease, color 0.3s ease;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
|
|
/* Subtle background pattern */
|
|
body::before {
|
|
content: '';
|
|
position: fixed;
|
|
inset: 0;
|
|
z-index: -1;
|
|
opacity: 0.4;
|
|
background-image: radial-gradient(circle at 1px 1px, var(--color-border) 0.5px, transparent 0);
|
|
background-size: 32px 32px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* Form controls */
|
|
input, select, textarea {
|
|
color: var(--color-foreground);
|
|
background-color: var(--color-background);
|
|
border-color: var(--color-border);
|
|
font-family: var(--font-sans);
|
|
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
}
|
|
|
|
input:focus-visible, select:focus-visible, textarea:focus-visible {
|
|
outline: none;
|
|
border-color: var(--color-primary);
|
|
box-shadow: 0 0 0 3px var(--color-glow), 0 0 12px var(--color-glow);
|
|
}
|
|
|
|
button:focus-visible {
|
|
outline: 2px solid var(--color-primary);
|
|
outline-offset: 2px;
|
|
border-radius: 0.375rem;
|
|
}
|
|
|
|
a:focus-visible {
|
|
outline: 2px solid var(--color-primary);
|
|
outline-offset: 2px;
|
|
border-radius: 0.375rem;
|
|
}
|
|
|
|
/* Override browser autofill styles in dark mode */
|
|
[data-theme="dark"] input:-webkit-autofill,
|
|
[data-theme="dark"] input:-webkit-autofill:hover,
|
|
[data-theme="dark"] input:-webkit-autofill:focus,
|
|
[data-theme="dark"] select:-webkit-autofill {
|
|
-webkit-box-shadow: 0 0 0 1000px #13151e inset !important;
|
|
-webkit-text-fill-color: #e4e6ed !important;
|
|
caret-color: #e4e6ed;
|
|
}
|
|
|
|
/* Color scheme for native controls */
|
|
[data-theme="dark"] { color-scheme: dark; }
|
|
[data-theme="light"] { color-scheme: light; }
|
|
|
|
/* Scrollbar styling */
|
|
::-webkit-scrollbar { width: 6px; height: 6px; }
|
|
::-webkit-scrollbar-track { background: transparent; }
|
|
::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 3px; }
|
|
::-webkit-scrollbar-thumb:hover { background: var(--color-muted-foreground); }
|
|
|
|
/* Animations */
|
|
@keyframes fadeSlideIn {
|
|
from { opacity: 0; transform: translateY(12px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
@keyframes shimmer {
|
|
0% { background-position: -200% 0; }
|
|
100% { background-position: 200% 0; }
|
|
}
|
|
|
|
@keyframes pulseGlow {
|
|
0%, 100% { box-shadow: 0 0 4px var(--color-glow); }
|
|
50% { box-shadow: 0 0 16px var(--color-glow-strong); }
|
|
}
|
|
|
|
@keyframes countUp {
|
|
from { opacity: 0; transform: translateY(8px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
.animate-fade-slide-in {
|
|
animation: fadeSlideIn 0.4s ease-out both;
|
|
}
|
|
|
|
.animate-shimmer {
|
|
background: linear-gradient(90deg, var(--color-muted) 25%, var(--color-border) 50%, var(--color-muted) 75%);
|
|
background-size: 200% 100%;
|
|
animation: shimmer 1.5s ease-in-out infinite;
|
|
}
|
|
|
|
.animate-pulse-glow {
|
|
animation: pulseGlow 2s ease-in-out infinite;
|
|
}
|
|
|
|
.animate-count-up {
|
|
animation: countUp 0.5s ease-out both;
|
|
}
|
|
|
|
/* Stagger children utility */
|
|
.stagger-children > * {
|
|
animation: fadeSlideIn 0.4s ease-out both;
|
|
}
|
|
.stagger-children > *:nth-child(1) { animation-delay: 0ms; }
|
|
.stagger-children > *:nth-child(2) { animation-delay: 60ms; }
|
|
.stagger-children > *:nth-child(3) { animation-delay: 120ms; }
|
|
.stagger-children > *:nth-child(4) { animation-delay: 180ms; }
|
|
.stagger-children > *:nth-child(5) { animation-delay: 240ms; }
|
|
.stagger-children > *:nth-child(6) { animation-delay: 300ms; }
|
|
|
|
.font-mono {
|
|
font-family: var(--font-mono);
|
|
}
|