@usezanin/blog 0.1.0

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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -0
  3. package/dist/BlogIndex.d.ts +9 -0
  4. package/dist/BlogIndex.d.ts.map +1 -0
  5. package/dist/BlogIndex.js +21 -0
  6. package/dist/BlogIndex.js.map +1 -0
  7. package/dist/BlogPost.d.ts +14 -0
  8. package/dist/BlogPost.d.ts.map +1 -0
  9. package/dist/BlogPost.js +53 -0
  10. package/dist/BlogPost.js.map +1 -0
  11. package/dist/components/CTA.d.ts +7 -0
  12. package/dist/components/CTA.d.ts.map +1 -0
  13. package/dist/components/CTA.js +5 -0
  14. package/dist/components/CTA.js.map +1 -0
  15. package/dist/components/Callout.d.ts +8 -0
  16. package/dist/components/Callout.d.ts.map +1 -0
  17. package/dist/components/Callout.js +11 -0
  18. package/dist/components/Callout.js.map +1 -0
  19. package/dist/components/Chart.d.ts +16 -0
  20. package/dist/components/Chart.d.ts.map +1 -0
  21. package/dist/components/Chart.js +28 -0
  22. package/dist/components/Chart.js.map +1 -0
  23. package/dist/components/CodeBlock.d.ts +9 -0
  24. package/dist/components/CodeBlock.d.ts.map +1 -0
  25. package/dist/components/CodeBlock.js +13 -0
  26. package/dist/components/CodeBlock.js.map +1 -0
  27. package/dist/components/ComparisonTable.d.ts +9 -0
  28. package/dist/components/ComparisonTable.d.ts.map +1 -0
  29. package/dist/components/ComparisonTable.js +12 -0
  30. package/dist/components/ComparisonTable.js.map +1 -0
  31. package/dist/components/Embeds.d.ts +15 -0
  32. package/dist/components/Embeds.d.ts.map +1 -0
  33. package/dist/components/Embeds.js +13 -0
  34. package/dist/components/Embeds.js.map +1 -0
  35. package/dist/components/FAQ.d.ts +9 -0
  36. package/dist/components/FAQ.d.ts.map +1 -0
  37. package/dist/components/FAQ.js +15 -0
  38. package/dist/components/FAQ.js.map +1 -0
  39. package/dist/components/Figure.d.ts +8 -0
  40. package/dist/components/Figure.d.ts.map +1 -0
  41. package/dist/components/Figure.js +5 -0
  42. package/dist/components/Figure.js.map +1 -0
  43. package/dist/config.d.ts +30 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +27 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/custom-components.d.ts +9 -0
  48. package/dist/custom-components.d.ts.map +1 -0
  49. package/dist/custom-components.js +58 -0
  50. package/dist/custom-components.js.map +1 -0
  51. package/dist/data.d.ts +9 -0
  52. package/dist/data.d.ts.map +1 -0
  53. package/dist/data.js +36 -0
  54. package/dist/data.js.map +1 -0
  55. package/dist/handlers.d.ts +21 -0
  56. package/dist/handlers.d.ts.map +1 -0
  57. package/dist/handlers.js +89 -0
  58. package/dist/handlers.js.map +1 -0
  59. package/dist/index.d.ts +18 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +17 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/mdx.d.ts +8 -0
  64. package/dist/mdx.d.ts.map +1 -0
  65. package/dist/mdx.js +35 -0
  66. package/dist/mdx.js.map +1 -0
  67. package/dist/seo.d.ts +19 -0
  68. package/dist/seo.d.ts.map +1 -0
  69. package/dist/seo.js +49 -0
  70. package/dist/seo.js.map +1 -0
  71. package/package.json +61 -0
  72. package/styles.css +484 -0
