My personal website
1@import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=DM+Serif+Display:ital@0;1&family=DM+Mono:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap');
2
3@tailwind base;
4@tailwind components;
5@tailwind utilities;
6
7html {
8 -webkit-text-size-adjust: 100%;
9 -ms-text-size-adjust: 100%;
10 font-family: sans-serif;
11}
12
13body {
14 margin: 0;
15}
16
17/**
18 * Typography System
19 *
20 * A modular, responsive typography system using fluid type scaling.
21 * All typography components use these base classes for consistency.
22 *
23 * Design principles:
24 * - Fluid scaling from mobile (360px) to desktop (1200px)
25 * - Semantic sizing (sm, md, lg, xl, 2xl)
26 * - Optical adjustments for readability
27 * - Consistent vertical rhythm
28 */
29
30@layer base {
31 /* Typography base reset */
32 body {
33 @apply font-sans antialiased;
34 font-weight: 400;
35 text-rendering: optimizeLegibility;
36 -webkit-font-smoothing: antialiased;
37 -moz-osx-font-smoothing: grayscale;
38 }
39
40 /* Prevent layout shift during font load */
41 html {
42 font-feature-settings:
43 'kern' 1,
44 'liga' 1,
45 'calt' 1;
46 }
47}
48
49@layer components {
50 /**
51 * Typography Scale Classes
52 * Base sizing classes with optimized line heights
53 */
54
55 /* sm: Captions, footnotes, labels (14px → 16px) */
56 .type-sm {
57 @apply fluid-preset-sm;
58 line-height: 1.62;
59 }
60
61 /* base: Default text (16px → 32px) */
62 .type-base {
63 @apply fluid-preset-base;
64 line-height: 1.5;
65 }
66
67 /* md: Body copy, paragraphs (24px → 40px) */
68 .type-md {
69 @apply fluid-preset-md;
70 line-height: 1.38;
71 }
72
73 /* lg: Subheadings, lead paragraphs (18px → 24px) */
74 .type-lg {
75 @apply fluid-preset-lg;
76 line-height: 1.24;
77 }
78
79 /* xl: Headings (24px → 36px) */
80 .type-xl {
81 @apply fluid-preset-xl;
82 line-height: 1.16;
83 }
84
85 /* 2xl: Display text, hero headings (36px → 64px) */
86 .type-2xl {
87 @apply fluid-preset-2xl;
88 line-height: 1;
89 }
90
91 /**
92 * Heading Presets
93 * Always bold, uses Tailwind's native font-sans
94 */
95
96 .heading-display {
97 @apply type-2xl font-bold font-sans;
98 }
99
100 .heading-2xl {
101 @apply type-2xl font-semibold font-sans;
102 }
103
104 .heading-xl {
105 @apply type-xl font-semibold font-sans;
106 }
107
108 .heading-lg {
109 @apply type-lg font-extrabold font-sans;
110 }
111
112 .heading-md {
113 @apply type-md font-extrabold font-sans;
114 }
115
116 .heading-base {
117 @apply type-base font-black font-sans;
118 }
119
120 .heading-sm {
121 @apply type-sm font-black font-sans;
122 }
123
124 /**
125 * Paragraph Presets
126 * Normal weight (400), uses Tailwind's native font-sans
127 */
128
129 .paragraph-2xl {
130 @apply type-2xl font-semibold font-sans;
131 }
132
133 .paragraph-xl {
134 @apply type-xl font-normal font-sans;
135 }
136
137 .paragraph-lg {
138 @apply type-lg font-normal font-sans;
139 }
140
141 .paragraph-md {
142 @apply type-md font-normal font-sans;
143 }
144
145 .paragraph-base {
146 @apply type-base font-normal font-sans;
147 }
148
149 .paragraph-sm {
150 @apply type-sm font-normal font-sans;
151 }
152
153 /**
154 * Quote Presets
155 * Uses Tailwind's native font-serif, italic
156 */
157
158 .quote-2xl {
159 @apply type-2xl font-normal font-sans italic;
160 }
161
162 .quote-xl {
163 @apply type-xl font-normal font-sans italic;
164 }
165
166 .quote-lg {
167 @apply type-lg font-normal font-serif italic;
168 }
169
170 .quote-md {
171 @apply type-md font-normal font-serif italic;
172 }
173
174 /**
175 * Code Presets
176 * Uses Tailwind's native font-mono
177 */
178
179 .code-inline {
180 @apply type-base font-normal font-mono;
181 }
182
183 .code-block {
184 @apply type-base font-normal font-mono;
185 line-height: 1.75;
186 }
187
188 /**
189 * Caption Preset
190 * Small text for image/media captions
191 */
192
193 .caption {
194 @apply type-sm font-normal font-sans;
195 }
196}
197
198@layer utilities {
199 /* Text selection */
200 ::selection {
201 @apply bg-bones-yellow text-bones-black;
202 }
203
204 /* Prevent orphans in headings (last word alone on a line) */
205 .balance-text {
206 text-wrap: balance;
207 }
208
209 /* Optimize for readability */
210 .optimize-legibility {
211 text-rendering: optimizeLegibility;
212 }
213}
214
215/**
216 * Icon System - FontAwesome 6
217 */
218
219@font-face {
220 font-family: 'FontAwesome 6';
221 src:
222 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103330ed7417a_fa-regular-400.woff2')
223 format('woff2'),
224 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103db67d7417e_fa-regular-400.ttf')
225 format('truetype');
226 font-weight: 400;
227 font-style: normal;
228 font-display: auto;
229}
230
231@font-face {
232 font-family: 'FontAwesome 6';
233 src:
234 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103794bd7418c_fa-solid-900.woff2')
235 format('woff2'),
236 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411033fc7d7417d_fa-solid-900.ttf')
237 format('truetype');
238 font-weight: 900;
239 font-style: normal;
240 font-display: auto;
241}
242
243@font-face {
244 font-family: 'FontAwesome Brands 6';
245 src:
246 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103fe94d74178_fa-brands-400.woff2')
247 format('woff2'),
248 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411037fcdd7417c_fa-brands-400.ttf')
249 format('truetype');
250 font-weight: 400;
251 font-style: normal;
252 font-display: auto;
253}
254
255@font-face {
256 font-family: 'FontAwesome 6';
257 src:
258 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411039933d74179_fa-thin-100.woff2')
259 format('woff2'),
260 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411038365d7418e_fa-thin-100.ttf')
261 format('truetype');
262 font-weight: 100;
263 font-style: normal;
264 font-display: auto;
265}
266
267@font-face {
268 font-family: 'FontAwesome 6';
269 src:
270 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411031febd7417b_fa-light-300.woff2')
271 format('woff2'),
272 url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103530ed7418d_fa-light-300.ttf')
273 format('truetype');
274 font-weight: 300;
275 font-style: normal;
276 font-display: auto;
277}