@import "tailwindcss" source(none);
@source "../views*.rl.html";
@source "../../public/js/app.js";
@source "../../src*.rs";
@custom-variant dark (&:where(.dark, .dark *));
@font-face {
font-family: Inter;
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url("/fonts/inter-latin-ext.woff2") format("woff2");
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: Inter;
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url("/fonts/inter-latin.woff2") format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@theme {
--color-ink-50: oklch(0.971 0.007 248);
--color-ink-100: oklch(0.958 0.009 248);
--color-ink-200: oklch(0.934 0.013 251);
--color-ink-300: oklch(0.909 0.017 251);
--color-ink-400: oklch(0.699 0.041 247);
--color-ink-500: oklch(0.554 0.041 257);
--color-ink-600: oklch(0.495 0.059 248);
--color-ink-700: oklch(0.414 0.055 248);
--color-ink-800: oklch(0.296 0.072 251);
--color-ink-900: oklch(0.248 0.065 251);
--color-ink-950: oklch(0.190 0.055 251);
--color-brand-50: oklch(0.970 0.009 252.0);
--color-brand-100: oklch(0.932 0.020 252.0);
--color-brand-200: oklch(0.882 0.038 252.0);
--color-brand-300: oklch(0.809 0.067 252.0);
--color-brand-400: oklch(0.707 0.106 252.0);
--color-brand-500: oklch(0.623 0.137 252.0);
--color-brand-600: oklch(0.546 0.157 252.0);
--color-brand-700: oklch(0.488 0.156 252.0);
--color-brand-800: oklch(0.424 0.127 252.0);
--color-brand-900: oklch(0.379 0.093 252.0);
--color-brand-950: oklch(0.282 0.070 252.0);
--font-sans: Inter, ui-sans-serif, system-ui, -apple-system,
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
--font-mono: ui-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
--text-sm: 0.8125rem;
--text-sm--line-height: 1.25rem;
--radius-lg: 0.625rem;
--radius-card: 0.75rem;
}
@layer base {
input[type="checkbox"],
input[type="radio"] {
accent-color: var(--color-brand-700);
width: 0.9375rem;
height: 0.9375rem;
}
}
@utility field-label {
@apply mb-1.5 block text-xs font-bold text-ink-700 dark:text-ink-300;
}
@utility field-input {
@apply block w-full rounded-lg border border-ink-300 bg-white px-3.5 py-2.5 text-sm
text-ink-900 transition
placeholder:text-ink-400
focus:border-brand-500 focus:outline-none focus:ring-2 focus:ring-brand-500/30
disabled:cursor-not-allowed disabled:bg-ink-100
dark:border-ink-700 dark:bg-ink-900 dark:text-ink-100 dark:placeholder:text-ink-500
dark:disabled:bg-ink-800;
}
@utility search-input {
@apply bg-ink-50 dark:bg-ink-950/60;
&:focus {
@apply bg-white dark:bg-ink-900;
}
}
@utility field-icon {
@apply pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2
text-ink-400 dark:text-ink-500;
}
@utility field-input-invalid {
@apply border-red-500 focus:border-red-500 focus:ring-red-500/30;
}
@utility field-error {
@apply mt-1.5 text-sm text-red-600 dark:text-red-400;
}
@utility field-hint {
@apply mt-1.5 text-sm text-ink-500 dark:text-ink-400;
}
@utility btn {
@apply inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2.5 text-sm
font-semibold transition select-none
focus:outline-none focus:ring-2 focus:ring-offset-2
focus:ring-offset-white dark:focus:ring-offset-ink-950
disabled:cursor-not-allowed disabled:opacity-60;
}
@utility btn-primary {
@apply btn bg-brand-700 text-white hover:bg-brand-800 focus:ring-brand-600;
}
@utility btn-secondary {
@apply btn border border-ink-200 bg-white text-ink-700
hover:bg-ink-50 focus:ring-ink-400
dark:border-ink-700 dark:bg-ink-900 dark:text-ink-200 dark:hover:bg-ink-800;
}
@utility btn-success {
@apply btn bg-emerald-600 text-white hover:bg-emerald-700 focus:ring-emerald-500;
}
@utility btn-danger {
@apply btn bg-red-600 text-white shadow-xs hover:bg-red-700 focus:ring-red-500;
}
@utility btn-ghost {
@apply btn text-ink-600 hover:bg-ink-100 focus:ring-ink-400
dark:text-ink-300 dark:hover:bg-ink-800;
}
@utility btn-sm {
@apply px-2.5 py-1.5 text-xs;
}
@utility card {
@apply rounded-card border border-ink-200 bg-white
dark:border-ink-800 dark:bg-ink-900;
}
@utility card-header {
@apply border-b border-ink-200 px-4 py-3.5 dark:border-ink-800;
}
@utility card-body {
@apply px-4 py-3.5;
}
@utility badge {
@apply inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold
ring-1 ring-inset;
}
@utility badge-neutral {
@apply badge bg-ink-100 text-ink-700 ring-ink-500/20
dark:bg-ink-800 dark:text-ink-300 dark:ring-ink-400/20;
}
@utility badge-success {
@apply badge bg-green-50 text-green-700 ring-green-600/20
dark:bg-green-500/10 dark:text-green-400 dark:ring-green-500/30;
}
@utility badge-warning {
@apply badge bg-amber-50 text-amber-800 ring-amber-600/20
dark:bg-amber-500/10 dark:text-amber-400 dark:ring-amber-500/30;
}
@utility badge-danger {
@apply badge bg-red-50 text-red-700 ring-red-600/20
dark:bg-red-500/10 dark:text-red-400 dark:ring-red-500/30;
}
@utility table-wrap {
@apply overflow-x-auto;
}
@utility table {
@apply w-full text-left text-sm;
& th {
@apply whitespace-nowrap px-4 py-3 text-[10px] font-bold uppercase tracking-[0.05em]
text-ink-400 dark:text-ink-500;
}
& td {
@apply border-t border-ink-200 px-4 py-3 align-middle
text-ink-700 dark:border-ink-800 dark:text-ink-300;
}
& tbody tr:hover {
@apply bg-ink-50 dark:bg-ink-800/50;
}
}
@utility badge-brand {
@apply badge bg-brand-50 text-brand-700 ring-brand-600/20
dark:bg-brand-500/10 dark:text-brand-400 dark:ring-brand-500/30;
}
@utility icon-action {
@apply inline-flex h-8 w-8 items-center justify-center rounded-full transition
focus:outline-none focus:ring-2 focus:ring-offset-1
focus:ring-offset-white dark:focus:ring-offset-ink-900;
}
@utility icon-action-neutral {
@apply icon-action bg-ink-100 text-ink-600 hover:bg-ink-200 focus:ring-ink-400
dark:bg-ink-800 dark:text-ink-300 dark:hover:bg-ink-700;
}
@utility icon-action-brand {
@apply icon-action bg-brand-50 text-brand-600 hover:bg-brand-100 focus:ring-brand-500
dark:bg-brand-500/10 dark:text-brand-400 dark:hover:bg-brand-500/20;
}
@utility icon-action-violet {
@apply icon-action bg-violet-50 text-violet-600 hover:bg-violet-100 focus:ring-violet-500
dark:bg-violet-500/10 dark:text-violet-400 dark:hover:bg-violet-500/20;
}
@utility icon-action-emerald {
@apply icon-action bg-emerald-50 text-emerald-600 hover:bg-emerald-100 focus:ring-emerald-500
dark:bg-emerald-500/10 dark:text-emerald-400 dark:hover:bg-emerald-500/20;
}
@utility icon-action-amber {
@apply icon-action bg-amber-50 text-amber-600 hover:bg-amber-100 focus:ring-amber-500
dark:bg-amber-500/10 dark:text-amber-400 dark:hover:bg-amber-500/20;
}
@utility icon-action-danger {
@apply icon-action bg-red-50 text-red-600 hover:bg-red-100 focus:ring-red-500
dark:bg-red-500/10 dark:text-red-400 dark:hover:bg-red-500/20;
}
@utility stat-tint {
@apply flex h-9 w-9 items-center justify-center rounded-lg;
}
@utility app-sidebar {
background-color: var(--sidebar-bg, oklch(0.296 0.072 251));
color: var(--sidebar-text, oklch(0.760 0.045 250));
}
@utility nav-link {
@apply flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition;
color: var(--sidebar-text, oklch(0.760 0.045 250));
:root[data-rail] & {
@apply justify-center px-0;
}
&:hover {
background-color: color-mix(in oklab, var(--sidebar-active-bg, oklch(0.360 0.080 251)) 55%, transparent);
color: var(--sidebar-active-text, #fff);
}
}
@utility nav-link-active {
background-color: var(--sidebar-active-bg, oklch(0.360 0.080 251));
color: var(--sidebar-active-text, #fff);
font-weight: 600;
}
@utility nav-label {
:root[data-rail] & {
@apply hidden;
}
}
@utility nav-heading {
@apply mt-5 px-3 pb-1 text-[10px] font-bold uppercase tracking-[0.08em];
color: color-mix(in oklab, var(--sidebar-text, oklch(0.760 0.045 250)) 70%, transparent);
:root[data-rail] & {
@apply mx-3 mt-3 h-px overflow-hidden p-0 text-transparent;
background-color: color-mix(in oklab, var(--sidebar-text, oklch(0.760 0.045 250)) 22%, transparent);
}
}
@utility rail-width {
@media (width >= 64rem) {
:root[data-rail] & {
width: calc(var(--spacing) * 16);
}
}
}
@utility sidebar-rule {
border-color: color-mix(in oklab, var(--sidebar-text, oklch(0.760 0.045 250)) 22%, transparent);
}
@utility auth-hero {
background-image: linear-gradient(
160deg,
var(--login-from, oklch(0.296 0.072 251)),
var(--login-to, oklch(0.424 0.127 252))
);
}
@utility avatar-sm {
@apply inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full
bg-brand-600 text-[10px] font-semibold text-white;
}
@utility page-link {
@apply inline-flex h-8 min-w-8 items-center justify-center rounded-lg px-2 text-sm
font-medium text-ink-600 transition
hover:bg-ink-100 hover:text-ink-900
dark:text-ink-400 dark:hover:bg-ink-800 dark:hover:text-ink-100;
}
@utility page-link-current {
@apply bg-brand-600 text-white hover:bg-brand-600 hover:text-white
dark:bg-brand-600 dark:text-white dark:hover:bg-brand-600;
}
@utility btn-danger {
@apply inline-flex items-center justify-center gap-2 rounded-lg bg-red-600 px-4 py-2
text-sm font-medium text-white shadow-xs transition
hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2
disabled:cursor-not-allowed disabled:opacity-60
dark:focus:ring-offset-ink-900;
}
@utility tab-pill {
@apply inline-flex items-center rounded-lg px-3 py-1.5 text-sm font-medium
text-ink-600 transition hover:bg-ink-100 hover:text-ink-900
dark:text-ink-400 dark:hover:bg-ink-800 dark:hover:text-ink-100;
}
@utility tab-pill-current {
@apply bg-brand-600 text-white hover:bg-brand-600 hover:text-white
dark:bg-brand-600 dark:text-white dark:hover:bg-brand-600;
}
@utility menu-handle {
@apply inline-flex h-7 w-7 shrink-0 cursor-grab items-center justify-center rounded-md
text-ink-400 transition hover:bg-ink-100 hover:text-ink-600
focus:outline-none focus:ring-2 focus:ring-brand-500
dark:hover:bg-ink-800 dark:hover:text-ink-300;
}
@utility icon-choice {
@apply inline-flex cursor-pointer flex-col items-center justify-center gap-1 rounded-lg
border border-ink-200 py-2.5 text-ink-500 transition
hover:border-ink-300 hover:text-ink-700
has-[:checked]:border-brand-500 has-[:checked]:bg-brand-50 has-[:checked]:text-brand-600
has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-brand-500
dark:border-ink-800 dark:text-ink-400 dark:hover:border-ink-700
dark:has-[:checked]:bg-brand-500/10 dark:has-[:checked]:text-brand-400;
}