@abreen/tada 1.17.1 → 1.18.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 (101) hide show
  1. package/README.md +37 -6
  2. package/bin/tada.ts +16 -7
  3. package/bin/validators.ts +33 -0
  4. package/build/branding.ts +41 -0
  5. package/build/build-manifest.ts +9 -4
  6. package/build/{watch/compiler-types.d.ts → build-types.d.ts} +8 -5
  7. package/build/build-validation.ts +176 -0
  8. package/build/bundle.ts +75 -65
  9. package/build/config-loader.ts +3 -3
  10. package/build/custom-fonts.ts +8 -5
  11. package/build/generate-favicon.ts +7 -6
  12. package/build/generate-fonts.ts +8 -15
  13. package/build/generate-katex-assets.ts +19 -17
  14. package/build/generate-web-app-manifest.ts +3 -11
  15. package/build/lodash-template.ts +14 -0
  16. package/build/output-publication.ts +238 -0
  17. package/build/pagefind.ts +49 -21
  18. package/build/pdf-text.ts +41 -1
  19. package/build/pipeline.ts +95 -101
  20. package/build/site-assets.ts +46 -0
  21. package/build/site-build.ts +267 -0
  22. package/build/source-model.ts +223 -244
  23. package/build/source-records.ts +69 -81
  24. package/build/template-globals.ts +3 -0
  25. package/build/templates.ts +5 -2
  26. package/build/toc-plugin.ts +21 -21
  27. package/build/types.d.ts +38 -38
  28. package/build/util.ts +0 -4
  29. package/build/utils/code.ts +38 -101
  30. package/build/utils/final-html.ts +171 -47
  31. package/build/utils/literate-java.ts +11 -7
  32. package/build/utils/markdown-partials.ts +4 -3
  33. package/build/utils/markdown.ts +6 -17
  34. package/build/utils/paths.ts +3 -0
  35. package/build/utils/plain-text.ts +18 -0
  36. package/build/utils/render.ts +197 -154
  37. package/build/utils/shiki-highlighter.ts +11 -0
  38. package/build/utils/source-template.ts +2 -2
  39. package/build/utils/trace-core.ts +8 -83
  40. package/build/utils/trace.ts +38 -95
  41. package/build/validate-config-links.ts +5 -5
  42. package/build/watch/build-incremental.ts +46 -103
  43. package/build/watch/compiler.ts +158 -37
  44. package/build/watch/engine.ts +207 -176
  45. package/build/watch/index.ts +9 -2
  46. package/build/watch/planner.ts +88 -144
  47. package/build/watch/runtime.ts +21 -34
  48. package/build/watch/types.d.ts +32 -64
  49. package/package.json +4 -4
  50. package/schema/site.schema.json +18 -2
  51. package/src/_content.scss +447 -0
  52. package/src/_fonts.scss +90 -0
  53. package/src/_layout.scss +50 -35
  54. package/src/appearance-picker/{style.scss → _index.scss} +1 -1
  55. package/src/code/{style.scss → _index.scss} +61 -0
  56. package/src/header/{_base.scss → _index.scss} +98 -6
  57. package/src/index.ts +1 -17
  58. package/src/navigate/{style.scss → _index.scss} +20 -0
  59. package/src/navigate/eligible.ts +0 -40
  60. package/src/navigate/index.ts +38 -4
  61. package/src/navigate/lifecycle.ts +19 -2
  62. package/src/navigate/runtime.ts +20 -4
  63. package/src/page-update/index.ts +33 -20
  64. package/src/print/{style.scss → _index.scss} +3 -1
  65. package/src/search/index.ts +7 -0
  66. package/src/slides/{style.scss → _index.scss} +5 -0
  67. package/src/style.scss +24 -536
  68. package/src/toc/index.ts +2 -2
  69. package/templates/_author.html +2 -2
  70. package/templates/_download.html +1 -1
  71. package/templates/_footer.html +1 -1
  72. package/templates/_heading.html +3 -3
  73. package/templates/_nav.html +2 -2
  74. package/templates/_page-bottom.html +6 -0
  75. package/templates/_top.html +18 -14
  76. package/templates/code.html +22 -21
  77. package/templates/default.html +12 -11
  78. package/templates/literate.html +6 -5
  79. package/build/copy.ts +0 -82
  80. package/build/generate-content-assets.ts +0 -121
  81. package/build/utils/content-files.ts +0 -170
  82. package/build/watch/assets.ts +0 -103
  83. package/build/watch/build-full.ts +0 -97
  84. package/build/watch/build-helpers.ts +0 -66
  85. package/build/watch/build-result.ts +0 -19
  86. package/build/watch/fs-commit.ts +0 -218
  87. package/build/watch/mutations.ts +0 -73
  88. package/build/watch/snapshot.ts +0 -201
  89. package/build/watch/validation.ts +0 -57
  90. package/src/code.scss +0 -60
  91. package/src/critical.scss +0 -5
  92. package/src/header/style.scss +0 -91
  93. /package/src/{literate.scss → _literate.scss} +0 -0
  94. /package/src/{material-symbols.scss → _material-symbols.scss} +0 -0
  95. /package/src/anchor/{style.scss → _index.scss} +0 -0
  96. /package/src/page-update/{style.scss → _index.scss} +0 -0
  97. /package/src/question/{style.scss → _index.scss} +0 -0
  98. /package/src/search/{style.scss → _index.scss} +0 -0
  99. /package/src/timezone/{style.scss → _index.scss} +0 -0
  100. /package/src/toc/{style.scss → _index.scss} +0 -0
  101. /package/src/trace/{style.scss → _index.scss} +0 -0
