svg-terminal 1.1.0 → 1.2.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.
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 [12-theme gallery](#themes).
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
- - **12 built-in themes** — dracula, nord, monokai, amber, green-phosphor, cyberpunk, solarized-dark, win95, catppuccin, tokyo-night, gruvbox, high-contrast (with chrome to match)
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
@@ -105,10 +105,23 @@ blocks:
105
105
  | `gruvbox` | Gruvbox Dark medium — retro warm contrast |
106
106
  | `high-contrast` | WCAG AAA pure-black-on-white palette — accessibility / slides / projector |
107
107
 
108
+ **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/):
109
+
110
+ | Theme | Description |
111
+ |-------|-------------|
112
+ | `modus-vivendi` | Maximally-legible neutral dark (Protesilaos) — 21:1 body text |
113
+ | `oxocarbon` | IBM Carbon — cool high-contrast modern dark |
114
+ | `rose-pine` | Muted rosé & iris, soho dusk |
115
+ | `everforest` | Warm forest green, cozy low-glare |
116
+ | `kanagawa` | Hokusai ink-wash — indigo, sand, wave-crest |
117
+ | `flexoki` | Warm paper-and-ink reading palette (Steph Ango) |
118
+ | `github-light` | Clean professional **light** theme |
119
+ | `dayfox` | Soft warm-cream **light** theme |
120
+
108
121
  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
122
 
110
123
  <details>
111
- <summary>Theme gallery — click to expand all 12</summary>
124
+ <summary>Theme gallery — click to expand all 20</summary>
112
125
 
113
126
  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
127
 
@@ -120,6 +133,10 @@ Each is the same 2-block config (motd + neofetch) rendered against the named the
120
133
  | **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
134
  | **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
135
  | **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"/> |
136
+ | **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"/> |
137
+ | **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"/> |
138
+ | **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"/> |
139
+ | **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
140
 
124
141
  </details>
125
142
 
