1@tailwind base;
2@tailwind components;
3@tailwind utilities;
4@layer base {
5 @font-face {
6 font-family: "InterVariable";
7 src: url("/static/fonts/InterVariable.woff2") format("woff2");
8 font-weight: normal;
9 font-style: normal;
10 font-display: swap;
11 }
12
13 @font-face {
14 font-family: "InterVariable";
15 src: url("/static/fonts/InterVariable-Italic.woff2") format("woff2");
16 font-weight: normal;
17 font-style: italic;
18 font-display: swap;
19 }
20
21 @font-face {
22 font-family: "InterVariable";
23 src: url("/static/fonts/InterDisplay-Bold.woff2") format("woff2");
24 font-weight: bold;
25 font-style: normal;
26 font-display: swap;
27 }
28
29 @font-face {
30 font-family: "InterVariable";
31 src: url("/static/fonts/InterDisplay-BoldItalic.woff2") format("woff2");
32 font-weight: bold;
33 font-style: italic;
34 font-display: swap;
35 }
36
37 @font-face {
38 font-family: "IBMPlexMono";
39 src: url("/static/fonts/IBMPlexMono-Regular.woff2") format("woff2");
40 font-weight: normal;
41 font-style: normal;
42 font-display: swap;
43 }
44
45 @font-face {
46 font-family: "IBMPlexMono";
47 src: url("/static/fonts/IBMPlexMono-Italic.woff2") format("woff2");
48 font-weight: normal;
49 font-style: italic;
50 font-display: swap;
51 }
52
53 @font-face {
54 font-family: "IBMPlexMono";
55 src: url("/static/fonts/IBMPlexMono-Bold.woff2") format("woff2");
56 font-weight: bold;
57 font-style: normal;
58 font-display: swap;
59 }
60
61 @font-face {
62 font-family: "IBMPlexMono";
63 src: url("/static/fonts/IBMPlexMono-BoldItalic.woff2") format("woff2");
64 font-weight: bold;
65 font-style: italic;
66 font-display: swap;
67 }
68
69 ::selection {
70 @apply bg-yellow-400 text-black bg-opacity-30 dark:bg-yellow-600 dark:bg-opacity-50 dark:text-white;
71 }
72
73 @layer base {
74 html {
75 font-size: 14px;
76 scrollbar-gutter: stable;
77 }
78 @supports (font-variation-settings: normal) {
79 html {
80 font-feature-settings:
81 "kern" 1,
82 "liga" 1,
83 "cv05" 1,
84 "tnum" 1;
85 }
86 }
87
88 a {
89 @apply no-underline text-black hover:underline hover:text-gray-800 dark:text-white dark:hover:text-gray-300;
90 }
91
92 label {
93 @apply block text-gray-900 text-sm font-bold py-2 uppercase dark:text-gray-100;
94 }
95 input {
96 @apply border border-gray-400 block rounded bg-gray-50 focus:ring-black p-3 dark:bg-gray-800 dark:border-gray-600 dark:text-white dark:focus:ring-gray-400;
97 }
98 textarea {
99 @apply border border-gray-400 block rounded bg-gray-50 focus:ring-black p-3 dark:bg-gray-800 dark:border-gray-600 dark:text-white dark:focus:ring-gray-400;
100 }
101 details summary::-webkit-details-marker {
102 display: none;
103 }
104
105 code {
106 @apply font-mono rounded bg-gray-100 dark:bg-gray-700 text-black dark:text-white;
107 }
108 }
109
110 @layer components {
111 .btn {
112 @apply relative z-10 inline-flex min-h-[30px] cursor-pointer items-center justify-center
113 bg-transparent px-2 pb-[0.2rem] text-sm text-gray-900
114 before:absolute before:inset-0 before:-z-10 before:block before:rounded
115 before:border before:border-gray-200 before:bg-white
116 before:shadow-[inset_0_-2px_0_0_rgba(0,0,0,0.1),0_1px_0_0_rgba(0,0,0,0.04)]
117 before:content-[''] before:transition-all before:duration-150 before:ease-in-out
118 hover:before:shadow-[inset_0_-2px_0_0_rgba(0,0,0,0.15),0_2px_1px_0_rgba(0,0,0,0.06)]
119 hover:before:bg-gray-50
120 dark:hover:before:bg-gray-700
121 active:before:shadow-[inset_0_2px_2px_0_rgba(0,0,0,0.1)]
122 focus:outline-none focus-visible:before:outline focus-visible:before:outline-2 focus-visible:before:outline-gray-400
123 disabled:cursor-not-allowed disabled:opacity-50
124 dark:text-gray-100 dark:before:bg-gray-800 dark:before:border-gray-700;
125 }
126
127 .btn-create {
128 @apply btn text-white
129 before:bg-green-600 hover:before:bg-green-700
130 dark:before:bg-green-700 dark:hover:before:bg-green-800
131 before:border before:border-green-700 hover:before:border-green-800
132 focus-visible:before:outline-green-500
133 disabled:before:bg-green-400 dark:disabled:before:bg-green-600;
134 }
135
136 .prose hr {
137 @apply my-2;
138 }
139
140 .prose li:has(input) {
141 @apply list-none;
142 }
143
144 .prose ul:has(input) {
145 @apply pl-2;
146 }
147
148 .prose .heading .anchor {
149 @apply no-underline mx-2 opacity-0;
150 }
151
152 .prose .heading:hover .anchor {
153 @apply opacity-70;
154 }
155
156 .prose .heading .anchor:hover {
157 @apply opacity-70;
158 }
159
160 .prose a.footnote-backref {
161 @apply no-underline;
162 }
163
164 .prose a.mention {
165 @apply no-underline hover:underline;
166 }
167
168 .prose li {
169 @apply my-0 py-0;
170 }
171
172 .prose ul,
173 .prose ol {
174 @apply my-1 py-0;
175 }
176
177 .prose img {
178 display: inline;
179 margin: 0;
180 vertical-align: middle;
181 }
182
183 .prose input {
184 @apply inline-block my-0 mb-1 mx-1;
185 }
186
187 .prose input[type="checkbox"] {
188 @apply disabled:accent-blue-500 checked:accent-blue-500 disabled:checked:accent-blue-500;
189 }
190
191 /* Base callout */
192 details[data-callout] {
193 @apply border-l-4 pl-3 py-2 text-gray-800 dark:text-gray-200 my-4;
194 }
195
196 details[data-callout] > summary {
197 @apply font-bold cursor-pointer mb-1;
198 }
199
200 details[data-callout] > .callout-content {
201 @apply text-sm leading-snug;
202 }
203
204 /* Note (blue) */
205 details[data-callout="note" i] {
206 @apply border-blue-400 dark:border-blue-500;
207 }
208 details[data-callout="note" i] > summary {
209 @apply text-blue-700 dark:text-blue-400;
210 }
211
212 /* Important (purple) */
213 details[data-callout="important" i] {
214 @apply border-purple-400 dark:border-purple-500;
215 }
216 details[data-callout="important" i] > summary {
217 @apply text-purple-700 dark:text-purple-400;
218 }
219
220 /* Warning (yellow) */
221 details[data-callout="warning" i] {
222 @apply border-yellow-400 dark:border-yellow-500;
223 }
224 details[data-callout="warning" i] > summary {
225 @apply text-yellow-700 dark:text-yellow-400;
226 }
227
228 /* Caution (red) */
229 details[data-callout="caution" i] {
230 @apply border-red-400 dark:border-red-500;
231 }
232 details[data-callout="caution" i] > summary {
233 @apply text-red-700 dark:text-red-400;
234 }
235
236 /* Tip (green) */
237 details[data-callout="tip" i] {
238 @apply border-green-400 dark:border-green-500;
239 }
240 details[data-callout="tip" i] > summary {
241 @apply text-green-700 dark:text-green-400;
242 }
243
244 /* Optional: hide the disclosure arrow like GitHub */
245 details[data-callout] > summary::-webkit-details-marker {
246 display: none;
247 }
248 }
249 @layer utilities {
250 .error {
251 @apply py-1 text-red-400 dark:text-red-300;
252 }
253 .success {
254 @apply py-1 text-gray-900 dark:text-gray-100;
255 }
256 }
257}
258
259/* Background */
260.bg {
261 color: #4c4f69;
262 background-color: #eff1f5;
263}
264/* PreWrapper */
265.chroma {
266 color: #4c4f69;
267}
268/* Error */
269.chroma .err {
270 color: #d20f39;
271}
272/* LineLink */
273.chroma .lnlinks {
274 outline: none;
275 text-decoration: none;
276 color: inherit;
277}
278/* LineTableTD */
279.chroma .lntd {
280 vertical-align: top;
281 padding: 0;
282 margin: 0;
283 border: 0;
284}
285/* LineTable */
286.chroma .lntable {
287 border-spacing: 0;
288 padding: 0;
289 margin: 0;
290 border: 0;
291}
292/* LineHighlight */
293.chroma .hl {
294 @apply bg-amber-400/30 dark:bg-amber-500/20;
295}
296
297/* LineNumbersTable */
298.chroma .lnt {
299 white-space: pre;
300 -webkit-user-select: none;
301 user-select: none;
302 margin-right: 0.4em;
303 padding: 0 0.4em 0 0.4em;
304 color: #8c8fa1;
305}
306/* LineNumbers */
307.chroma .ln {
308 white-space: pre;
309 -webkit-user-select: none;
310 user-select: none;
311 margin-right: 0.4em;
312 padding: 0 0.4em 0 0.4em;
313 color: #8c8fa1;
314}
315/* Line */
316.chroma .line {
317 display: flex;
318}
319/* Keyword */
320.chroma .k {
321 color: #8839ef;
322}
323/* KeywordConstant */
324.chroma .kc {
325 color: #fe640b;
326}
327/* KeywordDeclaration */
328.chroma .kd {
329 color: #d20f39;
330}
331/* KeywordNamespace */
332.chroma .kn {
333 color: #179299;
334}
335/* KeywordPseudo */
336.chroma .kp {
337 color: #8839ef;
338}
339/* KeywordReserved */
340.chroma .kr {
341 color: #8839ef;
342}
343/* KeywordType */
344.chroma .kt {
345 color: #d20f39;
346}
347/* NameAttribute */
348.chroma .na {
349 color: #1e66f5;
350}
351/* NameBuiltin */
352.chroma .nb {
353 color: #04a5e5;
354}
355/* NameBuiltinPseudo */
356.chroma .bp {
357 color: #04a5e5;
358}
359/* NameClass */
360.chroma .nc {
361 color: #df8e1d;
362}
363/* NameConstant */
364.chroma .no {
365 color: #df8e1d;
366}
367/* NameDecorator */
368.chroma .nd {
369 color: #1e66f5;
370 font-weight: bold;
371}
372/* NameEntity */
373.chroma .ni {
374 color: #179299;
375}
376/* NameException */
377.chroma .ne {
378 color: #fe640b;
379}
380/* NameFunction */
381.chroma .nf {
382 color: #1e66f5;
383}
384/* NameFunctionMagic */
385.chroma .fm {
386 color: #1e66f5;
387}
388/* NameLabel */
389.chroma .nl {
390 color: #04a5e5;
391}
392/* NameNamespace */
393.chroma .nn {
394 color: #fe640b;
395}
396/* NameProperty */
397.chroma .py {
398 color: #fe640b;
399}
400/* NameTag */
401.chroma .nt {
402 color: #8839ef;
403}
404/* NameVariable */
405.chroma .nv {
406 color: #dc8a78;
407}
408/* NameVariableClass */
409.chroma .vc {
410 color: #dc8a78;
411}
412/* NameVariableGlobal */
413.chroma .vg {
414 color: #dc8a78;
415}
416/* NameVariableInstance */
417.chroma .vi {
418 color: #dc8a78;
419}
420/* NameVariableMagic */
421.chroma .vm {
422 color: #dc8a78;
423}
424/* LiteralString */
425.chroma .s {
426 color: #40a02b;
427}
428/* LiteralStringAffix */
429.chroma .sa {
430 color: #d20f39;
431}
432/* LiteralStringBacktick */
433.chroma .sb {
434 color: #40a02b;
435}
436/* LiteralStringChar */
437.chroma .sc {
438 color: #40a02b;
439}
440/* LiteralStringDelimiter */
441.chroma .dl {
442 color: #1e66f5;
443}
444/* LiteralStringDoc */
445.chroma .sd {
446 color: #9ca0b0;
447}
448/* LiteralStringDouble */
449.chroma .s2 {
450 color: #40a02b;
451}
452/* LiteralStringEscape */
453.chroma .se {
454 color: #1e66f5;
455}
456/* LiteralStringHeredoc */
457.chroma .sh {
458 color: #9ca0b0;
459}
460/* LiteralStringInterpol */
461.chroma .si {
462 color: #40a02b;
463}
464/* LiteralStringOther */
465.chroma .sx {
466 color: #40a02b;
467}
468/* LiteralStringRegex */
469.chroma .sr {
470 color: #179299;
471}
472/* LiteralStringSingle */
473.chroma .s1 {
474 color: #40a02b;
475}
476/* LiteralStringSymbol */
477.chroma .ss {
478 color: #40a02b;
479}
480/* LiteralNumber */
481.chroma .m {
482 color: #fe640b;
483}
484/* LiteralNumberBin */
485.chroma .mb {
486 color: #fe640b;
487}
488/* LiteralNumberFloat */
489.chroma .mf {
490 color: #fe640b;
491}
492/* LiteralNumberHex */
493.chroma .mh {
494 color: #fe640b;
495}
496/* LiteralNumberInteger */
497.chroma .mi {
498 color: #fe640b;
499}
500/* LiteralNumberIntegerLong */
501.chroma .il {
502 color: #fe640b;
503}
504/* LiteralNumberOct */
505.chroma .mo {
506 color: #fe640b;
507}
508/* Operator */
509.chroma .o {
510 color: #04a5e5;
511 font-weight: bold;
512}
513/* OperatorWord */
514.chroma .ow {
515 color: #04a5e5;
516 font-weight: bold;
517}
518/* Comment */
519.chroma .c {
520 color: #9ca0b0;
521 font-style: italic;
522}
523/* CommentHashbang */
524.chroma .ch {
525 color: #9ca0b0;
526 font-style: italic;
527}
528/* CommentMultiline */
529.chroma .cm {
530 color: #9ca0b0;
531 font-style: italic;
532}
533/* CommentSingle */
534.chroma .c1 {
535 color: #9ca0b0;
536 font-style: italic;
537}
538/* CommentSpecial */
539.chroma .cs {
540 color: #9ca0b0;
541 font-style: italic;
542}
543/* CommentPreproc */
544.chroma .cp {
545 color: #9ca0b0;
546 font-style: italic;
547}
548/* CommentPreprocFile */
549.chroma .cpf {
550 color: #9ca0b0;
551 font-weight: bold;
552 font-style: italic;
553}
554/* GenericDeleted */
555.chroma .gd {
556 color: #d20f39;
557 background-color: oklch(93.6% 0.032 17.717);
558}
559/* GenericEmph */
560.chroma .ge {
561 font-style: italic;
562}
563/* GenericError */
564.chroma .gr {
565 color: #d20f39;
566}
567/* GenericHeading */
568.chroma .gh {
569 color: #fe640b;
570 font-weight: bold;
571}
572/* GenericInserted */
573.chroma .gi {
574 color: #40a02b;
575 background-color: oklch(96.2% 0.044 156.743);
576}
577/* GenericStrong */
578.chroma .gs {
579 font-weight: bold;
580}
581/* GenericSubheading */
582.chroma .gu {
583 color: #fe640b;
584 font-weight: bold;
585}
586/* GenericTraceback */
587.chroma .gt {
588 color: #d20f39;
589}
590/* GenericUnderline */
591.chroma .gl {
592 text-decoration: underline;
593}
594
595@media (prefers-color-scheme: dark) {
596 /* Background */
597 .bg {
598 color: #cad3f5;
599 background-color: #24273a;
600 }
601 /* PreWrapper */
602 .chroma {
603 color: #cad3f5;
604 }
605 /* Error */
606 .chroma .err {
607 color: #ed8796;
608 }
609 /* LineLink */
610 .chroma .lnlinks {
611 outline: none;
612 text-decoration: none;
613 color: inherit;
614 }
615 /* LineTableTD */
616 .chroma .lntd {
617 vertical-align: top;
618 padding: 0;
619 margin: 0;
620 border: 0;
621 }
622 /* LineTable */
623 .chroma .lntable {
624 border-spacing: 0;
625 padding: 0;
626 margin: 0;
627 border: 0;
628 }
629 /* LineHighlight */
630 .chroma .hl {
631 background-color: #494d64;
632 }
633 /* LineNumbersTable */
634 .chroma .lnt {
635 white-space: pre;
636 -webkit-user-select: none;
637 user-select: none;
638 margin-right: 0.4em;
639 padding: 0 0.4em 0 0.4em;
640 color: #8087a2;
641 }
642 /* LineNumbers */
643 .chroma .ln {
644 white-space: pre;
645 -webkit-user-select: none;
646 user-select: none;
647 margin-right: 0.4em;
648 padding: 0 0.4em 0 0.4em;
649 color: #8087a2;
650 }
651 /* Line */
652 .chroma .line {
653 display: flex;
654 }
655 /* Keyword */
656 .chroma .k {
657 color: #c6a0f6;
658 }
659 /* KeywordConstant */
660 .chroma .kc {
661 color: #f5a97f;
662 }
663 /* KeywordDeclaration */
664 .chroma .kd {
665 color: #ed8796;
666 }
667 /* KeywordNamespace */
668 .chroma .kn {
669 color: #8bd5ca;
670 }
671 /* KeywordPseudo */
672 .chroma .kp {
673 color: #c6a0f6;
674 }
675 /* KeywordReserved */
676 .chroma .kr {
677 color: #c6a0f6;
678 }
679 /* KeywordType */
680 .chroma .kt {
681 color: #ed8796;
682 }
683 /* NameAttribute */
684 .chroma .na {
685 color: #8aadf4;
686 }
687 /* NameBuiltin */
688 .chroma .nb {
689 color: #91d7e3;
690 }
691 /* NameBuiltinPseudo */
692 .chroma .bp {
693 color: #91d7e3;
694 }
695 /* NameClass */
696 .chroma .nc {
697 color: #eed49f;
698 }
699 /* NameConstant */
700 .chroma .no {
701 color: #eed49f;
702 }
703 /* NameDecorator */
704 .chroma .nd {
705 color: #8aadf4;
706 font-weight: bold;
707 }
708 /* NameEntity */
709 .chroma .ni {
710 color: #8bd5ca;
711 }
712 /* NameException */
713 .chroma .ne {
714 color: #f5a97f;
715 }
716 /* NameFunction */
717 .chroma .nf {
718 color: #8aadf4;
719 }
720 /* NameFunctionMagic */
721 .chroma .fm {
722 color: #8aadf4;
723 }
724 /* NameLabel */
725 .chroma .nl {
726 color: #91d7e3;
727 }
728 /* NameNamespace */
729 .chroma .nn {
730 color: #f5a97f;
731 }
732 /* NameProperty */
733 .chroma .py {
734 color: #f5a97f;
735 }
736 /* NameTag */
737 .chroma .nt {
738 color: #c6a0f6;
739 }
740 /* NameVariable */
741 .chroma .nv {
742 color: #f4dbd6;
743 }
744 /* NameVariableClass */
745 .chroma .vc {
746 color: #f4dbd6;
747 }
748 /* NameVariableGlobal */
749 .chroma .vg {
750 color: #f4dbd6;
751 }
752 /* NameVariableInstance */
753 .chroma .vi {
754 color: #f4dbd6;
755 }
756 /* NameVariableMagic */
757 .chroma .vm {
758 color: #f4dbd6;
759 }
760 /* LiteralString */
761 .chroma .s {
762 color: #a6da95;
763 }
764 /* LiteralStringAffix */
765 .chroma .sa {
766 color: #ed8796;
767 }
768 /* LiteralStringBacktick */
769 .chroma .sb {
770 color: #a6da95;
771 }
772 /* LiteralStringChar */
773 .chroma .sc {
774 color: #a6da95;
775 }
776 /* LiteralStringDelimiter */
777 .chroma .dl {
778 color: #8aadf4;
779 }
780 /* LiteralStringDoc */
781 .chroma .sd {
782 color: #6e738d;
783 }
784 /* LiteralStringDouble */
785 .chroma .s2 {
786 color: #a6da95;
787 }
788 /* LiteralStringEscape */
789 .chroma .se {
790 color: #8aadf4;
791 }
792 /* LiteralStringHeredoc */
793 .chroma .sh {
794 color: #6e738d;
795 }
796 /* LiteralStringInterpol */
797 .chroma .si {
798 color: #a6da95;
799 }
800 /* LiteralStringOther */
801 .chroma .sx {
802 color: #a6da95;
803 }
804 /* LiteralStringRegex */
805 .chroma .sr {
806 color: #8bd5ca;
807 }
808 /* LiteralStringSingle */
809 .chroma .s1 {
810 color: #a6da95;
811 }
812 /* LiteralStringSymbol */
813 .chroma .ss {
814 color: #a6da95;
815 }
816 /* LiteralNumber */
817 .chroma .m {
818 color: #f5a97f;
819 }
820 /* LiteralNumberBin */
821 .chroma .mb {
822 color: #f5a97f;
823 }
824 /* LiteralNumberFloat */
825 .chroma .mf {
826 color: #f5a97f;
827 }
828 /* LiteralNumberHex */
829 .chroma .mh {
830 color: #f5a97f;
831 }
832 /* LiteralNumberInteger */
833 .chroma .mi {
834 color: #f5a97f;
835 }
836 /* LiteralNumberIntegerLong */
837 .chroma .il {
838 color: #f5a97f;
839 }
840 /* LiteralNumberOct */
841 .chroma .mo {
842 color: #f5a97f;
843 }
844 /* Operator */
845 .chroma .o {
846 color: #91d7e3;
847 font-weight: bold;
848 }
849 /* OperatorWord */
850 .chroma .ow {
851 color: #91d7e3;
852 font-weight: bold;
853 }
854 /* Comment */
855 .chroma .c {
856 color: #6e738d;
857 font-style: italic;
858 }
859 /* CommentHashbang */
860 .chroma .ch {
861 color: #6e738d;
862 font-style: italic;
863 }
864 /* CommentMultiline */
865 .chroma .cm {
866 color: #6e738d;
867 font-style: italic;
868 }
869 /* CommentSingle */
870 .chroma .c1 {
871 color: #6e738d;
872 font-style: italic;
873 }
874 /* CommentSpecial */
875 .chroma .cs {
876 color: #6e738d;
877 font-style: italic;
878 }
879 /* CommentPreproc */
880 .chroma .cp {
881 color: #6e738d;
882 font-style: italic;
883 }
884 /* CommentPreprocFile */
885 .chroma .cpf {
886 color: #6e738d;
887 font-weight: bold;
888 font-style: italic;
889 }
890 /* GenericDeleted */
891 .chroma .gd {
892 color: #ed8796;
893 background-color: oklch(44.4% 0.177 26.899 / 0.5);
894 }
895 /* GenericEmph */
896 .chroma .ge {
897 font-style: italic;
898 }
899 /* GenericError */
900 .chroma .gr {
901 color: #ed8796;
902 }
903 /* GenericHeading */
904 .chroma .gh {
905 color: #f5a97f;
906 font-weight: bold;
907 }
908 /* GenericInserted */
909 .chroma .gi {
910 color: #a6da95;
911 background-color: oklch(44.8% 0.119 151.328 / 0.5);
912 }
913 /* GenericStrong */
914 .chroma .gs {
915 font-weight: bold;
916 }
917 /* GenericSubheading */
918 .chroma .gu {
919 color: #f5a97f;
920 font-weight: bold;
921 }
922 /* GenericTraceback */
923 .chroma .gt {
924 color: #ed8796;
925 }
926 /* GenericUnderline */
927 .chroma .gl {
928 text-decoration: underline;
929 }
930}