Files
banner/web/src/routes/layout.css

238 lines
5.4 KiB
CSS

@import "tailwindcss";
@import "@fontsource-variable/inter";
@custom-variant dark (&:where(.dark, .dark *));
:root {
--background: oklch(0.985 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--muted: oklch(0.96 0 0);
--muted-foreground: oklch(0.556 0 0);
--border: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--accent: oklch(0.96 0 0);
--accent-foreground: oklch(0.145 0 0);
--status-green: oklch(0.65 0.2 145);
--status-red: oklch(0.63 0.2 25);
--status-orange: oklch(0.75 0.18 70);
--status-gray: oklch(0.556 0 0);
}
.dark {
--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);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--border: oklch(0.269 0 0);
--ring: oklch(0.556 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--status-green: oklch(0.72 0.19 145);
--status-red: oklch(0.7 0.19 25);
--status-orange: oklch(0.8 0.16 70);
--status-gray: oklch(0.708 0 0);
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-border: var(--border);
--color-ring: var(--ring);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-status-green: var(--status-green);
--color-status-red: var(--status-red);
--color-status-orange: var(--status-orange);
--color-status-gray: var(--status-gray);
--font-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;
--animate-accordion-down: accordion-down 200ms ease-out;
--animate-accordion-up: accordion-up 200ms ease-out;
}
body {
border-color: var(--border);
background-color: var(--background);
color: var(--foreground);
font-family: var(--font-sans);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
margin: 0;
}
/* Focus styling - only visible on keyboard navigation */
*:focus {
outline: none;
}
/* Form inputs get outline-based focus directly on border */
input[type="text"]:focus-visible,
input[type="search"]:focus-visible,
input[type="email"]:focus-visible,
input[type="password"]:focus-visible,
input[type="number"]:focus-visible,
input[type="url"]:focus-visible,
input[type="tel"]:focus-visible,
select:focus-visible,
textarea:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 0;
}
/* Buttons get rounded box-shadow focus (outline doesn't support border-radius) */
button:focus-visible {
outline: none;
box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--ring);
}
/* Checkboxes get direct outline focus */
input[type="checkbox"]:focus-visible,
input[type="radio"]:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
/* Checkbox styling - theme-aware appearance */
input[type="checkbox"] {
appearance: none;
width: 1rem;
height: 1rem;
border: 1.5px solid var(--border);
border-radius: 0.25rem;
background-color: var(--card);
cursor: pointer;
display: inline-grid;
place-content: center;
flex-shrink: 0;
}
input[type="checkbox"]:checked {
background-color: var(--foreground);
border-color: var(--foreground);
}
input[type="checkbox"]:checked::before {
content: "";
width: 0.5rem;
height: 0.5rem;
background-color: var(--background);
clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
}
/* View Transitions API - disable default cross-fade so JS can animate clip-path */
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
}
/* OverlayScrollbars — custom handle colors per theme */
:root .os-scrollbar {
--os-handle-bg: rgba(0, 0, 0, 0.25);
--os-handle-bg-hover: rgba(0, 0, 0, 0.35);
--os-handle-bg-active: rgba(0, 0, 0, 0.45);
}
.dark .os-scrollbar {
--os-handle-bg: rgba(255, 255, 255, 0.35);
--os-handle-bg-hover: rgba(255, 255, 255, 0.45);
--os-handle-bg-active: rgba(255, 255, 255, 0.55);
}
.os-scrollbar-handle {
border-radius: 4px;
}
/* Hide native scrollbars on body — OverlayScrollbars takes over */
html,
body {
scrollbar-width: none;
-ms-overflow-style: none;
}
html::-webkit-scrollbar,
body::-webkit-scrollbar {
display: none;
}
/* Native scrollbars — theme-aware styling for inner scrollable elements */
* {
scrollbar-width: thin;
scrollbar-color: rgba(0, 0, 0, 0.25) transparent;
}
.dark * {
scrollbar-color: rgba(255, 255, 255, 0.3) transparent;
}
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, 0.25);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(0, 0, 0, 0.35);
}
.dark ::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.3);
}
.dark ::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.4);
}
@keyframes accordion-down {
from {
height: 0;
opacity: 0;
}
to {
height: var(--bits-accordion-content-height);
opacity: 1;
}
}
@keyframes accordion-up {
from {
height: var(--bits-accordion-content-height);
opacity: 1;
}
to {
height: 0;
opacity: 0;
}
}
@keyframes pulse {
0%,
100% {
opacity: 0.2;
}
50% {
opacity: 0.4;
}
}
.animate-pulse {
animation: pulse 2s ease-in-out infinite;
}