g1t/apps/sudo/app/app.css

136 lines3,339 bytesCodeBlame
1@import "tailwindcss" source(".");
2@import "@g1t/theme/tokens.css";
3@import "@g1t/theme/fonts.css";
4
5/* Tailwind's names for the shared g1t tokens, as in apps/web. */
6@theme {
7 --font-sans: var(--g1t-font-sans);
8 --font-display: var(--g1t-font-display);
9 --font-mono: var(--g1t-font-mono);
10
11 --color-bg: var(--g1t-bg);
12 --color-surface: var(--g1t-surface);
13 --color-raised: var(--g1t-raised);
14 --color-line: var(--g1t-line);
15 --color-line-strong: var(--g1t-line-strong);
16
17 --color-fg: var(--g1t-fg);
18 --color-fg-soft: var(--g1t-fg-soft);
19 --color-muted: var(--g1t-muted);
20 --color-faint: var(--g1t-faint);
21
22 --color-accent: var(--g1t-accent);
23 --color-accent-dim: var(--g1t-accent-dim);
24
25 --color-info: var(--g1t-info);
26 --color-merged: var(--g1t-merged);
27 --color-warn: var(--g1t-warn);
28 --color-danger: var(--g1t-danger);
29}
30
31html {
32 color-scheme: dark;
33}
34
35body {
36 @apply bg-bg font-sans text-fg antialiased;
37}
38
39::selection {
40 background: color-mix(in srgb, var(--color-merged) 35%, transparent);
41}
42
43@layer base {
44 :focus-visible {
45 outline: 2px solid var(--color-merged);
46 outline-offset: 2px;
47 }
48
49 .grid > * {
50 min-width: 0;
51 }
52
53 /* Page titles in the headline face, as on g1t.sh. */
54 :where(h1) {
55 font-family: var(--font-display);
56 font-optical-sizing: auto;
57 }
58
59 :root {
60 accent-color: var(--color-merged);
61 }
62
63 /* Figures line up in columns of money. */
64 .tabular {
65 font-variant-numeric: tabular-nums;
66 }
67}
68
69/*
70 * sudo ships no JavaScript, so a long-running button says it is running
71 * with CSS alone: a clicked button keeps focus while the old page waits for
72 * the response. `:focus-visible` is left out, so tabbing to it does not
73 * read as running.
74 */
75.run-button .run-busy,
76.run-button + .run-note {
77 display: none;
78}
79.run-button:focus:not(:focus-visible) .run-idle {
80 display: none;
81}
82.run-button:focus:not(:focus-visible) .run-busy {
83 display: inline-flex;
84 align-items: center;
85 gap: 0.5rem;
86}
87.run-button:focus:not(:focus-visible) + .run-note {
88 display: inline;
89}
90.run-spinner {
91 width: 0.8rem;
92 height: 0.8rem;
93 border-radius: 9999px;
94 border: 2px solid currentColor;
95 border-right-color: transparent;
96 animation: run-spin 0.8s linear infinite;
97}
98@keyframes run-spin {
99 to {
100 transform: rotate(360deg);
101 }
102}
103@media (prefers-reduced-motion: reduce) {
104 .run-spinner {
105 animation: none;
106 }
107}
108
109/*
110 * Every other submit button says it is working the same way: a clicked
111 * button keeps focus while the page waits for the answer, so it dims
112 * and shows a spinner. The page that comes back is
113 * fresh (every action redirects), and says what happened. Nothing may
114 * stop pointer events here: focus comes on mouse-down, before the click.
115 */
116form button[type="submit"]:not(.run-button):focus:not(:focus-visible) {
117 opacity: 0.75;
118}
119form button[type="submit"]:not(.run-button):focus:not(:focus-visible)::before {
120 content: "";
121 flex: none;
122 width: 0.8rem;
123 height: 0.8rem;
124 border-radius: 9999px;
125 border: 2px solid currentColor;
126 border-right-color: transparent;
127 animation: run-spin 0.8s linear infinite;
128}
129form button[type="submit"]:not(.run-button):focus:not(:focus-visible) > svg {
130 display: none;
131}
132@media (prefers-reduced-motion: reduce) {
133 form button[type="submit"]:focus:not(:focus-visible)::before {
134 animation: none;
135 }
136}