@imontene/mdrender 2.9.0 → 2.11.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.
@@ -0,0 +1,535 @@
1
+ /*
2
+ * mdrender magazine theme (tech_magazine): loaded after theme.css. A technology magazine: Inter
3
+ * from 300 to 800, Newsreader for the standfirst, drop cap and pull quotes, one wide ragged
4
+ * column. With a title, the title block is a full-bleed cover over a picture from
5
+ * tech_magazine/<magazine-name>/ (render/magazine.ts sets the picture, the masthead, the accent
6
+ * and the page margins, header and footer). theme-tech-magazine-dark.css swaps the colours.
7
+ */
8
+
9
+ :root {
10
+ --tm-bg: #ffffff;
11
+ --tm-ink: #1d1d1f;
12
+ --tm-ink-secondary: #424245;
13
+ --tm-ink-muted: #6e6e73;
14
+ --tm-hairline: #d2d2d7;
15
+ --tm-surface: #f5f5f7;
16
+ /* The accent of the AlphaZeroChess covers; `accent:` or the magazine's magazine.json change it. */
17
+ --tm-accent: #2f6bff;
18
+ /* The accent as text and rules on the page (lighter on the dark page). */
19
+ --tm-accent-text: var(--tm-accent);
20
+ --tm-code-bg: #1d1d1f;
21
+ --tm-serif: "Newsreader", Georgia, serif;
22
+ --tm-sans: var(--font-text);
23
+
24
+ --color-text: var(--tm-ink);
25
+ --color-muted: var(--tm-ink-muted);
26
+ --color-heading: var(--tm-ink);
27
+ --color-link: var(--tm-accent-text);
28
+ --color-border: var(--tm-hairline);
29
+ --color-subtle-bg: var(--tm-surface);
30
+ --color-accent: var(--tm-accent-text);
31
+ --color-bg: var(--tm-bg);
32
+ --color-stripe: var(--tm-bg);
33
+ --alert-note: var(--tm-accent-text);
34
+ --alert-tip: var(--tm-accent-text);
35
+ --alert-important: var(--tm-accent-text);
36
+
37
+ /* Code sits on a dark card in both variants. */
38
+ --code-keyword: #ff7ab2;
39
+ --code-title: #dabaff;
40
+ --code-constant: #d9c97c;
41
+ --code-string: #ff8170;
42
+ --code-builtin: #78c2b3;
43
+ --code-comment: #8a8a8f;
44
+ --code-tag: #6bdfff;
45
+ --code-text: #f5f5f7;
46
+ }
47
+
48
+ /* Header and footer (their text comes from render/magazine.ts): small, tracked, uppercase. */
49
+ @page {
50
+ background: var(--tm-bg);
51
+
52
+ @top-left {
53
+ font:
54
+ 600 6.5pt/1 "Inter",
55
+ sans-serif;
56
+ letter-spacing: 0.14em;
57
+ text-transform: uppercase;
58
+ color: var(--tm-ink-muted);
59
+ }
60
+
61
+ @top-center {
62
+ font:
63
+ 600 6.5pt/1 "Inter",
64
+ sans-serif;
65
+ letter-spacing: 0.14em;
66
+ text-transform: uppercase;
67
+ color: var(--tm-ink-muted);
68
+ }
69
+
70
+ @top-right {
71
+ font:
72
+ 600 6.5pt/1 "Inter",
73
+ sans-serif;
74
+ letter-spacing: 0.14em;
75
+ text-transform: uppercase;
76
+ color: var(--tm-ink-muted);
77
+ }
78
+
79
+ @bottom-left {
80
+ font:
81
+ 600 6.5pt/1 "Inter",
82
+ sans-serif;
83
+ letter-spacing: 0.14em;
84
+ text-transform: uppercase;
85
+ color: var(--tm-ink-muted);
86
+ }
87
+
88
+ @bottom-center {
89
+ font:
90
+ 600 6.5pt/1 "Inter",
91
+ sans-serif;
92
+ letter-spacing: 0.14em;
93
+ text-transform: uppercase;
94
+ color: var(--tm-ink-muted);
95
+ }
96
+
97
+ @bottom-right {
98
+ font:
99
+ 700 7.5pt/1 "Inter",
100
+ sans-serif;
101
+ letter-spacing: 0.06em;
102
+ text-transform: uppercase;
103
+ color: var(--tm-ink);
104
+ }
105
+ }
106
+
107
+ body {
108
+ font-family: var(--tm-sans);
109
+ font-feature-settings: "kern", "calt", "ss01";
110
+ line-height: 1.55;
111
+ color: var(--tm-ink);
112
+ }
113
+
114
+ .markdown-body {
115
+ max-width: 680px;
116
+ }
117
+
118
+ /* In the PDF the page margins set the column, and the cover spans the whole sheet. */
119
+ @media print {
120
+ .markdown-body {
121
+ max-width: none;
122
+ }
123
+ }
124
+
125
+ /*
126
+ * Cover: the title block over the picture, filling page 1 (render/magazine.ts sets its size).
127
+ * cover-ink-light: white text over a dark veil; cover-ink-dark: dark text over a light one.
128
+ * cover-text-top / cover-text-bottom: where the text sits, the veil fading from that edge.
129
+ */
130
+ .doc-header {
131
+ --tm-veil: rgba(0, 0, 0, 0.6);
132
+ --cover-ink: #ffffff;
133
+ --cover-ink-soft: rgba(255, 255, 255, 0.86);
134
+ --cover-ink-muted: rgba(255, 255, 255, 0.7);
135
+ --cover-rule: rgba(255, 255, 255, 0.35);
136
+ --cover-kicker: color-mix(in srgb, var(--tm-accent) 55%, white);
137
+ --cover-veil-direction: to bottom;
138
+ position: relative;
139
+ display: flex;
140
+ flex-direction: column;
141
+ justify-content: flex-start;
142
+ margin: 0;
143
+ padding: 41mm 22mm 26mm;
144
+ overflow: hidden;
145
+ color: var(--cover-ink);
146
+ border: 0;
147
+ /* The veil, then the cover picture (render/magazine.ts adds it as a second layer). */
148
+ background-color: #07080d;
149
+ background-image: linear-gradient(
150
+ var(--cover-veil-direction),
151
+ var(--tm-veil) 0%,
152
+ transparent 50%
153
+ );
154
+ background-position:
155
+ center,
156
+ center top;
157
+ background-size: auto, cover;
158
+ background-repeat: no-repeat;
159
+ break-after: page;
160
+ }
161
+
162
+ .doc-header.cover-ink-dark {
163
+ --tm-veil: rgba(255, 255, 255, 0.6);
164
+ --cover-ink: #1d1d1f;
165
+ --cover-ink-soft: rgba(29, 29, 31, 0.82);
166
+ --cover-ink-muted: rgba(29, 29, 31, 0.65);
167
+ --cover-rule: rgba(0, 0, 0, 0.25);
168
+ --cover-kicker: var(--tm-accent);
169
+ background-color: #f4f4f6;
170
+ }
171
+
172
+ .doc-header.cover-text-bottom {
173
+ --cover-veil-direction: to top;
174
+ justify-content: flex-end;
175
+ }
176
+
177
+ @media screen {
178
+ .doc-header {
179
+ min-height: 70vh;
180
+ margin-bottom: 3em;
181
+ padding: 7em 3em 3em;
182
+ border-radius: 24px;
183
+ }
184
+ }
185
+
186
+ /* Masthead: the magazine's name at the top of the cover, the date on the right. */
187
+ .doc-header::before {
188
+ position: absolute;
189
+ top: 18mm;
190
+ left: 22mm;
191
+ right: 22mm;
192
+ padding-bottom: 4mm;
193
+ font-size: 26pt;
194
+ font-weight: 800;
195
+ line-height: 1;
196
+ letter-spacing: 0.2em;
197
+ text-transform: uppercase;
198
+ white-space: nowrap;
199
+ border-bottom: 1px solid var(--cover-rule);
200
+ }
201
+
202
+ .doc-header::after {
203
+ position: absolute;
204
+ top: 20.5mm;
205
+ right: 22mm;
206
+ font-size: 7pt;
207
+ font-weight: 600;
208
+ letter-spacing: 0.16em;
209
+ text-transform: uppercase;
210
+ color: var(--cover-ink-muted);
211
+ }
212
+
213
+ @media screen {
214
+ .doc-header::before {
215
+ top: 1.2em;
216
+ left: 1.2em;
217
+ right: 1.2em;
218
+ font-size: 20pt;
219
+ }
220
+
221
+ .doc-header::after {
222
+ top: 1.9em;
223
+ right: 1.4em;
224
+ }
225
+ }
226
+
227
+ .doc-kicker {
228
+ margin: 0 0 1em;
229
+ font-size: 8pt;
230
+ font-weight: 700;
231
+ letter-spacing: 0.18em;
232
+ text-transform: uppercase;
233
+ color: var(--cover-kicker);
234
+ }
235
+
236
+ .doc-header .doc-title {
237
+ margin: 0 0 0.35em;
238
+ padding: 0;
239
+ font-size: 48pt;
240
+ font-weight: 800;
241
+ line-height: 1.02;
242
+ letter-spacing: -0.035em;
243
+ color: var(--cover-ink);
244
+ border: 0;
245
+ }
246
+
247
+ .doc-subtitle {
248
+ max-width: 64%;
249
+ margin: 0 0 1.4em;
250
+ font-family: var(--tm-serif);
251
+ font-size: 15pt;
252
+ font-style: italic;
253
+ line-height: 1.3;
254
+ color: var(--cover-ink-soft);
255
+ }
256
+
257
+ .doc-meta {
258
+ margin: 0;
259
+ padding: 0;
260
+ font-size: 7.5pt;
261
+ font-weight: 600;
262
+ letter-spacing: 0.14em;
263
+ text-transform: uppercase;
264
+ color: var(--cover-ink-muted);
265
+ border: 0;
266
+ }
267
+
268
+ .doc-header :is(.doc-affiliations, .doc-abstract, .doc-keywords) {
269
+ max-width: 64%;
270
+ color: var(--cover-ink-soft);
271
+ }
272
+
273
+ /* Opening: a large lead paragraph with a serif drop cap (after the cover, or first). */
274
+ .doc-header + p,
275
+ .markdown-body > p:first-child {
276
+ margin-bottom: 1.2em;
277
+ font-size: 1.32em;
278
+ font-weight: 300;
279
+ line-height: 1.5;
280
+ color: var(--tm-ink);
281
+ }
282
+
283
+ .doc-header + p::first-letter,
284
+ .markdown-body > p:first-child::first-letter {
285
+ float: left;
286
+ margin: 0.06em 0.09em 0 0;
287
+ font-family: var(--tm-serif);
288
+ font-size: 4.1em;
289
+ font-weight: 600;
290
+ line-height: 0.82;
291
+ color: var(--tm-accent-text);
292
+ }
293
+
294
+ p {
295
+ margin: 0 0 0.95em;
296
+ }
297
+
298
+ strong {
299
+ font-weight: 700;
300
+ }
301
+
302
+ a {
303
+ color: var(--tm-accent-text);
304
+ }
305
+
306
+ /* Headings: big and heavy, or small and in the accent. */
307
+ h1,
308
+ h2,
309
+ h3,
310
+ h4 {
311
+ border: 0;
312
+ padding: 0;
313
+ color: var(--tm-ink);
314
+ }
315
+
316
+ h2 {
317
+ margin: 1.9em 0 0.5em;
318
+ font-size: 1.95em;
319
+ font-weight: 800;
320
+ line-height: 1.12;
321
+ letter-spacing: -0.028em;
322
+ }
323
+
324
+ h3 {
325
+ margin: 1.6em 0 0.4em;
326
+ font-size: 0.78em;
327
+ font-weight: 700;
328
+ letter-spacing: 0.14em;
329
+ text-transform: uppercase;
330
+ color: var(--tm-accent-text);
331
+ }
332
+
333
+ h4 {
334
+ margin: 1.3em 0 0.3em;
335
+ font-size: 1.05em;
336
+ font-weight: 700;
337
+ }
338
+
339
+ /* Pull quote: the serif, large, after a short rule in the accent. */
340
+ blockquote:not(.markdown-alert) {
341
+ margin: 1.8em 0;
342
+ padding: 0.9em 0 0;
343
+ border: 0;
344
+ border-top: 3px solid var(--tm-accent-text);
345
+ width: 62%;
346
+ color: var(--tm-ink);
347
+ break-inside: avoid;
348
+ }
349
+
350
+ blockquote:not(.markdown-alert) p {
351
+ margin: 0 0 0.4em;
352
+ font-family: var(--tm-serif);
353
+ font-size: 1.75em;
354
+ font-style: italic;
355
+ font-weight: 400;
356
+ line-height: 1.22;
357
+ letter-spacing: -0.01em;
358
+ }
359
+
360
+ blockquote:not(.markdown-alert) p + p {
361
+ font-family: var(--tm-sans);
362
+ font-size: 0.72em;
363
+ font-style: normal;
364
+ font-weight: 600;
365
+ letter-spacing: 0.12em;
366
+ text-transform: uppercase;
367
+ color: var(--tm-ink-muted);
368
+ }
369
+
370
+ /* Alerts as sidebar cards. */
371
+ .markdown-alert {
372
+ margin: 1.6em 0;
373
+ padding: 1.1em 1.3em 0.4em;
374
+ border: 0;
375
+ border-radius: 16px;
376
+ background: var(--tm-surface);
377
+ }
378
+
379
+ .markdown-alert-title {
380
+ margin-bottom: 0.5em;
381
+ font-size: 0.72em;
382
+ font-weight: 700;
383
+ letter-spacing: 0.14em;
384
+ text-transform: uppercase;
385
+ color: var(--tm-accent-text);
386
+ }
387
+
388
+ /* The card's own first line in bold is its title: the alert label is not shown. */
389
+ .markdown-alert-title {
390
+ display: none;
391
+ }
392
+
393
+ .markdown-alert-title + p > strong:only-child {
394
+ font-size: 0.78em;
395
+ letter-spacing: 0.14em;
396
+ text-transform: uppercase;
397
+ color: var(--tm-accent-text);
398
+ }
399
+
400
+ .markdown-alert > p:not(.markdown-alert-title) {
401
+ font-size: 0.95em;
402
+ }
403
+
404
+ .markdown-alert ul {
405
+ padding-left: 1.2em;
406
+ }
407
+
408
+ /* Figures with rounded corners and a small grey caption. */
409
+ figure {
410
+ margin: 1.8em 0;
411
+ break-inside: avoid;
412
+ }
413
+
414
+ figure img {
415
+ display: block;
416
+ width: 100%;
417
+ border-radius: 18px;
418
+ }
419
+
420
+ figcaption {
421
+ margin-top: 0.7em;
422
+ font-size: 0.8em;
423
+ line-height: 1.45;
424
+ color: var(--tm-ink-muted);
425
+ }
426
+
427
+ figcaption strong {
428
+ color: var(--tm-ink);
429
+ }
430
+
431
+ /* Tables as spec sheets: hairlines between rows, labels in grey, values in bold. */
432
+ table {
433
+ width: 100%;
434
+ margin: 1.4em 0 1.8em;
435
+ font-size: 0.92em;
436
+ border-top: 1.5px solid var(--tm-ink);
437
+ }
438
+
439
+ th,
440
+ td {
441
+ padding: 0.7em 0.8em 0.7em 0;
442
+ border: 0;
443
+ border-bottom: 0.75px solid var(--tm-hairline);
444
+ text-align: left;
445
+ vertical-align: top;
446
+ }
447
+
448
+ th {
449
+ font-size: 0.78em;
450
+ font-weight: 700;
451
+ letter-spacing: 0.1em;
452
+ text-transform: uppercase;
453
+ color: var(--tm-ink-muted);
454
+ background: none;
455
+ }
456
+
457
+ td {
458
+ font-weight: 600;
459
+ }
460
+
461
+ td:first-child {
462
+ font-weight: 400;
463
+ color: var(--tm-ink-muted);
464
+ }
465
+
466
+ tbody tr:nth-child(2n) {
467
+ background: none;
468
+ }
469
+
470
+ /* Code: a dark card, as on a keynote slide. */
471
+ code {
472
+ padding: 0.12em 0.4em;
473
+ border-radius: 6px;
474
+ background: var(--tm-surface);
475
+ font-size: 0.86em;
476
+ }
477
+
478
+ pre {
479
+ margin: 1.4em 0;
480
+ padding: 1.2em 1.4em;
481
+ border: 0;
482
+ border-radius: 16px;
483
+ background: var(--tm-code-bg);
484
+ color: var(--code-text);
485
+ font-size: 0.82em;
486
+ }
487
+
488
+ pre code {
489
+ color: inherit;
490
+ }
491
+
492
+ /* Section break: three dots in the accent. */
493
+ hr {
494
+ height: auto;
495
+ margin: 2.2em 0;
496
+ background: none;
497
+ text-align: center;
498
+ }
499
+
500
+ hr::after {
501
+ content: "• • •";
502
+ font-size: 1em;
503
+ letter-spacing: 0.4em;
504
+ color: var(--tm-accent-text);
505
+ }
506
+
507
+ .mermaid-diagram {
508
+ margin: 1.8em 0;
509
+ padding: 1.4em;
510
+ border-radius: 18px;
511
+ background: var(--tm-surface);
512
+ }
513
+
514
+ /* Footnotes: small, after a short rule. */
515
+ hr.footnotes-sep {
516
+ margin: 2.5em 0 1em;
517
+ height: 1px;
518
+ width: 25%;
519
+ background: var(--tm-hairline);
520
+ }
521
+
522
+ hr.footnotes-sep::after {
523
+ content: none;
524
+ }
525
+
526
+ .footnotes {
527
+ font-size: 0.78em;
528
+ color: var(--tm-ink-muted);
529
+ }
530
+
531
+ /* A paragraph that introduces a listing or a diagram stays on its page. */
532
+ p:has(+ pre),
533
+ p:has(+ .mermaid-diagram) {
534
+ break-after: avoid;
535
+ }
package/dist/assets.d.ts CHANGED
@@ -31,6 +31,18 @@ export declare const INTER_FACES: readonly [{
31
31
  readonly style: "italic";
32
32
  readonly file: "Inter-BoldItalic.woff2";
33
33
  }];
