@beforesemicolon/builder 1.8.11 → 1.8.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +839 -142
  2. package/dist/cjs/docs/run.js +16 -14
  3. package/dist/cjs/docs/templates/fading-citrus/README.md +772 -0
  4. package/dist/cjs/docs/templates/fading-citrus/assets/logo.dark.svg +8 -0
  5. package/dist/cjs/docs/templates/fading-citrus/assets/logo.light.svg +8 -0
  6. package/dist/cjs/docs/templates/fading-citrus/assets/logo.svg +8 -0
  7. package/dist/cjs/docs/templates/fading-citrus/layouts/_footer.js +13 -6
  8. package/dist/cjs/docs/templates/fading-citrus/layouts/_head-meta.js +3 -2
  9. package/dist/cjs/docs/templates/fading-citrus/layouts/_header.js +9 -4
  10. package/dist/cjs/docs/templates/fading-citrus/layouts/document.js +3 -2
  11. package/dist/cjs/docs/templates/fading-citrus/layouts/landing.js +4 -2
  12. package/dist/cjs/docs/templates/fading-citrus/stylesheets/common.css +135 -50
  13. package/dist/cjs/docs/templates/fading-citrus/stylesheets/documentation.css +32 -24
  14. package/dist/cjs/docs/templates/fading-citrus/stylesheets/github-dark.hightlighter.css +12 -12
  15. package/dist/cjs/docs/templates/fading-citrus/stylesheets/github-light.hightlighter.css +22 -22
  16. package/dist/cjs/docs/templates/fading-citrus/stylesheets/landing.css +74 -87
  17. package/dist/cjs/docs/templates/fading-citrus/template.config.js +106 -15
  18. package/dist/cjs/docs/types.js +1 -1
  19. package/dist/esm/docs/run.js +15 -13
  20. package/dist/esm/docs/templates/fading-citrus/README.md +772 -0
  21. package/dist/esm/docs/templates/fading-citrus/assets/logo.dark.svg +8 -0
  22. package/dist/esm/docs/templates/fading-citrus/assets/logo.light.svg +8 -0
  23. package/dist/esm/docs/templates/fading-citrus/assets/logo.svg +8 -0
  24. package/dist/esm/docs/templates/fading-citrus/layouts/_footer.js +13 -6
  25. package/dist/esm/docs/templates/fading-citrus/layouts/_head-meta.js +3 -2
  26. package/dist/esm/docs/templates/fading-citrus/layouts/_header.js +9 -4
  27. package/dist/esm/docs/templates/fading-citrus/layouts/document.js +3 -2
  28. package/dist/esm/docs/templates/fading-citrus/layouts/landing.js +4 -2
  29. package/dist/esm/docs/templates/fading-citrus/stylesheets/common.css +135 -50
  30. package/dist/esm/docs/templates/fading-citrus/stylesheets/documentation.css +32 -24
  31. package/dist/esm/docs/templates/fading-citrus/stylesheets/github-dark.hightlighter.css +12 -12
  32. package/dist/esm/docs/templates/fading-citrus/stylesheets/github-light.hightlighter.css +22 -22
  33. package/dist/esm/docs/templates/fading-citrus/stylesheets/landing.css +74 -87
  34. package/dist/esm/docs/templates/fading-citrus/template.config.js +106 -15
  35. package/dist/types/docs/types.d.ts +4 -2
  36. package/package.json +1 -1
  37. package/dist/cjs/docs/templates/fading-citrus/assets/before-semicolon-logo.png +0 -0
  38. package/dist/cjs/docs/templates/fading-citrus/layouts/_logo.js +0 -31
  39. package/dist/esm/docs/templates/fading-citrus/assets/before-semicolon-logo.png +0 -0
  40. package/dist/esm/docs/templates/fading-citrus/layouts/_logo.js +0 -31
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 60" role="img" aria-label="Fading Citrus">
2
+ <g fill="none" fill-rule="evenodd">
3
+ <circle cx="30" cy="30" r="23" fill="#f97316" />
4
+ <path d="M30 7a23 23 0 0 1 23 23H30z" fill="#22d3ee" opacity=".9" />
5
+ <path d="M30 7a23 23 0 0 0 0 46 23 23 0 0 1 0-46z" fill="#fff7ed" opacity=".35" />
6
+ <text x="68" y="37" fill="#f8fafc" font-family="Inter, Arial, sans-serif" font-size="22" font-weight="700">Docs</text>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 60" role="img" aria-label="Fading Citrus">
2
+ <g fill="none" fill-rule="evenodd">
3
+ <circle cx="30" cy="30" r="23" fill="#f97316" />
4
+ <path d="M30 7a23 23 0 0 1 23 23H30z" fill="#0891b2" opacity=".9" />
5
+ <path d="M30 7a23 23 0 0 0 0 46 23 23 0 0 1 0-46z" fill="#fff7ed" opacity=".35" />
6
+ <text x="68" y="37" fill="#111827" font-family="Inter, Arial, sans-serif" font-size="22" font-weight="700">Docs</text>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 60" role="img" aria-label="Fading Citrus">
2
+ <g fill="none" fill-rule="evenodd">
3
+ <circle cx="30" cy="30" r="23" fill="#f97316" />
4
+ <path d="M30 7a23 23 0 0 1 23 23H30z" fill="#22d3ee" opacity=".9" />
5
+ <path d="M30 7a23 23 0 0 0 0 46 23 23 0 0 1 0-46z" fill="#fff7ed" opacity=".35" />
6
+ <text x="68" y="37" fill="#f8fafc" font-family="Inter, Arial, sans-serif" font-size="22" font-weight="700">Docs</text>
7
+ </g>
8
+ </svg>
@@ -1,5 +1,3 @@
1
- import logo from './_logo.js'
2
-
3
1
  const social = [
4
2
  {
5
3
  link: 'https://medium.com/before-semicolon',
@@ -33,11 +31,20 @@ const social = [
33
31
  },
34
32
  ]
35
33
 
36
- export default () => `
34
+ export default (props = {}) => {
35
+ const siteName =
36
+ props.projectMeta?.name || props.name || props.title || 'Documentation'
37
+ const logo = `
38
+ <span class="site-logo-pair">
39
+ <img class="site-logo site-logo-dark" src="/assets/logo.dark.svg" alt="${siteName} logo" width="100" height="30" />
40
+ <img class="site-logo site-logo-light" src="/assets/logo.light.svg" alt="" width="100" height="30" aria-hidden="true" />
41
+ </span>`
42
+
43
+ return `
37
44
  <footer class="site-footer">
38
45
  <div class="footer-inner wrapper">
39
46
  <div class="footer-brand">
40
- ${logo({ fill: 'currentColor', width: '100px' })}
47
+ ${logo}
41
48
  <p>A reactive HTML templating system for building dynamic UIs with pure JavaScript. No build step. No virtual DOM.</p>
42
49
  </div>
43
50
  <ul class="footer-links">
@@ -57,16 +64,16 @@ export default () => `
57
64
  .map(
58
65
  (s) => `
59
66
  <a href="${s.link}" rel="noopener" target="_blank" aria-label="${s.name}">
60
- <img src="/${s.icon}" alt="" aria-hidden="true" width="16" height="16" />
67
+ <span class="footer-social-icon" style="--icon: url('/${s.icon}')" aria-hidden="true"></span>
61
68
  </a>
62
69
  `
63
70
  )
64
71
  .join('')}
65
72
  </div>
66
73
  <div class="footer-credit">
67
- <img width="20" height="20" src="/assets/before-semicolon-logo.png" alt="Before Semicolon logo" />
68
74
  <span>Copyright &copy; ${new Date().getFullYear()} Before Semicolon. All rights reserved.</span>
69
75
  </div>
70
76
  </div>
71
77
  </footer>
72
78
  `
79
+ }
@@ -131,7 +131,7 @@ const pageJson = ({ title, description, path, name }) => {
131
131
  url: 'https://beforesemicolon.com',
132
132
  logo: {
133
133
  '@type': 'ImageObject',
134
- url: `${siteUrl}/assets/before-semicolon-logo.png`,
134
+ url: `${siteUrl}/assets/logo.svg`,
135
135
  },
136
136
  },