@@ -56,7 +56,7 @@ var nord = {
56
56
  titleBarText: "#d8dee9",
57
57
  prompt: "#a3be8c",
58
58
  cursor: "#88c0d0",
59
- red: "#bf616a",
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: "#f92672",
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: "#dc322f",
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: "#cc241d",
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 autoEffects = isWin95 && !userConfig.effects ? { textGlow: false, scanlines: false, shadow: true } : isCrt && !userVignetteSet ? { vignette: true } : void 0;
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="-10%" y="-10%" width="120%" height="120%">
1073
- <feGaussianBlur in="SourceGraphic" stdDeviation="0.6" result="core"/>
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>`);
@@ -1392,6 +1707,15 @@ function generateAllLines(frames, terminal, lineHeight, colors, chrome, animatio
1392
1707
  return Array.from(processedLines.entries()).sort((a, b) => a[0] - b[0]).map(([, content]) => content).join("\n");
1393
1708
  }
1394
1709
 
1710
+ // src/core/strict-mode.ts
1711
+ var STRICT = false;
1712
+ function setStrict(enabled) {
1713
+ STRICT = enabled;
1714
+ }
1715
+ function isStrict() {
1716
+ return STRICT;
1717
+ }
1718
+
1395
1719
  // src/core/svg-generator.ts
1396
1720
  function animationHeight(frames) {
1397
1721
  return Math.max(1, ...frames.map((f) => f.length));
@@ -1649,6 +1973,11 @@ function createAnimationFrames(sequences, terminal, maxVisibleLines, scrollDurat
1649
1973
  }
1650
1974
  if (seq.frames && seq.frames.length > 0) {
1651
1975
  const height = animationHeight(seq.frames);
1976
+ if (height > maxVisibleLines) {
1977
+ const msg = `[svg-terminal] An animated block is ${height} rows tall but only ${maxVisibleLines} row(s) fit the terminal \u2014 the overflow is clipped. Use window.autoHeight (default) or a taller window.height / maxHeight. (#124)`;
1978
+ if (isStrict()) throw new Error(msg);
1979
+ console.warn(msg);
1980
+ }
1652
1981
  for (let r = 0; r < height; r++) buffer.push({ type: "output" });
1653
1982
  frames.push({
1654
1983
  time: currentTime,
@@ -2288,7 +2617,7 @@ async function readCappedText(response, url) {
2288
2617
  }
2289
2618
  return new TextDecoder().decode(Buffer.concat(chunks));
2290
2619
  }
2291
- var USER_AGENT = `svg-terminal/${true ? "1.1.0" : "0.0.0-dev"}`;
2620
+ var USER_AGENT = `svg-terminal/${true ? "1.2.0" : "0.0.0-dev"}`;
2292
2621
  async function fetchWithTimeout(url, timeoutMs = DEFAULT_FETCH_TIMEOUT) {
2293
2622
  const blocked = fetchBlockReason(url);
2294
2623
  if (blocked) {
@@ -4531,9 +4860,8 @@ function registerBuiltinBlocks() {
4531
4860
 
4532
4861
  // src/index.ts
4533
4862
  registerBuiltinBlocks();
4534
- var STRICT_BLOCK_CONFIG = false;
4535
4863
  function setStrictBlockConfig(enabled) {
4536
- STRICT_BLOCK_CONFIG = enabled;
4864
+ setStrict(enabled);
4537
4865
  }
4538
4866
  function validateBlockEntry(block, entry, index) {
4539
4867
  const cfg = entry.config ?? {};
@@ -4572,7 +4900,7 @@ ${issues}`
4572
4900
  const known = block.allowedKeys.join(", ");
4573
4901
  const msg = `Unknown config key(s) [${list}] for block "${block.name}" at blocks[${index}]
4574
4902
  Known keys: ${known}`;
4575
- if (STRICT_BLOCK_CONFIG) {
4903
+ if (isStrict()) {
4576
4904
  throw new BlockConfigError(block.name, index, msg);
4577
4905
  }
4578
4906
  console.warn(`[svg-terminal] warning: ${msg}`);
@@ -4702,6 +5030,14 @@ export {
4702
5030
  tokyoNight,
4703
5031
  gruvbox,
4704
5032
  highContrast,
5033
+ modusVivendi,
5034
+ oxocarbon,
5035
+ rosePine,
5036
+ everforest,
5037
+ kanagawa,
5038
+ flexoki,
5039
+ githubLight,
5040
+ dayfox,
4705
5041
  themes,
4706
5042
  registerTheme,
4707
5043
  getTheme,
@@ -4739,4 +5075,4 @@ export {
4739
5075
  inspectCache,
4740
5076
  generateStatic
4741
5077
  };
4742
- //# sourceMappingURL=chunk-DVACBVLX.js.map
5078
+ //# sourceMappingURL=chunk-LE62SCNE.js.map
package/dist/cli.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  mergeConfig,
12
12
  setStrictBlockConfig,
13
13
  themes
14
- } from "./chunk-DVACBVLX.js";
14
+ } from "./chunk-LE62SCNE.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.1.0" : "0.0.0-dev";
130
+ var VERSION = true ? "1.2.0" : "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
  /**
@@ -716,7 +740,13 @@ interface GenerateOptions {
716
740
  */
717
741
  onCacheEvent?: (event: CacheEventType, key: string) => void;
718
742
  }
719
- /** Enable strict mode globally — unknown block-config keys throw instead of warning. */
743
+ /**
744
+ * Enable strict mode globally — soft warnings (unknown block-config keys for
745
+ * schemaless blocks; an over-tall animated band, #124) become hard errors.
746
+ * The flag lives in `./core/strict-mode.js` so `svg-generator.ts` can read it
747
+ * without importing this module (which would be circular). Re-exported here as
748
+ * `setStrictBlockConfig` for back-compat with the CLI + library consumers.
749
+ */
720
750
  declare function setStrictBlockConfig(enabled: boolean): void;
721
751
  /**
722
752
  * Generate an animated SVG terminal from a declarative config.
@@ -734,4 +764,4 @@ declare function inspectCache(userConfig: UserConfig, configPath: string): {
734
764
  };
735
765
  declare function generateStatic(userConfig: UserConfig, options?: GenerateOptions): Promise<string>;
736
766
 
737
- 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-DVACBVLX.js";
58
+ } from "./chunk-LE62SCNE.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,6 +1,6 @@
1
1
  {
2
2
  "name": "svg-terminal",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Generate animated SVG terminals for GitHub READMEs from a declarative YAML config. 47 built-in blocks, 12 themes, zero runtime deps in the output.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",