@odla-ai/blog 0.0.2 → 0.0.3

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.
@@ -1,720 +0,0 @@
1
- /* ══════════════════════════════════════════════════════════════
2
- CHALK — chalkboard on graph paper
3
- Cormorant display · Spectral body · JetBrains Mono chrome
4
- Dark: chalk on a blackboard grid, copper + cerulean accents.
5
- Light: pencil on daylight graph paper, same grid.
6
- Flat, sharp corners, hairline borders, glow-not-shadow.
7
- ══════════════════════════════════════════════════════════════ */
8
- @import url("https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,600;0,700;1,400&family=Instrument+Sans:wght@500;700&family=JetBrains+Mono:wght@300;400;500&family=Spectral:ital,wght@0,300;0,400;0,500;1,300;1,400&display=swap");
9
-
10
- /* ─── Tokens ─── */
11
- :root {
12
- --bg: #f4f1ea;
13
- --grid-line: rgba(70, 90, 120, 0.07);
14
- --grid-major: rgba(70, 90, 120, 0.13);
15
- --vignette: transparent;
16
- --text: #23252b;
17
- --text-dim: rgba(35, 37, 43, 0.62);
18
- --text-faint: rgba(35, 37, 43, 0.4);
19
- --accent: #a55f28;
20
- --accent-border: rgba(165, 95, 40, 0.35);
21
- --accent-glow: rgba(165, 95, 40, 0.08);
22
- --accent-2: #0a7d99;
23
- --border: rgba(35, 37, 43, 0.14);
24
-
25
- --code-bg: rgba(35, 37, 43, 0.045);
26
- --code-text: #2b2d33;
27
- --hl-keyword: #a55f28;
28
- --hl-string: #0a7d99;
29
- --hl-comment: #8b8677;
30
- --hl-number: #a3790f;
31
- --hl-title: #23252b;
32
- --hl-attr: #3d6f8e;
33
- --hl-type: #0d6e86;
34
- --hl-meta: #8c6a3f;
35
- --hl-addition: #15803d;
36
- --hl-deletion: #b91c1c;
37
-
38
- --font-display: "Cormorant Garamond", serif;
39
- --font-body: "Spectral", Georgia, serif;
40
- --font-mono: "JetBrains Mono", ui-monospace, monospace;
41
- --font-wordmark: "Instrument Sans", sans-serif;
42
-
43
- --max-width: 760px;
44
- --header-width: var(--max-width);
45
- }
46
-
47
- [data-theme="dark"] {
48
- --bg: #0f1014;
49
- --grid-line: rgba(255, 255, 255, 0.025);
50
- --grid-major: rgba(255, 255, 255, 0.045);
51
- --vignette: rgba(0, 0, 0, 0.6);
52
- --text: rgba(235, 230, 220, 0.92);
53
- --text-dim: rgba(235, 230, 220, 0.55);
54
- --text-faint: rgba(235, 230, 220, 0.4);
55
- --accent: #c47a3a;
56
- --accent-border: rgba(196, 122, 58, 0.35);
57
- --accent-glow: rgba(196, 122, 58, 0.08);
58
- --accent-2: #0ea5c9;
59
- --border: rgba(235, 230, 220, 0.12);
60
-
61
- --code-bg: rgba(235, 230, 220, 0.04);
62
- --code-text: rgba(235, 230, 220, 0.88);
63
- --hl-keyword: #c47a3a;
64
- --hl-string: #6cc9e0;
65
- --hl-comment: rgba(235, 230, 220, 0.42);
66
- --hl-number: #d4a017;
67
- --hl-title: #ebe6dc;
68
- --hl-attr: #8cd2eb;
69
- --hl-type: #45b8d4;
70
- --hl-meta: rgba(220, 180, 145, 0.8);
71
- --hl-addition: #22c55e;
72
- --hl-deletion: #ef4444;
73
- }
74
-
75
- @media (prefers-color-scheme: dark) {
76
- :root:not([data-theme="light"]) {
77
- --bg: #0f1014;
78
- --grid-line: rgba(255, 255, 255, 0.025);
79
- --grid-major: rgba(255, 255, 255, 0.045);
80
- --vignette: rgba(0, 0, 0, 0.6);
81
- --text: rgba(235, 230, 220, 0.92);
82
- --text-dim: rgba(235, 230, 220, 0.55);
83
- --text-faint: rgba(235, 230, 220, 0.4);
84
- --accent: #c47a3a;
85
- --accent-border: rgba(196, 122, 58, 0.35);
86
- --accent-glow: rgba(196, 122, 58, 0.08);
87
- --accent-2: #0ea5c9;
88
- --border: rgba(235, 230, 220, 0.12);
89
-
90
- --code-bg: rgba(235, 230, 220, 0.04);
91
- --code-text: rgba(235, 230, 220, 0.88);
92
- --hl-keyword: #c47a3a;
93
- --hl-string: #6cc9e0;
94
- --hl-comment: rgba(235, 230, 220, 0.42);
95
- --hl-number: #d4a017;
96
- --hl-title: #ebe6dc;
97
- --hl-attr: #8cd2eb;
98
- --hl-type: #45b8d4;
99
- --hl-meta: rgba(220, 180, 145, 0.8);
100
- --hl-addition: #22c55e;
101
- --hl-deletion: #ef4444;
102
- }
103
- }
104
-
105
- /* ─── Base + graph-paper backdrop ─── */
106
- * {
107
- box-sizing: border-box;
108
- }
109
-
110
- html {
111
- font-family: var(--font-body);
112
- font-size: 17px;
113
- line-height: 1.7;
114
- color: var(--text);
115
- background-color: var(--bg);
116
- transition: color 0.2s ease, background-color 0.2s ease;
117
- }
118
-
119
- body {
120
- margin: 0;
121
- min-height: 100vh;
122
- display: flex;
123
- flex-direction: column;
124
- }
125
-
126
- body::before {
127
- content: "";
128
- position: fixed;
129
- inset: 0;
130
- z-index: -2;
131
- background-image:
132
- linear-gradient(var(--grid-line) 1px, transparent 1px),
133
- linear-gradient(90deg, var(--grid-line) 1px, transparent 1px),
134
- linear-gradient(var(--grid-major) 1px, transparent 1px),
135
- linear-gradient(90deg, var(--grid-major) 1px, transparent 1px);
136
- background-size: 20px 20px, 20px 20px, 100px 100px, 100px 100px;
137
- background-position: -1px -1px;
138
- }
139
-
140
- body::after {
141
- content: "";
142
- position: fixed;
143
- inset: 0;
144
- z-index: -1;
145
- background: radial-gradient(ellipse at 50% 40%, transparent 30%, var(--vignette) 100%);
146
- pointer-events: none;
147
- }
148
-
149
- main {
150
- width: 100%;
151
- max-width: var(--max-width);
152
- margin: 0 auto;
153
- padding: 3rem 1.5rem 5rem;
154
- flex: 1;
155
- }
156
-
157
- /* ─── Header ─── */
158
- .site-header {
159
- position: sticky;
160
- top: 0;
161
- z-index: 100;
162
- background: var(--bg);
163
- border-bottom: 1px solid var(--border);
164
- padding: 0.9rem calc(max(0px, (100% - var(--header-width)) / 2) + 1.5rem);
165
- display: flex;
166
- align-items: center;
167
- justify-content: space-between;
168
- gap: 1rem;
169
- flex-wrap: wrap;
170
- }
171
-
172
- .site-title {
173
- font-family: var(--font-wordmark);
174
- font-size: 1.35rem;
175
- font-weight: 700;
176
- letter-spacing: -0.01em;
177
- color: var(--text);
178
- text-decoration: none;
179
- }
180
-
181
- .site-title:hover {
182
- color: var(--accent);
183
- }
184
-
185
- .site-nav {
186
- display: flex;
187
- align-items: baseline;
188
- gap: 1.5rem;
189
- }
190
-
191
- .site-nav a {
192
- font-family: var(--font-mono);
193
- font-size: 0.62rem;
194
- letter-spacing: 0.3em;
195
- text-indent: 0.3em;
196
- text-transform: uppercase;
197
- color: var(--text-dim);
198
- text-decoration: none;
199
- transition: color 0.3s;
200
- }
201
-
202
- .site-nav a:hover {
203
- color: var(--accent);
204
- }
205
-
206
- .theme-toggle {
207
- border: 1px solid var(--border);
208
- background: none;
209
- cursor: pointer;
210
- padding: 0.2rem 0.5rem;
211
- font-size: 0.8rem;
212
- color: var(--text-dim);
213
- line-height: 1;
214
- transition: color 0.3s, border-color 0.3s, box-shadow 0.3s;
215
- }
216
-
217
- .theme-toggle:hover {
218
- color: var(--accent);
219
- border-color: var(--accent-border);
220
- box-shadow: 0 0 30px var(--accent-glow);
221
- }
222
-
223
- .theme-toggle-icon::before {
224
- content: "☾";
225
- }
226
-
227
- [data-theme="dark"] .theme-toggle-icon::before {
228
- content: "☀";
229
- }
230
-
231
- @media (prefers-color-scheme: dark) {
232
- :root:not([data-theme="light"]) .theme-toggle-icon::before {
233
- content: "☀";
234
- }
235
- }
236
-
237
- /* ─── Footer ─── */
238
- .site-footer {
239
- width: 100%;
240
- max-width: var(--max-width);
241
- margin: 0 auto;
242
- padding: 1.5rem;
243
- border-top: 1px solid var(--border);
244
- font-family: var(--font-mono);
245
- font-size: 0.62rem;
246
- letter-spacing: 0.15em;
247
- text-transform: uppercase;
248
- color: var(--text-faint);
249
- }
250
-
251
- .site-footer p {
252
- margin: 0;
253
- }
254
-
255
- /* ─── Post list (home) ─── */
256
- .post-list {
257
- display: flex;
258
- flex-direction: column;
259
- gap: 2.5rem;
260
- }
261
-
262
- .post-item {
263
- border: 1px solid var(--border);
264
- padding: 1.75rem;
265
- background: color-mix(in srgb, var(--bg) 55%, transparent);
266
- transition: border-color 0.3s, box-shadow 0.3s;
267
- }
268
-
269
- .post-item:hover {
270
- border-color: var(--accent-border);
271
- box-shadow: 0 0 40px var(--accent-glow);
272
- }
273
-
274
- a.post-title {
275
- font-family: var(--font-display);
276
- font-size: clamp(1.8rem, 4.5vw, 2.4rem);
277
- font-weight: 700;
278
- line-height: 1.05;
279
- color: var(--text);
280
- text-decoration: none;
281
- transition: color 0.3s;
282
- }
283
-
284
- a.post-title:hover {
285
- color: var(--accent);
286
- }
287
-
288
- .post-meta {
289
- display: flex;
290
- align-items: baseline;
291
- flex-wrap: wrap;
292
- gap: 1.25rem;
293
- margin-top: 0.9rem;
294
- font-family: var(--font-mono);
295
- font-size: 0.62rem;
296
- letter-spacing: 0.2em;
297
- text-transform: uppercase;
298
- color: var(--text-faint);
299
- }
300
-
301
- .post-tags {
302
- display: inline;
303
- }
304
-
305
- .post-tag {
306
- color: var(--accent-2);
307
- text-decoration: none;
308
- transition: color 0.3s;
309
- }
310
-
311
- .post-tag:hover {
312
- color: var(--accent);
313
- }
314
-
315
- .post-description {
316
- margin: 1rem 0 0;
317
- font-size: 0.95rem;
318
- font-weight: 300;
319
- line-height: 1.85;
320
- color: var(--text-dim);
321
- }
322
-
323
- /* ─── Single post / page ─── */
324
- h1.post-title,
325
- .page-title {
326
- font-family: var(--font-display);
327
- font-size: clamp(2.4rem, 7vw, 3.75rem);
328
- font-weight: 700;
329
- line-height: 0.95;
330
- color: var(--text);
331
- margin: 0 0 1rem;
332
- }
333
-
334
- .post > .post-header {
335
- margin-bottom: 2.5rem;
336
- padding-bottom: 1.5rem;
337
- border-bottom: 1px solid var(--border);
338
- }
339
-
340
- /* ─── Prose ─── */
341
- .prose {
342
- font-size: 1rem;
343
- font-weight: 300;
344
- line-height: 1.85;
345
- overflow-wrap: break-word;
346
- }
347
-
348
- .prose h1,
349
- .prose h2,
350
- .prose h3,
351
- .prose h4,
352
- .prose h5,
353
- .prose h6 {
354
- font-family: var(--font-display);
355
- font-weight: 700;
356
- line-height: 1.1;
357
- color: var(--text);
358
- margin: 2.5rem 0 0.75rem;
359
- }
360
-
361
- .prose h1 { font-size: 2rem; }
362
- .prose h2 { font-size: 1.7rem; }
363
- .prose h3 { font-size: 1.4rem; }
364
- .prose h4 { font-size: 1.2rem; }
365
-
366
- .prose p {
367
- margin: 0 0 1.5rem;
368
- }
369
-
370
- .prose a {
371
- color: var(--accent);
372
- text-decoration: none;
373
- border-bottom: 1px solid var(--accent-border);
374
- transition: color 0.3s, border-color 0.3s;
375
- }
376
-
377
- .prose a:hover {
378
- color: var(--text);
379
- border-bottom-color: var(--text-faint);
380
- }
381
-
382
- .prose ul,
383
- .prose ol {
384
- margin: 0 0 1.5rem;
385
- padding-left: 1.5rem;
386
- }
387
-
388
- .prose li {
389
- margin-bottom: 0.5rem;
390
- }
391
-
392
- .prose blockquote {
393
- margin: 2.25rem 0;
394
- padding-left: 1.5rem;
395
- border-left: 2px solid var(--accent);
396
- font-style: italic;
397
- color: var(--text-dim);
398
- }
399
-
400
- .prose img {
401
- max-width: 100%;
402
- height: auto;
403
- border: 1px solid var(--border);
404
- }
405
-
406
- .prose hr {
407
- border: none;
408
- border-top: 1px solid var(--border);
409
- margin: 3rem 0;
410
- }
411
-
412
- .prose table {
413
- width: 100%;
414
- border-collapse: collapse;
415
- margin: 1.75rem 0;
416
- font-size: 0.85rem;
417
- font-variant-numeric: tabular-nums;
418
- }
419
-
420
- .prose th,
421
- .prose td {
422
- text-align: left;
423
- padding: 0.6rem 0.5rem;
424
- border-bottom: 1px solid var(--border);
425
- }
426
-
427
- .prose th {
428
- font-family: var(--font-mono);
429
- font-size: 0.62rem;
430
- font-weight: 500;
431
- letter-spacing: 0.15em;
432
- text-transform: uppercase;
433
- color: var(--text-faint);
434
- }
435
-
436
- /* ─── Code ─── */
437
- code {
438
- font-family: var(--font-mono);
439
- font-size: 0.85em;
440
- background-color: var(--code-bg);
441
- color: var(--code-text);
442
- padding: 0.125em 0.3em;
443
- border: 1px solid var(--border);
444
- }
445
-
446
- pre {
447
- font-family: var(--font-mono);
448
- font-size: 0.76rem;
449
- font-weight: 400;
450
- line-height: 1.7;
451
- background-color: var(--code-bg);
452
- border: 1px solid var(--border);
453
- padding: 1.25rem;
454
- overflow-x: auto;
455
- margin: 0 0 1.5rem;
456
- }
457
-
458
- pre code {
459
- background: none;
460
- border: none;
461
- padding: 0;
462
- font-size: 1em;
463
- }
464
-
465
- .hljs { color: var(--code-text); }
466
- .hljs-keyword, .hljs-selector-tag, .hljs-tag { color: var(--hl-keyword); }
467
- .hljs-string, .hljs-regexp { color: var(--hl-string); }
468
- .hljs-comment, .hljs-quote { color: var(--hl-comment); font-style: italic; }
469
- .hljs-number, .hljs-literal, .hljs-symbol, .hljs-bullet { color: var(--hl-number); }
470
- .hljs-title, .hljs-section, .hljs-name { color: var(--hl-title); font-weight: 600; }
471
- .hljs-attr, .hljs-attribute, .hljs-variable, .hljs-template-variable, .hljs-property { color: var(--hl-attr); }
472
- .hljs-type, .hljs-built_in, .hljs-selector-class, .hljs-selector-id { color: var(--hl-type); }
473
- .hljs-meta, .hljs-doctag { color: var(--hl-meta); }
474
- .hljs-addition { color: var(--hl-addition); }
475
- .hljs-deletion { color: var(--hl-deletion); }
476
- .hljs-emphasis { font-style: italic; }
477
- .hljs-strong { font-weight: 700; }
478
-
479
- /* ─── Archive & tags ─── */
480
- .archive-year {
481
- font-family: var(--font-mono);
482
- font-size: clamp(3rem, 8vw, 5rem);
483
- font-weight: 300;
484
- line-height: 1;
485
- margin: 3rem 0 1.25rem;
486
- -webkit-text-stroke: 1px var(--text-dim);
487
- -webkit-text-fill-color: transparent;
488
- color: var(--text-dim);
489
- }
490
-
491
- .archive-list {
492
- list-style: none;
493
- margin: 0;
494
- padding: 0;
495
- display: flex;
496
- flex-direction: column;
497
- gap: 0.75rem;
498
- }
499
-
500
- .archive-item {
501
- display: flex;
502
- align-items: baseline;
503
- gap: 1.25rem;
504
- }
505
-
506
- .archive-item time {
507
- flex: none;
508
- min-width: 9rem;
509
- font-family: var(--font-mono);
510
- font-size: 0.62rem;
511
- letter-spacing: 0.15em;
512
- text-transform: uppercase;
513
- color: var(--text-faint);
514
- }
515
-
516
- .archive-item a {
517
- font-family: var(--font-display);
518
- font-size: 1.2rem;
519
- font-weight: 600;
520
- color: var(--text);
521
- text-decoration: none;
522
- transition: color 0.3s;
523
- }
524
-
525
- .archive-item a:hover {
526
- color: var(--accent);
527
- }
528
-
529
- .tag-cloud {
530
- list-style: none;
531
- margin: 0;
532
- padding: 0;
533
- display: flex;
534
- flex-wrap: wrap;
535
- gap: 0.75rem;
536
- }
537
-
538
- .tag-cloud li {
539
- border: 1px solid var(--border);
540
- padding: 0.4rem 0.9rem;
541
- transition: border-color 0.3s, box-shadow 0.3s;
542
- }
543
-
544
- .tag-cloud li:hover {
545
- border-color: var(--accent-border);
546
- box-shadow: 0 0 30px var(--accent-glow);
547
- }
548
-
549
- .tag-cloud .post-tag {
550
- font-family: var(--font-mono);
551
- font-size: 0.62rem;
552
- letter-spacing: 0.2em;
553
- text-transform: uppercase;
554
- }
555
-
556
- .tag-count {
557
- font-family: var(--font-mono);
558
- font-size: 0.62rem;
559
- color: var(--text-faint);
560
- }
561
-
562
- /* ─── Responsive ─── */
563
- @media (max-width: 640px) {
564
- html {
565
- font-size: 16px;
566
- }
567
-
568
- .site-nav {
569
- gap: 1rem;
570
- }
571
-
572
- .archive-item {
573
- flex-direction: column;
574
- gap: 0.15rem;
575
- }
576
- }
577
-
578
- /* ─── Footnotes & excerpts ─── */
579
- .footnotes {
580
- margin-top: 3rem;
581
- padding-top: 1rem;
582
- border-top: 1px solid var(--border);
583
- font-size: 0.85em;
584
- }
585
-
586
- .footnote-ref a {
587
- text-decoration: none;
588
- }
589
-
590
- .footnote-backref {
591
- text-decoration: none;
592
- }
593
-
594
- .post-excerpt {
595
- margin-top: 1rem;
596
- }
597
-
598
- .read-more a {
599
- font-size: 0.85em;
600
- }
601
-
602
- .site-footer a {
603
- color: inherit;
604
- text-decoration: underline;
605
- text-decoration-thickness: 1px;
606
- text-underline-offset: 0.2em;
607
- }
608
-
609
- .site-footer a:hover {
610
- color: var(--accent);
611
- }
612
-
613
- .site-footer .copyright a {
614
- text-decoration: none;
615
- }
616
-
617
- /* ─── Scroll position indicator (nav bar) ─── */
618
- .scroll-indicator {
619
- position: absolute;
620
- bottom: -1px;
621
- left: 0;
622
- right: 0;
623
- height: 1px;
624
- pointer-events: none;
625
- }
626
-
627
- .scroll-line {
628
- position: absolute;
629
- bottom: 0;
630
- left: 0;
631
- width: 0;
632
- height: 1px;
633
- background: var(--accent);
634
- }
635
-
636
- .scroll-dot {
637
- position: absolute;
638
- left: 0;
639
- bottom: -2px;
640
- width: 5px;
641
- height: 5px;
642
- border-radius: 50%;
643
- background: var(--accent);
644
- transform: translateX(-50%);
645
- }
646
-
647
- [id] {
648
- scroll-margin-top: 5rem;
649
- }
650
-
651
- /* ─── Recent-posts sidebar (config.sidebarRecentPosts) ─── */
652
- .content-wrapper {
653
- display: flex;
654
- justify-content: center;
655
- gap: 2.5rem;
656
- flex: 1;
657
- }
658
-
659
- .content-wrapper main {
660
- margin: 0;
661
- }
662
-
663
- .recent-posts-sidebar {
664
- width: 280px;
665
- flex-shrink: 0;
666
- display: none;
667
- margin-top: 2.5rem;
668
- padding-right: 1.25rem;
669
- }
670
-
671
- @media (min-width: 1200px) {
672
- .recent-posts-sidebar {
673
- display: block;
674
- }
675
- }
676
-
677
- .recent-posts-sidebar .section-title {
678
- font-size: 0.7rem;
679
- text-transform: uppercase;
680
- letter-spacing: 0.1em;
681
- color: var(--text-dim);
682
- margin: 0 0 0.5rem;
683
- }
684
-
685
- .recent-posts {
686
- display: flex;
687
- flex-direction: column;
688
- gap: 0.5rem;
689
- }
690
-
691
- .recent-posts .post-link {
692
- display: flex;
693
- flex-direction: column;
694
- gap: 0.125rem;
695
- padding: 0.375rem 0;
696
- color: var(--text);
697
- text-decoration: none;
698
- }
699
-
700
- .recent-posts .post-title {
701
- font-size: 0.72rem;
702
- line-height: 1.3;
703
- }
704
-
705
- .recent-posts .post-link:hover .post-title {
706
- color: var(--accent);
707
- }
708
-
709
- .recent-posts .post-date {
710
- font-size: 0.62rem;
711
- color: var(--text-dim);
712
- }
713
-
714
- /* Header aligns with the content column; when the sidebar is on (wide
715
- viewports) the centered column is wider by sidebar + gap. */
716
- @media (min-width: 1200px) {
717
- body.has-sidebar .site-header {
718
- --header-width: calc(var(--max-width) + 280px + 2.5rem);
719
- }
720
- }
@@ -1,6 +0,0 @@
1
- {
2
- "name": "chalk",
3
- "label": "Chalk",
4
- "description": "Chalkboard on graph paper. Cormorant Garamond display, Spectral body, JetBrains Mono chrome, copper + cerulean accents, flat hairline cards, outline numerals. Dark is the chalkboard; light is pencil on daylight graph paper. Drawn from o16g.com.",
5
- "fonts": "Cormorant Garamond, Spectral, JetBrains Mono, Instrument Sans (Google Fonts)"
6
- }