vowel 0.7.1-beta.0 → 0.7.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.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -239
  3. package/bin.js +91 -31
  4. package/cli.js +32 -0
  5. package/config.js +12 -0
  6. package/extractDate.js +1 -1
  7. package/package.json +8 -34
  8. package/pathDate.js +69 -0
  9. package/plugins/assets/index.js +1 -1
  10. package/plugins/atproto/body.js +3 -1
  11. package/plugins/atproto/index.js +5 -45
  12. package/plugins/atproto/publish.js +42 -11
  13. package/plugins/atproto/record.js +47 -4
  14. package/plugins/deploy-cloudflare/index.js +4 -1
  15. package/plugins/export/index.js +131 -0
  16. package/plugins/html/bundle/index.js +101 -44
  17. package/plugins/html/editor/Editor.svelte +9 -5
  18. package/plugins/html/editor/create-session.js +3 -1
  19. package/plugins/html/editor/directives.js +12 -0
  20. package/plugins/html/editor/frontmatter.js +77 -12
  21. package/plugins/html/editor/ingest.js +29 -31
  22. package/plugins/html/editor/main.js +5 -1
  23. package/plugins/html/editor/serialize.js +8 -4
  24. package/plugins/html/editor/socket.js +34 -4
  25. package/plugins/html/image.js +88 -27
  26. package/plugins/html/index.js +237 -109
  27. package/plugins/html/partials.js +41 -17
  28. package/plugins/html/socialLinks.js +13 -11
  29. package/plugins/html/writeRules.js +234 -42
  30. package/plugins/images/favicon.png +0 -0
  31. package/plugins/images/index.js +69 -8
  32. package/plugins/markdown/colorScheme.js +70 -14
  33. package/plugins/markdown/frontmatter.js +18 -8
  34. package/plugins/markdown/index.js +94 -25
  35. package/plugins/markdown/metadata.js +132 -32
  36. package/plugins/markdown/typography.js +11 -11
  37. package/plugins/styles/index.js +4 -4
  38. package/plugins/xml/index.js +17 -10
  39. package/stylesheets/DefaultStyles.css +163 -108
  40. package/stylesheets/TypographyStyles.css +148 -81
  41. package/utils.js +74 -21
@@ -3,84 +3,108 @@
3
3
  Barebones, Basic.css, Pico, Typeplate, Simple.css, and more
4
4
  */
5
5
 
6
+ /*
7
+ Variable names: --{kind}-{subject}-{variant}-{state}-{context},
8
+ general to specific, unused positions dropped, one word per position
9
+ (compounds joined: fontsize, borderradius).
10
+
11
+ kind the CSS type when the value feeds many properties (color,
12
+ url, string), else the property it feeds (fontsize, gap)
13
+ context where it applies: an element (main, article, aside) or a
14
+ component (menu, panel); none means the default
15
+
16
+ --color-link-hover-menu --fontsize-h1-article --color-primary-01
17
+ --_name is internal to a sheet: computed here, not for setting.
18
+ */
19
+
6
20
  @layer reset, typography, default, dynamic-typography;
7
21
 