package/styles.css ADDED
@@ -0,0 +1,484 @@
1
+ /**
2
+ * @usezanin/blog — themable reading styles.
3
+ *
4
+ * Every color and face routes through a CSS variable so host sites can
5
+ * re-brand by overriding the --zanin-* tokens; the defaults follow the Zanin
6
+ * design system: warm light canvas, ink (never pure black), one brand accent,
7
+ * serif for the content's voice, sans for chrome, pill-shaped tags.
8
+ */
9
+ .zanin-blog {
10
+ --zanin-accent: #2563eb;
11
+ --zanin-accent-pressed: #1d4ed8;
12
+ --zanin-canvas: #fafaf9;
13
+ --zanin-surface: #ffffff;
14
+ --zanin-ink: #1c1917;
15
+ --zanin-ink-muted: #57534e;
16
+ --zanin-ink-faint: #a8a29e;
17
+ --zanin-hairline: #e7e5e4;
18
+ --zanin-font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
19
+ --zanin-font-serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
20
+ --zanin-font-mono: ui-monospace, "SF Mono", "Cascadia Code", Menlo, monospace;
21
+ --zanin-measure: 720px;
22
+ --zanin-radius-card: 22px;
23
+
24
+ margin: 0 auto;
25
+ max-width: var(--zanin-measure);
26
+ padding: 48px 24px 96px;
27
+ color: var(--zanin-ink);
28
+ font-family: var(--zanin-font-sans);
29
+ font-size: 16px;
30
+ line-height: 1.6;
31
+ }
32
+
33
+ .zanin-blog a {
34
+ color: var(--zanin-accent);
35
+ text-decoration: none;
36
+ }
37
+ .zanin-blog a:hover {
38
+ color: var(--zanin-accent-pressed);
39
+ }
40
+
41
+ .zanin-tag {
42
+ display: inline-block;
43
+ border-radius: 999px;
44
+ background: color-mix(in srgb, var(--zanin-accent) 10%, transparent);
45
+ color: var(--zanin-accent);
46
+ font-size: 12px;
47
+ font-weight: 600;
48
+ letter-spacing: 0.02em;
49
+ padding: 2px 12px;
50
+ }
51
+
52
+ /* ---- Index ---------------------------------------------------------- */
53
+
54
+ .zanin-index-header {
55
+ margin-bottom: 48px;
56
+ }
57
+ .zanin-index-header h1 {
58
+ font-family: var(--zanin-font-serif);
59
+ font-size: 44px;
60
+ font-weight: 500;
61
+ letter-spacing: -0.015em;
62
+ line-height: 1.1;
63
+ margin: 0 0 8px;
64
+ text-wrap: balance;
65
+ }
66
+ .zanin-index-header p {
67
+ color: var(--zanin-ink-muted);
68
+ font-size: 18px;
69
+ margin: 0;
70
+ max-width: 52ch;
71
+ }
72
+
73
+ .zanin-index-list {
74
+ display: flex;
75
+ flex-direction: column;
76
+ }
77
+ .zanin-index-item {
78
+ border-top: 1px solid var(--zanin-hairline);
79
+ }
80
+ .zanin-index-item:last-child {
81
+ border-bottom: 1px solid var(--zanin-hairline);
82
+ }
83
+ .zanin-index-item > a {
84
+ color: inherit;
85
+ display: block;
86
+ padding: 28px 4px;
87
+ transition: opacity 0.15s ease;
88
+ }
89
+ .zanin-index-item > a:hover {
90
+ color: inherit;
91
+ opacity: 0.72;
92
+ }
93
+ .zanin-index-item h2 {
94
+ font-family: var(--zanin-font-serif);
95
+ font-size: 26px;
96
+ font-weight: 500;
97
+ letter-spacing: -0.01em;
98
+ line-height: 1.25;
99
+ margin: 0 0 6px;
100
+ text-wrap: balance;
101
+ }
102
+ .zanin-index-item p {
103
+ color: var(--zanin-ink-muted);
104
+ margin: 0;
105
+ max-width: 62ch;
106
+ }
107
+ .zanin-index-meta {
108
+ align-items: center;
109
+ color: var(--zanin-ink-faint);
110
+ display: flex;
111
+ font-size: 12px;
112
+ font-weight: 600;
113
+ gap: 10px;
114
+ letter-spacing: 0.09em;
115
+ margin-bottom: 10px;
116
+ text-transform: uppercase;
117
+ }
118
+ .zanin-index-empty {
119
+ color: var(--zanin-ink-faint);
120
+ }
121
+
122
+ /* ---- Post header ----------------------------------------------------- */
123
+
124
+ .zanin-post-header {
125
+ margin-bottom: 44px;
126
+ }
127
+ .zanin-post-meta {
128
+ align-items: center;
129
+ color: var(--zanin-ink-faint);
130
+ display: flex;
131
+ flex-wrap: wrap;
132
+ font-size: 12px;
133
+ font-weight: 600;
134
+ gap: 10px;
135
+ letter-spacing: 0.09em;
136
+ margin-bottom: 16px;
137
+ text-transform: uppercase;
138
+ }
139
+ .zanin-post-header h1 {
140
+ font-family: var(--zanin-font-serif);
141
+ font-size: 44px;
142
+ font-weight: 500;
143
+ letter-spacing: -0.015em;
144
+ line-height: 1.12;
145
+ margin: 0 0 14px;
146
+ text-wrap: balance;
147
+ }
148
+ .zanin-post-lede {
149
+ color: var(--zanin-ink-muted);
150
+ font-size: 19px;
151
+ line-height: 1.55;
152
+ margin: 0;
153
+ text-wrap: pretty;
154
+ }
155
+
156
+ /* ---- Prose ----------------------------------------------------------- */
157
+
158
+ .zanin-prose {
159
+ font-size: 17px;
160
+ line-height: 1.65;
161
+ }
162
+ .zanin-prose > * + * {
163
+ margin-top: 1.15em;
164
+ }
165
+ .zanin-prose p {
166
+ margin: 0;
167
+ text-wrap: pretty;
168
+ }
169
+ .zanin-prose h2 {
170
+ font-family: var(--zanin-font-serif);
171
+ font-size: 28px;
172
+ font-weight: 500;
173
+ letter-spacing: -0.01em;
174
+ line-height: 1.25;
175
+ margin-top: 2em;
176
+ text-wrap: balance;
177
+ }
178
+ .zanin-prose h3 {
179
+ font-size: 20px;
180
+ font-weight: 650;
181
+ line-height: 1.3;
182
+ margin-top: 1.8em;
183
+ }
184
+ .zanin-prose ul,
185
+ .zanin-prose ol {
186
+ padding-left: 1.4em;
187
+ }
188
+ .zanin-prose li + li {
189
+ margin-top: 0.4em;
190
+ }
191
+ .zanin-prose blockquote {
192
+ border-left: 3px solid var(--zanin-accent);
193
+ color: var(--zanin-ink-muted);
194
+ font-family: var(--zanin-font-serif);
195
+ font-size: 20px;
196
+ font-style: italic;
197
+ margin: 1.6em 0;
198
+ padding: 0.2em 0 0.2em 1.2em;
199
+ }
200
+ .zanin-prose code {
201
+ background: color-mix(in srgb, var(--zanin-ink) 6%, transparent);
202
+ border-radius: 6px;
203
+ font-family: var(--zanin-font-mono);
204
+ font-size: 0.88em;
205
+ padding: 0.15em 0.4em;
206
+ }
207
+ .zanin-prose img {
208
+ border-radius: var(--zanin-radius-card);
209
+ height: auto;
210
+ max-width: 100%;
211
+ }
212
+ .zanin-prose hr {
213
+ border: none;
214
+ border-top: 1px solid var(--zanin-hairline);
215
+ margin: 2.5em 0;
216
+ }
217
+ .zanin-prose table {
218
+ border-collapse: collapse;
219
+ font-size: 15px;
220
+ width: 100%;
221
+ }
222
+ .zanin-prose th,
223
+ .zanin-prose td {
224
+ border-bottom: 1px solid var(--zanin-hairline);
225
+ padding: 10px 12px;
226
+ text-align: left;
227
+ }
228
+ .zanin-prose th {
229
+ color: var(--zanin-ink-faint);
230
+ font-size: 12px;
231
+ font-weight: 650;
232
+ letter-spacing: 0.09em;
233
+ text-transform: uppercase;
234
+ }
235
+
236
+ /* ---- Built-in components --------------------------------------------- */
237
+
238
+ .zanin-callout {
239
+ background: var(--zanin-surface);
240
+ border-radius: var(--zanin-radius-card);
241
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--zanin-accent) 10%, transparent);
242
+ display: flex;
243
+ gap: 14px;
244
+ padding: 18px 22px;
245
+ }
246
+ .zanin-callout-icon {
247
+ align-items: center;
248
+ background: color-mix(in srgb, var(--zanin-accent) 12%, transparent);
249
+ border-radius: 999px;
250
+ color: var(--zanin-accent);
251
+ display: flex;
252
+ flex-shrink: 0;
253
+ font-size: 13px;
254
+ font-weight: 700;
255
+ height: 26px;
256
+ justify-content: center;
257
+ margin-top: 2px;
258
+ width: 26px;
259
+ }
260
+ .zanin-callout-warning .zanin-callout-icon {
261
+ background: rgba(217, 119, 6, 0.14);
262
+ color: #b45309;
263
+ }
264
+ .zanin-callout-success .zanin-callout-icon {
265
+ background: rgba(22, 163, 74, 0.13);
266
+ color: #15803d;
267
+ }
268
+ .zanin-callout-body {
269
+ font-size: 15.5px;
270
+ }
271
+ .zanin-callout-body > * + * {
272
+ margin-top: 0.5em;
273
+ }
274
+ .zanin-callout-body p {
275
+ margin: 0;
276
+ }
277
+ .zanin-callout-title {
278
+ font-weight: 650;
279
+ }
280
+
281
+ .zanin-figure {
282
+ margin: 0;
283
+ }
284
+ .zanin-figure img {
285
+ border-radius: var(--zanin-radius-card);
286
+ height: auto;
287
+ max-width: 100%;
288
+ width: 100%;
289
+ }
290
+ .zanin-figure figcaption {
291
+ color: var(--zanin-ink-faint);
292
+ font-size: 13.5px;
293
+ margin-top: 10px;
294
+ text-align: center;
295
+ }
296
+
297
+ .zanin-chart {
298
+ background: var(--zanin-surface);
299
+ border-radius: var(--zanin-radius-card);
300
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--zanin-accent) 8%, transparent);
301
+ padding: 22px;
302
+ }
303
+ .zanin-chart-title {
304
+ color: var(--zanin-ink-faint);
305
+ font-size: 12px;
306
+ font-weight: 650;
307
+ letter-spacing: 0.09em;
308
+ margin: 0 0 14px;
309
+ text-transform: uppercase;
310
+ }
311
+ .zanin-chart .recharts-text {
312
+ fill: var(--zanin-ink-faint);
313
+ }
314
+
315
+ .zanin-cta {
316
+ align-items: center;
317
+ background: color-mix(in srgb, var(--zanin-accent) 7%, var(--zanin-surface));
318
+ border-radius: var(--zanin-radius-card);
319
+ display: flex;
320
+ flex-wrap: wrap;
321
+ gap: 18px;
322
+ justify-content: space-between;
323
+ padding: 26px 30px;
324
+ }
325
+ .zanin-cta-title {
326
+ font-family: var(--zanin-font-serif);
327
+ font-size: 22px;
328
+ font-weight: 500;
329
+ margin: 0;
330
+ }
331
+ .zanin-cta-description {
332
+ color: var(--zanin-ink-muted);
333
+ font-size: 15px;
334
+ margin: 4px 0 0;
335
+ }
336
+ .zanin-cta-button {
337
+ background: var(--zanin-accent);
338
+ border-radius: 999px;
339
+ box-shadow: 0 4px 14px color-mix(in srgb, var(--zanin-accent) 35%, transparent);
340
+ color: #fff !important;
341
+ display: inline-block;
342
+ font-size: 15px;
343
+ font-weight: 650;
344
+ padding: 12px 26px;
345
+ transition: transform 0.12s ease, background 0.15s ease;
346
+ white-space: nowrap;
347
+ }
348
+ .zanin-cta-button:hover {
349
+ background: var(--zanin-accent-pressed);
350
+ }
351
+ .zanin-cta-button:active {
352
+ transform: scale(0.97);
353
+ }
354
+
355
+ .zanin-embed-youtube {
356
+ aspect-ratio: 16 / 9;
357
+ border-radius: var(--zanin-radius-card);
358
+ overflow: hidden;
359
+ }
360
+ .zanin-embed-youtube iframe {
361
+ border: 0;
362
+ height: 100%;
363
+ width: 100%;
364
+ }
365
+
366
+ .zanin-tweet {
367
+ background: var(--zanin-surface);
368
+ border-radius: var(--zanin-radius-card);
369
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--zanin-accent) 8%, transparent);
370
+ margin: 0;
371
+ padding: 22px 26px;
372
+ }
373
+ .zanin-tweet-text {
374
+ font-family: var(--zanin-font-serif);
375
+ font-size: 19px;
376
+ font-style: italic;
377
+ line-height: 1.5;
378
+ }
379
+ .zanin-tweet footer {
380
+ align-items: center;
381
+ color: var(--zanin-ink-faint);
382
+ display: flex;
383
+ font-size: 13.5px;
384
+ gap: 8px;
385
+ margin-top: 14px;
386
+ }
387
+ .zanin-tweet-author {
388
+ color: var(--zanin-ink);
389
+ font-weight: 650;
390
+ }
391
+
392
+ .zanin-codeblock {
393
+ background: #1c1917;
394
+ border-radius: var(--zanin-radius-card);
395
+ color: #e7e5e4;
396
+ overflow: hidden;
397
+ position: relative;
398
+ }
399
+ .zanin-codeblock-lang {
400
+ color: #a8a29e;
401
+ font-family: var(--zanin-font-mono);
402
+ font-size: 11px;
403
+ letter-spacing: 0.09em;
404
+ position: absolute;
405
+ right: 16px;
406
+ text-transform: uppercase;
407
+ top: 12px;
408
+ }
409
+ .zanin-codeblock pre {
410
+ font-family: var(--zanin-font-mono);
411
+ font-size: 13.5px;
412
+ line-height: 1.6;
413
+ margin: 0;
414
+ overflow-x: auto;
415
+ padding: 20px 24px;
416
+ }
417
+ .zanin-codeblock code {
418
+ background: none;
419
+ padding: 0;
420
+ }
421
+
422
+ .zanin-comparison {
423
+ overflow-x: auto;
424
+ }
425
+ .zanin-comparison .zanin-highlight {
426
+ background: color-mix(in srgb, var(--zanin-accent) 7%, transparent);
427
+ }
428
+ .zanin-check {
429
+ color: #15803d;
430
+ font-weight: 700;
431
+ }
432
+ .zanin-cross {
433
+ color: var(--zanin-ink-faint);
434
+ }
435
+
436
+ .zanin-faq details {
437
+ border-top: 1px solid var(--zanin-hairline);
438
+ padding: 16px 4px;
439
+ }
440
+ .zanin-faq details:last-child {
441
+ border-bottom: 1px solid var(--zanin-hairline);
442
+ }
443
+ .zanin-faq summary {
444
+ cursor: pointer;
445
+ font-weight: 650;
446
+ list-style: none;
447
+ }
448
+ .zanin-faq summary::-webkit-details-marker {
449
+ display: none;
450
+ }
451
+ .zanin-faq summary::after {
452
+ color: var(--zanin-ink-faint);
453
+ content: "+";
454
+ float: right;
455
+ font-size: 18px;
456
+ }
457
+ .zanin-faq details[open] summary::after {
458
+ content: "–";
459
+ }
460
+ .zanin-faq details p {
461
+ color: var(--zanin-ink-muted);
462
+ margin: 10px 0 0;
463
+ }
464
+
465
+ /* ---- Responsiveness & motion preferences ------------------------------ */
466
+
467
+ @media (max-width: 640px) {
468
+ .zanin-blog {
469
+ padding: 32px 18px 64px;
470
+ }
471
+ .zanin-index-header h1,
472
+ .zanin-post-header h1 {
473
+ font-size: 34px;
474
+ }
475
+ }
476
+
477
+ @media (prefers-reduced-motion: reduce) {
478
+ .zanin-blog *,
479
+ .zanin-blog *::before,
480
+ .zanin-blog *::after {
481
+ animation-duration: 0.01ms !important;
482
+ transition-duration: 0.01ms !important;
483
+ }
484
+ }