package/src/style.scss CHANGED
@@ -1,540 +1,28 @@
1
- @use 'mixins' as *;
1
+ // The only Sass entry point, imported by src/index.ts and compiled once per
2
+ // build into index.bundle.*.css. Every other Sass file is a partial loaded
3
+ // here: shared partials live in src/, component styles in
4
+ // src/<component>/_index.scss. Modules are emitted in this order, so later
5
+ // rules win specificity ties.
6
+
7
+ // Theme custom properties, generated from the site config at build time
2
8
  @use 'config/theme';
3
9
  @use 'base';
4
10
  @use 'layout';
5
11
  @use 'alerts';
6
- @include theme.custom-font-faces;
7
- @include theme.custom-font-tuning;
8
-
9
- @font-face {
10
- font-family: Inter;
11
- font-style: normal;
12
- font-weight: 100 900;
13
- src: url('inter/InterVariable.woff2') format('woff2');
14
- font-display: swap;
15
- }
16
-
17
- @font-face {
18
- font-family: Inter;
19
- font-style: italic;
20
- font-weight: 100 900;
21
- src: url('inter/InterVariable-Italic.woff2') format('woff2');
22
- font-display: swap;
23
- }
24
-
25
- @font-face {
26
- font-family: 'Google Sans Code';
27
- font-style: normal;
28
- font-weight: 300 800;
29
- src: url('google-sans-code/GoogleSansCodeVariable.woff2') format('woff2');
30
- font-display: swap;
31
- }
32
-
33
- @font-face {
34
- font-family: 'Google Sans Code';
35
- font-style: italic;
36
- font-weight: 300 800;
37
- src: url('google-sans-code/GoogleSansCodeVariable-Italic.woff2')
38
- format('woff2');
39
- font-display: swap;
40
- }
41
-
42
- @font-face {
43
- font-family: 'Source Serif 4';
44
- font-style: normal;
45
- font-weight: 200 900;
46
- src: url('source-serif-4/SourceSerif4-VariableFont_opsz,wght.woff2')
47
- format('woff2');
48
- font-display: swap;
49
- }
50
-
51
- @font-face {
52
- font-family: 'Source Serif 4';
53
- font-style: italic;
54
- font-weight: 200 900;
55
- src: url('source-serif-4/SourceSerif4-Italic-VariableFont_opsz,wght.woff2')
56
- format('woff2');
57
- font-display: swap;
58
- }
59
-
60
- @font-face {
61
- font-family: 'Courier Prime';
62
- font-style: normal;
63
- font-weight: 400;
64
- src: url('courier-prime/CourierPrime-Regular.woff2') format('woff2');
65
- font-display: swap;
66
- size-adjust: 106.383%;
67
- }
68
-
69
- @font-face {
70
- font-family: 'Courier Prime';
71
- font-style: italic;
72
- font-weight: 400;
73
- src: url('courier-prime/CourierPrime-Italic.woff2') format('woff2');
74
- font-display: swap;
75
- size-adjust: 106.383%;
76
- }
77
-
78
- @font-face {
79
- font-family: 'Courier Prime';
80
- font-style: normal;
81
- font-weight: 700;
82
- src: url('courier-prime/CourierPrime-Bold.woff2') format('woff2');
83
- font-display: swap;
84
- size-adjust: 106.383%;
85
- }
86
-
87
- @font-face {
88
- font-family: 'Courier Prime';
89
- font-style: italic;
90
- font-weight: 700;
91
- src: url('courier-prime/CourierPrime-BoldItalic.woff2') format('woff2');
92
- font-display: swap;
93
- size-adjust: 106.383%;
94
- }
95
-
96
- ::selection {
97
- color: var(--bg-color);
98
- background: var(--fg-color);
99
- }
100
-
101
- :focus-visible {
102
- outline: 2px solid var(--theme-color);
103
- outline-offset: 1px;
104
- }
105
-
106
- a.disabled {
107
- color: var(--fg-color-translucent);
108
- text-decoration-color: var(--fg-color-translucent);
109
- cursor: not-allowed;
110
-
111
- @media (hover: hover) {
112
- &:hover {
113
- color: var(--fg-color-translucent);
114
- text-decoration-line: none;
115
- }
116
- }
117
- }
118
-
119
- .external-link-tail {
120
- white-space: nowrap;
121
- }
122
-
123
- .external-link-tail::after,
124
- a.external:not(:has(.external-link-tail))::after {
125
- vertical-align: text-top;
126
-
127
- @include contained-mask(var(--icon-external-link));
128
- }
129
-
130
- .external-link-tail::after {
131
- display: inline;
132
-
133
- // With zero font metrics, block-end padding paints down from text-top.
134
- padding-block-end: var(--icon-external-link-size);
135
- padding-inline-start: var(--icon-external-link-size);
136
- font-size: 0;
137
- line-height: 0;
138
- content: '\2060' / '';
139
- }
140
-
141
- a.external:not(:has(.external-link-tail))::after {
142
- display: inline-block;
143
- width: var(--icon-external-link-size);
144
- height: var(--icon-external-link-size);
145
- content: '';
146
- }
147
-
148
- .footnotes {
149
- padding-top: 32px;
150
- margin-top: calc(var(--thematic-break-margin) / 2);
151
- font-size: 0.9em;
152
- border-top: 3px solid var(--bg2-color);
153
- }
154
-
155
- .footnotes .title {
156
- @include user-select(none);
157
-
158
- font-size: larger;
159
- font-weight: 700;
160
- }
161
-
162
- .footnotes p {
163
- margin: 0;
164
- }
165
-
166
- .footnotes li {
167
- margin-bottom: 8px;
168
- }
169
-
170
- a.footnote-ref {
171
- font-size: 0.8em;
172
- vertical-align: super;
173
- border-bottom: none;
174
- }
175
-
176
- .footnote-item {
177
- &:target {
178
- outline: 2px solid var(--theme-color);
179
- outline-offset: 1px;
180
- }
181
- }
182
-
183
- a.footnote-ref,
184
- .footnotes .footnote-backref {
185
- display: inline-block;
186
-
187
- @include user-select(none);
188
- }
189
-
190
- hr {
191
- display: flex;
192
- align-items: center;
193
- justify-content: center;
194
- height: 32px;
195
- margin: var(--section-padding) 0;
196
- border: none;
197
- }
198
-
199
- hr::after {
200
- display: block;
201
- width: 160px;
202
- height: 12px;
203
- content: '';
204
- background-color: var(--fg2-color);
205
- mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 12'><rect x='0' y='5.5' width='96' height='1' fill='black'/><path d='M 64,6 C 71,6 80,4.5 80,1 C 80,4.5 89,6 96,6 C 89,6 80,7.5 80,11 C 80,7.5 71,6 64,6 Z' fill='black'/><rect x='64' y='5.5' width='96' height='1' fill='black'/></svg>");
206
- mask-repeat: no-repeat;
207
- mask-size: 100% 100%;
208
- }
209
-
210
- button,
211
- a.button,
212
- input[type='submit'] {
213
- padding: 0.25em 0.66em;
214
- font-family: var(--font);
215
- font-size: var(--font-size-small);
216
- font-weight: 500;
217
- color: var(--fg-color);
218
- text-decoration: none;
219
- background: var(--bg-color);
220
- border: var(--control-border-width) solid var(--fg2-color);
221
- border-radius: var(--border-radius);
222
- }
223
-
224
- button:disabled,
225
- input[type='submit']:disabled {
226
- cursor: not-allowed;
227
- opacity: 0.4;
228
- }
229
-
230
- button:active:not(:disabled),
231
- a.button:not(.disabled):active,
232
- input[type='submit']:active:not(:disabled) {
233
- color: var(--bg-color) !important;
234
- background: var(--link-active-color) !important;
235
- }
236
-
237
- @media (hover: hover) {
238
- button:hover:not(:disabled),
239
- a.button:not(.disabled):hover,
240
- input[type='submit']:hover:not(:disabled) {
241
- cursor: pointer;
242
- background: var(--bg2-color);
243
- }
244
- }
245
-
246
- button:focus,
247
- a.button:focus,
248
- input[type='submit']:focus,
249
- input[type='text']:focus,
250
- input[type='search']:focus,
251
- select:focus {
252
- outline: 2px solid var(--theme-color);
253
- outline-offset: 1px;
254
- background-color: var(--bg2-color);
255
- border-color: var(--fg-color);
256
- }
257
-
258
- button.icon-button {
259
- display: inline-flex;
260
- align-items: center;
261
- justify-content: center;
262
- width: 30px;
263
- height: 30px;
264
- padding: 0;
265
- font-style: normal;
266
- font-weight: 400;
267
- vertical-align: top;
268
- border: none;
269
- border-radius: 999px;
270
- }
271
-
272
- button.icon-button:focus {
273
- background-color: var(--bg2-color);
274
- }
275
-
276
- ol.styled-list,
277
- ul.styled-list {
278
- font-weight: 700;
279
- color: var(--theme-color-text);
280
- }
281
-
282
- ul.styled-list {
283
- // Make bullet points slightly bigger
284
- font-size: 1.2em;
285
- }
286
-
287
- ol li .styled-list-item {
288
- font-size: 1em;
289
- font-weight: var(--font-weight);
290
- color: var(--fg-color);
291
- }
292
-
293
- ul li .styled-list-item {
294
- font-size: 0.8333em;
295
- font-weight: var(--font-weight);
296
- color: var(--fg-color);
297
- }
298
-
299
- ul {
300
- list-style-type: square;
301
- }
302
-
303
- ul ul {
304
- list-style-type: disc;
305
- }
306
-
307
- ul ul ul {
308
- list-style-type: circle;
309
- }
310
-
311
- ul ul ul ul {
312
- list-style-type: square;
313
- }
314
-
315
- ol {
316
- list-style-type: decimal;
317
- }
318
-
319
- :root[data-font-preference='serif'] ol > li::marker {
320
- font-variant-numeric: oldstyle-nums;
321
- }
322
-
323
- ol ol {
324
- list-style-type: lower-alpha;
325
- }
326
-
327
- ol ol ol {
328
- list-style-type: lower-roman;
329
- }
330
-
331
- ol ol ol ol {
332
- list-style-type: decimal;
333
- }
334
-
335
- ol ol ol ol ol {
336
- list-style-type: lower-alpha;
337
- }
338
-
339
- table {
340
- margin: 1rem 0;
341
- overflow: scroll;
342
- font-size: var(--font-size-smaller);
343
- border-collapse: collapse;
344
- }
345
-
346
- thead {
347
- text-align: left;
348
- }
349
-
350
- th,
351
- td {
352
- border-bottom: 1px solid var(--fg-color);
353
- }
354
-
355
- th {
356
- font-weight: 600;
357
- color: var(--theme-color-text);
358
- }
359
-
360
- th,
361
- td {
362
- padding: var(--table-padding) var(--table-padding) var(--table-padding) 0;
363
- vertical-align: top;
364
- text-align: left;
365
- }
366
-
367
- tbody tr:last-child td {
368
- border-bottom: none;
369
- }
370
-
371
- section {
372
- padding: calc(5 * var(--gap)) calc(2 * var(--gap));
373
- margin: 0 calc(-1 * var(--gap)) 2rem;
374
- background: linear-gradient(
375
- 0deg,
376
- transparent 0,
377
- var(--bg2-color) 3rem,
378
- var(--bg2-color) calc(100% - 3rem),
379
- transparent 100%
380
- );
381
-
382
- .alert {
383
- background: var(--bg-color);
384
- }
385
- }
386
-
387
- section h2:first-child,
388
- section h3:first-child,
389
- section h4:first-child,
390
- section h5:first-child,
391
- section h6:first-child {
392
- font-style: italic;
393
- font-weight: 600;
394
- }
395
-
396
- section > p:last-child,
397
- section > div:last-child {
398
- margin-bottom: 0;
399
- }
400
-
401
- section > h2 + p {
402
- margin-top: 16px;
403
- }
404
-
405
- blockquote {
406
- font-size: 1.2em;
407
- font-style: italic;
408
- color: var(--fg-color);
409
- }
410
-
411
- .heading-subtitle {
412
- font-style: italic;
413
- }
414
-
415
- h1 .heading-subtitle,
416
- h2 .heading-subtitle,
417
- h3 .heading-subtitle,
418
- h4 .heading-subtitle,
419
- h5 .heading-subtitle,
420
- h6 .heading-subtitle {
421
- margin-left: 1rem;
422
- font-weight: 400;
423
- }
424
-
425
- h3.has-subtitle,
426
- h4.has-subtitle,
427
- h5.has-subtitle,
428
- h6.has-subtitle {
429
- padding-bottom: 0.5em;
430
- margin-top: 6rem;
431
- margin-bottom: 0.5em;
432
- border-bottom: 1px solid var(--fg-color);
433
- }
434
-
435
- .small-caps {
436
- margin-right: -0.05em;
437
- font-variant-caps: all-small-caps;
438
- font-synthesis-small-caps: none;
439
- text-transform: uppercase;
440
- letter-spacing: 0.05em;
441
- }
442
-
443
- dl {
444
- dt {
445
- font-weight: 600;
446
- color: var(--theme-color-text);
447
- }
448
-
449
- dd > *:first-child {
450
- margin-top: 0;
451
- }
452
- }
453
-
454
- dfn {
455
- font-style: italic;
456
- font-weight: 500;
457
- color: var(--theme-color-text);
458
- }
459
-
460
- a.breadcrumb {
461
- @include user-select(none);
462
- @include subdued-link;
463
-
464
- &::after {
465
- display: inline-block;
466
- width: var(--icon-parent-size);
467
- height: var(--icon-parent-size);
468
- vertical-align: middle;
469
- content: '';
470
-
471
- @include contained-mask(var(--icon-parent));
472
- }
473
- }
474
-
475
- img {
476
- max-width: 100%;
477
- }
478
-
479
- .avatar {
480
- max-width: 100px;
481
- aspect-ratio: 1 / 1;
482
- object-fit: cover;
483
- border-radius: 999px;
484
- }
485
-
486
- figure.bio {
487
- float: left;
488
- max-width: 125px;
489
- margin: 1rem 1rem 1rem 0;
490
-
491
- @media (width > 540px) {
492
- max-width: 200px;
493
- }
494
-
495
- .avatar {
496
- display: block;
497
- width: 100%;
498
- max-width: 100%;
499
- }
500
-
501
- figcaption {
502
- margin-top: var(--gap);
503
- font-style: italic;
504
- text-align: center;
505
- }
506
- }
507
-
508
- kbd {
509
- display: inline-block;
510
- padding: 1px 5px;
511
- font-family: var(--font);
512
- font-size: var(--font-size-small);
513
- font-weight: 500;
514
- border: 1px solid var(--fg-color);
515
- border-radius: 4px;
516
- box-shadow: 0 2px 0 var(--fg-color);
517
- }
518
-
519
- select {
520
- position: relative;
521
- padding: 4px;
522
- font-family: var(--font);
523
- font-size: inherit;
524
- color: var(--fg-color);
525
- background: var(--bg-color);
526
- border: var(--control-border-width) solid var(--fg2-color);
527
- border-radius: var(--border-radius);
528
- }
529
-
530
- // Shiki dual-theme support (defaultColor: false, CSS custom properties only,
531
- // no inline color/background-color, so no !important needed)
532
- .shiki span {
533
- color: var(--shiki-light);
534
- }
535
-
536
- @media (prefers-color-scheme: dark) {
537
- .shiki span {
538
- color: var(--shiki-dark);
539
- }
540
- }
12
+ @use 'fonts';
13
+ @use 'content';
14
+ @use 'material-symbols';
15
+ @use 'anchor';
16
+ @use 'code';
17
+ @use 'literate';
18
+ @use 'header';
19
+ @use 'print';
20
+ @use 'question';
21
+ @use 'search';
22
+ @use 'slides';
23
+ @use 'timezone';
24
+ @use 'toc';
25
+ @use 'trace';
26
+ @use 'appearance-picker';
27
+ @use 'navigate';
28
+ @use 'page-update';
package/src/toc/index.ts CHANGED
@@ -45,7 +45,7 @@ function getHeadingsAndAlerts(
45
45
  ): (HTMLHeadingElement | HTMLDivElement)[] {
46
46
  return Array.from(
47
47
  parent.querySelectorAll(
48
- '.body h1, .body h2, .body h3, .body h4, .body h5, .body h6, .body > div.alert, .body section > div.alert',
48
+ '.body h1, .body h2, .body h3, .body h4, .body h5, .body h6, :is(.body, .page-content) > div.alert, .body section > div.alert',
49
49
  ),
50
50
  );
51
51
  }
