@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap'); @import 'tailwindcss'; @import 'tw-animate-css'; @import 'shadcn/tailwind.css'; @import './styles/LoginPage.css'; @import './styles/StatusPage.css'; @import './styles/DashboardPage.css'; @import './styles/MonitorDetailPage.css'; @import './styles/SettingsPage.css'; @custom-variant dark (&:is(.dark *)); :root { font-family: 'DM Sans', 'Helvetica Neue', sans-serif; color: #171717; background: #fff; font-synthesis: none; text-rendering: optimizeLegibility; --primary: #3ecf8e; --shadcn-primary: oklch(0.205 0 0); --primary-deep: #24b47e; --chart-down: #d95c5c; --chart-degraded: #d97706; --ink: #171717; --muted: #707070; --shadcn-muted: oklch(0.97 0 0); --faint: #9a9a9a; --hairline: #dfdfdf; --soft: #fafafa; --night: #1c1c1c; --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); --primary-foreground: oklch(0.985 0 0); --secondary: oklch(0.97 0 0); --secondary-foreground: oklch(0.205 0 0); --muted-foreground: oklch(0.556 0 0); --accent: oklch(0.97 0 0); --accent-foreground: oklch(0.205 0 0); --destructive: oklch(0.577 0.245 27.325); --border: oklch(0.922 0 0); --input: oklch(0.922 0 0); --ring: oklch(0.708 0 0); --chart-1: oklch(0.87 0 0); --chart-2: oklch(0.556 0 0); --chart-3: oklch(0.439 0 0); --chart-4: oklch(0.371 0 0); --chart-5: oklch(0.269 0 0); --radius: 0.625rem; --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: oklch(0.205 0 0); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); } * { box-sizing: border-box; } html { font-size: 19px; scroll-behavior: smooth; } body { margin: 0; min-width: 320px; min-height: 100vh; background: #fff; color: var(--ink); } .dark body { background: #090a0c; color: #ededed; } button, input, select { font: inherit; } a { color: inherit; text-decoration: none; } button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible { outline: 2px solid var(--primary-deep); outline-offset: 3px; } button { color: inherit; } .full-page-loading { display: grid; place-items: center; align-content: center; gap: 14px; min-height: 100dvh; color: var(--muted); } .full-page-loading p { margin: 0; font-size: 13px; } .loading-mark { width: 32px; height: 32px; color: var(--primary-deep); animation: loading-pulse 1.2s ease-in-out infinite; } .dashboard-shell { min-height: 100dvh; background: linear-gradient(#fff 0, #fff 68px, #fcfcfc 68px); } .dashboard-header { position: sticky; z-index: 20; top: 0; border-bottom: 1px solid #ededed; background: rgb(255 255 255 / 0.94); backdrop-filter: blur(14px); } .dashboard-header-inner { display: flex; align-items: center; justify-content: space-between; width: min(1280px, calc(100% - 48px)); height: 68px; margin: 0 auto; } .brand { display: inline-flex; align-items: center; gap: 8px; font-size: 20px; font-weight: 600; letter-spacing: -0.6px; } .brand-button { padding: 0; border: 0; background: transparent; cursor: pointer; } .brand-mark { width: 26px; height: 26px; color: var(--primary-deep); } .nav-actions { display: none; align-items: center; gap: 8px; } .app-nav-mobile-trigger { display: block; } .header-context { margin-right: 12px; padding-right: 20px; border-right: 1px solid #e5e5e5; font-size: 13px; color: var(--muted); } .app-nav-icon { color: #5f5f5f; } .app-nav-icon:hover:not(:disabled), .app-nav-icon[aria-current='page'] { background: rgb(62 207 142 / 0.1); color: var(--primary-deep); } .app-nav-sheet { width: min(88vw, 340px); border-color: var(--hairline); background: #fff; } .app-nav-sheet-header { gap: 5px; padding: 24px 20px 18px; border-bottom: 1px solid #ededed; } .app-nav-sheet-title { display: flex; align-items: center; gap: 8px; font-size: 19px; font-weight: 600; letter-spacing: -0.5px; } .app-nav-sheet-title svg { width: 24px; height: 24px; color: var(--primary-deep); } .app-nav-mobile { display: flex; flex-direction: column; gap: 4px; padding: 4px 12px; } .app-nav-mobile-item { display: flex; align-items: center; gap: 12px; width: 100%; min-height: 46px; padding: 10px 12px; border: 0; border-radius: 8px; font-size: 14px; font-weight: 500; text-align: left; color: #4f4f4f; background: transparent; cursor: pointer; transition: background-color 160ms ease, color 160ms ease; } .app-nav-mobile-item svg { width: 18px; height: 18px; } .app-nav-mobile-item:hover:not(:disabled), .app-nav-mobile-item[aria-current='page'] { color: var(--primary-deep); background: rgb(62 207 142 / 0.1); } .app-nav-mobile-item:disabled { cursor: wait; opacity: 0.55; } @media (min-width: 768px) { .nav-actions { display: flex; } .app-nav-mobile-trigger { display: none; } } .dashboard-main { width: min(1280px, calc(100% - 48px)); margin: 0 auto; padding: 56px 0 72px; } .overline { margin: 0 0 8px; font: 500 12px/1.4 'IBM Plex Mono', monospace; letter-spacing: 0.08em; text-transform: uppercase; color: #55816e; } .primary-button, .secondary-button, .danger-button { display: inline-flex; align-items: center; justify-content: center; gap: 9px; min-height: 42px; padding: 8px 16px; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; white-space: nowrap; transition: border-color 160ms ease, background 160ms ease, transform 160ms ease; } .primary-button { border: 1px solid #35c586; color: var(--ink); background: var(--primary); box-shadow: 0 1px 2px rgb(0 0 0 / 0.08), inset 0 1px rgb(255 255 255 / 0.2); } .primary-button:hover:not(:disabled) { background: #36c487; transform: translateY(-1px); } .secondary-button { border: 1px solid #cfcfcf; color: #444; background: #fff; } .secondary-button:hover:not(:disabled) { border-color: #aaa; background: var(--soft); } .danger-button { border: 1px solid #efcaca; color: #9f2f2f; background: #fff6f6; } .danger-button:hover:not(:disabled) { border-color: #e0b4b4; background: #fff0f0; } .primary-button:active:not(:disabled), .secondary-button:active:not(:disabled), .danger-button:active:not(:disabled) { transform: translateY(1px); } .primary-button:disabled, .secondary-button:disabled, .danger-button:disabled { cursor: wait; opacity: 0.6; } .primary-button svg, .secondary-button svg, .danger-button svg { width: 16px; height: 16px; } .field { display: grid; gap: 8px; } .field > span { font-size: 13px; font-weight: 500; color: #353535; } .form-actions { display: flex; justify-content: flex-end; gap: 10px; align-self: end; grid-column: span 3; } .form-actions.compact-actions { grid-column: 3 / -1; } .form-error { grid-column: 1 / -1; margin: 0; padding: 10px 12px; border: 1px solid #efcaca; border-radius: 6px; font-size: 13px; color: #9f2f2f; background: #fff6f6; } .panel-heading { display: flex; align-items: center; justify-content: space-between; gap: 20px; min-height: 78px; padding: 16px 20px; border-bottom: 1px solid #e8e8e8; } .panel-heading h2 { margin: 0; font-size: 18px; font-weight: 500; } .panel-heading p { margin: 4px 0 0; font-size: 13px; color: var(--muted); } .icon-button { display: grid; place-items: center; width: 34px; height: 34px; padding: 0; border: 1px solid #d8d8d8; border-radius: 6px; color: #666; background: #fff; cursor: pointer; } .icon-button:hover:not(:disabled) { color: #222; border-color: #aaa; } .icon-button:disabled { cursor: wait; opacity: 0.6; } .icon-button svg { width: 15px; height: 15px; } .is-spinning { animation: spin 900ms linear infinite; } .back-link { display: inline-flex; align-items: center; gap: 7px; padding: 0; border: 0; font-size: 13px; color: var(--muted); background: transparent; cursor: pointer; } .back-link:hover { color: var(--ink); } .back-link svg { width: 15px; height: 15px; } .table-empty { display: grid; min-height: 150px; place-items: center; padding: 24px; font-size: 13px; color: var(--muted); text-align: center; } .incidents-panel { display: flex; min-height: 0; flex-direction: column; } @keyframes spin { to { transform: rotate(360deg); } } @keyframes blink { 50% { opacity: 0.35; } } @keyframes loading-pulse { 50% { opacity: 0.4; transform: scale(0.94); } } @keyframes skeleton { to { background-position: -220% 0; } } @keyframes enter { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 1000px) { .form-actions { grid-column: span 1; } .form-actions.compact-actions { grid-column: span 2; } } @media (max-width: 760px) { .dashboard-header-inner, .dashboard-main { width: min(100% - 32px, 1280px); } .status-header-inner, .status-main, .status-footer { width: min(100% - 32px, 960px); } .dashboard-main { padding: 40px 0 56px; } .form-actions { grid-column: auto; } .form-actions { justify-content: stretch; } .form-actions.compact-actions { grid-column: auto; } .form-actions button { flex: 1; } } @media (max-width: 520px) { .dashboard-header-inner { height: 62px; } .status-header-action { min-height: 36px; padding: 6px 14px; } .public-services-heading .icon-button { flex: 0 0 44px; width: 44px; height: 44px; } .dashboard-main { padding-top: 32px; } .dashboard-intro > div > p:last-child { font-size: 19px; line-height: 1.5; } .panel-heading { min-height: 70px; padding: 14px 16px; } .service-row { padding: 18px 16px; } .row-actions { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) repeat(3, 40px); justify-content: space-between; justify-self: stretch; width: 100%; max-width: none; margin: 0; padding: 3px; border: 1px solid #dedede; border-radius: 9px; background: #f8f8f8; box-shadow: 0 1px 2px rgb(0 0 0 / 0.035); } .row-actions::before { display: none; } .row-action { min-height: 40px; } .row-action-icon { width: 40px; } } @media (max-width: 380px) { .row-action-labeled svg { display: none; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } @media (max-width: 640px) { .panel-heading { grid-template-columns: 1fr; align-items: stretch; flex-direction: column; } } @theme inline { --font-sans: 'DM Sans', 'Helvetica Neue', sans-serif; --font-mono: 'IBM Plex Mono', monospace; --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar: var(--sidebar); --color-chart-5: var(--chart-5); --color-chart-4: var(--chart-4); --color-chart-3: var(--chart-3); --color-chart-2: var(--chart-2); --color-chart-1: var(--chart-1); --color-chart-down: var(--chart-down); --color-chart-degraded: var(--chart-degraded); --color-ring: var(--ring); --color-input: var(--input); --color-border: var(--border); --color-destructive: var(--destructive); --color-accent-foreground: var(--accent-foreground); --color-accent: var(--accent); --color-muted-foreground: var(--muted-foreground); --color-muted: var(--shadcn-muted); --color-secondary-foreground: var(--secondary-foreground); --color-secondary: var(--secondary); --color-primary-foreground: var(--primary-foreground); --color-primary: var(--shadcn-primary); --color-popover-foreground: var(--popover-foreground); --color-popover: var(--popover); --color-card-foreground: var(--card-foreground); --color-card: var(--card); --color-foreground: var(--foreground); --color-background: var(--background); --radius-sm: calc(var(--radius) * 0.6); --radius-md: calc(var(--radius) * 0.8); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) * 1.4); --radius-2xl: calc(var(--radius) * 1.8); --radius-3xl: calc(var(--radius) * 2.2); --radius-4xl: calc(var(--radius) * 2.6); } .dark { /* Semantic text and surface tokens used by both page styles and shared UI. */ --ink: #f3f4f6; --muted: #aeb4bf; --faint: #858d9a; --hairline: rgb(255 255 255 / 0.12); --soft: #171a20; --primary-deep: #3ecf8e; --background: oklch(0.145 0 0); --foreground: oklch(0.985 0 0); --card: oklch(0.205 0 0); --card-foreground: oklch(0.985 0 0); --popover: oklch(0.205 0 0); --popover-foreground: oklch(0.985 0 0); --shadcn-primary: oklch(0.922 0 0); --primary-foreground: oklch(0.205 0 0); --secondary: oklch(0.269 0 0); --secondary-foreground: oklch(0.985 0 0); --shadcn-muted: oklch(0.269 0 0); --muted-foreground: oklch(0.76 0 0); --accent: oklch(0.269 0 0); --accent-foreground: oklch(0.985 0 0); --destructive: oklch(0.704 0.191 22.216); --border: oklch(1 0 0 / 10%); --input: oklch(1 0 0 / 15%); --ring: oklch(0.556 0 0); --chart-1: oklch(0.87 0 0); --chart-2: oklch(0.556 0 0); --chart-3: oklch(0.439 0 0); --chart-4: oklch(0.371 0 0); --chart-5: oklch(0.269 0 0); --sidebar: oklch(0.205 0 0); --sidebar-foreground: oklch(0.985 0 0); --sidebar-primary: oklch(0.488 0.243 264.376); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.269 0 0); --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); --sidebar-ring: oklch(0.556 0 0); }