8
22
  @layer default {
9
23
  :root {
10
24
 
11
25
  /* vertical space between main sections */
12
- --large-gap: 3em;
26
+ --gap-large: 3em;
13
27
 
14
28
  /* vertical space within content */
15
- --small-gap: 2em;
29
+ --gap-small: 2em;
16
30
 
17
31
  /* horizontal space between items */
18
- --gutter: 2em;
32
+ --gap-gutter: 2em;
19
33
 
20
34
  /* main body maximum width */
21
35
  --width-body: 100ch;
22
36
 
23
- --separator-breadcrumb: "/";
37
+ --string-separator-breadcrumb: "/";
24
38
 
25
39
  /* borders */
26
- --border-radius-tight: 5px;
27
- --border-radius-loose: calc(clamp(0.3rem, 1vw, 0.7rem) + 2px);
40
+ --borderradius-tight: 5px;
41
+ --borderradius-loose: calc(clamp(0.3rem, 1vw, 0.7rem) + 2px);
28
42
 
29
43
  /* body colors */
30
- --color-background-body: light-dark(var(--primary-10), var(--primary-01));
31
- --color-text-body: light-dark(var(--primary-01), var(--primary-10));
32
- --color-heading-body: light-dark(var(--primary-01), var(--primary-09));
33
- --color-link-body: light-dark(var(--secondary-05), var(--secondary-09));
34
- --color-link-hover-body: light-dark(var(--secondary-07), var(--secondary-10));
35
- --color-border-body: light-dark(var(--primary-07), var(--primary-04));
36
- --color-highlight-body: light-dark(var(--secondary-08), var(--secondary-03));
44
+ --color-background-body: light-dark(var(--color-primary-10), var(--color-primary-01));
45
+ --color-text-body: light-dark(var(--color-primary-01), var(--color-primary-10));
46
+ --color-heading-body: light-dark(var(--color-primary-01), var(--color-primary-09));
47
+ --color-link-body: light-dark(var(--color-secondary-05), var(--color-secondary-09));
48
+ --color-link-hover-body: light-dark(var(--color-secondary-07), var(--color-secondary-10));
49
+ --color-border-body: light-dark(var(--color-primary-07), var(--color-primary-03));
50
+ --color-highlight-body: light-dark(var(--color-secondary-08), var(--color-secondary-03));
37
51
 
38
52
  /* menu colors */
39
- --color-background-menu: light-dark(var(--primary-09), var(--primary-02));
40
- --color-surface-menu: light-dark(var(--tertiary-09), var(--tertiary-02));
41
- --color-surface-border-menu: light-dark(var(--tertiary-09), var(--tertiary-01));
42
- --color-border-menu: light-dark(var(--primary-07), var(--primary-03));
43
- --color-link-menu: light-dark(var(--tertiary-04), var(--tertiary-09));
44
- --color-link-disabled-menu: light-dark(var(--secondary-04), var(--secondary-07));
45
- --color-link-hover-menu: light-dark(var(--tertiary-06), var(--tertiary-10));
53
+ --color-background-menu: light-dark(var(--color-primary-09), var(--color-primary-02));
54
+ --color-surface-menu: light-dark(var(--color-tertiary-09), var(--color-tertiary-02));
55
+ --color-border-surface-menu: light-dark(var(--color-tertiary-09), var(--color-tertiary-01));
56
+ --color-border-menu: light-dark(var(--color-primary-07), var(--color-primary-03));
57
+ --color-link-menu: light-dark(var(--color-tertiary-04), var(--color-tertiary-09));
58
+ --color-link-disabled-menu: light-dark(var(--color-secondary-04), var(--color-secondary-07));
59
+ --color-link-hover-menu: light-dark(var(--color-tertiary-06), var(--color-tertiary-10));
46
60
 
47
61
  /* panel colors */
48
- --color-background-panel: light-dark(var(--primary-09), var(--primary-02));
49
- --color-background-hover-panel: light-dark(var(--primary-09), var(--primary-02));
50
- --color-border-panel: light-dark(var(--primary-08), var(--primary-02));
51
- --color-text-panel: light-dark(var(--primary-02), var(--primary-08));
52
- --color-text-hover-panel: light-dark(var(--primary-02), var(--primary-08));
53
- --color-border-hover-panel: light-dark(var(--accent-08), var(--accent-05));
62
+ --color-background-panel: light-dark(var(--color-primary-09), var(--color-primary-02));
63
+ --color-background-hover-panel: light-dark(var(--color-primary-09), var(--color-primary-02));
64
+ --color-border-panel: light-dark(var(--color-primary-08), var(--color-primary-02));
65
+ --color-text-panel: light-dark(var(--color-primary-02), var(--color-primary-08));
66
+ --color-text-hover-panel: light-dark(var(--color-primary-02), var(--color-primary-08));
67
+ --color-border-hover-panel: light-dark(var(--color-accent-08), var(--color-accent-05));
54
68
 
55
69
  /* pre colors */
56
- --color-background-pre: light-dark(var(--tertiary-09), var(--tertiary-02));
57
- --color-border-pre: light-dark(var(--tertiary-08), var(--tertiary-01));
58
- --color-text-pre: light-dark(var(--tertiary-02), var(--tertiary-02));
59
-
60
- /* semantic colors */
61
- --color-text-warning: light-dark(var(--warning-01), var(--warning-10));
62
- --color-heading-warning: light-dark(var(--warning-02), var(--warning-09));
63
- --color-icon-warning: light-dark(var(--warning-04), var(--warning-07));
64
- --color-background-warning: light-dark(var(--warning-09), var(--warning-02));
65
- --color-border-warning: light-dark(var(--warning-07), var(--warning-04));
66
-
67
- --color-text-note: light-dark(var(--info-01), var(--info-10));
68
- --color-heading-note: light-dark(var(--info-02), var(--info-09));
69
- --color-icon-note: light-dark(var(--info-04), var(--info-07));
70
- --color-background-note: light-dark(var(--info-09), var(--info-02));
71
- --color-border-note: light-dark(var(--info-07), var(--info-04));
72
-
73
- --color-text-success: light-dark(var(--success-01), var(--success-10));
74
- --color-heading-success: light-dark(var(--success-02), var(--success-09));
75
- --color-icon-success: light-dark(var(--success-04), var(--success-07));
76
- --color-background-success: light-dark(var(--success-09), var(--success-02));
77
- --color-border-success: light-dark(var(--success-07), var(--success-04));
78
-
79
- --color-text-danger: light-dark(var(--danger-01), var(--danger-10));
80
- --color-heading-danger: light-dark(var(--danger-02), var(--danger-09));
81
- --color-icon-danger: light-dark(var(--danger-04), var(--danger-07));
82
- --color-background-danger: light-dark(var(--danger-09), var(--danger-02));
83
- --color-border-danger: light-dark(var(--danger-07), var(--danger-04));
70
+ --color-background-pre: light-dark(var(--color-tertiary-09), var(--color-tertiary-02));
71
+ --color-border-pre: light-dark(var(--color-tertiary-08), var(--color-tertiary-01));
72
+ --color-text-pre: light-dark(var(--color-tertiary-02), var(--color-tertiary-02));
73
+
74
+ /*
75
+ alert colors: --color-{element}-alert-{type} for the types the
76
+ theme colours, and --color-{element}-alert for any other type
77
+ ([!CARD] is .alert.card): set those inside .alert.card to
78
+ colour your own
79
+ */
80
+ --color-text-alert: var(--color-text-body);
81
+ --color-heading-alert: var(--color-heading-body);
82
+ --color-background-alert: transparent;
83
+ --color-border-alert: var(--color-border-body);
84
+
85
+ --color-text-alert-warning: light-dark(var(--color-warning-01), var(--color-warning-10));
86
+ --color-heading-alert-warning: light-dark(var(--color-warning-02), var(--color-warning-09));
87
+ --color-icon-alert-warning: light-dark(var(--color-warning-04), var(--color-warning-07));
88
+ --color-background-alert-warning: light-dark(var(--color-warning-09), var(--color-warning-02));
89
+ --color-border-alert-warning: light-dark(var(--color-warning-07), var(--color-warning-04));
90
+
91
+ --color-text-alert-note: light-dark(var(--color-info-01), var(--color-info-10));
92
+ --color-heading-alert-note: light-dark(var(--color-info-02), var(--color-info-09));
93
+ --color-icon-alert-note: light-dark(var(--color-info-04), var(--color-info-07));
94
+ --color-background-alert-note: light-dark(var(--color-info-09), var(--color-info-02));
95
+ --color-border-alert-note: light-dark(var(--color-info-07), var(--color-info-04));
96
+
97
+ --color-text-alert-success: light-dark(var(--color-success-01), var(--color-success-10));
98
+ --color-heading-alert-success: light-dark(var(--color-success-02), var(--color-success-09));
99
+ --color-icon-alert-success: light-dark(var(--color-success-04), var(--color-success-07));
100
+ --color-background-alert-success: light-dark(var(--color-success-09), var(--color-success-02));
101
+ --color-border-alert-success: light-dark(var(--color-success-07), var(--color-success-04));
102
+
103
+ --color-text-alert-danger: light-dark(var(--color-danger-01), var(--color-danger-10));
104
+ --color-heading-alert-danger: light-dark(var(--color-danger-02), var(--color-danger-09));
105
+ --color-icon-alert-danger: light-dark(var(--color-danger-04), var(--color-danger-07));
106
+ --color-background-alert-danger: light-dark(var(--color-danger-09), var(--color-danger-02));
107
+ --color-border-alert-danger: light-dark(var(--color-danger-07), var(--color-danger-04));
84
108
 
85
109
  /* automatic dark mode */
86
110
  color-scheme: light dark;
@@ -128,7 +152,7 @@
128
152
  }
129
153
 
130
154
  &:hover {
131
- color: var(--color-link-body-hover);
155
+ color: var(--color-link-hover-body);
132
156
  }
133
157
 
134
158
  &:before {
@@ -138,7 +162,7 @@
138
162
 
139
163
  nav[aria-label=Contents]>ol {
140
164
  /* background: var(--color-surface-menu); */
141
- /* border-color: var(--color-surface-border-menu); */
165
+ /* border-color: var(--color-border-surface-menu); */
142
166
 
143
167
  a {
144
168
 
@@ -198,6 +222,10 @@
198
222
  display: grid;
199
223
  grid-template-columns: subgrid;
200
224
  align-items: baseline;
225
+
226
+ nav {
227
+ justify-self: end;
228
+ }
201
229
  }
202
230
 
203
231
  &>main {
@@ -206,6 +234,7 @@
206
234
 
207
235
  display: grid;
208
236
  grid-template-columns: subgrid;
237
+ align-content: start;
209
238
 
210
239
  &>* {
211
240
  grid-column-start: 1;
@@ -268,9 +297,6 @@
268
297
  }
269
298
 
270
299
  nav {
271
- border-radius: var(--border-radius-tight);
272
- border: 1px solid var(--color-menu-border);
273
-
274
300
  &>:first-child~* {
275
301
  display: none;
276
302
  }
@@ -285,6 +311,7 @@
285
311
  ul {
286
312
  list-style: none;
287
313
  display: flex;
314
+ flex-wrap: wrap;
288
315
  gap: 2ch;
289
316
  }
290
317
 
@@ -295,23 +322,17 @@
295
322
  text-transform: uppercase;
296
323
 
297
324
  &+a:before {
298
- content: var(--separator-breadcrumb);
325
+ content: var(--string-separator-breadcrumb);
299
326
  margin-inline: 1ch;
300
327
  }
301
328
  }
302
329
 
303
- /* TODO: Only render contents when necessary */
304
- nav[aria-label=Contents]:has(>ol:empty),
305
- nav[aria-label=Contents]:has(>ol>li:only-of-type>a) {
306
- display: none;
307
- }
308
-
309
330
  /* table of contents */
310
331
 
311
332
  nav[aria-label=Contents]>ol {
312
333
  /* border-width: 1px; */
313
334
  /* border-style: solid; */
314
- /* border-radius: var(--border-radius-tight); */
335
+ /* border-radius: var(--borderradius-tight); */
315
336
  height: max-content;
316
337
  max-height: 80vh;
317
338
 
@@ -376,6 +397,27 @@
376
397
  }
377
398
  }
378
399
 
400
+ /*
401
+ A hack, on purpose, for social link icons only: each takes the
402
+ colour of the text around it. The <img>'s background is that
403
+ colour and its own url (--url-icon) is the mask; object-position
404
+ moves its own pixels out of its box, where the browser clips
405
+ them. It keeps its size and its alt. The logo and inline icons
406
+ carry their url the same way (--url-logo, --url-icon) for an
407
+ author who wants this.
408
+ */
409
+ .social-links img {
410
+ background: currentColor;
411
+ mask: var(--url-icon) center / contain no-repeat;
412
+ object-position: -100vmax 0;
413
+ }
414
+
415
+ /* images: a blurry copy behind each one while it loads */
416
+
417
+ picture>img {
418
+ background: var(--url-image-placeholder, none) center / cover no-repeat;
419
+ }
420
+
379
421
  /* main */
380
422
 
381
423
  main>p:where([itemprop=description]) {
@@ -386,20 +428,22 @@
386
428
  main {
387
429
 
388
430
  max-width: min(80rch, 100%);
389
- margin-bottom: var(--large-gap);
431
+ margin-bottom: var(--gap-large);
390
432
  overflow-x: clip;
391
433
  /* position: relative; */
392
434
 
393
435
  table {
394
- position: relative;
395
- max-height: 80vh;
396
-
397
- thead {
398
- position: sticky;
399
- top: 0;
436
+ th,
437
+ td {
438
+ vertical-align: top;
400
439
  }
401
440
  }
402
441
 
442
+ /* the page's own image, beside its title, as well as the content's */
443
+ img {
444
+ border-radius: var(--borderradius-tight);
445
+ }
446
+
403
447
  /* content */
404
448
 
405
449
  section#content {
@@ -416,10 +460,6 @@
416
460
  }
417
461
  }
418
462
 
419
- img {
420
- border-radius: var(--border-radius-tight);
421
- }
422
-
423
463
  mark,
424
464
  code {
425
465
  padding: 0.1cap 0.5ch;
@@ -434,7 +474,7 @@
434
474
  pre,
435
475
  :not(pre)>code {
436
476
  border: 1px solid var(--color-border-pre);
437
- border-radius: var(--border-radius-tight);
477
+ border-radius: var(--borderradius-tight);
438
478
  }
439
479
 
440
480
 
@@ -453,6 +493,15 @@
453
493
  border-bottom: 1px solid var(--color-border-body);
454
494
  }
455
495
 
496
+ /*
497
+ Tables fill the content's width, the spare space shared
498
+ between columns by their content. A table too wide for the
499
+ page scrolls inside its <figure> (the typography sheet).
500
+ */
501
+ table {
502
+ width: 100%;
503
+ }
504
+
456
505
  hr {
457
506
  border-top: 1px solid var(--color-border-body);
458
507
  }
@@ -473,7 +522,7 @@
473
522
  background: var(--color-background-panel);
474
523
  transition-property: border-color, box-shadow, color;
475
524
  transition-duration: 0.2s;
476
- border-radius: var(--border-radius-loose);
525
+ border-radius: var(--borderradius-loose);
477
526
 
478
527
  a &:hover {
479
528
  border-color: var(--color-border-hover-panel);
@@ -491,61 +540,67 @@
491
540
  /* alerts */
492
541
 
493
542
  aside.alert {
494
- &.danger {
495
- --icon: '⛔️';
496
- background: var(--color-background-danger);
497
- color: var(--color-text-danger);
498
- border-color: var(--color-border-danger);
543
+ /* GitHub's CAUTION and TIP share DANGER's and SUCCESS's colours */
544
+ &.danger,
545
+ &.caution {
546
+ --string-alert-icon: '⛔️';
547
+ background: var(--color-background-alert-danger);
548
+ color: var(--color-text-alert-danger);
549
+ border-color: var(--color-border-alert-danger);
499
550
 
500
551
  h2 {
501
- color: var(--color-heading-danger);
552
+ color: var(--color-heading-alert-danger);
502
553
  }
503
554
  }
504
555
 
505
556
  &.note {
506
- --icon: 'ℹ️';
507
- background: var(--color-background-note);
508
- color: var(--color-text-note);
509
- border-color: var(--color-border-note);
557
+ --string-alert-icon: 'ℹ️';
558
+ background: var(--color-background-alert-note);
559
+ color: var(--color-text-alert-note);
560
+ border-color: var(--color-border-alert-note);
510
561
 
511
562
  h2 {
512
- color: var(--color-heading-note);
563
+ color: var(--color-heading-alert-note);
513
564
  }
514
565
  }
515
566
 
516
- &.success {
517
- --icon: '💡';
518
- background: var(--color-background-success);
519
- color: var(--color-text-success);
520
- border-color: var(--color-border-success);
567
+ &.success,
568
+ &.tip {
569
+ --string-alert-icon: '💡';
570
+ background: var(--color-background-alert-success);
571
+ color: var(--color-text-alert-success);
572
+ border-color: var(--color-border-alert-success);
521
573
 
522
574
  h2 {
523
- color: var(--color-heading-success);
575
+ color: var(--color-heading-alert-success);
524
576
  }
525
577
  }
526
578
 
527
579
  &.warning {
528
- --icon: '⚠️';
529
- background: var(--color-background-warning);
530
- color: var(--color-text-warning);
531
- border-color: var(--color-border-warning);
580
+ --string-alert-icon: '⚠️';
581
+ background: var(--color-background-alert-warning);
582
+ color: var(--color-text-alert-warning);
583
+ border-color: var(--color-border-alert-warning);
532
584
 
533
585
  h2 {
534
- color: var(--color-heading-warning);
586
+ color: var(--color-heading-alert-warning);
535
587
  }
536
588
  }
537
589
 
590
+ background: var(--color-background-alert);
591
+ color: var(--color-text-alert);
592
+ border-color: var(--color-border-alert);
538
593
  border-left-width: 0.5ch;
539
594
  border-left-style: solid;
540
595
 
541
596
  h2 {
542
- color: var(--heading);
597
+ color: var(--color-heading-alert);
543
598
 
544
599
  &:before {
545
600
  font-size: 0.8em;
546
601
  margin-right: 0.7rem;
547
602
  opacity: 0.9;
548
- content: var(--icon);
603
+ content: var(--string-alert-icon);
549
604
  }
550
605
  }
551
606
  }
@@ -604,18 +659,18 @@ footer {
604
659
 
605
660
  /* homepage */
606
661
  @media (min-width: 140rch) {
607
- body.home {
662
+ body.page_home {
608
663
  grid-template-columns: 1fr 15rch 70rch 15rch 1fr;
609
664
  }
610
665
  }
611
666
 
612
- body.home {
667
+ body.page_home {
613
668
 
614
669
 
615
670
  /*
616
- The homepage's tagline is the hero
671
+ The homepage's slogan is the hero
617
672
  */
618
- #tagline {
673
+ main>[itemprop="slogan"] {
619
674
  font-size: 4em;
620
675
  font-weight: bold;
621
676
  padding-block: 0.5lh;