Files
headplane/app/tailwind.css
T
2026-10-19 11:48:26 -07:00

303 lines
6.5 KiB
CSS

@import "tailwindcss";
@import "./tokens.css";
@plugin "tailwindcss-animate";
/* Dark mode: respect an explicit `.dark` / `.light` class on <html>, and fall
* back to the user's OS preference when neither is set (i.e. "system"). */
@custom-variant dark {
&:where(.dark, .dark *) {
@slot;
}
@media (prefers-color-scheme: dark) {
&:where(html:not(.light):not(.dark)),
&:where(html:not(.light):not(.dark) *) {
@slot;
}
}
}
@theme {
--blur-xs: 2px;
--height-editor: calc(100vh - 20rem);
--font-sans: "Inter Variable", -apple-system, BlinkMacSystemFont, sans-serif;
--text-xs: 0.75rem;
--text-xs--line-height: 1rem;
--text-sm: 0.8125rem;
--text-sm--line-height: 1.125rem;
--text-base: 0.875rem;
--text-base--line-height: 1.25rem;
--text-lg: 0.9375rem;
--text-lg--line-height: 1.375rem;
--text-xl: 1.25rem;
--text-xl--line-height: 1.75rem;
--transition-duration-25: 25ms;
--transition-duration-50: 50ms;
--radius-sm: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.625rem;
--animate-loading: loader 0.8s infinite ease-in-out;
@keyframes loader {
from {
transform: translateX(-100%);
}
to {
transform: translateX(100%);
}
}
}
@utility border-overlay {
border-width: 1px;
border-color: var(--hp-line);
@variant dark {
border-color: var(--hp-line-strong);
}
}
@utility focus-ring {
&:focus-visible {
outline: 2px solid var(--hp-accent);
outline-offset: 2px;
}
}
@utility focus-within-ring {
&:has(:focus-visible) {
outline: 2px solid var(--hp-accent);
outline-offset: 2px;
}
}
@utility container {
margin-inline: auto;
padding-inline: 1rem;
width: 100%;
max-width: 96rem; /* 1536px - constrain on large displays */
@media (width >= theme(--breakpoint-sm)) {
padding-inline: 2rem;
}
@media (width >= theme(--breakpoint-lg)) {
padding-inline: 4rem;
}
@media (width >= theme(--breakpoint-xl)) {
padding-inline: 5rem;
}
@media (width >= theme(--breakpoint-2xl)) {
padding-inline: 6rem;
}
}
@layer base {
html {
/* The scrollbar gutter shows the root background, not body's. */
background-color: var(--hp-canvas);
/* app/layout/scrollbar.tsx draws an overlay thumb instead, so the page
never shifts when a classic scrollbar appears. */
@media (pointer: fine) {
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
}
@apply dark:dark-tokens;
}
body {
@apply bg-canvas text-fg text-base;
font-optical-sizing: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
::-webkit-scrollbar {
width: 5px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background-color: var(--hp-line-strong);
border-radius: 5px;
}
* {
scrollbar-width: thin;
scrollbar-color: var(--hp-line-strong) transparent;
}
}
@utility dark-cm-tokens {
--cm-keyword: var(--color-purple-400);
--cm-string: var(--color-emerald-400);
--cm-variable: var(--color-cyan-400);
--cm-property: var(--color-violet-400);
--cm-atom: var(--color-orange-400);
--cm-number: var(--color-orange-400);
}
@layer base {
html {
--cm-bg: var(--hp-surface);
--cm-fg: var(--hp-fg);
--cm-caret: var(--hp-fg);
--cm-selection: var(--hp-accent-subtle);
--cm-selection-match: var(--hp-subtle);
--cm-line-highlight: var(--hp-subtle);
--cm-gutter-bg: var(--hp-canvas);
--cm-gutter-fg: var(--hp-faint);
--cm-gutter-fg-active: var(--hp-muted);
--cm-gutter-border: var(--hp-line);
--cm-comment: var(--hp-muted);
--cm-keyword: var(--color-purple-600);
--cm-string: var(--color-emerald-700);
--cm-type: var(--hp-accent);
--cm-definition: var(--hp-accent);
--cm-name: var(--hp-fg);
--cm-variable: var(--color-cyan-700);
--cm-property: var(--color-violet-600);
--cm-atom: var(--color-orange-600);
--cm-number: var(--color-orange-600);
--cm-link: var(--hp-accent);
--cm-bracket: var(--hp-muted);
@apply dark:dark-cm-tokens;
}
}
.cm-merge-theme,
.cm-mergeView,
.cm-mergeViewEditor {
height: 100% !important;
}
.cm-mergeViewEditors {
height: 100%;
}
.toast-viewport {
position: fixed;
z-index: 50;
bottom: 2rem;
right: 1rem;
left: auto;
top: auto;
width: 20rem;
}
.toast-root {
--gap: 0.75rem;
--peek: 0.75rem;
--scale: calc(max(0, 1 - (var(--toast-index) * 0.1)));
--shrink: calc(1 - var(--scale));
--height: var(--toast-frontmost-height, var(--toast-height));
--offset-y: calc(
var(--toast-offset-y) * -1 + (var(--toast-index) * var(--gap) * -1) +
var(--toast-swipe-movement-y)
);
position: absolute;
right: 0;
bottom: 0;
left: auto;
width: 100%;
height: var(--height);
z-index: calc(1000 - var(--toast-index));
transform-origin: bottom center;
user-select: none;
transform: translateX(var(--toast-swipe-movement-x))
translateY(
calc(
var(--toast-swipe-movement-y) - (var(--toast-index) * var(--peek)) -
(var(--shrink) * var(--height))
)
)
scale(var(--scale));
transition:
transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),
opacity 0.5s,
height 0.15s;
&[data-expanded] {
transform: translateX(var(--toast-swipe-movement-x)) translateY(var(--offset-y));
height: var(--toast-height);
}
&[data-starting-style] {
transform: translateY(150%);
}
&[data-ending-style] {
opacity: 0;
transform: translateY(150%);
&[data-swipe-direction="up"] {
transform: translateY(calc(var(--toast-swipe-movement-y) - 150%));
}
&[data-swipe-direction="down"] {
transform: translateY(calc(var(--toast-swipe-movement-y) + 150%));
}
&[data-swipe-direction="left"] {
transform: translateX(calc(var(--toast-swipe-movement-x) - 150%)) translateY(var(--offset-y));
}
&[data-swipe-direction="right"] {
transform: translateX(calc(var(--toast-swipe-movement-x) + 150%)) translateY(var(--offset-y));
}
}
&[data-limited] {
opacity: 0;
}
/* Invisible hit area to bridge hover gap between toasts */
&::after {
content: "";
position: absolute;
top: 100%;
left: 0;
width: 100%;
height: calc(var(--gap) + 1px);
}
}
.toast-content {
overflow: hidden;
transition: opacity 0.25s;
&[data-behind] {
opacity: 0;
}
&[data-expanded] {
opacity: 1;
}
}
.cm-mergeView .cm-editor,
.cm-mergeView .cm-editor .cm-scroller {
height: 100% !important;
}
.cm-mergeViewEditors {
scrollbar-color: var(--cm-gutter-border) transparent;
scrollbar-width: auto;
}