34
+ /** Extra Inter weights of the magazine themes: light standfirsts and extra-bold titles. */
35
+ export declare const INTER_MAGAZINE_FACES: readonly [{
36
+ readonly weight: 300;
37
+ readonly style: "normal";
38
+ readonly file: "Inter-Light.woff2";
39
+ }, {
40
+ readonly weight: 800;
41
+ readonly style: "normal";
42
+ readonly file: "Inter-ExtraBold.woff2";
43
+ }];
44
+ /** Newsreader, the serif of the magazine themes: drop caps, pull quotes and the standfirst. */
45
+ export declare const NEWSREADER_STYLESHEETS: string[];
34
46
  /** Manrope faces in use (Fontsource, split into unicode-range subsets); it has no italics. */
35
47
  export declare const MANROPE_STYLESHEETS: string[];
36
48
  export declare const MONO_STYLESHEETS: string[];
@@ -40,6 +52,13 @@ export declare const KATEX_CSS = "katex/dist/katex.min.css";
40
52
  export declare const MERMAID_JS = "mermaid/dist/mermaid.min.js";
41
53
  export declare const THEMES: string[];
42
54
  export declare const PACKAGE_JSON = "mdrender/package.json";
55
+ /** Cover pictures shipped with mdrender: tech_magazine/<magazine>/<file>. */
56
+ export declare const MAGAZINES_KEY = "mdrender/tech_magazine";
57
+ /**
58
+ * Files of a folder of shipped assets (e.g. "mdrender/tech_magazine/AlphaZeroChess"), as asset
59
+ * keys; empty when the folder does not exist. Inside the executable, from the embedded keys.
60
+ */
61
+ export declare function listAssets(folderKey: string): string[];
43
62
  /** Fonts referenced by a stylesheet as url(...woff2), as asset keys. */
