svg-terminal 1.1.1 → 1.2.1
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.
- package/README.md +100 -4
- package/dist/{chunk-24NH6UUG.js → chunk-BXES76D7.js} +335 -12
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +25 -1
- package/dist/index.js +17 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -31,13 +31,13 @@ Or as a GitHub Action — refresh your profile README on a schedule:
|
|
|
31
31
|
commit: true
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
See the full [GitHub Action](#github-action) section below, the [block catalog](./examples/blocks/) (48 blocks, one preview each), and the [
|
|
34
|
+
See the full [GitHub Action](#github-action) section below, the [block catalog](./examples/blocks/) (48 blocks, one preview each), and the [20-theme gallery](#themes).
|
|
35
35
|
|
|
36
36
|
### What's in the box
|
|
37
37
|
|
|
38
38
|
- **Declarative YAML config** — write blocks, pick a theme, run the CLI
|
|
39
39
|
- **48 built-in blocks** — across identity, retro / fake-system, status, ASCII art, single- and multi-line animation, and humor categories. Browse the [block catalog](./examples/blocks/) for previews of each
|
|
40
|
-
- **
|
|
40
|
+
- **20 built-in themes** — 12 classics (dracula, nord, monokai, the amber/green-phosphor/cyberpunk CRT trio, solarized-dark, win95, catppuccin, tokyo-night, gruvbox, high-contrast) plus 8 sharp, modern, **WCAG-AAA** OKLCH additions (modus-vivendi, oxocarbon, rose-pine, everforest, kanagawa, flexoki, github-light, dayfox)
|
|
41
41
|
- **Frame animation** — `BlockResult.animation = { frames, fps, loop }` powers the 10 animated blocks (spinners, clock, dice, progress bar, etc.). Frames may be single- **or multi-line** as of #69 (`jumping-jack` is the reference multi-line block)
|
|
42
42
|
- **Dynamic-block cache** — the 5 cacheable blocks (weather, github-stats, github-languages, quote, fun-fact) write to `.svg-terminal-cache.json`. Pair with `--frozen-cache` for offline CI builds
|
|
43
43
|
- **Reduced-motion respected** — `@media (prefers-reduced-motion)` clamps the CSS fade-ins AND (since v0.17) the frame cycle. SMIL-driven typing reveal, cursor walk, and scroll-on-overflow remain animated; pair with `--static` for full stillness
|
|
@@ -54,6 +54,34 @@ npx svg-terminal generate --watch # Rebuild on every save
|
|
|
54
54
|
npx svg-terminal blocks <name> # Inspect a block's config schema
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
### CLI reference
|
|
58
|
+
|
|
59
|
+
**Commands**
|
|
60
|
+
|
|
61
|
+
| Command | Description |
|
|
62
|
+
|---------|-------------|
|
|
63
|
+
| `generate` | Generate the SVG from a config file |
|
|
64
|
+
| `init` | Create a starter `terminal.yml` (refuses to overwrite without `--force`) |
|
|
65
|
+
| `themes` | List available themes |
|
|
66
|
+
| `blocks [<name>]` | List block types, or print one block's config schema |
|
|
67
|
+
| `cache check` | Verify dynamic-block cache freshness (exit 1 on stale/missing) |
|
|
68
|
+
|
|
69
|
+
**`generate` flags**
|
|
70
|
+
|
|
71
|
+
| Flag | Description |
|
|
72
|
+
|------|-------------|
|
|
73
|
+
| `--config <path>` | Config file path (default `terminal.yml`) |
|
|
74
|
+
| `--output <path>` | Output file path (default `terminal.svg`) |
|
|
75
|
+
| `--static` | Non-animated final-frame snapshot |
|
|
76
|
+
| `--minify` | Strip inter-element whitespace |
|
|
77
|
+
| `--strict` | Promote soft warnings (unknown block-config keys, over-tall animated bands) to hard errors |
|
|
78
|
+
| `--watch` | Re-generate on config-file change |
|
|
79
|
+
| `--timings` | Print per-phase wall-clock timings to stderr |
|
|
80
|
+
| `--explain` | Print the resolved config + block list as JSON to stderr |
|
|
81
|
+
| `--no-cache` / `--refresh-cache` / `--frozen-cache` | Cache behavior shortcuts (off / re-fetch all / cached-only) |
|
|
82
|
+
| `--cache-mode <m>` | Explicit cache mode: `normal` \| `refresh` \| `frozen` \| `off` |
|
|
83
|
+
| `--version` | Print the version |
|
|
84
|
+
|
|
57
85
|
## Configuration
|
|
58
86
|
|
|
59
87
|
Edit `terminal.yml`:
|
|
@@ -88,6 +116,25 @@ blocks:
|
|
|
88
116
|
- "[[fg:green]]Welcome to my terminal![[/fg]]"
|
|
89
117
|
```
|
|
90
118
|
|
|
119
|
+
`svg-terminal init` writes a fully-commented starter `terminal.yml`. The top-level keys:
|
|
120
|
+
|
|
121
|
+
| Key | Purpose |
|
|
122
|
+
|-----|---------|
|
|
123
|
+
| `theme` | Theme name, an inline theme object, or `random` (daily rotation) |
|
|
124
|
+
| `blocks` | The ordered list of blocks to render (each `{ block, config?, command?, color?, typing?, pause? }`) |
|
|
125
|
+
| `window` | Chrome + frame: `width`, `height`/`autoHeight` (+ `minHeight`/`maxHeight`), `title`, `style` (`macos`\|`win95`\|`floating`\|`minimal`\|`none`), `titleBarHeight`, `borderRadius` |
|
|
126
|
+
| `terminal` | Text rendering: `fontFamily`, `fontSize`, `lineHeight`, `prompt`, `padding`/`paddingTop` |
|
|
127
|
+
| `effects` | `textGlow`, `scanlines`, `vignette`, `shadow` (booleans) |
|
|
128
|
+
| `animation` | Timing: `loop`, `defaultTypingDuration`, `outputLineStagger`, `commandOutputPause`, `outputEndPause`, `defaultSequencePause`, `scrollDelay` |
|
|
129
|
+
| `chrome` | Title-bar/button styling: `titleFontFamily`, `titleFontSize`, `buttonRadius`, `buttonSpacing`, `dimOpacity` |
|
|
130
|
+
| `accessibility` | `{ describe }` — emit the `<title>`/`<desc>` screen-reader content (default `true`) |
|
|
131
|
+
| `accessibilityLabel` | Override the auto-generated `aria-label` |
|
|
132
|
+
| `variables` | Arbitrary values exposed to blocks (surfaced by `--explain`) |
|
|
133
|
+
| `maxDuration` | Hard cap (seconds) on the animation timeline (default 90) |
|
|
134
|
+
| `scrollDuration` | Per-scroll transition duration in ms (default 100) |
|
|
135
|
+
| `fetchTimeout` | Network timeout (ms) for dynamic blocks (default 10000) |
|
|
136
|
+
| `cachePath` / `cacheTTL` | On-disk cache file location + entry TTL for cacheable blocks |
|
|
137
|
+
|
|
91
138
|
## Themes
|
|
92
139
|
|
|
93
140
|
| Theme | Description |
|
|
@@ -105,10 +152,23 @@ blocks:
|
|
|
105
152
|
| `gruvbox` | Gruvbox Dark medium — retro warm contrast |
|
|
106
153
|
| `high-contrast` | WCAG AAA pure-black-on-white palette — accessibility / slides / projector |
|
|
107
154
|
|
|
155
|
+
**OKLCH WCAG-AAA additions** — sharp, modern, scanline-free; AAA body text (≥ 7:1), derived from the [400+ OKLCH scheme collection](https://williamzujkowski.github.io/oklch-terminal-themes/):
|
|
156
|
+
|
|
157
|
+
| Theme | Description |
|
|
158
|
+
|-------|-------------|
|
|
159
|
+
| `modus-vivendi` | Maximally-legible neutral dark (Protesilaos) — 21:1 body text |
|
|
160
|
+
| `oxocarbon` | IBM Carbon — cool high-contrast modern dark |
|
|
161
|
+
| `rose-pine` | Muted rosé & iris, soho dusk |
|
|
162
|
+
| `everforest` | Warm forest green, cozy low-glare |
|
|
163
|
+
| `kanagawa` | Hokusai ink-wash — indigo, sand, wave-crest |
|
|
164
|
+
| `flexoki` | Warm paper-and-ink reading palette (Steph Ango) |
|
|
165
|
+
| `github-light` | Clean professional **light** theme |
|
|
166
|
+
| `dayfox` | Soft warm-cream **light** theme |
|
|
167
|
+
|
|
108
168
|
Special value: `theme: random` rotates through all themes deterministically by day of year — gives you a different look every day without committing to one.
|
|
109
169
|
|
|
110
170
|
<details>
|
|
111
|
-
<summary>Theme gallery — click to expand all
|
|
171
|
+
<summary>Theme gallery — click to expand all 20</summary>
|
|
112
172
|
|
|
113
173
|
Each is the same 2-block config (motd + neofetch) rendered against the named theme. Source in [`examples/gallery/_template.yml`](./examples/gallery/_template.yml).
|
|
114
174
|
|
|
@@ -120,6 +180,10 @@ Each is the same 2-block config (motd + neofetch) rendered against the named the
|
|
|
120
180
|
| **solarized-dark**<br><img src="./examples/gallery/solarized-dark.svg" width="380" alt="solarized-dark theme preview"/> | **win95**<br><img src="./examples/gallery/win95.svg" width="380" alt="win95 theme preview"/> |
|
|
121
181
|
| **catppuccin**<br><img src="./examples/gallery/catppuccin.svg" width="380" alt="catppuccin theme preview"/> | **tokyo-night**<br><img src="./examples/gallery/tokyo-night.svg" width="380" alt="tokyo-night theme preview"/> |
|
|
122
182
|
| **gruvbox**<br><img src="./examples/gallery/gruvbox.svg" width="380" alt="gruvbox theme preview"/> | **high-contrast**<br><img src="./examples/gallery/high-contrast.svg" width="380" alt="high-contrast theme preview"/> |
|
|
183
|
+
| **modus-vivendi**<br><img src="./examples/gallery/modus-vivendi.svg" width="380" alt="modus-vivendi theme preview"/> | **oxocarbon**<br><img src="./examples/gallery/oxocarbon.svg" width="380" alt="oxocarbon theme preview"/> |
|
|
184
|
+
| **rose-pine**<br><img src="./examples/gallery/rose-pine.svg" width="380" alt="rose-pine theme preview"/> | **everforest**<br><img src="./examples/gallery/everforest.svg" width="380" alt="everforest theme preview"/> |
|
|
185
|
+
| **kanagawa**<br><img src="./examples/gallery/kanagawa.svg" width="380" alt="kanagawa theme preview"/> | **flexoki**<br><img src="./examples/gallery/flexoki.svg" width="380" alt="flexoki theme preview"/> |
|
|
186
|
+
| **github-light**<br><img src="./examples/gallery/github-light.svg" width="380" alt="github-light theme preview"/> | **dayfox**<br><img src="./examples/gallery/dayfox.svg" width="380" alt="dayfox theme preview"/> |
|
|
123
187
|
|
|
124
188
|
</details>
|
|
125
189
|
|
|
@@ -349,17 +413,49 @@ For maximally reproducible CI, commit `.svg-terminal-cache.json` alongside `term
|
|
|
349
413
|
|
|
350
414
|
The action commits as `github-actions[bot]`; the `commit` input only runs `git add output + git commit + git push` against the current branch. Skip `commit: true` and add your own commit step if you need signed commits or a custom author.
|
|
351
415
|
|
|
416
|
+
### Inputs
|
|
417
|
+
|
|
418
|
+
| Input | Default | Description |
|
|
419
|
+
|-------|---------|-------------|
|
|
420
|
+
| `config` | `terminal.yml` | Path to the YAML config file |
|
|
421
|
+
| `output` | `terminal.svg` | Output SVG file path |
|
|
422
|
+
| `cache-mode` | `normal` | Dynamic-block cache behavior: `normal` \| `refresh` \| `frozen` \| `off` |
|
|
423
|
+
| `static` | `false` | Generate a non-animated SVG (final-frame snapshot) |
|
|
424
|
+
| `minify` | `false` | Strip inter-element whitespace from the output |
|
|
425
|
+
| `commit` | `false` | Auto-commit the generated SVG (needs `permissions: contents: write`) |
|
|
426
|
+
| `commit-message` | `chore: update terminal SVG [skip ci]` | Commit message when `commit: true` |
|
|
427
|
+
|
|
428
|
+
### Outputs
|
|
429
|
+
|
|
430
|
+
| Output | Description |
|
|
431
|
+
|--------|-------------|
|
|
432
|
+
| `svg-path` | Path to the generated SVG file (echoes `output`) |
|
|
433
|
+
| `svg-bytes` | Byte count of the generated SVG (integer string) |
|
|
434
|
+
| `svg-size` | Alias of `svg-bytes` — same value |
|
|
435
|
+
| `svg-sha256` | Hex SHA-256 of the generated SVG, for cache-busting downstream |
|
|
436
|
+
| `svg-changed` | `true` \| `false` — did this run modify a pre-existing SVG? `false` on the first run (no prior file) and when bytes are unchanged. Gate commits on this. |
|
|
437
|
+
|
|
438
|
+
```yaml
|
|
439
|
+
- uses: williamzujkowski/svg-terminal@v1
|
|
440
|
+
id: term
|
|
441
|
+
with: { config: terminal.yml, output: terminal.svg }
|
|
442
|
+
- run: echo "size=${{ steps.term.outputs.svg-bytes }} changed=${{ steps.term.outputs.svg-changed }}"
|
|
443
|
+
```
|
|
444
|
+
|
|
352
445
|
## Text Markup
|
|
353
446
|
|
|
354
447
|
Blocks support inline color markup:
|
|
355
448
|
|
|
356
449
|
```
|
|
357
450
|
[[fg:green]]green text[[/fg]]
|
|
451
|
+
[[bg:blue]][[fg:white]]white on blue[[/fg]][[/bg]]
|
|
358
452
|
[[fg:cyan]][[bold]]bold cyan[[/bold]][[/fg]]
|
|
359
453
|
[[dim]]dimmed text[[/dim]]
|
|
360
454
|
```
|
|
361
455
|
|
|
362
|
-
|
|
456
|
+
Tags: `[[fg:color]]` (foreground), `[[bg:color]]` (background), `[[bold]]`, `[[dim]]` — each closed by its matching `[[/fg]]` / `[[/bg]]` / `[[/bold]]` / `[[/dim]]`, and nestable.
|
|
457
|
+
|
|
458
|
+
Available colors: `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`, `orange`, `purple`, `pink`, `comment`, plus `bright_*` variants. Colors resolve against the active theme palette; a raw hex value also works.
|
|
363
459
|
|
|
364
460
|
## ASCII Boxes
|
|
365
461
|
|
|
@@ -56,7 +56,7 @@ var nord = {
|
|
|
56
56
|
titleBarText: "#d8dee9",
|
|
57
57
|
prompt: "#a3be8c",
|
|
58
58
|
cursor: "#88c0d0",
|
|
59
|
-
red: "#
|
|
59
|
+
red: "#d08a91",
|
|
60
60
|
green: "#a3be8c",
|
|
61
61
|
yellow: "#ebcb8b",
|
|
62
62
|
blue: "#5e81ac",
|
|
@@ -97,7 +97,7 @@ var monokai = {
|
|
|
97
97
|
titleBarText: "#75715e",
|
|
98
98
|
prompt: "#a6e22e",
|
|
99
99
|
cursor: "#f8f8f2",
|
|
100
|
-
red: "#
|
|
100
|
+
red: "#fa4a8a",
|
|
101
101
|
green: "#a6e22e",
|
|
102
102
|
yellow: "#e6db74",
|
|
103
103
|
blue: "#66d9ef",
|
|
@@ -259,7 +259,7 @@ var solarizedDark = {
|
|
|
259
259
|
// Lifted to a brighter Solarized-family blue.
|
|
260
260
|
prompt: "#4eb3e8",
|
|
261
261
|
cursor: "#2aa198",
|
|
262
|
-
red: "#
|
|
262
|
+
red: "#e66663",
|
|
263
263
|
green: "#859900",
|
|
264
264
|
yellow: "#b58900",
|
|
265
265
|
blue: "#268bd2",
|
|
@@ -435,7 +435,7 @@ var gruvbox = {
|
|
|
435
435
|
// bright_green
|
|
436
436
|
cursor: "#fabd2f",
|
|
437
437
|
// bright_yellow
|
|
438
|
-
red: "#
|
|
438
|
+
red: "#e86560",
|
|
439
439
|
// red
|
|
440
440
|
green: "#98971a",
|
|
441
441
|
// green
|
|
@@ -511,6 +511,302 @@ var highContrast = {
|
|
|
511
511
|
}
|
|
512
512
|
};
|
|
513
513
|
|
|
514
|
+
// src/themes/modus-vivendi.ts
|
|
515
|
+
var modusVivendi = {
|
|
516
|
+
name: "modus-vivendi",
|
|
517
|
+
colors: {
|
|
518
|
+
text: "#ffffff",
|
|
519
|
+
comment: "#767676",
|
|
520
|
+
background: "#000000",
|
|
521
|
+
titleBarBackground: "#171717",
|
|
522
|
+
titleBarText: "#ffffff",
|
|
523
|
+
prompt: "#6ae4b9",
|
|
524
|
+
cursor: "#ffffff",
|
|
525
|
+
red: "#ff5f59",
|
|
526
|
+
green: "#44bc44",
|
|
527
|
+
yellow: "#d0bc00",
|
|
528
|
+
blue: "#2fafff",
|
|
529
|
+
magenta: "#feacd0",
|
|
530
|
+
cyan: "#00d3d0",
|
|
531
|
+
white: "#a6a6a6",
|
|
532
|
+
orange: "#e88e2c",
|
|
533
|
+
purple: "#feacd0",
|
|
534
|
+
pink: "#b6a0ff",
|
|
535
|
+
brightRed: "#ff7f9f",
|
|
536
|
+
brightGreen: "#00c06f",
|
|
537
|
+
brightYellow: "#fec43f",
|
|
538
|
+
brightBlue: "#79a8ff",
|
|
539
|
+
brightMagenta: "#b6a0ff",
|
|
540
|
+
brightCyan: "#6ae4b9",
|
|
541
|
+
brightWhite: "#ffffff",
|
|
542
|
+
brightBlack: "#595959"
|
|
543
|
+
},
|
|
544
|
+
buttons: {
|
|
545
|
+
close: "#ff5f57",
|
|
546
|
+
minimize: "#ffbd2e",
|
|
547
|
+
maximize: "#28ca42"
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
// src/themes/oxocarbon.ts
|
|
552
|
+
var oxocarbon = {
|
|
553
|
+
name: "oxocarbon",
|
|
554
|
+
colors: {
|
|
555
|
+
text: "#f2f4f8",
|
|
556
|
+
comment: "#828384",
|
|
557
|
+
background: "#161616",
|
|
558
|
+
titleBarBackground: "#2a2a2a",
|
|
559
|
+
titleBarText: "#f2f4f8",
|
|
560
|
+
prompt: "#00b4ff",
|
|
561
|
+
cursor: "#ffffff",
|
|
562
|
+
red: "#00dfdb",
|
|
563
|
+
green: "#00b4ff",
|
|
564
|
+
yellow: "#ff4297",
|
|
565
|
+
blue: "#00c15a",
|
|
566
|
+
magenta: "#c693ff",
|
|
567
|
+
cyan: "#ff74b8",
|
|
568
|
+
white: "#f2f4f8",
|
|
569
|
+
orange: "#8090b9",
|
|
570
|
+
purple: "#c693ff",
|
|
571
|
+
pink: "#c693ff",
|
|
572
|
+
brightRed: "#00dfdb",
|
|
573
|
+
brightGreen: "#00b4ff",
|
|
574
|
+
brightYellow: "#ff4297",
|
|
575
|
+
brightBlue: "#00c15a",
|
|
576
|
+
brightMagenta: "#c693ff",
|
|
577
|
+
brightCyan: "#ff74b8",
|
|
578
|
+
brightWhite: "#f2f4f8",
|
|
579
|
+
brightBlack: "#585858"
|
|
580
|
+
},
|
|
581
|
+
buttons: {
|
|
582
|
+
close: "#ff5f57",
|
|
583
|
+
minimize: "#ffbd2e",
|
|
584
|
+
maximize: "#28ca42"
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
// src/themes/rose-pine.ts
|
|
589
|
+
var rosePine = {
|
|
590
|
+
name: "rose-pine",
|
|
591
|
+
colors: {
|
|
592
|
+
text: "#e0def4",
|
|
593
|
+
comment: "#85819c",
|
|
594
|
+
background: "#191724",
|
|
595
|
+
titleBarBackground: "#2b2937",
|
|
596
|
+
titleBarText: "#e0def4",
|
|
597
|
+
prompt: "#ebbcba",
|
|
598
|
+
cursor: "#e0def4",
|
|
599
|
+
red: "#eb6f92",
|
|
600
|
+
green: "#31748f",
|
|
601
|
+
yellow: "#f6c177",
|
|
602
|
+
blue: "#9ccfd8",
|
|
603
|
+
magenta: "#c4a7e7",
|
|
604
|
+
cyan: "#ebbcba",
|
|
605
|
+
white: "#e0def4",
|
|
606
|
+
orange: "#f09884",
|
|
607
|
+
purple: "#c4a7e7",
|
|
608
|
+
pink: "#c4a7e7",
|
|
609
|
+
brightRed: "#eb6f92",
|
|
610
|
+
brightGreen: "#31748f",
|
|
611
|
+
brightYellow: "#f6c177",
|
|
612
|
+
brightBlue: "#9ccfd8",
|
|
613
|
+
brightMagenta: "#c4a7e7",
|
|
614
|
+
brightCyan: "#ebbcba",
|
|
615
|
+
brightWhite: "#e0def4",
|
|
616
|
+
brightBlack: "#6e6a86"
|
|
617
|
+
},
|
|
618
|
+
buttons: {
|
|
619
|
+
close: "#ff5f57",
|
|
620
|
+
minimize: "#ffbd2e",
|
|
621
|
+
maximize: "#28ca42"
|
|
622
|
+
}
|
|
623
|
+
};
|
|
624
|
+
|
|
625
|
+
// src/themes/everforest.ts
|
|
626
|
+
var everforest = {
|
|
627
|
+
name: "everforest",
|
|
628
|
+
colors: {
|
|
629
|
+
text: "#d3c6aa",
|
|
630
|
+
comment: "#a6b0a0",
|
|
631
|
+
background: "#1e2326",
|
|
632
|
+
titleBarBackground: "#2e3232",
|
|
633
|
+
titleBarText: "#d3c6aa",
|
|
634
|
+
prompt: "#a7c080",
|
|
635
|
+
cursor: "#e69875",
|
|
636
|
+
red: "#e67e80",
|
|
637
|
+
green: "#a7c080",
|
|
638
|
+
yellow: "#dbbc7f",
|
|
639
|
+
blue: "#7fbbb3",
|
|
640
|
+
magenta: "#d699b6",
|
|
641
|
+
cyan: "#83c092",
|
|
642
|
+
white: "#f2efdf",
|
|
643
|
+
orange: "#e09d80",
|
|
644
|
+
purple: "#d699b6",
|
|
645
|
+
pink: "#df69ba",
|
|
646
|
+
brightRed: "#f85552",
|
|
647
|
+
brightGreen: "#8da101",
|
|
648
|
+
brightYellow: "#dfa000",
|
|
649
|
+
brightBlue: "#3a94c5",
|
|
650
|
+
brightMagenta: "#df69ba",
|
|
651
|
+
brightCyan: "#35a77c",
|
|
652
|
+
brightWhite: "#fffbef",
|
|
653
|
+
brightBlack: "#a6b0a0"
|
|
654
|
+
},
|
|
655
|
+
buttons: {
|
|
656
|
+
close: "#ff5f57",
|
|
657
|
+
minimize: "#ffbd2e",
|
|
658
|
+
maximize: "#28ca42"
|
|
659
|
+
}
|
|
660
|
+
};
|
|
661
|
+
|
|
662
|
+
// src/themes/kanagawa.ts
|
|
663
|
+
var kanagawa = {
|
|
664
|
+
name: "kanagawa",
|
|
665
|
+
colors: {
|
|
666
|
+
text: "#dcd7ba",
|
|
667
|
+
comment: "#8c8a7d",
|
|
668
|
+
background: "#1f1f28",
|
|
669
|
+
titleBarBackground: "#303035",
|
|
670
|
+
titleBarText: "#dcd7ba",
|
|
671
|
+
prompt: "#98bb6c",
|
|
672
|
+
cursor: "#dcd7ba",
|
|
673
|
+
red: "#c34043",
|
|
674
|
+
green: "#76946a",
|
|
675
|
+
yellow: "#c0a36e",
|
|
676
|
+
blue: "#7e9cd8",
|
|
677
|
+
magenta: "#957fb8",
|
|
678
|
+
cyan: "#6a9589",
|
|
679
|
+
white: "#c8c093",
|
|
680
|
+
orange: "#c27258",
|
|
681
|
+
purple: "#957fb8",
|
|
682
|
+
pink: "#938aa9",
|
|
683
|
+
brightRed: "#e82424",
|
|
684
|
+
brightGreen: "#98bb6c",
|
|
685
|
+
brightYellow: "#e6c384",
|
|
686
|
+
brightBlue: "#7fb4ca",
|
|
687
|
+
brightMagenta: "#938aa9",
|
|
688
|
+
brightCyan: "#7aa89f",
|
|
689
|
+
brightWhite: "#dcd7ba",
|
|
690
|
+
brightBlack: "#727169"
|
|
691
|
+
},
|
|
692
|
+
buttons: {
|
|
693
|
+
close: "#ff5f57",
|
|
694
|
+
minimize: "#ffbd2e",
|
|
695
|
+
maximize: "#28ca42"
|
|
696
|
+
}
|
|
697
|
+
};
|
|
698
|
+
|
|
699
|
+
// src/themes/flexoki.ts
|
|
700
|
+
var flexoki = {
|
|
701
|
+
name: "flexoki",
|
|
702
|
+
colors: {
|
|
703
|
+
text: "#cecdc3",
|
|
704
|
+
comment: "#7e7d77",
|
|
705
|
+
background: "#100f0f",
|
|
706
|
+
titleBarBackground: "#21201f",
|
|
707
|
+
titleBarText: "#cecdc3",
|
|
708
|
+
prompt: "#3aa99f",
|
|
709
|
+
cursor: "#cecdc3",
|
|
710
|
+
red: "#d14d41",
|
|
711
|
+
green: "#879a39",
|
|
712
|
+
yellow: "#d0a215",
|
|
713
|
+
blue: "#4385be",
|
|
714
|
+
magenta: "#ce5d97",
|
|
715
|
+
cyan: "#3aa99f",
|
|
716
|
+
white: "#878580",
|
|
717
|
+
orange: "#d0782b",
|
|
718
|
+
purple: "#ce5d97",
|
|
719
|
+
pink: "#a02f6f",
|
|
720
|
+
brightRed: "#af3029",
|
|
721
|
+
brightGreen: "#66800b",
|
|
722
|
+
brightYellow: "#ad8301",
|
|
723
|
+
brightBlue: "#205ea6",
|
|
724
|
+
brightMagenta: "#a02f6f",
|
|
725
|
+
brightCyan: "#24837b",
|
|
726
|
+
brightWhite: "#cecdc3",
|
|
727
|
+
brightBlack: "#575653"
|
|
728
|
+
},
|
|
729
|
+
buttons: {
|
|
730
|
+
close: "#ff5f57",
|
|
731
|
+
minimize: "#ffbd2e",
|
|
732
|
+
maximize: "#28ca42"
|
|
733
|
+
}
|
|
734
|
+
};
|
|
735
|
+
|
|
736
|
+
// src/themes/github-light.ts
|
|
737
|
+
var githubLight = {
|
|
738
|
+
name: "github-light",
|
|
739
|
+
colors: {
|
|
740
|
+
text: "#1f2328",
|
|
741
|
+
comment: "#57606a",
|
|
742
|
+
background: "#ffffff",
|
|
743
|
+
titleBarBackground: "#ebebec",
|
|
744
|
+
titleBarText: "#1f2328",
|
|
745
|
+
prompt: "#116329",
|
|
746
|
+
cursor: "#0969da",
|
|
747
|
+
red: "#cf222e",
|
|
748
|
+
green: "#116329",
|
|
749
|
+
yellow: "#4d2d00",
|
|
750
|
+
blue: "#0969da",
|
|
751
|
+
magenta: "#8250df",
|
|
752
|
+
cyan: "#1b7c83",
|
|
753
|
+
white: "#6e7781",
|
|
754
|
+
orange: "#8e2817",
|
|
755
|
+
purple: "#8250df",
|
|
756
|
+
pink: "#a475f9",
|
|
757
|
+
brightRed: "#a40e26",
|
|
758
|
+
brightGreen: "#1a7f37",
|
|
759
|
+
brightYellow: "#633c01",
|
|
760
|
+
brightBlue: "#218bff",
|
|
761
|
+
brightMagenta: "#a475f9",
|
|
762
|
+
brightCyan: "#3192aa",
|
|
763
|
+
brightWhite: "#8c959f",
|
|
764
|
+
brightBlack: "#57606a"
|
|
765
|
+
},
|
|
766
|
+
buttons: {
|
|
767
|
+
close: "#ff5f57",
|
|
768
|
+
minimize: "#ffbd2e",
|
|
769
|
+
maximize: "#28ca42"
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
// src/themes/dayfox.ts
|
|
774
|
+
var dayfox = {
|
|
775
|
+
name: "dayfox",
|
|
776
|
+
colors: {
|
|
777
|
+
text: "#3d2b5a",
|
|
778
|
+
comment: "#534c45",
|
|
779
|
+
background: "#f6f2ee",
|
|
780
|
+
titleBarBackground: "#e5e0e1",
|
|
781
|
+
titleBarText: "#3d2b5a",
|
|
782
|
+
prompt: "#396847",
|
|
783
|
+
cursor: "#3d2b5a",
|
|
784
|
+
red: "#a5222f",
|
|
785
|
+
green: "#396847",
|
|
786
|
+
yellow: "#ac5402",
|
|
787
|
+
blue: "#2848a9",
|
|
788
|
+
magenta: "#6e33ce",
|
|
789
|
+
cyan: "#287980",
|
|
790
|
+
white: "#bfb6ae",
|
|
791
|
+
orange: "#a83b18",
|
|
792
|
+
purple: "#6e33ce",
|
|
793
|
+
pink: "#8452d5",
|
|
794
|
+
brightRed: "#b3434e",
|
|
795
|
+
brightGreen: "#577f63",
|
|
796
|
+
brightYellow: "#b86e28",
|
|
797
|
+
brightBlue: "#4863b6",
|
|
798
|
+
brightMagenta: "#8452d5",
|
|
799
|
+
brightCyan: "#488d93",
|
|
800
|
+
brightWhite: "#f4ece6",
|
|
801
|
+
brightBlack: "#534c45"
|
|
802
|
+
},
|
|
803
|
+
buttons: {
|
|
804
|
+
close: "#ff5f57",
|
|
805
|
+
minimize: "#ffbd2e",
|
|
806
|
+
maximize: "#28ca42"
|
|
807
|
+
}
|
|
808
|
+
};
|
|
809
|
+
|
|
514
810
|
// src/themes/index.ts
|
|
515
811
|
var themes = {
|
|
516
812
|
dracula,
|
|
@@ -524,7 +820,16 @@ var themes = {
|
|
|
524
820
|
catppuccin,
|
|
525
821
|
"tokyo-night": tokyoNight,
|
|
526
822
|
gruvbox,
|
|
527
|
-
"high-contrast": highContrast
|
|
823
|
+
"high-contrast": highContrast,
|
|
824
|
+
// OKLCH WCAG-AAA additions (v1.2.0)
|
|
825
|
+
"modus-vivendi": modusVivendi,
|
|
826
|
+
oxocarbon,
|
|
827
|
+
"rose-pine": rosePine,
|
|
828
|
+
everforest,
|
|
829
|
+
kanagawa,
|
|
830
|
+
flexoki,
|
|
831
|
+
"github-light": githubLight,
|
|
832
|
+
dayfox
|
|
528
833
|
};
|
|
529
834
|
var customThemes = /* @__PURE__ */ new Map();
|
|
530
835
|
function registerTheme(theme) {
|
|
@@ -997,7 +1302,19 @@ function mergeConfig(userConfig) {
|
|
|
997
1302
|
const autoTitleBarHeight = isWin95 && userConfig.window?.titleBarHeight === void 0 ? 22 : void 0;
|
|
998
1303
|
const isCrt = theme.name === "amber" || theme.name === "green-phosphor" || theme.name === "cyberpunk";
|
|
999
1304
|
const userVignetteSet = userConfig.effects?.vignette !== void 0;
|
|
1000
|
-
const
|
|
1305
|
+
const MODERN_THEMES = /* @__PURE__ */ new Set([
|
|
1306
|
+
"modus-vivendi",
|
|
1307
|
+
"oxocarbon",
|
|
1308
|
+
"rose-pine",
|
|
1309
|
+
"everforest",
|
|
1310
|
+
"kanagawa",
|
|
1311
|
+
"flexoki",
|
|
1312
|
+
"github-light",
|
|
1313
|
+
"dayfox"
|
|
1314
|
+
]);
|
|
1315
|
+
const isModern = MODERN_THEMES.has(theme.name);
|
|
1316
|
+
const userScanlinesSet = userConfig.effects?.scanlines !== void 0;
|
|
1317
|
+
const autoEffects = isWin95 && !userConfig.effects ? { textGlow: false, scanlines: false, shadow: true } : isCrt && !userVignetteSet ? { vignette: true } : isModern && !userScanlinesSet ? { scanlines: false } : void 0;
|
|
1001
1318
|
return {
|
|
1002
1319
|
window: {
|
|
1003
1320
|
...DEFAULT_WINDOW,
|
|
@@ -1069,12 +1386,10 @@ function generateFilters(effects, _glowColor) {
|
|
|
1069
1386
|
const parts = [];
|
|
1070
1387
|
if (effects.textGlow) {
|
|
1071
1388
|
parts.push(`
|
|
1072
|
-
<filter id="textGlow" x="-
|
|
1073
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="
|
|
1074
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="2" result="halo"/>
|
|
1389
|
+
<filter id="textGlow" x="-12%" y="-12%" width="124%" height="124%">
|
|
1390
|
+
<feGaussianBlur in="SourceGraphic" stdDeviation="1.4" result="halo"/>
|
|
1075
1391
|
<feMerge>
|
|
1076
1392
|
<feMergeNode in="halo"/>
|
|
1077
|
-
<feMergeNode in="core"/>
|
|
1078
1393
|
<feMergeNode in="SourceGraphic"/>
|
|
1079
1394
|
</feMerge>
|
|
1080
1395
|
</filter>`);
|
|
@@ -2302,7 +2617,7 @@ async function readCappedText(response, url) {
|
|
|
2302
2617
|
}
|
|
2303
2618
|
return new TextDecoder().decode(Buffer.concat(chunks));
|
|
2304
2619
|
}
|
|
2305
|
-
var USER_AGENT = `svg-terminal/${true ? "1.
|
|
2620
|
+
var USER_AGENT = `svg-terminal/${true ? "1.2.1" : "0.0.0-dev"}`;
|
|
2306
2621
|
async function fetchWithTimeout(url, timeoutMs = DEFAULT_FETCH_TIMEOUT) {
|
|
2307
2622
|
const blocked = fetchBlockReason(url);
|
|
2308
2623
|
if (blocked) {
|
|
@@ -4715,6 +5030,14 @@ export {
|
|
|
4715
5030
|
tokyoNight,
|
|
4716
5031
|
gruvbox,
|
|
4717
5032
|
highContrast,
|
|
5033
|
+
modusVivendi,
|
|
5034
|
+
oxocarbon,
|
|
5035
|
+
rosePine,
|
|
5036
|
+
everforest,
|
|
5037
|
+
kanagawa,
|
|
5038
|
+
flexoki,
|
|
5039
|
+
githubLight,
|
|
5040
|
+
dayfox,
|
|
4718
5041
|
themes,
|
|
4719
5042
|
registerTheme,
|
|
4720
5043
|
getTheme,
|
|
@@ -4752,4 +5075,4 @@ export {
|
|
|
4752
5075
|
inspectCache,
|
|
4753
5076
|
generateStatic
|
|
4754
5077
|
};
|
|
4755
|
-
//# sourceMappingURL=chunk-
|
|
5078
|
+
//# sourceMappingURL=chunk-BXES76D7.js.map
|
package/dist/cli.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
mergeConfig,
|
|
12
12
|
setStrictBlockConfig,
|
|
13
13
|
themes
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-BXES76D7.js";
|
|
15
15
|
|
|
16
16
|
// src/cli.ts
|
|
17
17
|
import { writeFileSync, watch as fsWatch } from "fs";
|
|
@@ -127,7 +127,7 @@ function isZodOptional(t) {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
// src/cli.ts
|
|
130
|
-
var VERSION = true ? "1.
|
|
130
|
+
var VERSION = true ? "1.2.1" : "0.0.0-dev";
|
|
131
131
|
var args = process.argv.slice(2);
|
|
132
132
|
var command = args[0];
|
|
133
133
|
function getFlag(name) {
|
package/dist/index.d.ts
CHANGED
|
@@ -623,6 +623,30 @@ declare const gruvbox: Theme;
|
|
|
623
623
|
*/
|
|
624
624
|
declare const highContrast: Theme;
|
|
625
625
|
|
|
626
|
+
/** Maximally-legible neutral dark (Protesilaos, WCAG-AAA by design). OKLCH-derived, WCAG-AAA body text. */
|
|
627
|
+
declare const modusVivendi: Theme;
|
|
628
|
+
|
|
629
|
+
/** IBM Carbon — cool high-contrast modern dark. OKLCH-derived, WCAG-AAA body text. */
|
|
630
|
+
declare const oxocarbon: Theme;
|
|
631
|
+
|
|
632
|
+
/** Muted rosé & iris, soho dusk. OKLCH-derived, WCAG-AAA body text. */
|
|
633
|
+
declare const rosePine: Theme;
|
|
634
|
+
|
|
635
|
+
/** Warm forest green, cozy low-glare. OKLCH-derived, WCAG-AAA body text. */
|
|
636
|
+
declare const everforest: Theme;
|
|
637
|
+
|
|
638
|
+
/** Hokusai ink-wash: indigo, sand, wave-crest. OKLCH-derived, WCAG-AAA body text. */
|
|
639
|
+
declare const kanagawa: Theme;
|
|
640
|
+
|
|
641
|
+
/** Warm paper-and-ink, inky reading palette (Steph Ango). OKLCH-derived, WCAG-AAA body text. */
|
|
642
|
+
declare const flexoki: Theme;
|
|
643
|
+
|
|
644
|
+
/** Clean professional light. OKLCH-derived, WCAG-AAA body text. */
|
|
645
|
+
declare const githubLight: Theme;
|
|
646
|
+
|
|
647
|
+
/** Soft warm-cream light. OKLCH-derived, WCAG-AAA body text. */
|
|
648
|
+
declare const dayfox: Theme;
|
|
649
|
+
|
|
626
650
|
/** Built-in theme registry. */
|
|
627
651
|
declare const themes: Record<string, Theme>;
|
|
628
652
|
/**
|
|
@@ -740,4 +764,4 @@ declare function inspectCache(userConfig: UserConfig, configPath: string): {
|
|
|
740
764
|
};
|
|
741
765
|
declare function generateStatic(userConfig: UserConfig, options?: GenerateOptions): Promise<string>;
|
|
742
766
|
|
|
743
|
-
export { type AccessibilityConfig, type AnimationConfig, type AnimationFrame, type Block, type BlockAnimation, BlockConfigError, type BlockContext, type BlockEntry, type BlockResult, type BoxChars, type BoxConfig, type BoxStyle, type CacheEventType, type ChromeConfig, ConfigError, type EffectsConfig, type GenerateOptions, PAUSE_PRESETS, type Sequence, type StyledSpan, TYPING_PRESETS, type TerminalConfig, type TerminalTextConfig, type Theme, type ThemeColors, type TimingPresets, type UserConfig, type WindowConfig, type WindowStyle, amber, buildColorMap, catppuccin, createAutoBox, createBox, createDoubleBox, createRoundedBox, createTitledBox, cyberpunk, dracula, fetchJson, fetchText, fetchWithTimeout, generate, generateStatic, generateStaticSvg, generateSvg, getBlock, getTheme, greenPhosphor, gruvbox, hasMarkup, highContrast, inspectCache, listBlocks, listThemes, loadConfig, mergeConfig, monokai, nord, parseMarkup, registerBlock, registerBlocks, registerBuiltinBlocks, registerTheme, resolvePause, resolveTheme, resolveTyping, setStrictBlockConfig, solarizedDark, stripMarkup, themes, tokyoNight, win95 };
|
|
767
|
+
export { type AccessibilityConfig, type AnimationConfig, type AnimationFrame, type Block, type BlockAnimation, BlockConfigError, type BlockContext, type BlockEntry, type BlockResult, type BoxChars, type BoxConfig, type BoxStyle, type CacheEventType, type ChromeConfig, ConfigError, type EffectsConfig, type GenerateOptions, PAUSE_PRESETS, type Sequence, type StyledSpan, TYPING_PRESETS, type TerminalConfig, type TerminalTextConfig, type Theme, type ThemeColors, type TimingPresets, type UserConfig, type WindowConfig, type WindowStyle, amber, buildColorMap, catppuccin, createAutoBox, createBox, createDoubleBox, createRoundedBox, createTitledBox, cyberpunk, dayfox, dracula, everforest, fetchJson, fetchText, fetchWithTimeout, flexoki, generate, generateStatic, generateStaticSvg, generateSvg, getBlock, getTheme, githubLight, greenPhosphor, gruvbox, hasMarkup, highContrast, inspectCache, kanagawa, listBlocks, listThemes, loadConfig, mergeConfig, modusVivendi, monokai, nord, oxocarbon, parseMarkup, registerBlock, registerBlocks, registerBuiltinBlocks, registerTheme, resolvePause, resolveTheme, resolveTyping, rosePine, setStrictBlockConfig, solarizedDark, stripMarkup, themes, tokyoNight, win95 };
|
package/dist/index.js
CHANGED
|
@@ -12,27 +12,34 @@ import {
|
|
|
12
12
|
createRoundedBox,
|
|
13
13
|
createTitledBox,
|
|
14
14
|
cyberpunk,
|
|
15
|
+
dayfox,
|
|
15
16
|
dracula,
|
|
17
|
+
everforest,
|
|
16
18
|
fetchJson,
|
|
17
19
|
fetchText,
|
|
18
20
|
fetchWithTimeout,
|
|
21
|
+
flexoki,
|
|
19
22
|
generate,
|
|
20
23
|
generateStatic,
|
|
21
24
|
generateStaticSvg,
|
|
22
25
|
generateSvg,
|
|
23
26
|
getBlock,
|
|
24
27
|
getTheme,
|
|
28
|
+
githubLight,
|
|
25
29
|
greenPhosphor,
|
|
26
30
|
gruvbox,
|
|
27
31
|
hasMarkup,
|
|
28
32
|
highContrast,
|
|
29
33
|
inspectCache,
|
|
34
|
+
kanagawa,
|
|
30
35
|
listBlocks,
|
|
31
36
|
listThemes,
|
|
32
37
|
loadConfig,
|
|
33
38
|
mergeConfig,
|
|
39
|
+
modusVivendi,
|
|
34
40
|
monokai,
|
|
35
41
|
nord,
|
|
42
|
+
oxocarbon,
|
|
36
43
|
parseMarkup,
|
|
37
44
|
registerBlock,
|
|
38
45
|
registerBlocks,
|
|
@@ -41,13 +48,14 @@ import {
|
|
|
41
48
|
resolvePause,
|
|
42
49
|
resolveTheme,
|
|
43
50
|
resolveTyping,
|
|
51
|
+
rosePine,
|
|
44
52
|
setStrictBlockConfig,
|
|
45
53
|
solarizedDark,
|
|
46
54
|
stripMarkup,
|
|
47
55
|
themes,
|
|
48
56
|
tokyoNight,
|
|
49
57
|
win95
|
|
50
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-BXES76D7.js";
|
|
51
59
|
export {
|
|
52
60
|
BlockConfigError,
|
|
53
61
|
ConfigError,
|
|
@@ -62,27 +70,34 @@ export {
|
|
|
62
70
|
createRoundedBox,
|
|
63
71
|
createTitledBox,
|
|
64
72
|
cyberpunk,
|
|
73
|
+
dayfox,
|
|
65
74
|
dracula,
|
|
75
|
+
everforest,
|
|
66
76
|
fetchJson,
|
|
67
77
|
fetchText,
|
|
68
78
|
fetchWithTimeout,
|
|
79
|
+
flexoki,
|
|
69
80
|
generate,
|
|
70
81
|
generateStatic,
|
|
71
82
|
generateStaticSvg,
|
|
72
83
|
generateSvg,
|
|
73
84
|
getBlock,
|
|
74
85
|
getTheme,
|
|
86
|
+
githubLight,
|
|
75
87
|
greenPhosphor,
|
|
76
88
|
gruvbox,
|
|
77
89
|
hasMarkup,
|
|
78
90
|
highContrast,
|
|
79
91
|
inspectCache,
|
|
92
|
+
kanagawa,
|
|
80
93
|
listBlocks,
|
|
81
94
|
listThemes,
|
|
82
95
|
loadConfig,
|
|
83
96
|
mergeConfig,
|
|
97
|
+
modusVivendi,
|
|
84
98
|
monokai,
|
|
85
99
|
nord,
|
|
100
|
+
oxocarbon,
|
|
86
101
|
parseMarkup,
|
|
87
102
|
registerBlock,
|
|
88
103
|
registerBlocks,
|
|
@@ -91,6 +106,7 @@ export {
|
|
|
91
106
|
resolvePause,
|
|
92
107
|
resolveTheme,
|
|
93
108
|
resolveTyping,
|
|
109
|
+
rosePine,
|
|
94
110
|
setStrictBlockConfig,
|
|
95
111
|
solarizedDark,
|
|
96
112
|
stripMarkup,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svg-terminal",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Generate animated SVG terminals for GitHub READMEs from a declarative YAML config.
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "Generate animated SVG terminals for GitHub READMEs from a declarative YAML config. 48 built-in blocks, 20 themes, zero runtime deps in the output.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|