Krolyxon
Commit 18ca21c

ferreniumassetscsscomponents.css

433 lines · 7.8 KB · CSS

1/* Components: labels, display type, top bar, theme switch, page patterns. */
2
3/* ---- Type roles ------------------------------------------------------- */
4
5.label {
6 font-family: var(--font-mono);
7 font-size: var(--label);
8 font-weight: 400;
9 line-height: 1.2;
10 letter-spacing: 0.08em;
11 text-transform: uppercase;
12 color: var(--text-secondary);
13}
14
15.dim {
16 color: var(--text-disabled);
17}
18
19.doto {
20 font-family: var(--font-display);
21 font-weight: 600;
22 color: var(--text-display);
23}
24
25.display-xl {
26 font-size: var(--display-xl);
27 line-height: 1;
28 letter-spacing: -0.03em;
29}
30
31.display-lg {
32 font-size: var(--display-lg);
33 line-height: 1.05;
34 letter-spacing: -0.02em;
35}
36
37.display-md {
38 font-size: var(--display-md);
39 line-height: 1.1;
40 letter-spacing: -0.02em;
41}
42
43/* Inline status text: [LOADING], [COPIED], [ERROR: …]. */
44.status {
45 font-family: var(--font-mono);
46 font-size: var(--caption);
47 font-weight: 400;
48 line-height: 1.4;
49 letter-spacing: 0.04em;
50 text-transform: uppercase;
51 color: var(--text-secondary);
52}
53
54.status-error {
55 color: var(--error);
56}
57
58/* ---- Buttons ---------------------------------------------------------- */
59
60.btn-ghost {
61 display: inline-flex;
62 align-items: center;
63 min-height: 44px;
64 font-family: var(--font-mono);
65 font-size: 13px;
66 letter-spacing: 0.06em;
67 text-transform: uppercase;
68 color: var(--text-secondary);
69 background: none;
70 border: 0;
71 transition: color var(--dur-micro) var(--ease);
72}
73
74.btn-ghost:hover {
75 color: var(--text-display);
76 text-decoration: none;
77}
78
79/* ---- Top bar ---------------------------------------------------------- */
80
81.topbar {
82 display: flex;
83 align-items: center;
84 justify-content: space-between;
85 gap: var(--space-md);
86 min-height: 64px;
87 padding-block: var(--space-md);
88}
89
90.topbar-home {
91 color: var(--text-display);
92 white-space: nowrap;
93 overflow: hidden;
94 text-overflow: ellipsis;
95}
96
97.topbar-home:hover {
98 text-decoration: none;
99}
100
101/* ---- Segmented control ------------------------------------------------ */
102
103.segmented {
104 display: inline-flex;
105 flex: none;
106 padding: var(--space-2xs);
107 border: 1px solid var(--border-visible);
108 border-radius: 999px;
109}
110
111.segmented button,
112.segmented a {
113 display: inline-flex;
114 align-items: center;
115 height: 30px;
116 padding: 0 var(--space-md);
117 border: 0;
118 border-radius: 999px;
119 background: transparent;
120 font-family: var(--font-mono);
121 font-size: var(--label);
122 letter-spacing: 0.08em;
123 text-transform: uppercase;
124 color: var(--text-secondary);
125 transition:
126 background-color 200ms var(--ease),
127 color 200ms var(--ease);
128}
129
130.segmented button:hover,
131.segmented a:hover {
132 color: var(--text-primary);
133 text-decoration: none;
134}
135
136.segmented button[aria-pressed="true"],
137.segmented a[aria-current="true"] {
138 background: var(--text-display);
139 color: var(--black);
140}
141
142.segmented-sm button,
143.segmented-sm a {
144 height: 26px;
145 padding: 0 var(--space-sm);
146}
147
148@media (pointer: coarse) {
149 .segmented button,
150 .segmented a {
151 height: 40px;
152 }
153}
154
155/* The theme switch needs JS; without it the OS preference applies. */
156html:not(.js) .theme-switch {
157 display: none;
158}
159
160/* ---- Site header / footer --------------------------------------------- */
161
162.site-header {
163 padding-block: var(--space-sm);
164}
165
166.footer {
167 display: flex;
168 flex-wrap: wrap;
169 align-items: flex-end;
170 justify-content: space-between;
171 gap: var(--space-md);
172 margin-top: var(--space-4xl);
173 padding-block: var(--space-xl);
174}
175
176.site-footer {
177 font-size: var(--body-sm);
178 color: var(--text-secondary);
179}
180
181/* ---- Index ------------------------------------------------------------ */
182
183.hero {
184 display: flex;
185 flex-wrap: wrap;
186 align-items: flex-end;
187 justify-content: space-between;
188 gap: var(--space-md) var(--space-xl);
189 padding-top: var(--space-3xl);
190}
191
192.hero-main {
193 min-width: 0;
194}
195
196.hero h1 {
197 overflow-wrap: anywhere;
198}
199
200.hero-desc {
201 margin-top: var(--space-sm);
202 max-width: 60ch;
203 color: var(--text-secondary);
204}
205
206.hero-meta {
207 white-space: nowrap;
208 padding-bottom: var(--space-xs);
209}
210
211/* ---- Inputs ----------------------------------------------------------- */
212
213.field {
214 display: flex;
215 flex-direction: column;
216 gap: var(--space-sm);
217}
218
219.field input {
220 width: 100%;
221 min-height: 44px;
222 padding: var(--space-sm) 0;
223 border: 0;
224 border-bottom: 1px solid var(--border-visible);
225 border-radius: 0;
226 background: transparent;
227 font-family: var(--font-mono);
228 font-size: var(--body);
229 color: var(--text-primary);
230 outline: none;
231 transition: border-color var(--dur-micro) var(--ease);
232 -webkit-appearance: none;
233 appearance: none;
234}
235
236.field input::placeholder {
237 color: var(--text-disabled);
238}
239
240.field input:focus {
241 border-bottom-color: var(--text-primary);
242}
243
244.field input::-webkit-search-cancel-button {
245 display: none;
246}
247
248/* ---- Index: filter, sort, repository rows ----------------------------- */
249
250.index-tools {
251 display: flex;
252 flex-wrap: wrap;
253 align-items: flex-end;
254 justify-content: space-between;
255 gap: var(--space-md) var(--space-xl);
256 margin-top: var(--space-2xl);
257}
258
259.index-tools .field {
260 flex: 1 1 240px;
261 max-width: 360px;
262}
263
264/* Bracket nav: [ ACTIVE ] INACTIVE */
265.sort,
266.bracket-nav {
267 display: flex;
268 gap: var(--space-sm);
269}
270
271.sort a,
272.bracket-nav a {
273 display: inline-flex;
274 align-items: center;
275 min-height: 44px;
276 padding-inline: var(--space-xs);
277 color: var(--text-disabled);
278 transition: color var(--dur-micro) var(--ease);
279}
280
281.sort a:hover,
282.bracket-nav a:hover {
283 color: var(--text-secondary);
284 text-decoration: none;
285}
286
287.sort a.active,
288.bracket-nav a.active {
289 color: var(--text-display);
290}
291
292.sort a.active::before,
293.bracket-nav a.active::before {
294 content: "[ ";
295 white-space: pre;
296}
297
298.sort a.active::after,
299.bracket-nav a.active::after {
300 content: " ]";
301 white-space: pre;
302}
303
304.repo-section {
305 margin-top: var(--space-2xl);
306}
307
308.section-label {
309 padding-bottom: var(--space-sm);
310}
311
312.repo-list {
313 list-style: none;
314 border-top: 1px solid var(--border);
315}
316
317.repo-row {
318 display: flex;
319 align-items: baseline;
320 justify-content: space-between;
321 gap: var(--space-md);
322 border-bottom: 1px solid var(--border);
323}
324
325.repo-link {
326 display: flex;
327 flex-direction: column;
328 gap: var(--space-2xs);
329 flex: 1;
330 min-width: 0;
331 padding-block: 14px;
332 color: var(--text-primary);
333}
334
335.repo-link:hover {
336 text-decoration: none;
337}
338
339.repo-name {
340 font-weight: 500;
341 color: var(--text-display);
342 overflow-wrap: anywhere;
343}
344
345.repo-link:hover .repo-name {
346 text-decoration: underline;
347 text-underline-offset: 3px;
348 text-decoration-thickness: 1px;
349}
350
351.repo-desc {
352 color: var(--text-secondary);
353}
354
355@media (min-width: 768px) {
356 .repo-link {
357 flex-direction: row;
358 align-items: baseline;
359 gap: var(--space-md);
360 }
361
362 .repo-name {
363 flex: none;
364 max-width: 50%;
365 }
366
367 .repo-desc {
368 overflow: hidden;
369 white-space: nowrap;
370 text-overflow: ellipsis;
371 }
372}
373
374.repo-meta {
375 display: inline-flex;
376 align-items: center;
377 gap: var(--space-sm);
378 flex: none;
379 color: var(--text-disabled);
380 white-space: nowrap;
381}
382
383.repo-lang {
384 color: var(--text-secondary);
385}
386
387.repo-lang::after {
388 content: "\00B7";
389 margin-left: var(--space-sm);
390 color: var(--text-disabled);
391}
392
393/* Data-status dot: pushed in the last 24 hours. */
394.dot {
395 width: 6px;
396 height: 6px;
397 border-radius: 50%;
398 background: var(--accent);
399}
400
401.no-matches {
402 padding-block: var(--space-2xl);
403}
404
405/* ---- Empty state ------------------------------------------------------ */
406
407.empty {
408 padding-block: var(--space-4xl);
409 text-align: center;
410}
411
412.empty-title {
413 color: var(--text-secondary);
414}
415
416.empty-desc {
417 margin-top: var(--space-xs);
418 color: var(--text-disabled);
419}
420
421/* ---- Error page ------------------------------------------------------- */
422
423.error-page {
424 display: flex;
425 flex-direction: column;
426 align-items: flex-start;
427 gap: var(--space-md);
428 padding-top: var(--space-4xl);
429}
430
431.error-page .btn-ghost {
432 margin-top: var(--space-xl);
433}