@@ -55,7 +55,7 @@ function getTocElements(
55
55
  ): (HTMLHeadingElement | HTMLDivElement | HTMLHRElement)[] {
56
56
  return Array.from(
57
57
  parent.querySelectorAll(
58
- '.body h1, .body h2, .body h3, .body h4, .body h5, .body h6, .body > div.alert, .body section > div.alert, .body > hr',
58
+ '.body h1, .body h2, .body h3, .body h4, .body h5, .body h6, :is(.body, .page-content) > div.alert, .body section > div.alert, :is(.body, .page-content) > hr',
59
59
  ),
60
60
  );
61
61
  }
@@ -3,13 +3,13 @@
3
3
  <% if (page.author.url) { %>
4
4
  <a href="<%- encodeAuthoredUrl(page.author.url) %>">
5
5
  <% } %>
6
- <span class="text"><%= page.author.name %></span>
6
+ <span class="text"><%- page.author.name %></span>
7
7
  <% if (page.author.avatar) { %>
8
8
  <img
9
9
  width="32"
10
10
  height="32"
11
11
  src="<%- encodeAuthoredUrl(page.author.avatar) %>"
12
- alt="Picture of <%= page.author.name %>"
12
+ alt="Picture of <%- page.author.name %>"
13
13
  class="avatar"
14
14
  />
15
15
  <% } else { %>
@@ -1 +1 @@
1
- <a class="button" href="<%= page.codeFilePath %>" download="<%= page.downloadName %>" data-pagefind-ignore>Download</a>
1
+ <a class="button" href="<%= page.codeFilePath %>" download="<%- page.downloadName %>" data-pagefind-ignore>Download</a>
@@ -1,5 +1,5 @@
1
1
  <% if (site.features.footer) { %>
2
2
  <footer data-pagefind-ignore>
3
- <p>Built using <a href="https://github.com/abreen/Tada" target="_blank" rel="noopener noreferrer">Tada</a> <%= tadaVersion %></p>
3
+ <p>Built using <a href="https://github.com/abreen/Tada" target="_blank" rel="noopener noreferrer">Tada</a> <%- tadaVersion %></p>
4
4
  </footer>
5
5
  <% } %>
@@ -1,14 +1,14 @@
1
1
  <div class="title-and-info" data-pagefind-body>
2
2
  <% if (page.parent) { %>
3
- <a class="breadcrumb" href="<%- encodeAuthoredUrl(page.parent) %>" data-pagefind-ignore><%= page.parentLabel %></a>
3
+ <a class="breadcrumb" href="<%- encodeAuthoredUrl(page.parent) %>" data-pagefind-ignore><%- page.parentLabel %></a>
4
4
  <% } %>
5
5
  <h1 data-pagefind-weight="10" data-pagefind-meta="title_html[data-title-html]" data-title-html="<%- page.titleHtml %>"><%= page.titleHtml %></h1>
6
6
 
7
7
  <div class="info" data-pagefind-ignore>
8
8
  <% if (page.published) { %>
9
9
  <div class="publish-date">
10
- <time datetime="<%= isoDate(page.published) %>">
11
- <%= readableDate(page.published) %>
10
+ <time datetime="<%- isoDate(page.published) %>">
11
+ <%- readableDate(page.published) %>
12
12
  </time>
13
13
  </div>
14
14
  <% } %>
@@ -1,7 +1,7 @@
1
1
  <nav>
2
2
  <% config('nav').forEach(function(section) { %>
3
3
  <div>
4
- <p><%= section.title %></p>
4
+ <p><%- section.title %></p>
5
5
  <ul>
6
6
  <% section.links.forEach(function(link) { %>
7
7
  <li>
@@ -10,7 +10,7 @@
10
10
  <% if (!link.disabled) { %>href="<%- encodeAuthoredUrl(link.internal || link.external) %>"<% } %>
11
11
  <% if (link.external) { %>target="_blank" rel="noopener noreferrer"<% } %>
12
12
  >
13
- <%= link.text %></a>
13
+ <%- link.text %></a>
14
14
  </li>
15
15
  <% }) %>
16
16
  </ul>
@@ -0,0 +1,6 @@
1
+ <% if (site.features.footer || site.features.pickers) { %>
2
+ <div class="page-bottom" data-pagefind-ignore>
3
+ <%= render('_footer.html') %>
4
+ <%= render('_appearance-picker.html') %>
5
+ </div>
6
+ <% } %>