accelr8 3.6.1 → 3.7.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.
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-HY6ULYGH.js";
7
7
  import {
8
8
  DEFAULT_SERVER
9
- } from "./chunk-HXMWH7DE.js";
9
+ } from "./chunk-5BI2REGA.js";
10
10
 
11
11
  // src/radio/app.ts
12
12
  import tk from "terminal-kit";
@@ -2880,272 +2880,203 @@ var bassShock = {
2880
2880
  };
2881
2881
  var SCENES7 = [waveScope, eqSunburst, arcDischarge, bassShock];
2882
2882
 
2883
- // src/radio/scenes/bumps-a.ts
2884
- var INK3 = xterm256(3, 3, 5);
2883
+ // src/radio/bumpengine.ts
2885
2884
  var WHITE = 231;
2886
- var BG = { ch: " ", color: INK3 };
2887
- var CHAR_MS = 40;
2888
- var LINE_PAUSE = 280;
2889
- var LEAD_MS = 240;
2890
- var BLINK_MS = 530;
2891
- var CURSOR = "\u258F";
2892
- function makeBump(name, lines) {
2893
- const starts = [];
2894
- let acc = LEAD_MS;
2895
- for (const ln of lines) {
2896
- starts.push(acc);
2897
- acc += ln.length * CHAR_MS + LINE_PAUSE;
2898
- }
2899
- const doneAt = acc;
2885
+ var BLACK = 16;
2886
+ var CURSOR = "\u258C";
2887
+ function makeBump(name, beats, opts = {}) {
2888
+ const baseCps = opts.cps ?? 20;
2889
+ const segs = [];
2890
+ let t = 0, row = -1;
2891
+ for (const b of beats) {
2892
+ if ("pause" in b) {
2893
+ t += b.pause;
2894
+ continue;
2895
+ }
2896
+ if ("pop" in b) {
2897
+ row++;
2898
+ segs.push({ row, text: b.pop, start: t, end: t + 1 });
2899
+ t += 1;
2900
+ continue;
2901
+ }
2902
+ const cps = "cps" in b && b.cps ? b.cps : baseCps;
2903
+ const text = "line" in b ? b.line : b.add;
2904
+ if ("line" in b) row++;
2905
+ if (row < 0) row = 0;
2906
+ const dur = Math.max(1, text.length / cps * 1e3);
2907
+ segs.push({ row, text, start: t, end: t + dur });
2908
+ t += dur;
2909
+ }
2910
+ const holdEnd = opts.holdEnd ?? 2800;
2911
+ const rows = Math.max(1, row + 1);
2912
+ const durationMs = t + holdEnd;
2900
2913
  return {
2901
2914
  name,
2902
2915
  kind: "bump",
2903
- durationMs: 7e3,
2916
+ durationMs,
2904
2917
  frame(tMs, w, h) {
2905
- const out = new Array(w * h);
2906
- out.fill(BG);
2907
- if (w <= 0 || h <= 0) return out;
2908
- const top = Math.floor((h - lines.length) / 2);
2909
- let activeLine = 0;
2910
- for (let li = 0; li < lines.length; li++) {
2911
- if (tMs >= starts[li]) activeLine = li;
2912
- }
2913
- for (let li = 0; li < lines.length; li++) {
2914
- const y = top + li;
2915
- if (y < 0 || y >= h) continue;
2916
- const line = lines[li];
2917
- const left = Math.floor((w - line.length) / 2);
2918
- let revealed = tMs <= starts[li] ? 0 : Math.floor((tMs - starts[li]) / CHAR_MS);
2919
- if (revealed > line.length) revealed = line.length;
2920
- for (let ci = 0; ci < revealed; ci++) {
2921
- const x = left + ci;
2922
- if (x < 0 || x >= w) continue;
2923
- const ch = line[ci];
2924
- out[y * w + x] = { ch: ch === " " ? " " : ch, color: WHITE };
2918
+ const out = new Array(Math.max(0, w * h));
2919
+ for (let i = 0; i < out.length; i++) out[i] = { ch: " ", color: BLACK };
2920
+ if (w < 1 || h < 1) return out;
2921
+ const rowText = new Array(rows).fill("");
2922
+ let headRow = 0, typing = false;
2923
+ for (const s of segs) {
2924
+ if (tMs >= s.end) rowText[s.row] += s.text;
2925
+ else if (tMs >= s.start) {
2926
+ const n = Math.floor((tMs - s.start) / (s.end - s.start) * s.text.length);
2927
+ rowText[s.row] += s.text.slice(0, n);
2928
+ headRow = s.row;
2929
+ typing = true;
2925
2930
  }
2926
2931
  }
2927
- const typing = tMs < doneAt;
2928
- const blinkOn = Math.floor(tMs / BLINK_MS) % 2 === 0;
2929
- if (typing || blinkOn) {
2930
- const cy = top + activeLine;
2931
- const line = lines[activeLine];
2932
- const left = Math.floor((w - line.length) / 2);
2933
- let cChars = tMs <= starts[activeLine] ? 0 : Math.floor((tMs - starts[activeLine]) / CHAR_MS);
2934
- if (cChars > line.length) cChars = line.length;
2935
- const cx = left + cChars;
2936
- if (cy >= 0 && cy < h && cx >= 0 && cx < w) {
2937
- out[cy * w + cx] = { ch: CURSOR, color: WHITE };
2932
+ if (!typing) {
2933
+ for (let r = rows - 1; r >= 0; r--) if (rowText[r]) {
2934
+ headRow = r;
2935
+ break;
2938
2936
  }
2939
2937
  }
2938
+ const top = Math.max(0, Math.floor((h - rows) / 2));
2939
+ const put2 = (x, y, ch, color) => {
2940
+ if (x >= 0 && x < w && y >= 0 && y < h) out[y * w + x] = { ch, color };
2941
+ };
2942
+ for (let r = 0; r < rows; r++) {
2943
+ const line = rowText[r];
2944
+ if (!line) continue;
2945
+ const x0 = Math.max(0, Math.floor((w - line.length) / 2));
2946
+ for (let i = 0; i < line.length; i++) put2(x0 + i, top + r, line[i], WHITE);
2947
+ }
2948
+ const blink = typing || (tMs / 480 | 0) % 2 === 0;
2949
+ if (blink) {
2950
+ const line = rowText[headRow] ?? "";
2951
+ const x0 = Math.max(0, Math.floor((w - Math.max(1, line.length)) / 2));
2952
+ put2(x0 + line.length, top + headRow, CURSOR, WHITE);
2953
+ }
2940
2954
  return out;
2941
2955
  }
2942
2956
  };
2943
2957
  }
2958
+
2959
+ // src/radio/scenes/bumps-a.ts
2944
2960
  var SCENES8 = [
2945
- makeBump("bump-standup", [
2946
- "tomorrow at standup",
2947
- 'you will say "almost done."',
2948
- "we will all nod."
2949
- ]),
2950
- makeBump("bump-todo-later", [
2951
- "// TODO: fix this later",
2952
- "it is later now.",
2953
- "later brought nothing."
2961
+ makeBump("bump-friday-deploy", [
2962
+ { line: "you are pushing to production." },
2963
+ { pause: 1400 },
2964
+ { line: "on a friday." },
2965
+ { pause: 2400 },
2966
+ { line: "godspeed." }
2954
2967
  ]),
2955
- makeBump("bump-only-you", [
2956
- "you are the only one listening.",
2957
- "we checked the logs. twice.",
2958
- "hi."
2968
+ makeBump("bump-it-compiled", [
2969
+ { line: "it compiled." },
2970
+ { pause: 2300 },
2971
+ { line: "be suspicious." }
2959
2972
  ]),
2960
- makeBump("bump-dependencies", [
2961
- "1,847 packages installed.",
2962
- "you will import two.",
2963
- "the rest just live here now."
2973
+ makeBump("bump-why", [
2974
+ { line: "the code works." },
2975
+ { pause: 1500 },
2976
+ { line: "nobody knows " },
2977
+ { add: "why", cps: 6 },
2978
+ { add: "." },
2979
+ { pause: 2e3 },
2980
+ { line: "do not touch it." }
2964
2981
  ]),
2965
2982
  makeBump("bump-rubber-duck", [
2966
- "the rubber duck understood the bug.",
2967
- "the rubber duck understood you.",
2968
- "the rubber duck said nothing."
2983
+ { line: "the rubber duck knows." },
2984
+ { pause: 1900 },
2985
+ { line: "the rubber duck has " },
2986
+ { add: "always", cps: 7 },
2987
+ { add: " known." }
2969
2988
  ]),
2970
- makeBump("bump-3am-prod", [
2971
- "it is 3 a.m.",
2972
- "you are pushing to production.",
2973
- "no one is here to stop you.",
2974
- "we are not going to start."
2989
+ makeBump("bump-agent-refactor", [
2990
+ { line: "somewhere, right now," },
2991
+ { pause: 800 },
2992
+ { line: "your agent is refactoring code" },
2993
+ { pause: 600 },
2994
+ { line: "you will never read." },
2995
+ { pause: 2100 },
2996
+ { line: "thank it." }
2975
2997
  ]),
2976
2998
  makeBump("bump-git-blame", [
2977
- "git blame says it was you.",
2978
- "you don't remember doing it.",
2979
- "git remembers everything."
2999
+ { line: "git blame says it was you." },
3000
+ { pause: 2200 },
3001
+ { line: "git blame does not " },
3002
+ { add: "lie", cps: 6 },
3003
+ { add: "." }
3004
+ ]),
3005
+ makeBump("bump-one-more", [
3006
+ { line: "just one more " },
3007
+ { add: "feature", cps: 7 },
3008
+ { add: "." },
3009
+ { pause: 2500 },
3010
+ { line: "it is 4am." }
2980
3011
  ]),
2981
- makeBump("bump-no-metrics", [
2982
- "this station has no audience metrics.",
2983
- "we prefer it this way.",
2984
- "so do you, probably."
3012
+ makeBump("bump-three-tests", [
3013
+ { line: "all tests pass." },
3014
+ { pause: 1700 },
3015
+ { line: "you wrote " },
3016
+ { add: "three", cps: 6 },
3017
+ { add: " tests." }
2985
3018
  ])
2986
3019
  ];
2987
3020
 
2988
3021
  // src/radio/scenes/bumps-b.ts
2989
- var INK4 = 16;
2990
- var LIT = 231;
2991
- var DECK = [
2992
- {
2993
- name: "bump-letter-3am",
2994
- layout: "center",
2995
- lines: [
2996
- "the commit at 3am",
2997
- "is a letter to whoever",
2998
- "wakes up as you tomorrow."
2999
- ]
3000
- },
3001
- {
3002
- name: "bump-agent-waiting",
3003
- layout: "lower-left",
3004
- lines: [
3005
- "your agent finished an hour ago.",
3006
- "it's still here.",
3007
- "it doesn't mind the wait."
3008
- ]
3009
- },
3010
- {
3011
- name: "bump-no-line",
3012
- layout: "center",
3013
- lines: [
3014
- "you are not behind.",
3015
- "there is no line.",
3016
- "there was never a line."
3017
- ]
3018
- },
3019
- {
3020
- name: "bump-temp-var",
3021
- layout: "lower-left",
3022
- lines: [
3023
- "you called it temp.",
3024
- "that was two years ago.",
3025
- "it holds up the whole building now.",
3026
- "so do you."
3027
- ]
3028
- },
3029
- {
3030
- name: "bump-build-green",
3031
- layout: "center",
3032
- lines: [
3033
- "the build is green.",
3034
- "breathe out.",
3035
- "small things are allowed to count."
3036
- ]
3037
- },
3038
- {
3039
- name: "bump-200-ok",
3040
- layout: "lower-left",
3041
- lines: [
3042
- "somewhere a machine is saying your name",
3043
- "in the only language it has.",
3044
- "200. 200. 200."
3045
- ]
3046
- },
3047
- {
3048
- name: "bump-still-up",
3049
- layout: "center",
3050
- lines: [
3051
- "still up?",
3052
- "yeah.",
3053
- "us too. we left a light on."
3054
- ]
3055
- },
3056
- {
3057
- name: "bump-cursor-patient",
3058
- layout: "center",
3059
- lines: [
3060
- "the cursor blinks at the speed",
3061
- "it blinked the night you began.",
3062
- "it has waited this whole time."
3063
- ]
3064
- }
3022
+ var SCENES9 = [
3023
+ makeBump("bump-only-you", [
3024
+ { line: "you are the only one listening." },
3025
+ { pause: 1700 },
3026
+ { line: "we checked." },
3027
+ { pause: 2400 },
3028
+ { line: "twice." }
3029
+ ]),
3030
+ makeBump("bump-terminal-candle", [
3031
+ { line: "the terminal is just a candle" },
3032
+ { pause: 700 },
3033
+ { line: "you type into." },
3034
+ { pause: 2600 },
3035
+ { line: "keep it lit." }
3036
+ ]),
3037
+ makeBump("bump-still-up", [
3038
+ { line: "still up?" },
3039
+ { pause: 2300 },
3040
+ { line: "yeah." },
3041
+ { pause: 1500 },
3042
+ { line: "us too." }
3043
+ ]),
3044
+ makeBump("bump-ship-it", [
3045
+ { line: "ship it." },
3046
+ { pause: 2400 },
3047
+ { line: "the bar was " },
3048
+ { add: "never", cps: 7 },
3049
+ { add: " real." }
3050
+ ]),
3051
+ makeBump("bump-nobody-asked", [
3052
+ { line: "you built a thing" },
3053
+ { pause: 700 },
3054
+ { line: "nobody asked for." },
3055
+ { pause: 2200 },
3056
+ { line: "that is the whole point." }
3057
+ ]),
3058
+ makeBump("bump-cursor-patient", [
3059
+ { line: "the cursor is very patient." },
3060
+ { pause: 2400 },
3061
+ { line: "it will wait as long" },
3062
+ { pause: 500 },
3063
+ { line: "as you need." }
3064
+ ]),
3065
+ makeBump("bump-200-ok", [
3066
+ { line: "the server says 200 OK." },
3067
+ { pause: 2200 },
3068
+ { line: "are " },
3069
+ { add: "you", cps: 5 },
3070
+ { add: "?" }
3071
+ ]),
3072
+ makeBump("bump-3am", [
3073
+ { line: "it is 3am somewhere." },
3074
+ { pause: 1200 },
3075
+ { line: "it is 3am here." },
3076
+ { pause: 2300 },
3077
+ { line: "make something." }
3078
+ ])
3065
3079
  ];
3066
- function makeBump2(def) {
3067
- const lines = def.lines;
3068
- const nLines = lines.length;
3069
- const totalChars = lines.reduce((s, l) => s + l.length, 0);
3070
- const maxLen = lines.reduce((m, l) => Math.max(m, l.length), 0);
3071
- const LINE_PAUSE2 = 240;
3072
- const TARGET = 1900;
3073
- const rawPer = (TARGET - (nLines - 1) * LINE_PAUSE2) / Math.max(1, totalChars);
3074
- const perChar = Math.max(18, Math.min(70, rawPer));
3075
- return {
3076
- name: def.name,
3077
- kind: "bump",
3078
- durationMs: 7e3,
3079
- frame(tMs, w, h) {
3080
- const N = Math.max(0, w * h);
3081
- const out = new Array(N);
3082
- for (let i = 0; i < N; i++) out[i] = { ch: " ", color: INK4 };
3083
- if (w <= 0 || h <= 0) return out;
3084
- const shown = new Array(nLines);
3085
- let doneAll = true;
3086
- let headLine = nLines - 1;
3087
- let headChar = 0;
3088
- let g = 0;
3089
- for (let i = 0; i < nLines; i++) {
3090
- const len = lines[i].length;
3091
- let s = 0;
3092
- for (let j = 0; j < len; j++) {
3093
- const revealAt = i * LINE_PAUSE2 + g * perChar;
3094
- if (tMs >= revealAt) {
3095
- s++;
3096
- } else if (doneAll) {
3097
- doneAll = false;
3098
- headLine = i;
3099
- headChar = j;
3100
- }
3101
- g++;
3102
- }
3103
- shown[i] = s;
3104
- }
3105
- const gap = nLines * 2 - 1 <= h ? 2 : 1;
3106
- const blockH = (nLines - 1) * gap + 1;
3107
- let top;
3108
- if (def.layout === "lower-left") {
3109
- top = h - blockH - 2;
3110
- if (top < 0) top = Math.max(0, h - blockH);
3111
- } else {
3112
- top = Math.floor((h - blockH) / 2);
3113
- if (top < 0) top = 0;
3114
- }
3115
- const leftMargin = Math.min(3, Math.max(0, w - maxLen));
3116
- const startColOf = (line) => def.layout === "lower-left" ? leftMargin : Math.max(0, Math.floor((w - line.length) / 2));
3117
- for (let i = 0; i < nLines; i++) {
3118
- const row = top + i * gap;
3119
- if (row < 0 || row >= h) continue;
3120
- const line = lines[i];
3121
- const startCol = startColOf(line);
3122
- const rowBase = row * w;
3123
- const vis = shown[i];
3124
- for (let j = 0; j < vis; j++) {
3125
- const col13 = startCol + j;
3126
- if (col13 < 0 || col13 >= w) continue;
3127
- out[rowBase + col13] = { ch: line[j], color: LIT };
3128
- }
3129
- }
3130
- let curRow;
3131
- let curCol;
3132
- if (doneAll) {
3133
- const li = nLines - 1;
3134
- curRow = top + li * gap;
3135
- curCol = startColOf(lines[li]) + lines[li].length;
3136
- } else {
3137
- curRow = top + headLine * gap;
3138
- curCol = startColOf(lines[headLine]) + headChar;
3139
- }
3140
- const caretOn = doneAll ? tMs % 900 < 520 : true;
3141
- if (caretOn && curRow >= 0 && curRow < h && curCol >= 0 && curCol < w) {
3142
- out[curRow * w + curCol] = { ch: "\u2588", color: LIT };
3143
- }
3144
- return out;
3145
- }
3146
- };
3147
- }
3148
- var SCENES9 = DECK.map(makeBump2);
3149
3080
 
3150
3081
  // src/radio/scenes/vignette-socratic.ts
3151
3082
  var TAU9 = Math.PI * 2;
@@ -3823,16 +3754,16 @@ var DESCARTES = buildFigure({
3823
3754
  });
3824
3755
  var SIG_L = [70, 176, 255];
3825
3756
  var SIG_R = [255, 100, 186];
3826
- var CHAR_MS2 = 40;
3757
+ var CHAR_MS = 40;
3827
3758
  var HOLD_MS = 1050;
3828
3759
  var PUNCH_HOLD = 1650;
3829
- var LEAD_MS2 = 420;
3760
+ var LEAD_MS = 420;
3830
3761
  var TAIL_MS = 2400;
3831
3762
  function schedule(lines) {
3832
3763
  const beats = [];
3833
- let t = LEAD_MS2;
3764
+ let t = LEAD_MS;
3834
3765
  for (const ln of lines) {
3835
- const typeEnd = t + ln.text.length * CHAR_MS2;
3766
+ const typeEnd = t + ln.text.length * CHAR_MS;
3836
3767
  const end = typeEnd + (ln.punch ? PUNCH_HOLD : HOLD_MS);
3837
3768
  beats.push({ who: ln.who, text: ln.text, punch: !!ln.punch, start: t, typeEnd, end });
3838
3769
  t = end;
@@ -3911,7 +3842,7 @@ function makeVignette2(name, theme, lines) {
3911
3842
  let boxY = boxBottom - boxH + 1;
3912
3843
  if (boxY < 0) boxY = 0;
3913
3844
  const totalChars = textLines.reduce((s, l) => s + l.length, 0);
3914
- const revealed = clamp3(Math.floor((tMs - beat.start) / CHAR_MS2), 0, totalChars);
3845
+ const revealed = clamp3(Math.floor((tMs - beat.start) / CHAR_MS), 0, totalChars);
3915
3846
  const typing = tMs < beat.typeEnd;
3916
3847
  drawBubble2(out, w, h, boxX, boxY, boxW, boxH, boxInnerW, textLines, revealed, sig, tMs, typing);
3917
3848
  drawTail(out, w, h, boxX, boxY + boxH, boxW, speakerCX, figTop, sig);
@@ -4159,8 +4090,8 @@ var SCENE_ORACLE = makeVignette2(
4159
4090
  var SCENES11 = [SCENE_SUNLIGHT, SCENE_DREAM, SCENE_ORACLE];
4160
4091
 
4161
4092
  // src/radio/scenes/vignette-nietzsche.ts
4162
- var LEAD_MS3 = 300;
4163
- var CHAR_MS3 = 38;
4093
+ var LEAD_MS2 = 300;
4094
+ var CHAR_MS2 = 38;
4164
4095
  var HOLD_MS2 = 950;
4165
4096
  var CY = [46, 168, 255];
4166
4097
  var MG = [255, 93, 177];
@@ -4311,7 +4242,7 @@ function makeVignette3(name, look, script) {
4311
4242
  let acc = 0;
4312
4243
  for (const b of script) {
4313
4244
  starts.push(acc);
4314
- acc += LEAD_MS3 + b.text.length * CHAR_MS3 + HOLD_MS2;
4245
+ acc += LEAD_MS2 + b.text.length * CHAR_MS2 + HOLD_MS2;
4315
4246
  }
4316
4247
  const total = acc;
4317
4248
  return {
@@ -4331,8 +4262,8 @@ function makeVignette3(name, look, script) {
4331
4262
  for (let i = 0; i < script.length; i++) if (tMs >= starts[i]) bi = i;
4332
4263
  const beat = script[bi];
4333
4264
  const tIn = tMs - starts[bi];
4334
- const typing = tIn >= LEAD_MS3 && tIn < LEAD_MS3 + beat.text.length * CHAR_MS3;
4335
- const typed = tIn < LEAD_MS3 ? 0 : Math.floor((tIn - LEAD_MS3) / CHAR_MS3);
4265
+ const typing = tIn >= LEAD_MS2 && tIn < LEAD_MS2 + beat.text.length * CHAR_MS2;
4266
+ const typed = tIn < LEAD_MS2 ? 0 : Math.floor((tIn - LEAD_MS2) / CHAR_MS2);
4336
4267
  const activeL = beat.who === "L";
4337
4268
  const spriteH = h >= 20 ? 7 : h >= 12 ? 4 : 0;
4338
4269
  const figW = 9;
@@ -4619,7 +4550,7 @@ var DIOGENES_BUST = {
4619
4550
  ],
4620
4551
  mini: [",www,", "(e e)", "[=m=]"]
4621
4552
  };
4622
- var CHAR_MS4 = 28;
4553
+ var CHAR_MS3 = 28;
4623
4554
  var BEAT_LEAD = 240;
4624
4555
  var BEAT_HOLD = 820;
4625
4556
  var CURSOR2 = "\u258F";
@@ -4662,7 +4593,7 @@ function makeVignette4(def) {
4662
4593
  let acc = 0;
4663
4594
  for (const b of def.script) {
4664
4595
  starts.push(acc);
4665
- acc += BEAT_LEAD + b.text.length * CHAR_MS4 + BEAT_HOLD;
4596
+ acc += BEAT_LEAD + b.text.length * CHAR_MS3 + BEAT_HOLD;
4666
4597
  }
4667
4598
  const totalMs = acc;
4668
4599
  const pal = PAL[def.backdrop];
@@ -4672,8 +4603,8 @@ function makeVignette4(def) {
4672
4603
  durationMs: clamp4(totalMs, 18e3, 26e3),
4673
4604
  frame(tMs, w, h) {
4674
4605
  const out = new Array(w * h);
4675
- const BG3 = { ch: " ", color: 16 };
4676
- out.fill(BG3);
4606
+ const BG2 = { ch: " ", color: 16 };
4607
+ out.fill(BG2);
4677
4608
  if (w <= 0 || h <= 0) return out;
4678
4609
  const setCell = (x, y, ch, color) => {
4679
4610
  if (x >= 0 && x < w && y >= 0 && y < h) out[y * w + x] = { ch, color };
@@ -4712,7 +4643,7 @@ function makeVignette4(def) {
4712
4643
  for (let i = 0; i < starts.length; i++) if (tMs >= starts[i]) ab = i;
4713
4644
  const beat = def.script[ab];
4714
4645
  const localT = tMs - starts[ab];
4715
- const rawTyped = Math.floor((localT - BEAT_LEAD) / CHAR_MS4);
4646
+ const rawTyped = Math.floor((localT - BEAT_LEAD) / CHAR_MS3);
4716
4647
  const big = h >= 18 && w >= 34;
4717
4648
  const figH = big ? 6 : 3;
4718
4649
  const feetY = h - 1;
@@ -4972,6 +4903,11 @@ var CUT = /* @__PURE__ */ new Set([
4972
4903
  // Pat's reject: the spectrum-analyzer visualizer
4973
4904
  ]);
4974
4905
  var originals = VISUALIZERS.map((v) => ({ name: v.name, kind: "visualizer", frame: v.frame }));
4906
+ function dilate(s, f) {
4907
+ return { name: s.name, kind: s.kind, durationMs: Math.round((s.durationMs ?? 2e4) * f), frame: (t, w, h) => s.frame(t / f, w, h) };
4908
+ }
4909
+ var VIGNETTE_SLOW = 1.6;
4910
+ var vignettes = [...SCENES10, ...SCENES11, ...SCENES12, ...SCENES13].map((s) => dilate(s, VIGNETTE_SLOW));
4975
4911
  var ALL_SCENES = [
4976
4912
  ...originals,
4977
4913
  ...SCENES,
@@ -4983,10 +4919,7 @@ var ALL_SCENES = [
4983
4919
  ...SCENES7,
4984
4920
  ...SCENES8,
4985
4921
  ...SCENES9,
4986
- ...SCENES10,
4987
- ...SCENES11,
4988
- ...SCENES12,
4989
- ...SCENES13
4922
+ ...vignettes
4990
4923
  ].filter((s) => !CUT.has(s.name));
4991
4924
  var SCENE_COUNT = ALL_SCENES.length;
4992
4925
 
@@ -5697,23 +5630,23 @@ function drawVolToast() {
5697
5630
  for (let i = 0; i < s.length && x + i < screen.width; i++)
5698
5631
  screen.put({ x: x + i, y, attr: { color: 231, bgColor: 16, bold: true }, dx: 1, dy: 0, wrap: false }, s[i]);
5699
5632
  }
5700
- var BG2 = 16;
5633
+ var BG = 16;
5701
5634
  function blitVideo() {
5702
5635
  const w = screen.width, h = screen.height;
5703
5636
  if (lastFrame && frameW === w && frameH === h) {
5704
5637
  for (let y = 0; y < h; y++) {
5705
5638
  for (let x = 0; x < w; x++) {
5706
5639
  const c = lastFrame[y * w + x];
5707
- if (c) screen.put({ x, y, attr: { color: c.color, bgColor: BG2 }, dx: 1, dy: 0, wrap: false }, c.ch);
5640
+ if (c) screen.put({ x, y, attr: { color: c.color, bgColor: BG }, dx: 1, dy: 0, wrap: false }, c.ch);
5708
5641
  }
5709
5642
  }
5710
5643
  } else {
5711
5644
  for (let y = 0; y < h; y++)
5712
- screen.put({ x: 0, y, attr: { color: BG2, bgColor: BG2 }, dx: 1, dy: 0, wrap: false }, " ".repeat(w));
5645
+ screen.put({ x: 0, y, attr: { color: BG, bgColor: BG }, dx: 1, dy: 0, wrap: false }, " ".repeat(w));
5713
5646
  }
5714
5647
  }
5715
5648
  function videoColorAt(_x, _y) {
5716
- return BG2;
5649
+ return BG;
5717
5650
  }
5718
5651
  function blitOverlay(cells) {
5719
5652
  const w = screen.width, h = screen.height;
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/protocol.ts
4
- var VERSION = true ? "3.6.1" : "3.6.1";
4
+ var VERSION = true ? "3.7.0" : "3.7.0";
5
5
  var PROTO = 3;
6
6
  var PORT = 8787;
7
7
  var DEFAULT_SERVER = "wss://accelr8-canvas.patonchain.workers.dev";
@@ -32,7 +32,7 @@ import {
32
32
  VERSION,
33
33
  decode,
34
34
  encode
35
- } from "./chunk-HXMWH7DE.js";
35
+ } from "./chunk-5BI2REGA.js";
36
36
 
37
37
  // src/client.ts
38
38
  import tk from "terminal-kit";
@@ -6,7 +6,7 @@ import {
6
6
  LIMITS,
7
7
  PORT,
8
8
  PROTO
9
- } from "./chunk-HXMWH7DE.js";
9
+ } from "./chunk-5BI2REGA.js";
10
10
 
11
11
  // src/server.ts
12
12
  import { WebSocketServer, WebSocket } from "ws";
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  DEFAULT_SERVER,
4
4
  PORT,
5
5
  VERSION
6
- } from "./chunks/chunk-HXMWH7DE.js";
6
+ } from "./chunks/chunk-5BI2REGA.js";
7
7
 
8
8
  // src/cli.ts
9
9
  var HELP = `
@@ -53,7 +53,7 @@ async function main() {
53
53
  console.error(`invalid port: ${argVal(args, "--port")}`);
54
54
  process.exit(1);
55
55
  }
56
- const { runServer } = await import("./chunks/server-43CHBWWU.js");
56
+ const { runServer } = await import("./chunks/server-RZ7GYEFD.js");
57
57
  runServer(port);
58
58
  return;
59
59
  }
@@ -67,7 +67,7 @@ async function main() {
67
67
  console.error("accelr8 radio needs an interactive terminal (TTY).");
68
68
  process.exit(1);
69
69
  }
70
- const { runRadio } = await import("./chunks/app-RLI7EJGK.js");
70
+ const { runRadio } = await import("./chunks/app-LK4ZWGHW.js");
71
71
  runRadio({
72
72
  name: argVal(args, "--name"),
73
73
  server: argVal(args, "--server"),
@@ -90,7 +90,7 @@ async function main() {
90
90
  const { cachedUpdate, refreshUpdateCache } = await import("./chunks/update-UEPNGB6Y.js");
91
91
  refreshUpdateCache();
92
92
  const update = cachedUpdate(VERSION);
93
- const { runClient } = await import("./chunks/client-HEB5PQCT.js");
93
+ const { runClient } = await import("./chunks/client-DSPPLOJJ.js");
94
94
  runClient({
95
95
  name: argVal(args, "--name"),
96
96
  server: argVal(args, "--server"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "accelr8",
3
- "version": "3.6.1",
3
+ "version": "3.7.0",
4
4
  "description": "Collaborative ascii canvas in your terminal. Real multiplayer, live cursors, mouse-driven TUI.",
5
5
  "type": "module",
6
6
  "license": "ISC",