44
63
  export declare function woff2References(cssKey: string, css: string): string[];
45
64
  /**
package/dist/assets.js CHANGED
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { createRequire } from "node:module";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
@@ -78,6 +78,17 @@ export const INTER_FACES = [
78
78
  { weight: 700, style: "normal", file: "Inter-Bold.woff2" },
79
79
  { weight: 700, style: "italic", file: "Inter-BoldItalic.woff2" },
80
80
  ];
81
+ /** Extra Inter weights of the magazine themes: light standfirsts and extra-bold titles. */
82
+ export const INTER_MAGAZINE_FACES = [
83
+ { weight: 300, style: "normal", file: "Inter-Light.woff2" },
84
+ { weight: 800, style: "normal", file: "Inter-ExtraBold.woff2" },
85
+ ];
86
+ /** Newsreader, the serif of the magazine themes: drop caps, pull quotes and the standfirst. */
87
+ export const NEWSREADER_STYLESHEETS = [
88
+ "@fontsource/newsreader/400.css",
89
+ "@fontsource/newsreader/400-italic.css",
90
+ "@fontsource/newsreader/600.css",
91
+ ];
81
92
  /** Manrope faces in use (Fontsource, split into unicode-range subsets); it has no italics. */
82
93
  export const MANROPE_STYLESHEETS = [
83
94
  "@fontsource/manrope/400.css",
@@ -104,9 +115,40 @@ export const THEMES = [
104
115
  "mdrender/assets/theme-antigravity.css",
105
116
  "mdrender/assets/theme-antigravity-dark.css",
106
117
  "mdrender/assets/theme-academic-basic.css",
118
+ "mdrender/assets/theme-tech-magazine.css",
119
+ "mdrender/assets/theme-tech-magazine-dark.css",
107
120
  "mdrender/assets/density-compact.css",
108
121
  ];
109
122
  export const PACKAGE_JSON = "mdrender/package.json";
123
+ /** Cover pictures shipped with mdrender: tech_magazine/<magazine>/<file>. */
124
+ export const MAGAZINES_KEY = "mdrender/tech_magazine";
125
+ /**
126
+ * Files of a folder of shipped assets (e.g. "mdrender/tech_magazine/AlphaZeroChess"), as asset
127
+ * keys; empty when the folder does not exist. Inside the executable, from the embedded keys.
128
+ */
129
+ export function listAssets(folderKey) {
130
+ const prefix = folderKey.replace(/\/$/, "") + "/";
131
+ if (isSea()) {
132
+ const keys = sea.getAssetKeys();
133
+ return keys.filter((k) => k.startsWith(prefix) && !k.slice(prefix.length).includes("/")).sort();
134
+ }
135
+ const dir = assetPath(folderKey);
136
+ if (!existsSync(dir))
137
+ return [];
138
+ return readdirSync(dir, { withFileTypes: true })
139
+ .filter((entry) => entry.isFile())
140
+ .map((entry) => prefix + entry.name)
141
+ .sort();
142
+ }
143
+ /** Every shipped file under tech_magazine/, as asset keys. */
144
+ function magazineAssets() {
145
+ const root = assetPath(MAGAZINES_KEY);
146
+ if (!existsSync(root))
147
+ return [];
148
+ return readdirSync(root, { withFileTypes: true })
149
+ .filter((entry) => entry.isDirectory())
150
+ .flatMap((entry) => listAssets(`${MAGAZINES_KEY}/${entry.name}`));
151
+ }
110
152
  /** Fonts referenced by a stylesheet as url(...woff2), as asset keys. */
111
153
  export function woff2References(cssKey, css) {
112
154
  return [...css.matchAll(/url\((['"]?)([^)'"]+\.woff2)\1\)/g)].map((m) => relativeAsset(cssKey, m[2]));
@@ -117,12 +159,16 @@ export function woff2References(cssKey, css) {
117
159
  */
118
160
  export function assetManifest() {
119
161
  const keys = new Set([PACKAGE_JSON, ...THEMES, MERMAID_JS]);
120
- for (const { file } of INTER_FACES)
162
+ for (const { file } of [...INTER_FACES, ...INTER_MAGAZINE_FACES]) {
121
163
  keys.add(`${INTER_DIR}/${file}`);
164
+ }
165
+ for (const key of magazineAssets())
166
+ keys.add(key);
122
167
  for (const cssKey of [
123
168
  ...MANROPE_STYLESHEETS,
124
169
  ...MONO_STYLESHEETS,
125
170
  ...SERIF_STYLESHEETS,
171
+ ...NEWSREADER_STYLESHEETS,
126
172
  KATEX_CSS,
127
173
  ]) {
128
174
  keys.add(cssKey);
package/dist/cli.js CHANGED
@@ -69,8 +69,8 @@ function addDocumentOptions(command) {
69
69
  .option("--watermark-field", "soft fields of light in the top-left and bottom-right corners of every PDF page")
70
70
  .option("--density <density>", "normal or compact (tighter spacing) (default: normal)")
71
71
  .option("--font-size <size>", "text size, e.g. 10pt or 11pt (default: 10.5pt)")
72
- .option("--theme <theme>", "antigravity, antigravity-dark, light, dark, academic_basic, or a .css file replacing " +
73
- "the theme (default: antigravity)")
72
+ .option("--theme <theme>", "antigravity, antigravity-dark, light, dark, academic_basic, tech_magazine, " +
73
+ "tech_magazine-dark, or a .css file replacing the theme (default: antigravity)")
74
74
  .option("--css <file>", "extra stylesheet (repeatable)", collect)
75
75
  .option("--mermaid-theme <theme>", `Mermaid theme: ${MERMAID_THEMES.join(", ")} ` +
76
76
  "(default: the page theme's — base in Anti-Gravity colours, neutral for light, dark for dark)")