137
137
  mainEntityOfPage: url,
@@ -164,6 +164,7 @@ export default (props = {}) => {
164
164
  const url = absoluteUrl(props.path)
165
165
  const canonical = escapeHTML(url)
166
166
  const image = props.image || defaultImage
167
+ const cacheKey = props.cacheKey ? `?v=${escapeHTML(props.cacheKey)}` : ''
167
168
  const type = canonicalPath(props.path).startsWith('/documentation')
168
169
  ? 'article'
169
170
  : 'website'
@@ -211,7 +212,7 @@ export default (props = {}) => {
211
212
  <link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16x16.png" />
212
213
  <link rel="manifest" href="/assets/favicon/site.webmanifest" />
213
214
  <link rel="icon" type="image/x-icon" href="/assets/favicon/favicon.ico" />
214
- <link rel="stylesheet" href="/stylesheets/github-dark.hightlighter.css">
215
+ <link rel="stylesheet" href="/stylesheets/github-dark.hightlighter.css${cacheKey}">
215
216
  ${jsonScript(pageJson({ ...props, title, description }))}
216
217
  ${jsonScript(breadcrumbJson({ title, path: props.path }))}
217
218
  ${
@@ -1,14 +1,19 @@
1
- import logo from './_logo.js'
2
-
3
1
  export default (props = {}) => {
4
2
  const isDocs = props.path?.startsWith('/documentation')
3
+ const siteName =
4
+ props.projectMeta?.name || props.name || props.title || 'Documentation'
5
+ const logo = `
6
+ <span class="site-logo-pair">
7
+ <img class="site-logo site-logo-dark" src="/assets/logo.dark.svg" alt="${siteName} logo" width="90" height="27" />
8
+ <img class="site-logo site-logo-light" src="/assets/logo.light.svg" alt="" width="90" height="27" aria-hidden="true" />
9
+ </span>`
5
10
 
6
11
  return `
7
12
  <header class="site-header">
8
13
  <div class="header-inner wrapper">
9
14
  <h1>
10
- <a href="/" aria-label="Markup home">
11
- ${logo({ fill: 'currentColor', width: '90px' })}
15
+ <a href="/" aria-label="${siteName} home">
16
+ ${logo}
12
17
  </a>
13
18
  </h1>
14
19
  ${
@@ -26,6 +26,7 @@ const navCategoryToHTML = (docs, currentPath) =>
26
26
  export default (props) => {
27
27
  const docs = props.siteMap.get('documentation')
28
28
  const isDocsIndex = props.path === '/documentation/index.html'
29
+ const cacheKey = props.cacheKey ? `?v=${props.cacheKey}` : ''
29
30
  const docsMenu = `<ul>${navCategoryToHTML(docs, props.path)}</ul>`
30
31
  const pages = [...docs.values()].flatMap((page) =>
31
32
  page instanceof Map ? [...page.values()] : [page]
@@ -45,7 +46,7 @@ export default (props) => {
45
46
  <html lang="en">
46
47
  <head>
47
48
  ${meta(props)}
48
- <link rel="stylesheet" href="/stylesheets/documentation.css?v=20260621exact">
49
+ <link rel="stylesheet" href="/stylesheets/documentation.css${cacheKey}">
49
50
  ${
50
51
  props.themeStylesheet
51
52
  ? `<link rel="stylesheet" href="${props.themeStylesheet}">`
@@ -86,7 +87,7 @@ export default (props) => {
86
87
  </aside>
87
88
  </main>
88
89
 
89
- ${footer()}
90
+ ${footer(props)}
90
91
  ${props.scripts?.join('') || ''}
91
92
 
92
93
  </body>
@@ -3,12 +3,14 @@ import header from './_header.js'
3
3
  import footer from './_footer.js'
4
4
 
5
5
  export default (props) => {
6
+ const cacheKey = props.cacheKey ? `?v=${props.cacheKey}` : ''
7
+
6
8
  return `
7
9
  <!doctype html>
8
10
  <html lang="en">
9
11
  <head>
10
12
  ${meta(props)}
11
- <link rel="stylesheet" href="/stylesheets/landing.css?v=20260621exact">
13
+ <link rel="stylesheet" href="/stylesheets/landing.css${cacheKey}">
12
14
  ${
13
15
  props.themeStylesheet
14
16
  ? `<link rel="stylesheet" href="${props.themeStylesheet}">`
@@ -18,7 +20,7 @@ export default (props) => {
18
20
  <body>
19
21
  ${header(props)}
20
22
  ${props.content}
21
- ${footer()}
23
+ ${footer(props)}
22
24
  ${props.scripts?.join('') || ''}
23
25
  </body>
24
26
  </html>
@@ -4,23 +4,60 @@
4
4
  :root {
5
5
  --background: oklch(0.18 0.015 250);
6
6
  --foreground: oklch(0.96 0.005 250);
7
+ --heading: var(--foreground);
7
8
  --card: oklch(0.22 0.018 250);
8
9
  --primary: oklch(0.74 0.18 45);
9
10
  --primary-glow: oklch(0.78 0.19 50);
10
11
  --primary-foreground: oklch(0.18 0.02 250);
12
+ --primary-soft: color-mix(in oklch, var(--primary) 12%, transparent);
13
+ --primary-softer: color-mix(in oklch, var(--primary) 6%, transparent);
14
+ --primary-border: color-mix(in oklch, var(--primary) 45%, transparent);
11
15
  --secondary: oklch(0.27 0.02 250);
12
16
  --muted: oklch(0.25 0.018 250);
13
17
  --muted-foreground: oklch(0.68 0.02 250);
14
18
  --accent: oklch(0.7 0.16 200);
19
+ --accent-soft: color-mix(in oklch, var(--accent) 12%, transparent);
20
+ --accent-softer: color-mix(in oklch, var(--accent) 6%, transparent);
21
+ --accent-border: color-mix(in oklch, var(--accent) 35%, transparent);
15
22
  --border: oklch(0.3 0.02 250);
16
23
  --ring: oklch(0.74 0.18 45);
17
24
  --radius: 0.75rem;
25
+ --surface: color-mix(in oklch, var(--card) 40%, transparent);
26
+ --surface-muted: color-mix(in oklch, var(--card) 60%, transparent);
27
+ --surface-hover: color-mix(in oklch, var(--card) 70%, transparent);
28
+ --surface-border: color-mix(in oklch, var(--border) 65%, transparent);
29
+ --surface-border-strong: color-mix(
30
+ in oklch,
31
+ var(--foreground) 20%,
32
+ transparent
33
+ );
34
+ --header-bg: color-mix(in oklch, var(--background) 60%, transparent);
35
+ --footer-bg: color-mix(in oklch, var(--background) 88%, black 12%);
36
+ --grid-line: color-mix(in oklch, var(--foreground) 5%, transparent);
37
+ --inline-code-bg: color-mix(
38
+ in oklch,
39
+ var(--background) 82%,
40
+ var(--foreground) 8%
41
+ );
18
42
  --code-bg: oklch(0.16 0.015 250);
43
+ --code-header-bg: color-mix(in oklch, var(--card) 60%, transparent);
44
+ --code-border: var(--surface-border);
45
+ --code-line-number: color-mix(
46
+ in oklch,
47
+ var(--muted-foreground) 65%,
48
+ transparent
49
+ );
50
+ --success: oklch(0.78 0.15 145);
51
+ --success-soft: color-mix(in oklch, var(--success) 14%, transparent);
52
+ --warning: oklch(0.78 0.14 90);
53
+ --warning-soft: color-mix(in oklch, var(--warning) 14%, transparent);
54
+ --danger: oklch(0.62 0.22 25);
55
+ --danger-soft: color-mix(in oklch, var(--danger) 14%, transparent);
19
56
  --syntax-comment: oklch(0.55 0.02 250);
20
- --syntax-keyword: oklch(0.78 0.19 50);
21
- --syntax-string: oklch(0.78 0.15 145);
22
- --syntax-tag: oklch(0.72 0.16 200);
23
- --syntax-attr: oklch(0.82 0.14 90);
57
+ --syntax-keyword: var(--primary);
58
+ --syntax-string: var(--success);
59
+ --syntax-tag: var(--accent);
60
+ --syntax-attr: var(--warning);
24
61
 
25
62
  --font-sans:
26
63
  ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
@@ -32,7 +69,7 @@
32
69
 
33
70
  --gradient-hero: radial-gradient(
34
71
  ellipse at top,
35
- oklch(0.28 0.08 45 / 0.35),
72
+ color-mix(in oklch, var(--primary) 26%, transparent),
36
73
  transparent 60%
37
74
  );
38
75
  --gradient-primary: linear-gradient(
@@ -47,10 +84,11 @@
47
84
  );
48
85
  --gradient-border: linear-gradient(
49
86
  135deg,
50
- oklch(0.74 0.18 45 / 0.5),
51
- oklch(0.7 0.16 200 / 0.3)
87
+ color-mix(in oklch, var(--primary) 50%, transparent),
88
+ color-mix(in oklch, var(--accent) 30%, transparent)
52
89
  );
53
- --shadow-glow: 0 0 60px -15px oklch(0.74 0.18 45 / 0.5);
90
+ --shadow-glow: 0 0 60px -15px
91
+ color-mix(in oklch, var(--primary) 50%, transparent);
54
92
  --shadow-card:
55
93
  0 1px 0 0 oklch(1 0 0 / 0.05) inset,
56
94
  0 20px 40px -20px oklch(0 0 0 / 0.5);
@@ -111,7 +149,7 @@ h4,
111
149
  h5,
112
150
  h6 {
113
151
  font-family: var(--font-title);
114
- color: oklch(1 0 0);
152
+ color: var(--heading);
115
153
  font-weight: 800;
116
154
  }
117
155
 
@@ -194,8 +232,8 @@ ul {
194
232
  .bg-grid {
195
233
  background-size: 48px 48px;
196
234
  background-image:
197
- linear-gradient(to right, oklch(1 0 0 / 0.04) 1px, transparent 1px),
198
- linear-gradient(to bottom, oklch(1 0 0 / 0.04) 1px, transparent 1px);
235
+ linear-gradient(to right, var(--grid-line) 1px, transparent 1px),
236
+ linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px);
199
237
  mask-image: radial-gradient(
200
238
  ellipse 80% 60% at 50% 0%,
201
239
  black 30%,
@@ -246,8 +284,8 @@ ul {
246
284
  header {
247
285
  height: 4rem;
248
286
  max-width: 1280px;
249
- border-bottom: 1px solid oklch(0.3 0.02 250 / 0.5);
250
- background-color: oklch(0.18 0.015 250 / 0.6);
287
+ border-bottom: 1px solid var(--surface-border);
288
+ background-color: var(--header-bg);
251
289
  backdrop-filter: blur(16px);
252
290
  -webkit-backdrop-filter: blur(16px);
253
291
  display: flex;
@@ -315,18 +353,18 @@ header nav a.github-link {
315
353
  height: 36px;
316
354
  display: inline-grid;
317
355
  place-items: center;
318
- border: 1px solid oklch(0.3 0.02 250 / 0.7);
356
+ border: 1px solid var(--surface-border);
319
357
  border-radius: 8px;
320
358
  }
321
359
 
322
360
  header nav a.github-link:hover {
323
- border-color: oklch(0.74 0.18 45 / 0.45);
361
+ border-color: var(--primary-border);
324
362
  color: var(--primary);
325
363
  }
326
364
 
327
365
  /* footer ------------------- */
328
366
  footer {
329
- background: oklch(0.14 0.012 250);
367
+ background: var(--footer-bg);
330
368
  color: var(--muted-foreground);
331
369
  border-top: 1px solid var(--border);
332
370
  padding-top: 60px;
@@ -341,9 +379,8 @@ footer .footer-brand {
341
379
  min-width: 280px;
342
380
  }
343
381
 
344
- footer .footer-brand svg {
382
+ footer .footer-brand .site-logo-pair {
345
383
  margin-bottom: 16px;
346
- display: block;
347
384
  }
348
385
 
349
386
  footer .footer-brand p {
@@ -398,7 +435,7 @@ footer address a {
398
435
  height: 32px;
399
436
  border-radius: 6px;
400
437
  border: 1px solid var(--border);
401
- background: oklch(1 1 1 / 0.02);
438
+ background: var(--surface);
402
439
  transition: all 0.2s ease;
403
440
  }
404
441
 
@@ -410,7 +447,7 @@ footer address a img {
410
447
 
411
448
  footer address a:hover {
412
449
  border-color: var(--primary);
413
- background: oklch(0.74 0.18 45 / 0.05);
450
+ background: var(--primary-softer);
414
451
  }
415
452
 
416
453
  footer address a:hover img {
@@ -419,7 +456,7 @@ footer address a:hover img {
419
456
 
420
457
  footer .copyright-section {
421
458
  width: 100%;
422
- border-top: 1px solid oklch(1 1 1 / 0.05);
459
+ border-top: 1px solid var(--surface-border);
423
460
  padding-top: 24px;
424
461
  margin-top: 20px;
425
462
  display: flex;
@@ -445,7 +482,7 @@ footer .copyright-section .brand-logo-container img {
445
482
  .code-snippet {
446
483
  background: var(--code-bg);
447
484
  border-radius: 0.75rem;
448
- border: 1px solid oklch(0.3 0.02 250 / 0.6);
485
+ border: 1px solid var(--code-border);
449
486
  margin: 16px 0;
450
487
  width: 100%;
451
488
  max-width: 100%;
@@ -464,8 +501,8 @@ footer .copyright-section .brand-logo-container img {
464
501
  align-items: center;
465
502
  gap: 12px;
466
503
  padding: 0 10px 0 16px;
467
- background: oklch(0.22 0.018 250 / 0.6);
468
- border-bottom: 1px solid oklch(0.3 0.02 250 / 0.6);
504
+ background: var(--code-header-bg);
505
+ border-bottom: 1px solid var(--code-border);
469
506
  }
470
507
 
471
508
  .code-snippet .mac-dots {
@@ -481,15 +518,15 @@ footer .copyright-section .brand-logo-container img {
481
518
  }
482
519
 
483
520
  .code-snippet .mac-dots .dot-red {
484
- background-color: oklch(0.62 0.22 25 / 0.7);
521
+ background-color: color-mix(in oklch, var(--danger) 70%, transparent);
485
522
  }
486
523
 
487
524
  .code-snippet .mac-dots .dot-yellow {
488
- background-color: oklch(0.78 0.14 90 / 0.7);
525
+ background-color: color-mix(in oklch, var(--warning) 70%, transparent);
489
526
  }
490
527
 
491
528
  .code-snippet .mac-dots .dot-green {
492
- background-color: oklch(0.78 0.15 145 / 0.7);
529
+ background-color: color-mix(in oklch, var(--success) 70%, transparent);
493
530
  }
494
531
 
495
532
  .code-snippet .filename {
@@ -571,7 +608,7 @@ footer .copyright-section .brand-logo-container img {
571
608
  padding-right: 16px;
572
609
  flex-shrink: 0;
573
610
  text-align: right;
574
- color: oklch(0.68 0.02 250 / 0.5);
611
+ color: var(--code-line-number);
575
612
  }
576
613
 
577
614
  .code-snippet .line-code {
@@ -614,16 +651,16 @@ footer .copyright-section .brand-logo-container img {
614
651
  .code-snippet .code-copy-btn::after {
615
652
  top: 7px;
616
653
  left: 12px;
617
- background: oklch(0.22 0.018 250);
654
+ background: var(--code-header-bg);
618
655
  }
619
656
 
620
657
  .code-snippet .code-copy-btn:hover {
621
658
  color: var(--foreground);
622
- background: oklch(0.25 0.018 250 / 0.6);
659
+ background: var(--surface-muted);
623
660
  }
624
661
 
625
662
  .code-snippet .code-copy-btn.copied {
626
- color: oklch(0.78 0.15 145);
663
+ color: var(--success);
627
664
  }
628
665
 
629
666
  @media screen and (max-width: 768px) {
@@ -663,8 +700,52 @@ header.site-header .header-inner {
663
700
  justify-content: space-between;
664
701
  }
665
702
 
666
- header.site-header h1 a svg {
703
+ .site-logo-pair {
704
+ display: inline-grid;
705
+ align-items: center;
706
+ }
707
+
708
+ .site-logo-pair .site-logo {
709
+ grid-area: 1 / 1;
710
+ }
711
+
712
+ .site-logo-light {
713
+ display: block;
714
+ }
715
+
716
+ .site-logo-dark {
717
+ display: none;
718
+ }
719
+
720
+ @media (prefers-color-scheme: dark) {
721
+ .site-logo-light {
722
+ display: none;
723
+ }
724
+
725
+ .site-logo-dark {
726
+ display: block;
727
+ }
728
+ }
729
+
730
+ [data-theme='light'] .site-logo-light {
731
+ display: block;
732
+ }
733
+
734
+ [data-theme='light'] .site-logo-dark {
735
+ display: none;
736
+ }
737
+
738
+ [data-theme='dark'] .site-logo-light {
739
+ display: none;
740
+ }
741
+
742
+ [data-theme='dark'] .site-logo-dark {
743
+ display: block;
744
+ }
745
+
746
+ header.site-header h1 a .site-logo {
667
747
  height: 28px;
748
+ width: auto;
668
749
  }
669
750
 
670
751
  header.site-header nav a {
@@ -689,7 +770,7 @@ header.site-header nav a.docs-github-link {
689
770
  }
690
771
 
691
772
  .site-footer {
692
- border-top: 1px solid oklch(0.3 0.02 250 / 0.5);
773
+ border-top: 1px solid var(--surface-border);
693
774
  background: transparent;
694
775
  padding: 56px 0 36px;
695
776
  }
@@ -704,10 +785,9 @@ header.site-header nav a.docs-github-link {
704
785
  gap: 40px;
705
786
  }
706
787
 
707
- .site-footer .footer-brand svg {
788
+ .site-footer .footer-brand .site-logo {
708
789
  height: 28px;
709
790
  width: auto;
710
- color: var(--foreground);
711
791
  }
712
792
 
713
793
  .site-footer .footer-brand p {
@@ -747,11 +827,12 @@ header.site-header nav a.docs-github-link {
747
827
 
748
828
  .footer-credit {
749
829
  grid-column: 1 / -1;
750
- border-top: 1px solid oklch(0.3 0.02 250 / 0.5);
830
+ border-top: 1px solid var(--surface-border);
751
831
  padding-top: 24px;
752
832
  display: flex;
753
833
  align-items: center;
754
- gap: 12px;
834
+ justify-content: center;
835
+ text-align: center;
755
836
  font-size: 0.8125rem;
756
837
  }
757
838
 
@@ -769,25 +850,33 @@ header.site-header nav a.docs-github-link {
769
850
  display: grid;
770
851
  place-items: center;
771
852
  border-radius: 6px;
772
- border: 1px solid oklch(0.3 0.02 250 / 0.6);
853
+ border: 1px solid var(--surface-border);
773
854
  color: var(--muted-foreground);
774
- background: oklch(0.22 0.018 250 / 0.25);
855
+ background: var(--surface);
775
856
  transition: all 0.2s ease;
776
857
  }
777
858
 
778
- .footer-social img {
779
- filter: invert(1);
780
- opacity: 0.62;
781
- transition: opacity 0.2s ease;
859
+ .footer-social-icon {
860
+ width: 16px;
861
+ height: 16px;
862
+ display: block;
863
+ background-color: var(--muted-foreground);
864
+ opacity: 0.72;
865
+ mask: var(--icon) center / contain no-repeat;
866
+ -webkit-mask: var(--icon) center / contain no-repeat;
867
+ transition:
868
+ background-color 0.2s ease,
869
+ opacity 0.2s ease;
782
870
  }
783
871
 
784
872
  .footer-social a:hover {
785
873
  color: var(--primary);
786
- border-color: oklch(0.74 0.18 45 / 0.5);
787
- background: oklch(0.74 0.18 45 / 0.06);
874
+ border-color: var(--primary-border);
875
+ background: var(--primary-softer);
788
876
  }
789
877
 
790
- .footer-social a:hover img {
878
+ .footer-social a:hover .footer-social-icon {
879
+ background-color: var(--primary);
791
880
  opacity: 1;
792
881
  }
793
882
 
@@ -808,8 +897,4 @@ header.site-header nav a.docs-github-link {
808
897
  .footer-social {
809
898
  justify-content: flex-start;
810
899
  }
811
-
812
- .footer-credit {
813
- align-items: flex-start;
814
- }
815
900
  }