@olwiba/dx 0.0.9 → 0.0.12
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/dist/ascii/index.js +16 -2
- package/dist/ascii/index.js.map +1 -1
- package/dist/ascii-gif.js +16 -2
- package/dist/ascii-gif.js.map +1 -1
- package/dist/cli.js +16 -2
- package/dist/generate-previews.d.ts +2 -0
- package/dist/generate-previews.js +39 -9
- package/dist/generate-previews.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/ascii/index.js
CHANGED
|
@@ -32,16 +32,30 @@ function composeAsciiText(font, text) {
|
|
|
32
32
|
function getAsciiAccentColumns(font, text, accent) {
|
|
33
33
|
if (!accent) return /* @__PURE__ */ new Set();
|
|
34
34
|
const columns = /* @__PURE__ */ new Set();
|
|
35
|
+
const accentRanges = [];
|
|
36
|
+
let searchFrom = 0;
|
|
37
|
+
while (true) {
|
|
38
|
+
const idx = text.indexOf(accent, searchFrom);
|
|
39
|
+
if (idx === -1) break;
|
|
40
|
+
accentRanges.push({ start: idx, end: idx + accent.length });
|
|
41
|
+
searchFrom = idx + 1;
|
|
42
|
+
}
|
|
43
|
+
if (accentRanges.length === 0) return columns;
|
|
35
44
|
let offsetX = 0;
|
|
45
|
+
let charIndex = 0;
|
|
36
46
|
for (const ch of text) {
|
|
37
47
|
const code = ch.charCodeAt(0);
|
|
38
48
|
const glyph = font.chars.get(code) ?? font.chars.get(32);
|
|
39
|
-
if (!glyph)
|
|
49
|
+
if (!glyph) {
|
|
50
|
+
charIndex++;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
40
53
|
const width = Math.max(...glyph.map((line) => line.length));
|
|
41
|
-
if (
|
|
54
|
+
if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {
|
|
42
55
|
for (let col = 0; col < width; col++) columns.add(offsetX + col);
|
|
43
56
|
}
|
|
44
57
|
offsetX += width;
|
|
58
|
+
charIndex++;
|
|
45
59
|
}
|
|
46
60
|
return columns;
|
|
47
61
|
}
|
package/dist/ascii/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ascii/compose.ts","../../src/ascii/figlet.ts","../../src/ascii/render.ts","../../src/ascii/fonts/dosrebel-data.ts","../../src/ascii/fonts.ts"],"names":[],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACG7B,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU;AACZ;AAIO,SAAS,aAAa,IAAA,EAA6B;AACxD,EAAA,OAAO,WAAW,IAAI,CAAA;AACxB","file":"index.js","sourcesContent":["import type { FigletFont } from \"./figlet\"\n\nexport interface AsciiCell {\n ch: \"█\" | \"░\"\n col: number\n row: number\n}\n\nexport interface AsciiTextLayout {\n cells: AsciiCell[]\n cols: number\n rows: number\n}\n\nexport function composeAsciiText(font: FigletFont, text: string): AsciiTextLayout {\n const charBlocks: Array<{ lines: string[]; width: number }> = []\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n charBlocks.push({\n lines: glyph.map((line) => line.padEnd(width)),\n width,\n })\n }\n\n const cols = charBlocks.reduce((sum, block) => sum + block.width, 0)\n const rows = font.height\n const cells: AsciiCell[] = []\n let offsetX = 0\n\n for (const block of charBlocks) {\n for (let row = 0; row < rows; row++) {\n const line = block.lines[row] ?? \"\"\n for (let col = 0; col < line.length; col++) {\n const ch = line[col]\n if (ch === \"█\" || ch === \"░\") {\n cells.push({ ch, col: offsetX + col, row })\n }\n }\n }\n offsetX += block.width\n }\n\n return { cells, cols, rows }\n}\n\nexport function getAsciiAccentColumns(\n font: FigletFont,\n text: string,\n accent: string,\n): Set<number> {\n if (!accent) return new Set<number>()\n\n const columns = new Set<number>()\n let offsetX = 0\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n if (accent.includes(ch)) {\n for (let col = 0; col < width; col++) columns.add(offsetX + col)\n }\n offsetX += width\n }\n\n return columns\n}\n","export interface FigletFont {\n height: number\n baseline: number\n hardblank: string\n chars: Map<number, string[]>\n}\n\nexport function parseFigletFont(raw: string): FigletFont {\n const lines = raw.split(\"\\n\")\n\n if (lines[0]?.charCodeAt(0) === 0xfeff) {\n lines[0] = lines[0].slice(1)\n }\n\n const header = lines[0]\n if (!header?.startsWith(\"flf2a\")) {\n throw new Error(\"Invalid FIGlet font: missing flf2a header\")\n }\n\n const hardblank = header[5] ?? \"$\"\n const parts = header.slice(6).trim().split(/\\s+/)\n const height = Number.parseInt(parts[0] ?? \"\", 10)\n const baseline = Number.parseInt(parts[1] ?? \"\", 10)\n const commentLines = Number.parseInt(parts[4] ?? \"\", 10)\n\n if (!Number.isFinite(height) || height <= 0) {\n throw new Error(\"Invalid FIGlet font: missing character height\")\n }\n\n const dataStart = 1 + (Number.isFinite(commentLines) ? commentLines : 0)\n const chars = new Map<number, string[]>()\n let lineIndex = dataStart\n let ascii = 32\n\n while (lineIndex + height <= lines.length && ascii <= 126) {\n const charLines: string[] = []\n for (let row = 0; row < height; row++) {\n const line = (lines[lineIndex + row] ?? \"\")\n .replace(/@+$/, \"\")\n .replaceAll(hardblank, \" \")\n charLines.push(line)\n }\n\n chars.set(ascii, charLines)\n lineIndex += height\n ascii++\n }\n\n return { height, baseline, hardblank, chars }\n}\n","import type { AsciiCell, AsciiTextLayout } from \"./compose\"\n\nexport const ASCII_CHAR_WIDTH = 7.5\nexport const ASCII_CHAR_HEIGHT = 15\n\nexport interface AsciiWave {\n cx: number\n cy: number\n t: number\n}\n\nexport interface AsciiPointer {\n x: number\n y: number\n active: boolean\n}\n\nexport interface AsciiFrameState {\n time?: number\n phase?: number\n pointer?: AsciiPointer\n waves?: AsciiWave[]\n}\n\nexport interface AsciiRenderOptions extends AsciiFrameState {\n accentColumns?: ReadonlySet<number>\n color: string\n accentColor?: string\n charWidth?: number\n charHeight?: number\n}\n\nexport interface AsciiFrameContext {\n clearRect(x: number, y: number, width: number, height: number): void\n fillRect(x: number, y: number, width: number, height: number): void\n globalAlpha: number\n fillStyle: string\n}\n\nexport function getAsciiCanvasSize(\n layout: AsciiTextLayout,\n charWidth = ASCII_CHAR_WIDTH,\n charHeight = ASCII_CHAR_HEIGHT,\n) {\n return {\n width: Math.ceil(layout.cols * charWidth),\n height: layout.rows * charHeight,\n }\n}\n\nexport function getAsciiCellIntensity(cell: AsciiCell, options: AsciiFrameState): number {\n const time = options.time ?? 0\n const loop = options.phase == null ? null : options.phase * Math.PI * 2\n\n if (cell.ch === \"░\") {\n const drift =\n loop == null\n ? Math.sin(time * 0.3 + cell.col * 0.1) * 0.03\n : Math.sin(loop + cell.col * 0.1) * 0.03\n return 0.15 + drift\n }\n\n if (loop != null) {\n return getLoopIntensity(cell, loop)\n }\n\n const noise = getLiveNoise(cell, time)\n\n const seed = cell.col * 7.13 + cell.row * 13.37\n const flickerPhase = Math.sin(seed) * 1000\n const flickerWave = Math.sin(time * 0.8 + flickerPhase)\n const flicker = flickerWave > 0.97 ? 0.15 : 0\n\n let intensity = 0.7 + noise + flicker\n const charWidth = ASCII_CHAR_WIDTH\n const charHeight = ASCII_CHAR_HEIGHT\n\n if (options.pointer?.active) {\n const mdx = cell.col * charWidth + charWidth / 2 - options.pointer.x\n const mdy = cell.row * charHeight + charHeight / 2 - options.pointer.y\n const mDist = Math.sqrt(mdx * mdx + mdy * mdy)\n const radius = 80\n if (mDist < radius) {\n const falloff = 1 - mDist / radius\n const ripple = Math.sin(mDist * 0.08 - time * 4) * 0.12 * falloff * falloff\n intensity = Math.min(1, intensity + falloff * 0.2 + ripple)\n }\n }\n\n const px = cell.col * charWidth + charWidth / 2\n const py = cell.row * charHeight + charHeight / 2\n for (const wave of options.waves ?? []) {\n const wdx = px - wave.cx\n const wdy = py - wave.cy\n const dist = Math.sqrt(wdx * wdx + wdy * wdy)\n const age = time - wave.t\n const waveRadius = age * 200\n const delta = dist - waveRadius\n const fade = Math.exp(-age * 1.5)\n const ring = Math.exp(-delta * delta * 0.002) * fade\n intensity = Math.min(1, intensity + ring * 0.5 * Math.sin(delta * 0.06 + 1.5))\n }\n\n return Math.max(0.5, Math.min(1, intensity))\n}\n\nexport function renderAsciiFrameToContext(\n ctx: AsciiFrameContext,\n layout: AsciiTextLayout,\n options: AsciiRenderOptions,\n) {\n const charWidth = options.charWidth ?? ASCII_CHAR_WIDTH\n const charHeight = options.charHeight ?? ASCII_CHAR_HEIGHT\n const { width, height } = getAsciiCanvasSize(layout, charWidth, charHeight)\n const accentColor = options.accentColor ?? options.color\n\n ctx.clearRect(0, 0, width, height)\n\n for (const cell of layout.cells) {\n const isAccent = options.accentColumns?.has(cell.col) ?? false\n ctx.globalAlpha = getAsciiCellIntensity(cell, options)\n ctx.fillStyle = isAccent ? accentColor : options.color\n ctx.fillRect(cell.col * charWidth, cell.row * charHeight, charWidth, charHeight)\n }\n\n ctx.globalAlpha = 1\n}\n\nfunction getLiveNoise(cell: AsciiCell, time: number): number {\n const nx = cell.col * 0.18 + time * 0.9\n const ny = cell.row * 0.3 + time * 0.55\n return (\n Math.sin(nx) * 0.12 +\n Math.sin(ny * 1.4 + nx * 0.6) * 0.1 +\n Math.sin(nx * 0.4 - ny * 0.8 + time * 1.6) * 0.08 +\n Math.sin((cell.col + cell.row) * 0.15 + time * 0.4) * 0.07\n )\n}\n\nfunction getLoopIntensity(cell: AsciiCell, loop: number): number {\n const flow =\n Math.sin(cell.col * 0.08 + loop) * 0.055 +\n Math.sin(cell.row * 0.22 - loop * 0.75) * 0.04\n const shimmer = (Math.sin(cell.col * 0.16 + cell.row * 0.08 - loop * 2) + 1) / 2\n const highlight = Math.pow(shimmer, 4) * 0.22\n const intensity = 0.68 + flow + highlight\n\n return Math.max(0.55, Math.min(1, intensity))\n}\n","// @generated from dosrebel.flf. Do not edit by hand.\nexport const dosrebelFont: string = \"flf2a$ 11 8 35 -1 15\\nRebel by Valerie Mates (popcorn@cyberspace.org), based on a font by Ron Bliss\\n(who sometimes goes by the name \\\"rebel\\\" because his initials are REB).\\nNOTE: THIS FONT ONLY WORKS IN MS-DOS.\\nMay 27, 1994\\n\\nExplanation of first line:\\nflf2 - \\\"magic number\\\" for file identification\\na - should always be `a', for now\\n$ - the \\\"hardblank\\\" -- prints as a blank, but can't be smushed\\n11 - height of a character\\n8 - height of a character, not including descenders\\n35 - max line length (excluding comment lines) + a fudge factor\\n-1 - default smushmode for this font (like \\\"-m 15\\\" on command line)\\n15 - number of comment lines\\n\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n ███@\\n░░░ @\\n @\\n @\\n @@\\n ██ ██@\\n░██░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ████████████@\\n░░░███░░███░ @\\n ████████████@\\n░░░███░░███░ @\\n ░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n ██████ @\\n ███░░░ @\\n ░░█████ @\\n ░░░░███ @\\n ██████ @\\n ░░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n ███ ███@\\n ░░░ ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ ███ @\\n░░░ ░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███ @\\n ░░██████ @\\n ██████ @\\n░███░░███ @\\n░███ ░░███ @\\n░░█████░███@\\n ░░░░░ ░░░ @\\n @\\n @\\n @@\\n ██@\\n ███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███@\\n ███ @\\n ███ @\\n░███ @\\n░███ @\\n░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███@\\n ░███@\\n ░███@\\n ███ @\\n ██░ @\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n ███ ░███ ███@\\n░░░█████████░ @\\n ░░░█████░ @\\n █████████ @\\n ███░░███░░███@\\n░░░ ░███ ░░░ @\\n ░░░ @\\n @\\n @\\n @@\\n @\\n ███ @\\n ░███ @\\n ███████████@\\n░░░░░███░░░ @\\n ░███ @\\n ░░░ @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n @\\n @\\n @\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n █████ @\\n ███░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░█████░ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ███████ @\\n ███░░░░ @\\n ███ █@\\n░██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ██████░ @\\n ░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████ @\\n░░███ ░░███ @\\n ░███ ░███ █@\\n ░███████████@\\n ░░░░░░░███░█@\\n ░███░ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░░░█@\\n░███ ░ @\\n░█████████ @\\n░░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░░░ @\\n░█████████ @\\n░███░░░░███@\\n░███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░███@\\n░░░ ███ @\\n ███ @\\n ███ @\\n ███ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░███@\\n░░█████████@\\n ░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n ██@\\n ░░ @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░███@\\n░░░ ░███@\\n ███████ @\\n ░███░░░ @\\n ░░░ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░░ @\\n░███ ██████ @\\n░███░███░███@\\n░███░███░███@\\n░███░░░ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ███████████ @\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ @\\n░░███ ███@\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████ @\\n░░███░░░░███ @\\n ░███ ░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███ ███ @\\n ██████████ @\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░░███░░░░░█@\\n ░███ █ ░ @\\n ░██████ @\\n ░███░░█ @\\n ░███ ░ █@\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░░███░░░░░░█@\\n ░███ █ ░ @\\n ░███████ @\\n ░███░░░█ @\\n ░███ ░ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ █████@\\n░░███ ░░███ @\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ ████@\\n░░███ ███░ @\\n ░███ ███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░░███ @\\n █████ ░░████@\\n░░░░░ ░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████ ██████@\\n░░██████ ██████ @\\n ░███░█████░███ @\\n ░███░░███ ░███ @\\n ░███ ░░░ ░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ██████ █████@\\n░░██████ ░░███ @\\n ░███░███ ░███ @\\n ░███░░███░███ @\\n ░███ ░░██████ @\\n ░███ ░░█████ @\\n █████ ░░█████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░███████░ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ██░███@\\n░░███ ░░████ @\\n ░░░██████░██@\\n ░░░░░░ ░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███ @\\n ░███ ░███ @\\n ░██████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n░███ ░░░ @\\n░░█████████ @\\n ░░░░░░░░███@\\n ███ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░███░░░█@\\n░ ░███ ░ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░░█████░ @\\n ░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████ ███ █████@\\n░░███ ░███ ░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n ░░███ █████ ███ @\\n ░░░█████░█████░ @\\n ░░███ ░░███ @\\n ░░░ ░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ███░███ @\\n ███ ░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░░░░███ @\\n░ ███░ @\\n ███ @\\n ███ @\\n ████ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░███░ @\\n░███ @\\n░███ @\\n░███ @\\n░███ @\\n░█████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n █████@\\n░░░███@\\n ░███@\\n ░███@\\n ░███@\\n ░███@\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n ████ @\\n ██░░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n░███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ████████ @\\n░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░░░ @\\n░███ ███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ███████ @\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███████ @\\n░███░░░ @\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███@\\n ░███ ░░░ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ███████@\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████@\\n ░░░░░███@\\n ███ ░███@\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███ █████@\\n ░███░░███ @\\n ░██████░ @\\n ░███░░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████████ @\\n░░███░░███░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n █████░███ █████@\\n░░░░░ ░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███████ @\\n ░███░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @@\\n @\\n @\\n ████████@\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░███████ @\\n ░░░░░███ @\\n ░███ @\\n █████@\\n ░░░░░ @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ @\\n ███░░ @\\n░░█████ @\\n ░░░░███@\\n ██████ @\\n░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n ░░███ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n ░███ ███@\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ███ █████@\\n░░███ ░███░░███ @\\n ░███ ░███ ░███ @\\n ░░███████████ @\\n ░░████░████ @\\n ░░░░ ░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░░░█████░ @\\n ███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░███ @\\n ███ ░███ @\\n ░░██████ @\\n ░░░░░░ @@\\n @\\n @\\n █████████@\\n ░█░░░░███ @\\n ░ ███░ @\\n ███░ █@\\n █████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░ @\\n @\\n @\\n @@\\n @\\n ███ ███@\\n ███░███░ @\\n░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n ███████ @\\n ███░░░███ @\\n ░█████████ @\\n ░███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░█████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ████ ██████ @\\n░░░░ ░░░░░░ @\\n @\\n @\\n @@\\n\"\n\n","import { dosrebelFont } from \"./fonts/dosrebel-data\"\n\nexport { dosrebelFont }\n\nexport const asciiFonts = {\n dosrebel: dosrebelFont,\n} as const\n\nexport type AsciiFontName = keyof typeof asciiFonts\n\nexport function getAsciiFont(name: AsciiFontName): string {\n return asciiFonts[name]\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ascii/compose.ts","../../src/ascii/figlet.ts","../../src/ascii/render.ts","../../src/ascii/fonts/dosrebel-data.ts","../../src/ascii/fonts.ts"],"names":[],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACG7B,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU;AACZ;AAIO,SAAS,aAAa,IAAA,EAA6B;AACxD,EAAA,OAAO,WAAW,IAAI,CAAA;AACxB","file":"index.js","sourcesContent":["import type { FigletFont } from \"./figlet\"\n\nexport interface AsciiCell {\n ch: \"█\" | \"░\"\n col: number\n row: number\n}\n\nexport interface AsciiTextLayout {\n cells: AsciiCell[]\n cols: number\n rows: number\n}\n\nexport function composeAsciiText(font: FigletFont, text: string): AsciiTextLayout {\n const charBlocks: Array<{ lines: string[]; width: number }> = []\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n charBlocks.push({\n lines: glyph.map((line) => line.padEnd(width)),\n width,\n })\n }\n\n const cols = charBlocks.reduce((sum, block) => sum + block.width, 0)\n const rows = font.height\n const cells: AsciiCell[] = []\n let offsetX = 0\n\n for (const block of charBlocks) {\n for (let row = 0; row < rows; row++) {\n const line = block.lines[row] ?? \"\"\n for (let col = 0; col < line.length; col++) {\n const ch = line[col]\n if (ch === \"█\" || ch === \"░\") {\n cells.push({ ch, col: offsetX + col, row })\n }\n }\n }\n offsetX += block.width\n }\n\n return { cells, cols, rows }\n}\n\nexport function getAsciiAccentColumns(\n font: FigletFont,\n text: string,\n accent: string,\n): Set<number> {\n if (!accent) return new Set<number>()\n\n const columns = new Set<number>()\n const accentRanges: Array<{ start: number; end: number }> = []\n let searchFrom = 0\n while (true) {\n const idx = text.indexOf(accent, searchFrom)\n if (idx === -1) break\n accentRanges.push({ start: idx, end: idx + accent.length })\n searchFrom = idx + 1\n }\n if (accentRanges.length === 0) return columns\n\n let offsetX = 0\n let charIndex = 0\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) { charIndex++; continue }\n\n const width = Math.max(...glyph.map((line) => line.length))\n if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {\n for (let col = 0; col < width; col++) columns.add(offsetX + col)\n }\n offsetX += width\n charIndex++\n }\n\n return columns\n}\n","export interface FigletFont {\n height: number\n baseline: number\n hardblank: string\n chars: Map<number, string[]>\n}\n\nexport function parseFigletFont(raw: string): FigletFont {\n const lines = raw.split(\"\\n\")\n\n if (lines[0]?.charCodeAt(0) === 0xfeff) {\n lines[0] = lines[0].slice(1)\n }\n\n const header = lines[0]\n if (!header?.startsWith(\"flf2a\")) {\n throw new Error(\"Invalid FIGlet font: missing flf2a header\")\n }\n\n const hardblank = header[5] ?? \"$\"\n const parts = header.slice(6).trim().split(/\\s+/)\n const height = Number.parseInt(parts[0] ?? \"\", 10)\n const baseline = Number.parseInt(parts[1] ?? \"\", 10)\n const commentLines = Number.parseInt(parts[4] ?? \"\", 10)\n\n if (!Number.isFinite(height) || height <= 0) {\n throw new Error(\"Invalid FIGlet font: missing character height\")\n }\n\n const dataStart = 1 + (Number.isFinite(commentLines) ? commentLines : 0)\n const chars = new Map<number, string[]>()\n let lineIndex = dataStart\n let ascii = 32\n\n while (lineIndex + height <= lines.length && ascii <= 126) {\n const charLines: string[] = []\n for (let row = 0; row < height; row++) {\n const line = (lines[lineIndex + row] ?? \"\")\n .replace(/@+$/, \"\")\n .replaceAll(hardblank, \" \")\n charLines.push(line)\n }\n\n chars.set(ascii, charLines)\n lineIndex += height\n ascii++\n }\n\n return { height, baseline, hardblank, chars }\n}\n","import type { AsciiCell, AsciiTextLayout } from \"./compose\"\n\nexport const ASCII_CHAR_WIDTH = 7.5\nexport const ASCII_CHAR_HEIGHT = 15\n\nexport interface AsciiWave {\n cx: number\n cy: number\n t: number\n}\n\nexport interface AsciiPointer {\n x: number\n y: number\n active: boolean\n}\n\nexport interface AsciiFrameState {\n time?: number\n phase?: number\n pointer?: AsciiPointer\n waves?: AsciiWave[]\n}\n\nexport interface AsciiRenderOptions extends AsciiFrameState {\n accentColumns?: ReadonlySet<number>\n color: string\n accentColor?: string\n charWidth?: number\n charHeight?: number\n}\n\nexport interface AsciiFrameContext {\n clearRect(x: number, y: number, width: number, height: number): void\n fillRect(x: number, y: number, width: number, height: number): void\n globalAlpha: number\n fillStyle: string\n}\n\nexport function getAsciiCanvasSize(\n layout: AsciiTextLayout,\n charWidth = ASCII_CHAR_WIDTH,\n charHeight = ASCII_CHAR_HEIGHT,\n) {\n return {\n width: Math.ceil(layout.cols * charWidth),\n height: layout.rows * charHeight,\n }\n}\n\nexport function getAsciiCellIntensity(cell: AsciiCell, options: AsciiFrameState): number {\n const time = options.time ?? 0\n const loop = options.phase == null ? null : options.phase * Math.PI * 2\n\n if (cell.ch === \"░\") {\n const drift =\n loop == null\n ? Math.sin(time * 0.3 + cell.col * 0.1) * 0.03\n : Math.sin(loop + cell.col * 0.1) * 0.03\n return 0.15 + drift\n }\n\n if (loop != null) {\n return getLoopIntensity(cell, loop)\n }\n\n const noise = getLiveNoise(cell, time)\n\n const seed = cell.col * 7.13 + cell.row * 13.37\n const flickerPhase = Math.sin(seed) * 1000\n const flickerWave = Math.sin(time * 0.8 + flickerPhase)\n const flicker = flickerWave > 0.97 ? 0.15 : 0\n\n let intensity = 0.7 + noise + flicker\n const charWidth = ASCII_CHAR_WIDTH\n const charHeight = ASCII_CHAR_HEIGHT\n\n if (options.pointer?.active) {\n const mdx = cell.col * charWidth + charWidth / 2 - options.pointer.x\n const mdy = cell.row * charHeight + charHeight / 2 - options.pointer.y\n const mDist = Math.sqrt(mdx * mdx + mdy * mdy)\n const radius = 80\n if (mDist < radius) {\n const falloff = 1 - mDist / radius\n const ripple = Math.sin(mDist * 0.08 - time * 4) * 0.12 * falloff * falloff\n intensity = Math.min(1, intensity + falloff * 0.2 + ripple)\n }\n }\n\n const px = cell.col * charWidth + charWidth / 2\n const py = cell.row * charHeight + charHeight / 2\n for (const wave of options.waves ?? []) {\n const wdx = px - wave.cx\n const wdy = py - wave.cy\n const dist = Math.sqrt(wdx * wdx + wdy * wdy)\n const age = time - wave.t\n const waveRadius = age * 200\n const delta = dist - waveRadius\n const fade = Math.exp(-age * 1.5)\n const ring = Math.exp(-delta * delta * 0.002) * fade\n intensity = Math.min(1, intensity + ring * 0.5 * Math.sin(delta * 0.06 + 1.5))\n }\n\n return Math.max(0.5, Math.min(1, intensity))\n}\n\nexport function renderAsciiFrameToContext(\n ctx: AsciiFrameContext,\n layout: AsciiTextLayout,\n options: AsciiRenderOptions,\n) {\n const charWidth = options.charWidth ?? ASCII_CHAR_WIDTH\n const charHeight = options.charHeight ?? ASCII_CHAR_HEIGHT\n const { width, height } = getAsciiCanvasSize(layout, charWidth, charHeight)\n const accentColor = options.accentColor ?? options.color\n\n ctx.clearRect(0, 0, width, height)\n\n for (const cell of layout.cells) {\n const isAccent = options.accentColumns?.has(cell.col) ?? false\n ctx.globalAlpha = getAsciiCellIntensity(cell, options)\n ctx.fillStyle = isAccent ? accentColor : options.color\n ctx.fillRect(cell.col * charWidth, cell.row * charHeight, charWidth, charHeight)\n }\n\n ctx.globalAlpha = 1\n}\n\nfunction getLiveNoise(cell: AsciiCell, time: number): number {\n const nx = cell.col * 0.18 + time * 0.9\n const ny = cell.row * 0.3 + time * 0.55\n return (\n Math.sin(nx) * 0.12 +\n Math.sin(ny * 1.4 + nx * 0.6) * 0.1 +\n Math.sin(nx * 0.4 - ny * 0.8 + time * 1.6) * 0.08 +\n Math.sin((cell.col + cell.row) * 0.15 + time * 0.4) * 0.07\n )\n}\n\nfunction getLoopIntensity(cell: AsciiCell, loop: number): number {\n const flow =\n Math.sin(cell.col * 0.08 + loop) * 0.055 +\n Math.sin(cell.row * 0.22 - loop * 0.75) * 0.04\n const shimmer = (Math.sin(cell.col * 0.16 + cell.row * 0.08 - loop * 2) + 1) / 2\n const highlight = Math.pow(shimmer, 4) * 0.22\n const intensity = 0.68 + flow + highlight\n\n return Math.max(0.55, Math.min(1, intensity))\n}\n","// @generated from dosrebel.flf. Do not edit by hand.\nexport const dosrebelFont: string = \"flf2a$ 11 8 35 -1 15\\nRebel by Valerie Mates (popcorn@cyberspace.org), based on a font by Ron Bliss\\n(who sometimes goes by the name \\\"rebel\\\" because his initials are REB).\\nNOTE: THIS FONT ONLY WORKS IN MS-DOS.\\nMay 27, 1994\\n\\nExplanation of first line:\\nflf2 - \\\"magic number\\\" for file identification\\na - should always be `a', for now\\n$ - the \\\"hardblank\\\" -- prints as a blank, but can't be smushed\\n11 - height of a character\\n8 - height of a character, not including descenders\\n35 - max line length (excluding comment lines) + a fudge factor\\n-1 - default smushmode for this font (like \\\"-m 15\\\" on command line)\\n15 - number of comment lines\\n\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n ███@\\n░░░ @\\n @\\n @\\n @@\\n ██ ██@\\n░██░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ████████████@\\n░░░███░░███░ @\\n ████████████@\\n░░░███░░███░ @\\n ░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n ██████ @\\n ███░░░ @\\n ░░█████ @\\n ░░░░███ @\\n ██████ @\\n ░░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n ███ ███@\\n ░░░ ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ ███ @\\n░░░ ░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███ @\\n ░░██████ @\\n ██████ @\\n░███░░███ @\\n░███ ░░███ @\\n░░█████░███@\\n ░░░░░ ░░░ @\\n @\\n @\\n @@\\n ██@\\n ███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███@\\n ███ @\\n ███ @\\n░███ @\\n░███ @\\n░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███@\\n ░███@\\n ░███@\\n ███ @\\n ██░ @\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n ███ ░███ ███@\\n░░░█████████░ @\\n ░░░█████░ @\\n █████████ @\\n ███░░███░░███@\\n░░░ ░███ ░░░ @\\n ░░░ @\\n @\\n @\\n @@\\n @\\n ███ @\\n ░███ @\\n ███████████@\\n░░░░░███░░░ @\\n ░███ @\\n ░░░ @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n @\\n @\\n @\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n █████ @\\n ███░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░█████░ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ███████ @\\n ███░░░░ @\\n ███ █@\\n░██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ██████░ @\\n ░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████ @\\n░░███ ░░███ @\\n ░███ ░███ █@\\n ░███████████@\\n ░░░░░░░███░█@\\n ░███░ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░░░█@\\n░███ ░ @\\n░█████████ @\\n░░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░░░ @\\n░█████████ @\\n░███░░░░███@\\n░███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░███@\\n░░░ ███ @\\n ███ @\\n ███ @\\n ███ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░███@\\n░░█████████@\\n ░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n ██@\\n ░░ @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░███@\\n░░░ ░███@\\n ███████ @\\n ░███░░░ @\\n ░░░ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░░ @\\n░███ ██████ @\\n░███░███░███@\\n░███░███░███@\\n░███░░░ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ███████████ @\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ @\\n░░███ ███@\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████ @\\n░░███░░░░███ @\\n ░███ ░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███ ███ @\\n ██████████ @\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░░███░░░░░█@\\n ░███ █ ░ @\\n ░██████ @\\n ░███░░█ @\\n ░███ ░ █@\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░░███░░░░░░█@\\n ░███ █ ░ @\\n ░███████ @\\n ░███░░░█ @\\n ░███ ░ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ █████@\\n░░███ ░░███ @\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ ████@\\n░░███ ███░ @\\n ░███ ███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░░███ @\\n █████ ░░████@\\n░░░░░ ░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████ ██████@\\n░░██████ ██████ @\\n ░███░█████░███ @\\n ░███░░███ ░███ @\\n ░███ ░░░ ░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ██████ █████@\\n░░██████ ░░███ @\\n ░███░███ ░███ @\\n ░███░░███░███ @\\n ░███ ░░██████ @\\n ░███ ░░█████ @\\n █████ ░░█████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░███████░ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ██░███@\\n░░███ ░░████ @\\n ░░░██████░██@\\n ░░░░░░ ░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███ @\\n ░███ ░███ @\\n ░██████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n░███ ░░░ @\\n░░█████████ @\\n ░░░░░░░░███@\\n ███ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░███░░░█@\\n░ ░███ ░ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░░█████░ @\\n ░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████ ███ █████@\\n░░███ ░███ ░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n ░░███ █████ ███ @\\n ░░░█████░█████░ @\\n ░░███ ░░███ @\\n ░░░ ░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ███░███ @\\n ███ ░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░░░░███ @\\n░ ███░ @\\n ███ @\\n ███ @\\n ████ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░███░ @\\n░███ @\\n░███ @\\n░███ @\\n░███ @\\n░█████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n █████@\\n░░░███@\\n ░███@\\n ░███@\\n ░███@\\n ░███@\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n ████ @\\n ██░░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n░███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ████████ @\\n░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░░░ @\\n░███ ███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ███████ @\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███████ @\\n░███░░░ @\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███@\\n ░███ ░░░ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ███████@\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████@\\n ░░░░░███@\\n ███ ░███@\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███ █████@\\n ░███░░███ @\\n ░██████░ @\\n ░███░░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████████ @\\n░░███░░███░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n █████░███ █████@\\n░░░░░ ░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███████ @\\n ░███░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @@\\n @\\n @\\n ████████@\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░███████ @\\n ░░░░░███ @\\n ░███ @\\n █████@\\n ░░░░░ @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ @\\n ███░░ @\\n░░█████ @\\n ░░░░███@\\n ██████ @\\n░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n ░░███ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n ░███ ███@\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ███ █████@\\n░░███ ░███░░███ @\\n ░███ ░███ ░███ @\\n ░░███████████ @\\n ░░████░████ @\\n ░░░░ ░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░░░█████░ @\\n ███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░███ @\\n ███ ░███ @\\n ░░██████ @\\n ░░░░░░ @@\\n @\\n @\\n █████████@\\n ░█░░░░███ @\\n ░ ███░ @\\n ███░ █@\\n █████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░ @\\n @\\n @\\n @@\\n @\\n ███ ███@\\n ███░███░ @\\n░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n ███████ @\\n ███░░░███ @\\n ░█████████ @\\n ░███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░█████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ████ ██████ @\\n░░░░ ░░░░░░ @\\n @\\n @\\n @@\\n\"\n\n","import { dosrebelFont } from \"./fonts/dosrebel-data\"\n\nexport { dosrebelFont }\n\nexport const asciiFonts = {\n dosrebel: dosrebelFont,\n} as const\n\nexport type AsciiFontName = keyof typeof asciiFonts\n\nexport function getAsciiFont(name: AsciiFontName): string {\n return asciiFonts[name]\n}\n"]}
|
package/dist/ascii-gif.js
CHANGED
|
@@ -37,16 +37,30 @@ function composeAsciiText(font, text) {
|
|
|
37
37
|
function getAsciiAccentColumns(font, text, accent) {
|
|
38
38
|
if (!accent) return /* @__PURE__ */ new Set();
|
|
39
39
|
const columns = /* @__PURE__ */ new Set();
|
|
40
|
+
const accentRanges = [];
|
|
41
|
+
let searchFrom = 0;
|
|
42
|
+
while (true) {
|
|
43
|
+
const idx = text.indexOf(accent, searchFrom);
|
|
44
|
+
if (idx === -1) break;
|
|
45
|
+
accentRanges.push({ start: idx, end: idx + accent.length });
|
|
46
|
+
searchFrom = idx + 1;
|
|
47
|
+
}
|
|
48
|
+
if (accentRanges.length === 0) return columns;
|
|
40
49
|
let offsetX = 0;
|
|
50
|
+
let charIndex = 0;
|
|
41
51
|
for (const ch of text) {
|
|
42
52
|
const code = ch.charCodeAt(0);
|
|
43
53
|
const glyph = font.chars.get(code) ?? font.chars.get(32);
|
|
44
|
-
if (!glyph)
|
|
54
|
+
if (!glyph) {
|
|
55
|
+
charIndex++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
45
58
|
const width = Math.max(...glyph.map((line) => line.length));
|
|
46
|
-
if (
|
|
59
|
+
if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {
|
|
47
60
|
for (let col = 0; col < width; col++) columns.add(offsetX + col);
|
|
48
61
|
}
|
|
49
62
|
offsetX += width;
|
|
63
|
+
charIndex++;
|
|
50
64
|
}
|
|
51
65
|
return columns;
|
|
52
66
|
}
|
package/dist/ascii-gif.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ascii/compose.ts","../src/ascii/figlet.ts","../src/ascii/render.ts","../src/ascii/fonts/dosrebel-data.ts","../src/ascii/fonts.ts","../src/ascii-gif.ts"],"names":[],"mappings":"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YAAA,GAAuB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"ascii-gif.js","sourcesContent":["import type { FigletFont } from \"./figlet\"\n\nexport interface AsciiCell {\n ch: \"█\" | \"░\"\n col: number\n row: number\n}\n\nexport interface AsciiTextLayout {\n cells: AsciiCell[]\n cols: number\n rows: number\n}\n\nexport function composeAsciiText(font: FigletFont, text: string): AsciiTextLayout {\n const charBlocks: Array<{ lines: string[]; width: number }> = []\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n charBlocks.push({\n lines: glyph.map((line) => line.padEnd(width)),\n width,\n })\n }\n\n const cols = charBlocks.reduce((sum, block) => sum + block.width, 0)\n const rows = font.height\n const cells: AsciiCell[] = []\n let offsetX = 0\n\n for (const block of charBlocks) {\n for (let row = 0; row < rows; row++) {\n const line = block.lines[row] ?? \"\"\n for (let col = 0; col < line.length; col++) {\n const ch = line[col]\n if (ch === \"█\" || ch === \"░\") {\n cells.push({ ch, col: offsetX + col, row })\n }\n }\n }\n offsetX += block.width\n }\n\n return { cells, cols, rows }\n}\n\nexport function getAsciiAccentColumns(\n font: FigletFont,\n text: string,\n accent: string,\n): Set<number> {\n if (!accent) return new Set<number>()\n\n const columns = new Set<number>()\n let offsetX = 0\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n if (accent.includes(ch)) {\n for (let col = 0; col < width; col++) columns.add(offsetX + col)\n }\n offsetX += width\n }\n\n return columns\n}\n","export interface FigletFont {\n height: number\n baseline: number\n hardblank: string\n chars: Map<number, string[]>\n}\n\nexport function parseFigletFont(raw: string): FigletFont {\n const lines = raw.split(\"\\n\")\n\n if (lines[0]?.charCodeAt(0) === 0xfeff) {\n lines[0] = lines[0].slice(1)\n }\n\n const header = lines[0]\n if (!header?.startsWith(\"flf2a\")) {\n throw new Error(\"Invalid FIGlet font: missing flf2a header\")\n }\n\n const hardblank = header[5] ?? \"$\"\n const parts = header.slice(6).trim().split(/\\s+/)\n const height = Number.parseInt(parts[0] ?? \"\", 10)\n const baseline = Number.parseInt(parts[1] ?? \"\", 10)\n const commentLines = Number.parseInt(parts[4] ?? \"\", 10)\n\n if (!Number.isFinite(height) || height <= 0) {\n throw new Error(\"Invalid FIGlet font: missing character height\")\n }\n\n const dataStart = 1 + (Number.isFinite(commentLines) ? commentLines : 0)\n const chars = new Map<number, string[]>()\n let lineIndex = dataStart\n let ascii = 32\n\n while (lineIndex + height <= lines.length && ascii <= 126) {\n const charLines: string[] = []\n for (let row = 0; row < height; row++) {\n const line = (lines[lineIndex + row] ?? \"\")\n .replace(/@+$/, \"\")\n .replaceAll(hardblank, \" \")\n charLines.push(line)\n }\n\n chars.set(ascii, charLines)\n lineIndex += height\n ascii++\n }\n\n return { height, baseline, hardblank, chars }\n}\n","import type { AsciiCell, AsciiTextLayout } from \"./compose\"\n\nexport const ASCII_CHAR_WIDTH = 7.5\nexport const ASCII_CHAR_HEIGHT = 15\n\nexport interface AsciiWave {\n cx: number\n cy: number\n t: number\n}\n\nexport interface AsciiPointer {\n x: number\n y: number\n active: boolean\n}\n\nexport interface AsciiFrameState {\n time?: number\n phase?: number\n pointer?: AsciiPointer\n waves?: AsciiWave[]\n}\n\nexport interface AsciiRenderOptions extends AsciiFrameState {\n accentColumns?: ReadonlySet<number>\n color: string\n accentColor?: string\n charWidth?: number\n charHeight?: number\n}\n\nexport interface AsciiFrameContext {\n clearRect(x: number, y: number, width: number, height: number): void\n fillRect(x: number, y: number, width: number, height: number): void\n globalAlpha: number\n fillStyle: string\n}\n\nexport function getAsciiCanvasSize(\n layout: AsciiTextLayout,\n charWidth = ASCII_CHAR_WIDTH,\n charHeight = ASCII_CHAR_HEIGHT,\n) {\n return {\n width: Math.ceil(layout.cols * charWidth),\n height: layout.rows * charHeight,\n }\n}\n\nexport function getAsciiCellIntensity(cell: AsciiCell, options: AsciiFrameState): number {\n const time = options.time ?? 0\n const loop = options.phase == null ? null : options.phase * Math.PI * 2\n\n if (cell.ch === \"░\") {\n const drift =\n loop == null\n ? Math.sin(time * 0.3 + cell.col * 0.1) * 0.03\n : Math.sin(loop + cell.col * 0.1) * 0.03\n return 0.15 + drift\n }\n\n if (loop != null) {\n return getLoopIntensity(cell, loop)\n }\n\n const noise = getLiveNoise(cell, time)\n\n const seed = cell.col * 7.13 + cell.row * 13.37\n const flickerPhase = Math.sin(seed) * 1000\n const flickerWave = Math.sin(time * 0.8 + flickerPhase)\n const flicker = flickerWave > 0.97 ? 0.15 : 0\n\n let intensity = 0.7 + noise + flicker\n const charWidth = ASCII_CHAR_WIDTH\n const charHeight = ASCII_CHAR_HEIGHT\n\n if (options.pointer?.active) {\n const mdx = cell.col * charWidth + charWidth / 2 - options.pointer.x\n const mdy = cell.row * charHeight + charHeight / 2 - options.pointer.y\n const mDist = Math.sqrt(mdx * mdx + mdy * mdy)\n const radius = 80\n if (mDist < radius) {\n const falloff = 1 - mDist / radius\n const ripple = Math.sin(mDist * 0.08 - time * 4) * 0.12 * falloff * falloff\n intensity = Math.min(1, intensity + falloff * 0.2 + ripple)\n }\n }\n\n const px = cell.col * charWidth + charWidth / 2\n const py = cell.row * charHeight + charHeight / 2\n for (const wave of options.waves ?? []) {\n const wdx = px - wave.cx\n const wdy = py - wave.cy\n const dist = Math.sqrt(wdx * wdx + wdy * wdy)\n const age = time - wave.t\n const waveRadius = age * 200\n const delta = dist - waveRadius\n const fade = Math.exp(-age * 1.5)\n const ring = Math.exp(-delta * delta * 0.002) * fade\n intensity = Math.min(1, intensity + ring * 0.5 * Math.sin(delta * 0.06 + 1.5))\n }\n\n return Math.max(0.5, Math.min(1, intensity))\n}\n\nexport function renderAsciiFrameToContext(\n ctx: AsciiFrameContext,\n layout: AsciiTextLayout,\n options: AsciiRenderOptions,\n) {\n const charWidth = options.charWidth ?? ASCII_CHAR_WIDTH\n const charHeight = options.charHeight ?? ASCII_CHAR_HEIGHT\n const { width, height } = getAsciiCanvasSize(layout, charWidth, charHeight)\n const accentColor = options.accentColor ?? options.color\n\n ctx.clearRect(0, 0, width, height)\n\n for (const cell of layout.cells) {\n const isAccent = options.accentColumns?.has(cell.col) ?? false\n ctx.globalAlpha = getAsciiCellIntensity(cell, options)\n ctx.fillStyle = isAccent ? accentColor : options.color\n ctx.fillRect(cell.col * charWidth, cell.row * charHeight, charWidth, charHeight)\n }\n\n ctx.globalAlpha = 1\n}\n\nfunction getLiveNoise(cell: AsciiCell, time: number): number {\n const nx = cell.col * 0.18 + time * 0.9\n const ny = cell.row * 0.3 + time * 0.55\n return (\n Math.sin(nx) * 0.12 +\n Math.sin(ny * 1.4 + nx * 0.6) * 0.1 +\n Math.sin(nx * 0.4 - ny * 0.8 + time * 1.6) * 0.08 +\n Math.sin((cell.col + cell.row) * 0.15 + time * 0.4) * 0.07\n )\n}\n\nfunction getLoopIntensity(cell: AsciiCell, loop: number): number {\n const flow =\n Math.sin(cell.col * 0.08 + loop) * 0.055 +\n Math.sin(cell.row * 0.22 - loop * 0.75) * 0.04\n const shimmer = (Math.sin(cell.col * 0.16 + cell.row * 0.08 - loop * 2) + 1) / 2\n const highlight = Math.pow(shimmer, 4) * 0.22\n const intensity = 0.68 + flow + highlight\n\n return Math.max(0.55, Math.min(1, intensity))\n}\n","// @generated from dosrebel.flf. Do not edit by hand.\nexport const dosrebelFont: string = \"flf2a$ 11 8 35 -1 15\\nRebel by Valerie Mates (popcorn@cyberspace.org), based on a font by Ron Bliss\\n(who sometimes goes by the name \\\"rebel\\\" because his initials are REB).\\nNOTE: THIS FONT ONLY WORKS IN MS-DOS.\\nMay 27, 1994\\n\\nExplanation of first line:\\nflf2 - \\\"magic number\\\" for file identification\\na - should always be `a', for now\\n$ - the \\\"hardblank\\\" -- prints as a blank, but can't be smushed\\n11 - height of a character\\n8 - height of a character, not including descenders\\n35 - max line length (excluding comment lines) + a fudge factor\\n-1 - default smushmode for this font (like \\\"-m 15\\\" on command line)\\n15 - number of comment lines\\n\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n ███@\\n░░░ @\\n @\\n @\\n @@\\n ██ ██@\\n░██░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ████████████@\\n░░░███░░███░ @\\n ████████████@\\n░░░███░░███░ @\\n ░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n ██████ @\\n ███░░░ @\\n ░░█████ @\\n ░░░░███ @\\n ██████ @\\n ░░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n ███ ███@\\n ░░░ ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ ███ @\\n░░░ ░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███ @\\n ░░██████ @\\n ██████ @\\n░███░░███ @\\n░███ ░░███ @\\n░░█████░███@\\n ░░░░░ ░░░ @\\n @\\n @\\n @@\\n ██@\\n ███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███@\\n ███ @\\n ███ @\\n░███ @\\n░███ @\\n░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███@\\n ░███@\\n ░███@\\n ███ @\\n ██░ @\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n ███ ░███ ███@\\n░░░█████████░ @\\n ░░░█████░ @\\n █████████ @\\n ███░░███░░███@\\n░░░ ░███ ░░░ @\\n ░░░ @\\n @\\n @\\n @@\\n @\\n ███ @\\n ░███ @\\n ███████████@\\n░░░░░███░░░ @\\n ░███ @\\n ░░░ @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n @\\n @\\n @\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n █████ @\\n ███░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░█████░ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ███████ @\\n ███░░░░ @\\n ███ █@\\n░██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ██████░ @\\n ░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████ @\\n░░███ ░░███ @\\n ░███ ░███ █@\\n ░███████████@\\n ░░░░░░░███░█@\\n ░███░ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░░░█@\\n░███ ░ @\\n░█████████ @\\n░░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░░░ @\\n░█████████ @\\n░███░░░░███@\\n░███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░███@\\n░░░ ███ @\\n ███ @\\n ███ @\\n ███ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░███@\\n░░█████████@\\n ░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n ██@\\n ░░ @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░███@\\n░░░ ░███@\\n ███████ @\\n ░███░░░ @\\n ░░░ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░░ @\\n░███ ██████ @\\n░███░███░███@\\n░███░███░███@\\n░███░░░ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ███████████ @\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ @\\n░░███ ███@\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████ @\\n░░███░░░░███ @\\n ░███ ░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███ ███ @\\n ██████████ @\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░░███░░░░░█@\\n ░███ █ ░ @\\n ░██████ @\\n ░███░░█ @\\n ░███ ░ █@\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░░███░░░░░░█@\\n ░███ █ ░ @\\n ░███████ @\\n ░███░░░█ @\\n ░███ ░ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ █████@\\n░░███ ░░███ @\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ ████@\\n░░███ ███░ @\\n ░███ ███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░░███ @\\n █████ ░░████@\\n░░░░░ ░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████ ██████@\\n░░██████ ██████ @\\n ░███░█████░███ @\\n ░███░░███ ░███ @\\n ░███ ░░░ ░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ██████ █████@\\n░░██████ ░░███ @\\n ░███░███ ░███ @\\n ░███░░███░███ @\\n ░███ ░░██████ @\\n ░███ ░░█████ @\\n █████ ░░█████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░███████░ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ██░███@\\n░░███ ░░████ @\\n ░░░██████░██@\\n ░░░░░░ ░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███ @\\n ░███ ░███ @\\n ░██████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n░███ ░░░ @\\n░░█████████ @\\n ░░░░░░░░███@\\n ███ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░███░░░█@\\n░ ░███ ░ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░░█████░ @\\n ░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████ ███ █████@\\n░░███ ░███ ░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n ░░███ █████ ███ @\\n ░░░█████░█████░ @\\n ░░███ ░░███ @\\n ░░░ ░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ███░███ @\\n ███ ░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░░░░███ @\\n░ ███░ @\\n ███ @\\n ███ @\\n ████ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░███░ @\\n░███ @\\n░███ @\\n░███ @\\n░███ @\\n░█████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n █████@\\n░░░███@\\n ░███@\\n ░███@\\n ░███@\\n ░███@\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n ████ @\\n ██░░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n░███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ████████ @\\n░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░░░ @\\n░███ ███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ███████ @\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███████ @\\n░███░░░ @\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███@\\n ░███ ░░░ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ███████@\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████@\\n ░░░░░███@\\n ███ ░███@\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███ █████@\\n ░███░░███ @\\n ░██████░ @\\n ░███░░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████████ @\\n░░███░░███░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n █████░███ █████@\\n░░░░░ ░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███████ @\\n ░███░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @@\\n @\\n @\\n ████████@\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░███████ @\\n ░░░░░███ @\\n ░███ @\\n █████@\\n ░░░░░ @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ @\\n ███░░ @\\n░░█████ @\\n ░░░░███@\\n ██████ @\\n░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n ░░███ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n ░███ ███@\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ███ █████@\\n░░███ ░███░░███ @\\n ░███ ░███ ░███ @\\n ░░███████████ @\\n ░░████░████ @\\n ░░░░ ░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░░░█████░ @\\n ███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░███ @\\n ███ ░███ @\\n ░░██████ @\\n ░░░░░░ @@\\n @\\n @\\n █████████@\\n ░█░░░░███ @\\n ░ ███░ @\\n ███░ █@\\n █████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░ @\\n @\\n @\\n @@\\n @\\n ███ ███@\\n ███░███░ @\\n░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n ███████ @\\n ███░░░███ @\\n ░█████████ @\\n ░███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░█████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ████ ██████ @\\n░░░░ ░░░░░░ @\\n @\\n @\\n @@\\n\"\n\n","import { dosrebelFont } from \"./fonts/dosrebel-data\"\n\nexport { dosrebelFont }\n\nexport const asciiFonts = {\n dosrebel: dosrebelFont,\n} as const\n\nexport type AsciiFontName = keyof typeof asciiFonts\n\nexport function getAsciiFont(name: AsciiFontName): string {\n return asciiFonts[name]\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport path from \"node:path\"\nimport {\n ASCII_CHAR_HEIGHT,\n ASCII_CHAR_WIDTH,\n asciiFonts,\n composeAsciiText,\n getAsciiAccentColumns,\n getAsciiCellIntensity,\n parseFigletFont,\n type AsciiFontName,\n type AsciiTextLayout,\n} from \"./ascii/index\"\n\ninterface RGB {\n r: number\n g: number\n b: number\n}\n\nexport interface GenerateAsciiGifOptions {\n text: string\n accent?: string\n font?: AsciiFontName | string\n outputPath: string\n color?: string\n accentColor?: string\n backgroundColor?: string\n blendColor?: string\n fps?: number\n duration?: number\n scale?: number\n levels?: number\n padding?: number\n transparent?: boolean\n}\n\nexport async function generateAsciiGif(options: GenerateAsciiGifOptions): Promise<void> {\n const fps = options.fps ?? 24\n const duration = options.duration ?? 2.4\n const scale = options.scale ?? 2\n const levels = Math.max(2, Math.min(48, options.levels ?? 32))\n const padding = Math.max(0, Math.round(options.padding ?? 16))\n const fontRaw = resolveFont(options.font ?? \"dosrebel\")\n const font = parseFigletFont(fontRaw)\n const layout = composeAsciiText(font, options.text)\n const bounds = getLayoutBounds(layout)\n const accentColumns = getAsciiAccentColumns(font, options.text, options.accent ?? \"\")\n const palette = createPalette({\n backgroundColor: options.backgroundColor ?? \"#0a0a0a\",\n blendColor: options.blendColor ?? options.backgroundColor ?? \"#0a0a0a\",\n color: options.color ?? \"#e5e5e5\",\n accentColor: options.accentColor ?? options.color ?? \"#38bdf8\",\n levels,\n transparent: options.transparent ?? false,\n })\n const width = Math.ceil(bounds.cols * ASCII_CHAR_WIDTH * scale) + padding * 2\n const height = bounds.rows * ASCII_CHAR_HEIGHT * scale + padding * 2\n const frameCount = Math.max(1, Math.round(fps * duration))\n const delay = Math.max(1, Math.round(100 / fps))\n const frames: Uint8Array[] = []\n\n for (let frame = 0; frame < frameCount; frame++) {\n frames.push(\n renderIndexedAsciiFrame({\n layout,\n accentColumns,\n phase: frame / frameCount,\n width,\n height,\n scale,\n levels,\n bounds,\n padding,\n }),\n )\n }\n\n const bytes = encodeGif({\n width,\n height,\n delay,\n palette: palette.table,\n frames,\n transparent: options.transparent ?? false,\n })\n\n mkdirSync(path.dirname(options.outputPath), { recursive: true })\n writeFileSync(options.outputPath, bytes)\n}\n\ninterface RenderIndexedFrameOptions {\n layout: AsciiTextLayout\n accentColumns: ReadonlySet<number>\n phase: number\n width: number\n height: number\n scale: number\n levels: number\n bounds: LayoutBounds\n padding: number\n}\n\ninterface LayoutBounds {\n minCol: number\n minRow: number\n cols: number\n rows: number\n}\n\nfunction renderIndexedAsciiFrame(options: RenderIndexedFrameOptions): Uint8Array {\n const pixels = new Uint8Array(options.width * options.height)\n const charWidth = Math.round(ASCII_CHAR_WIDTH * options.scale)\n const charHeight = Math.round(ASCII_CHAR_HEIGHT * options.scale)\n\n for (const cell of options.layout.cells) {\n const intensity = getAsciiCellIntensity(cell, { phase: options.phase })\n const level = Math.max(0, Math.min(options.levels - 1, Math.round(intensity * (options.levels - 1))))\n const offset = options.accentColumns.has(cell.col) ? 1 + options.levels : 1\n const colorIndex = offset + level\n const x0 = options.padding + Math.round((cell.col - options.bounds.minCol) * ASCII_CHAR_WIDTH * options.scale)\n const y0 = options.padding + (cell.row - options.bounds.minRow) * charHeight\n const x1 = Math.min(options.width, x0 + charWidth)\n const y1 = Math.min(options.height, y0 + charHeight)\n\n for (let y = y0; y < y1; y++) {\n const row = y * options.width\n for (let x = x0; x < x1; x++) {\n pixels[row + x] = colorIndex\n }\n }\n }\n\n return pixels\n}\n\nfunction getLayoutBounds(layout: AsciiTextLayout): LayoutBounds {\n if (layout.cells.length === 0) {\n return { minCol: 0, minRow: 0, cols: Math.max(1, layout.cols), rows: Math.max(1, layout.rows) }\n }\n\n let minCol = Number.POSITIVE_INFINITY\n let maxCol = Number.NEGATIVE_INFINITY\n let minRow = Number.POSITIVE_INFINITY\n let maxRow = Number.NEGATIVE_INFINITY\n\n for (const cell of layout.cells) {\n minCol = Math.min(minCol, cell.col)\n maxCol = Math.max(maxCol, cell.col)\n minRow = Math.min(minRow, cell.row)\n maxRow = Math.max(maxRow, cell.row)\n }\n\n return {\n minCol,\n minRow,\n cols: maxCol - minCol + 1,\n rows: maxRow - minRow + 1,\n }\n}\n\nfunction resolveFont(font: AsciiFontName | string): string {\n if (font in asciiFonts) return asciiFonts[font as AsciiFontName]\n return readFileSync(font, \"utf-8\")\n}\n\nfunction createPalette(options: {\n backgroundColor: string\n blendColor: string\n color: string\n accentColor: string\n levels: number\n transparent: boolean\n}) {\n const bg = parseColor(options.backgroundColor)\n const blend = parseColor(options.blendColor)\n const base = parseColor(options.color)\n const accent = parseColor(options.accentColor)\n const table: number[] = [bg.r, bg.g, bg.b]\n\n for (let level = 0; level < options.levels; level++) {\n const alpha = level / (options.levels - 1)\n const mixed = mix(blend, base, alpha)\n table.push(mixed.r, mixed.g, mixed.b)\n }\n\n for (let level = 0; level < options.levels; level++) {\n const alpha = level / (options.levels - 1)\n const mixed = mix(blend, accent, alpha)\n table.push(mixed.r, mixed.g, mixed.b)\n }\n\n while (table.length < 256 * 3) table.push(0, 0, 0)\n return { table: Uint8Array.from(table.slice(0, 256 * 3)) }\n}\n\nfunction parseColor(input: string): RGB {\n const color = input.trim()\n const shortHex = /^#([0-9a-f]{3})$/i.exec(color)\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((part) => Number.parseInt(part + part, 16))\n return { r, g, b }\n }\n\n const longHex = /^#([0-9a-f]{6})$/i.exec(color)\n if (longHex) {\n const value = longHex[1]\n return {\n r: Number.parseInt(value.slice(0, 2), 16),\n g: Number.parseInt(value.slice(2, 4), 16),\n b: Number.parseInt(value.slice(4, 6), 16),\n }\n }\n\n const rgb = /^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i.exec(color)\n if (rgb) {\n return {\n r: clampByte(Number.parseInt(rgb[1], 10)),\n g: clampByte(Number.parseInt(rgb[2], 10)),\n b: clampByte(Number.parseInt(rgb[3], 10)),\n }\n }\n\n throw new Error(`Unsupported color \"${input}\". Use #rgb, #rrggbb, or rgb(r,g,b).`)\n}\n\nfunction mix(a: RGB, b: RGB, amount: number): RGB {\n return {\n r: clampByte(a.r + (b.r - a.r) * amount),\n g: clampByte(a.g + (b.g - a.g) * amount),\n b: clampByte(a.b + (b.b - a.b) * amount),\n }\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)))\n}\n\ninterface EncodeGifOptions {\n width: number\n height: number\n delay: number\n palette: Uint8Array\n frames: Uint8Array[]\n transparent: boolean\n}\n\nfunction encodeGif(options: EncodeGifOptions): Uint8Array {\n const bytes: number[] = []\n writeAscii(bytes, \"GIF89a\")\n writeU16(bytes, options.width)\n writeU16(bytes, options.height)\n bytes.push(0xf7, 0, 0)\n pushBytes(bytes, options.palette)\n bytes.push(0x21, 0xff, 0x0b)\n writeAscii(bytes, \"NETSCAPE2.0\")\n bytes.push(0x03, 0x01)\n writeU16(bytes, 0)\n bytes.push(0)\n\n for (const frame of options.frames) {\n bytes.push(0x21, 0xf9, 0x04, options.transparent ? 0x05 : 0x04)\n writeU16(bytes, options.delay)\n bytes.push(0, 0)\n bytes.push(0x2c)\n writeU16(bytes, 0)\n writeU16(bytes, 0)\n writeU16(bytes, options.width)\n writeU16(bytes, options.height)\n bytes.push(0)\n bytes.push(8)\n writeSubBlocks(bytes, lzwEncode(frame, 8))\n }\n\n bytes.push(0x3b)\n return Uint8Array.from(bytes)\n}\n\nfunction lzwEncode(indices: Uint8Array, minCodeSize: number): Uint8Array {\n const clearCode = 1 << minCodeSize\n const endCode = clearCode + 1\n let codeSize = minCodeSize + 1\n const output: number[] = []\n const writeCode = createBitWriter(output)\n\n writeCode(clearCode, codeSize)\n\n let codesSinceClear = 0\n for (const index of indices) {\n if (codesSinceClear >= 240) {\n writeCode(clearCode, codeSize)\n codeSize = minCodeSize + 1\n codesSinceClear = 0\n }\n writeCode(index, codeSize)\n codesSinceClear++\n }\n\n writeCode(endCode, codeSize)\n writeCode(-1, 0)\n\n return Uint8Array.from(output)\n}\n\nfunction createBitWriter(output: number[]) {\n let buffer = 0\n let bitCount = 0\n\n return (code: number, size: number) => {\n if (code < 0) {\n if (bitCount > 0) output.push(buffer & 0xff)\n buffer = 0\n bitCount = 0\n return\n }\n\n buffer |= code << bitCount\n bitCount += size\n\n while (bitCount >= 8) {\n output.push(buffer & 0xff)\n buffer >>= 8\n bitCount -= 8\n }\n }\n}\n\nfunction writeSubBlocks(bytes: number[], data: Uint8Array) {\n for (let offset = 0; offset < data.length; offset += 255) {\n const chunk = data.slice(offset, offset + 255)\n bytes.push(chunk.length)\n pushBytes(bytes, chunk)\n }\n bytes.push(0)\n}\n\nfunction writeAscii(bytes: number[], value: string) {\n for (let i = 0; i < value.length; i++) bytes.push(value.charCodeAt(i))\n}\n\nfunction writeU16(bytes: number[], value: number) {\n bytes.push(value & 0xff, (value >> 8) & 0xff)\n}\n\nfunction pushBytes(bytes: number[], values: Uint8Array) {\n for (const value of values) bytes.push(value)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ascii/compose.ts","../src/ascii/figlet.ts","../src/ascii/render.ts","../src/ascii/fonts/dosrebel-data.ts","../src/ascii/fonts.ts","../src/ascii-gif.ts"],"names":[],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACG7B,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU;AACZ,CAAA;;;AC+BA,eAAsB,iBAAiB,OAAA,EAAiD;AACtF,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,EAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,EAAI,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAC,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAC,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAQ,UAAU,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,gBAAgB,OAAO,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,EAAA,MAAM,gBAAgB,qBAAA,CAAsB,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,CAAQ,UAAU,EAAE,CAAA;AACpF,EAAA,MAAM,UAAU,aAAA,CAAc;AAAA,IAC5B,eAAA,EAAiB,QAAQ,eAAA,IAAmB,SAAA;AAAA,IAC5C,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,eAAA,IAAmB,SAAA;AAAA,IAC7D,KAAA,EAAO,QAAQ,KAAA,IAAS,SAAA;AAAA,IACxB,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,KAAA,IAAS,SAAA;AAAA,IACrD,MAAA;AAAA,IACA,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,GACrC,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,OAAO,gBAAA,GAAmB,KAAK,IAAI,OAAA,GAAU,CAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,GAAO,iBAAA,GAAoB,QAAQ,OAAA,GAAU,CAAA;AACnE,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAC/C,EAAA,MAAM,SAAuB,EAAC;AAE9B,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,UAAA,EAAY,KAAA,EAAA,EAAS;AAC/C,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,uBAAA,CAAwB;AAAA,QACtB,MAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAO,KAAA,GAAQ,UAAA;AAAA,QACf,KAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,SAAA,CAAU;AAAA,IACtB,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAS,OAAA,CAAQ,KAAA;AAAA,IACjB,MAAA;AAAA,IACA,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,GACrC,CAAA;AAED,EAAA,SAAA,CAAU,IAAA,CAAK,QAAQ,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC/D,EAAA,aAAA,CAAc,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzC;AAqBA,SAAS,wBAAwB,OAAA,EAAgD;AAC/E,EAAA,MAAM,SAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,QAAQ,KAAK,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,iBAAA,GAAoB,QAAQ,KAAK,CAAA;AAE/D,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO;AACvC,IAAA,MAAM,YAAY,qBAAA,CAAsB,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AACtE,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAM,SAAA,IAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAE,CAAC,CAAC,CAAA;AACpG,IAAA,MAAM,MAAA,GAAS,QAAQ,aAAA,CAAc,GAAA,CAAI,KAAK,GAAG,CAAA,GAAI,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,CAAA;AAC1E,IAAA,MAAM,aAAa,MAAA,GAAS,KAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,gBAAA,GAAmB,OAAA,CAAQ,KAAK,CAAA;AAC7G,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,GAAA,CAAW,KAAK,GAAA,GAAM,OAAA,CAAQ,OAAO,MAAA,IAAU,UAAA;AAClE,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,KAAK,SAAS,CAAA;AACjD,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,KAAK,UAAU,CAAA;AAEnD,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,KAAA;AACxB,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,QAAA,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,GAAI,UAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAuC;AAC9D,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,KAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,GAAG,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,EAChG;AAEA,EAAA,IAAI,SAAS,MAAA,CAAO,iBAAA;AACpB,EAAA,IAAI,SAAS,MAAA,CAAO,iBAAA;AACpB,EAAA,IAAI,SAAS,MAAA,CAAO,iBAAA;AACpB,EAAA,IAAI,SAAS,MAAA,CAAO,iBAAA;AAEpB,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAClC,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAClC,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAClC,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,SAAS,MAAA,GAAS,CAAA;AAAA,IACxB,IAAA,EAAM,SAAS,MAAA,GAAS;AAAA,GAC1B;AACF;AAEA,SAAS,YAAY,IAAA,EAAsC;AACzD,EAAA,IAAI,IAAA,IAAQ,UAAA,EAAY,OAAO,UAAA,CAAW,IAAqB,CAAA;AAC/D,EAAA,OAAO,YAAA,CAAa,MAAM,OAAO,CAAA;AACnC;AAEA,SAAS,cAAc,OAAA,EAOpB;AACD,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,OAAA,CAAQ,eAAe,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AAC7C,EAAA,MAAM,QAAkB,CAAC,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAEzC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,QAAQ,KAAA,EAAA,EAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,KAAA,IAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AACpC,IAAA,KAAA,CAAM,KAAK,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACtC;AAEA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,QAAQ,KAAA,EAAA,EAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,KAAA,IAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA;AACtC,IAAA,KAAA,CAAM,KAAK,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,KAAA,CAAM,SAAS,GAAA,GAAM,CAAA,QAAS,IAAA,CAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AACjD,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,EAAE;AAC3D;AAEA,SAAS,WAAW,KAAA,EAAoB;AACtC,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAK;AACzB,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAO,SAAS,IAAA,GAAO,IAAA,EAAM,EAAE,CAAC,CAAA;AACtF,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,EACnB;AAEA,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA;AAC9C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,OAAO,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,MACxC,CAAA,EAAG,OAAO,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,MACxC,CAAA,EAAG,OAAO,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE;AAAA,KAC1C;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,+CAAA,CAAgD,IAAA,CAAK,KAAK,CAAA;AACtE,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,UAAU,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MACxC,CAAA,EAAG,UAAU,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MACxC,CAAA,EAAG,UAAU,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,EAAE,CAAC;AAAA,KAC1C;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACnF;AAEA,SAAS,GAAA,CAAI,CAAA,EAAQ,CAAA,EAAQ,MAAA,EAAqB;AAChD,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA,GAAA,CAAK,EAAE,CAAA,GAAI,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IACvC,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA,GAAA,CAAK,EAAE,CAAA,GAAI,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IACvC,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA,GAAA,CAAK,EAAE,CAAA,GAAI,CAAA,CAAE,KAAK,MAAM;AAAA,GACzC;AACF;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AACrD;AAWA,SAAS,UAAU,OAAA,EAAuC;AACxD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,UAAA,CAAW,OAAO,QAAQ,CAAA;AAC1B,EAAA,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,KAAA,EAAO,QAAQ,MAAM,CAAA;AAC9B,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AACrB,EAAA,SAAA,CAAU,KAAA,EAAO,QAAQ,OAAO,CAAA;AAChC,EAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAM,GAAA,EAAM,EAAI,CAAA;AAC3B,EAAA,UAAA,CAAW,OAAO,aAAa,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,CAAK,GAAM,CAAI,CAAA;AACrB,EAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AACjB,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAEZ,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,IAAA,KAAA,CAAM,KAAK,EAAA,EAAM,GAAA,EAAM,GAAM,OAAA,CAAQ,WAAA,GAAc,IAAO,CAAI,CAAA;AAC9D,IAAA,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AACf,IAAA,KAAA,CAAM,KAAK,EAAI,CAAA;AACf,IAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AACjB,IAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AACjB,IAAA,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AAC7B,IAAA,QAAA,CAAS,KAAA,EAAO,QAAQ,MAAM,CAAA;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,cAAA,CAAe,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,EAC3C;AAEA,EAAA,KAAA,CAAM,KAAK,EAAI,CAAA;AACf,EAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAC9B;AAEA,SAAS,SAAA,CAAU,SAAqB,WAAA,EAAiC;AACvE,EAAA,MAAM,YAAY,CAAA,IAAK,WAAA;AACvB,EAAA,MAAM,UAAU,SAAA,GAAY,CAAA;AAC5B,EAAA,IAAI,WAAW,WAAA,GAAc,CAAA;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,SAAA,GAAY,gBAAgB,MAAM,CAAA;AAExC,EAAA,SAAA,CAAU,WAAW,QAAQ,CAAA;AAE7B,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,mBAAmB,GAAA,EAAK;AAC1B,MAAA,SAAA,CAAU,WAAW,QAAQ,CAAA;AAC7B,MAAA,QAAA,GAAW,WAAA,GAAc,CAAA;AACzB,MAAA,eAAA,GAAkB,CAAA;AAAA,IACpB;AACA,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,IAAA,eAAA,EAAA;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,SAAS,QAAQ,CAAA;AAC3B,EAAA,SAAA,CAAU,IAAI,CAAC,CAAA;AAEf,EAAA,OAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AAC/B;AAEA,SAAS,gBAAgB,MAAA,EAAkB;AACzC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,OAAO,CAAC,MAAc,IAAA,KAAiB;AACrC,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,SAAS,GAAI,CAAA;AAC3C,MAAA,MAAA,GAAS,CAAA;AACT,MAAA,QAAA,GAAW,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,IAAA,IAAQ,QAAA;AAClB,IAAA,QAAA,IAAY,IAAA;AAEZ,IAAA,OAAO,YAAY,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,GAAI,CAAA;AACzB,MAAA,MAAA,KAAW,CAAA;AACX,MAAA,QAAA,IAAY,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AACF;AAEA,SAAS,cAAA,CAAe,OAAiB,IAAA,EAAkB;AACzD,EAAA,KAAA,IAAS,SAAS,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,UAAU,GAAA,EAAK;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,SAAS,GAAG,CAAA;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,MAAM,CAAA;AACvB,IAAA,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,EACxB;AACA,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACd;AAEA,SAAS,UAAA,CAAW,OAAiB,KAAA,EAAe;AAClD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AACvE;AAEA,SAAS,QAAA,CAAS,OAAiB,KAAA,EAAe;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,GAAA,EAAO,KAAA,IAAS,IAAK,GAAI,CAAA;AAC9C;AAEA,SAAS,SAAA,CAAU,OAAiB,MAAA,EAAoB;AACtD,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC9C","file":"ascii-gif.js","sourcesContent":["import type { FigletFont } from \"./figlet\"\n\nexport interface AsciiCell {\n ch: \"█\" | \"░\"\n col: number\n row: number\n}\n\nexport interface AsciiTextLayout {\n cells: AsciiCell[]\n cols: number\n rows: number\n}\n\nexport function composeAsciiText(font: FigletFont, text: string): AsciiTextLayout {\n const charBlocks: Array<{ lines: string[]; width: number }> = []\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n charBlocks.push({\n lines: glyph.map((line) => line.padEnd(width)),\n width,\n })\n }\n\n const cols = charBlocks.reduce((sum, block) => sum + block.width, 0)\n const rows = font.height\n const cells: AsciiCell[] = []\n let offsetX = 0\n\n for (const block of charBlocks) {\n for (let row = 0; row < rows; row++) {\n const line = block.lines[row] ?? \"\"\n for (let col = 0; col < line.length; col++) {\n const ch = line[col]\n if (ch === \"█\" || ch === \"░\") {\n cells.push({ ch, col: offsetX + col, row })\n }\n }\n }\n offsetX += block.width\n }\n\n return { cells, cols, rows }\n}\n\nexport function getAsciiAccentColumns(\n font: FigletFont,\n text: string,\n accent: string,\n): Set<number> {\n if (!accent) return new Set<number>()\n\n const columns = new Set<number>()\n const accentRanges: Array<{ start: number; end: number }> = []\n let searchFrom = 0\n while (true) {\n const idx = text.indexOf(accent, searchFrom)\n if (idx === -1) break\n accentRanges.push({ start: idx, end: idx + accent.length })\n searchFrom = idx + 1\n }\n if (accentRanges.length === 0) return columns\n\n let offsetX = 0\n let charIndex = 0\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) { charIndex++; continue }\n\n const width = Math.max(...glyph.map((line) => line.length))\n if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {\n for (let col = 0; col < width; col++) columns.add(offsetX + col)\n }\n offsetX += width\n charIndex++\n }\n\n return columns\n}\n","export interface FigletFont {\n height: number\n baseline: number\n hardblank: string\n chars: Map<number, string[]>\n}\n\nexport function parseFigletFont(raw: string): FigletFont {\n const lines = raw.split(\"\\n\")\n\n if (lines[0]?.charCodeAt(0) === 0xfeff) {\n lines[0] = lines[0].slice(1)\n }\n\n const header = lines[0]\n if (!header?.startsWith(\"flf2a\")) {\n throw new Error(\"Invalid FIGlet font: missing flf2a header\")\n }\n\n const hardblank = header[5] ?? \"$\"\n const parts = header.slice(6).trim().split(/\\s+/)\n const height = Number.parseInt(parts[0] ?? \"\", 10)\n const baseline = Number.parseInt(parts[1] ?? \"\", 10)\n const commentLines = Number.parseInt(parts[4] ?? \"\", 10)\n\n if (!Number.isFinite(height) || height <= 0) {\n throw new Error(\"Invalid FIGlet font: missing character height\")\n }\n\n const dataStart = 1 + (Number.isFinite(commentLines) ? commentLines : 0)\n const chars = new Map<number, string[]>()\n let lineIndex = dataStart\n let ascii = 32\n\n while (lineIndex + height <= lines.length && ascii <= 126) {\n const charLines: string[] = []\n for (let row = 0; row < height; row++) {\n const line = (lines[lineIndex + row] ?? \"\")\n .replace(/@+$/, \"\")\n .replaceAll(hardblank, \" \")\n charLines.push(line)\n }\n\n chars.set(ascii, charLines)\n lineIndex += height\n ascii++\n }\n\n return { height, baseline, hardblank, chars }\n}\n","import type { AsciiCell, AsciiTextLayout } from \"./compose\"\n\nexport const ASCII_CHAR_WIDTH = 7.5\nexport const ASCII_CHAR_HEIGHT = 15\n\nexport interface AsciiWave {\n cx: number\n cy: number\n t: number\n}\n\nexport interface AsciiPointer {\n x: number\n y: number\n active: boolean\n}\n\nexport interface AsciiFrameState {\n time?: number\n phase?: number\n pointer?: AsciiPointer\n waves?: AsciiWave[]\n}\n\nexport interface AsciiRenderOptions extends AsciiFrameState {\n accentColumns?: ReadonlySet<number>\n color: string\n accentColor?: string\n charWidth?: number\n charHeight?: number\n}\n\nexport interface AsciiFrameContext {\n clearRect(x: number, y: number, width: number, height: number): void\n fillRect(x: number, y: number, width: number, height: number): void\n globalAlpha: number\n fillStyle: string\n}\n\nexport function getAsciiCanvasSize(\n layout: AsciiTextLayout,\n charWidth = ASCII_CHAR_WIDTH,\n charHeight = ASCII_CHAR_HEIGHT,\n) {\n return {\n width: Math.ceil(layout.cols * charWidth),\n height: layout.rows * charHeight,\n }\n}\n\nexport function getAsciiCellIntensity(cell: AsciiCell, options: AsciiFrameState): number {\n const time = options.time ?? 0\n const loop = options.phase == null ? null : options.phase * Math.PI * 2\n\n if (cell.ch === \"░\") {\n const drift =\n loop == null\n ? Math.sin(time * 0.3 + cell.col * 0.1) * 0.03\n : Math.sin(loop + cell.col * 0.1) * 0.03\n return 0.15 + drift\n }\n\n if (loop != null) {\n return getLoopIntensity(cell, loop)\n }\n\n const noise = getLiveNoise(cell, time)\n\n const seed = cell.col * 7.13 + cell.row * 13.37\n const flickerPhase = Math.sin(seed) * 1000\n const flickerWave = Math.sin(time * 0.8 + flickerPhase)\n const flicker = flickerWave > 0.97 ? 0.15 : 0\n\n let intensity = 0.7 + noise + flicker\n const charWidth = ASCII_CHAR_WIDTH\n const charHeight = ASCII_CHAR_HEIGHT\n\n if (options.pointer?.active) {\n const mdx = cell.col * charWidth + charWidth / 2 - options.pointer.x\n const mdy = cell.row * charHeight + charHeight / 2 - options.pointer.y\n const mDist = Math.sqrt(mdx * mdx + mdy * mdy)\n const radius = 80\n if (mDist < radius) {\n const falloff = 1 - mDist / radius\n const ripple = Math.sin(mDist * 0.08 - time * 4) * 0.12 * falloff * falloff\n intensity = Math.min(1, intensity + falloff * 0.2 + ripple)\n }\n }\n\n const px = cell.col * charWidth + charWidth / 2\n const py = cell.row * charHeight + charHeight / 2\n for (const wave of options.waves ?? []) {\n const wdx = px - wave.cx\n const wdy = py - wave.cy\n const dist = Math.sqrt(wdx * wdx + wdy * wdy)\n const age = time - wave.t\n const waveRadius = age * 200\n const delta = dist - waveRadius\n const fade = Math.exp(-age * 1.5)\n const ring = Math.exp(-delta * delta * 0.002) * fade\n intensity = Math.min(1, intensity + ring * 0.5 * Math.sin(delta * 0.06 + 1.5))\n }\n\n return Math.max(0.5, Math.min(1, intensity))\n}\n\nexport function renderAsciiFrameToContext(\n ctx: AsciiFrameContext,\n layout: AsciiTextLayout,\n options: AsciiRenderOptions,\n) {\n const charWidth = options.charWidth ?? ASCII_CHAR_WIDTH\n const charHeight = options.charHeight ?? ASCII_CHAR_HEIGHT\n const { width, height } = getAsciiCanvasSize(layout, charWidth, charHeight)\n const accentColor = options.accentColor ?? options.color\n\n ctx.clearRect(0, 0, width, height)\n\n for (const cell of layout.cells) {\n const isAccent = options.accentColumns?.has(cell.col) ?? false\n ctx.globalAlpha = getAsciiCellIntensity(cell, options)\n ctx.fillStyle = isAccent ? accentColor : options.color\n ctx.fillRect(cell.col * charWidth, cell.row * charHeight, charWidth, charHeight)\n }\n\n ctx.globalAlpha = 1\n}\n\nfunction getLiveNoise(cell: AsciiCell, time: number): number {\n const nx = cell.col * 0.18 + time * 0.9\n const ny = cell.row * 0.3 + time * 0.55\n return (\n Math.sin(nx) * 0.12 +\n Math.sin(ny * 1.4 + nx * 0.6) * 0.1 +\n Math.sin(nx * 0.4 - ny * 0.8 + time * 1.6) * 0.08 +\n Math.sin((cell.col + cell.row) * 0.15 + time * 0.4) * 0.07\n )\n}\n\nfunction getLoopIntensity(cell: AsciiCell, loop: number): number {\n const flow =\n Math.sin(cell.col * 0.08 + loop) * 0.055 +\n Math.sin(cell.row * 0.22 - loop * 0.75) * 0.04\n const shimmer = (Math.sin(cell.col * 0.16 + cell.row * 0.08 - loop * 2) + 1) / 2\n const highlight = Math.pow(shimmer, 4) * 0.22\n const intensity = 0.68 + flow + highlight\n\n return Math.max(0.55, Math.min(1, intensity))\n}\n","// @generated from dosrebel.flf. Do not edit by hand.\nexport const dosrebelFont: string = \"flf2a$ 11 8 35 -1 15\\nRebel by Valerie Mates (popcorn@cyberspace.org), based on a font by Ron Bliss\\n(who sometimes goes by the name \\\"rebel\\\" because his initials are REB).\\nNOTE: THIS FONT ONLY WORKS IN MS-DOS.\\nMay 27, 1994\\n\\nExplanation of first line:\\nflf2 - \\\"magic number\\\" for file identification\\na - should always be `a', for now\\n$ - the \\\"hardblank\\\" -- prints as a blank, but can't be smushed\\n11 - height of a character\\n8 - height of a character, not including descenders\\n35 - max line length (excluding comment lines) + a fudge factor\\n-1 - default smushmode for this font (like \\\"-m 15\\\" on command line)\\n15 - number of comment lines\\n\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n ███@\\n░░░ @\\n @\\n @\\n @@\\n ██ ██@\\n░██░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ████████████@\\n░░░███░░███░ @\\n ████████████@\\n░░░███░░███░ @\\n ░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n ██████ @\\n ███░░░ @\\n ░░█████ @\\n ░░░░███ @\\n ██████ @\\n ░░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n ███ ███@\\n ░░░ ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ ███ @\\n░░░ ░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███ @\\n ░░██████ @\\n ██████ @\\n░███░░███ @\\n░███ ░░███ @\\n░░█████░███@\\n ░░░░░ ░░░ @\\n @\\n @\\n @@\\n ██@\\n ███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███@\\n ███ @\\n ███ @\\n░███ @\\n░███ @\\n░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███@\\n ░███@\\n ░███@\\n ███ @\\n ██░ @\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n ███ ░███ ███@\\n░░░█████████░ @\\n ░░░█████░ @\\n █████████ @\\n ███░░███░░███@\\n░░░ ░███ ░░░ @\\n ░░░ @\\n @\\n @\\n @@\\n @\\n ███ @\\n ░███ @\\n ███████████@\\n░░░░░███░░░ @\\n ░███ @\\n ░░░ @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n @\\n @\\n @\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n █████ @\\n ███░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░█████░ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ███████ @\\n ███░░░░ @\\n ███ █@\\n░██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ██████░ @\\n ░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████ @\\n░░███ ░░███ @\\n ░███ ░███ █@\\n ░███████████@\\n ░░░░░░░███░█@\\n ░███░ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░░░█@\\n░███ ░ @\\n░█████████ @\\n░░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░░░ @\\n░█████████ @\\n░███░░░░███@\\n░███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░███@\\n░░░ ███ @\\n ███ @\\n ███ @\\n ███ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░███@\\n░░█████████@\\n ░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n ██@\\n ░░ @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░███@\\n░░░ ░███@\\n ███████ @\\n ░███░░░ @\\n ░░░ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░░ @\\n░███ ██████ @\\n░███░███░███@\\n░███░███░███@\\n░███░░░ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ███████████ @\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ @\\n░░███ ███@\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████ @\\n░░███░░░░███ @\\n ░███ ░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███ ███ @\\n ██████████ @\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░░███░░░░░█@\\n ░███ █ ░ @\\n ░██████ @\\n ░███░░█ @\\n ░███ ░ █@\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░░███░░░░░░█@\\n ░███ █ ░ @\\n ░███████ @\\n ░███░░░█ @\\n ░███ ░ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ █████@\\n░░███ ░░███ @\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ ████@\\n░░███ ███░ @\\n ░███ ███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░░███ @\\n █████ ░░████@\\n░░░░░ ░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████ ██████@\\n░░██████ ██████ @\\n ░███░█████░███ @\\n ░███░░███ ░███ @\\n ░███ ░░░ ░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ██████ █████@\\n░░██████ ░░███ @\\n ░███░███ ░███ @\\n ░███░░███░███ @\\n ░███ ░░██████ @\\n ░███ ░░█████ @\\n █████ ░░█████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░███████░ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ██░███@\\n░░███ ░░████ @\\n ░░░██████░██@\\n ░░░░░░ ░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███ @\\n ░███ ░███ @\\n ░██████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n░███ ░░░ @\\n░░█████████ @\\n ░░░░░░░░███@\\n ███ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░███░░░█@\\n░ ░███ ░ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░░█████░ @\\n ░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████ ███ █████@\\n░░███ ░███ ░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n ░░███ █████ ███ @\\n ░░░█████░█████░ @\\n ░░███ ░░███ @\\n ░░░ ░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ███░███ @\\n ███ ░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░░░░███ @\\n░ ███░ @\\n ███ @\\n ███ @\\n ████ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░███░ @\\n░███ @\\n░███ @\\n░███ @\\n░███ @\\n░█████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n █████@\\n░░░███@\\n ░███@\\n ░███@\\n ░███@\\n ░███@\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n ████ @\\n ██░░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n░███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ████████ @\\n░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░░░ @\\n░███ ███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ███████ @\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███████ @\\n░███░░░ @\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███@\\n ░███ ░░░ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ███████@\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████@\\n ░░░░░███@\\n ███ ░███@\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███ █████@\\n ░███░░███ @\\n ░██████░ @\\n ░███░░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████████ @\\n░░███░░███░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n █████░███ █████@\\n░░░░░ ░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███████ @\\n ░███░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @@\\n @\\n @\\n ████████@\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░███████ @\\n ░░░░░███ @\\n ░███ @\\n █████@\\n ░░░░░ @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ @\\n ███░░ @\\n░░█████ @\\n ░░░░███@\\n ██████ @\\n░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n ░░███ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n ░███ ███@\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ███ █████@\\n░░███ ░███░░███ @\\n ░███ ░███ ░███ @\\n ░░███████████ @\\n ░░████░████ @\\n ░░░░ ░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░░░█████░ @\\n ███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░███ @\\n ███ ░███ @\\n ░░██████ @\\n ░░░░░░ @@\\n @\\n @\\n █████████@\\n ░█░░░░███ @\\n ░ ███░ @\\n ███░ █@\\n █████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░ @\\n @\\n @\\n @@\\n @\\n ███ ███@\\n ███░███░ @\\n░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n ███████ @\\n ███░░░███ @\\n ░█████████ @\\n ░███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░█████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ████ ██████ @\\n░░░░ ░░░░░░ @\\n @\\n @\\n @@\\n\"\n\n","import { dosrebelFont } from \"./fonts/dosrebel-data\"\n\nexport { dosrebelFont }\n\nexport const asciiFonts = {\n dosrebel: dosrebelFont,\n} as const\n\nexport type AsciiFontName = keyof typeof asciiFonts\n\nexport function getAsciiFont(name: AsciiFontName): string {\n return asciiFonts[name]\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport path from \"node:path\"\nimport {\n ASCII_CHAR_HEIGHT,\n ASCII_CHAR_WIDTH,\n asciiFonts,\n composeAsciiText,\n getAsciiAccentColumns,\n getAsciiCellIntensity,\n parseFigletFont,\n type AsciiFontName,\n type AsciiTextLayout,\n} from \"./ascii/index\"\n\ninterface RGB {\n r: number\n g: number\n b: number\n}\n\nexport interface GenerateAsciiGifOptions {\n text: string\n accent?: string\n font?: AsciiFontName | string\n outputPath: string\n color?: string\n accentColor?: string\n backgroundColor?: string\n blendColor?: string\n fps?: number\n duration?: number\n scale?: number\n levels?: number\n padding?: number\n transparent?: boolean\n}\n\nexport async function generateAsciiGif(options: GenerateAsciiGifOptions): Promise<void> {\n const fps = options.fps ?? 24\n const duration = options.duration ?? 2.4\n const scale = options.scale ?? 2\n const levels = Math.max(2, Math.min(48, options.levels ?? 32))\n const padding = Math.max(0, Math.round(options.padding ?? 16))\n const fontRaw = resolveFont(options.font ?? \"dosrebel\")\n const font = parseFigletFont(fontRaw)\n const layout = composeAsciiText(font, options.text)\n const bounds = getLayoutBounds(layout)\n const accentColumns = getAsciiAccentColumns(font, options.text, options.accent ?? \"\")\n const palette = createPalette({\n backgroundColor: options.backgroundColor ?? \"#0a0a0a\",\n blendColor: options.blendColor ?? options.backgroundColor ?? \"#0a0a0a\",\n color: options.color ?? \"#e5e5e5\",\n accentColor: options.accentColor ?? options.color ?? \"#38bdf8\",\n levels,\n transparent: options.transparent ?? false,\n })\n const width = Math.ceil(bounds.cols * ASCII_CHAR_WIDTH * scale) + padding * 2\n const height = bounds.rows * ASCII_CHAR_HEIGHT * scale + padding * 2\n const frameCount = Math.max(1, Math.round(fps * duration))\n const delay = Math.max(1, Math.round(100 / fps))\n const frames: Uint8Array[] = []\n\n for (let frame = 0; frame < frameCount; frame++) {\n frames.push(\n renderIndexedAsciiFrame({\n layout,\n accentColumns,\n phase: frame / frameCount,\n width,\n height,\n scale,\n levels,\n bounds,\n padding,\n }),\n )\n }\n\n const bytes = encodeGif({\n width,\n height,\n delay,\n palette: palette.table,\n frames,\n transparent: options.transparent ?? false,\n })\n\n mkdirSync(path.dirname(options.outputPath), { recursive: true })\n writeFileSync(options.outputPath, bytes)\n}\n\ninterface RenderIndexedFrameOptions {\n layout: AsciiTextLayout\n accentColumns: ReadonlySet<number>\n phase: number\n width: number\n height: number\n scale: number\n levels: number\n bounds: LayoutBounds\n padding: number\n}\n\ninterface LayoutBounds {\n minCol: number\n minRow: number\n cols: number\n rows: number\n}\n\nfunction renderIndexedAsciiFrame(options: RenderIndexedFrameOptions): Uint8Array {\n const pixels = new Uint8Array(options.width * options.height)\n const charWidth = Math.round(ASCII_CHAR_WIDTH * options.scale)\n const charHeight = Math.round(ASCII_CHAR_HEIGHT * options.scale)\n\n for (const cell of options.layout.cells) {\n const intensity = getAsciiCellIntensity(cell, { phase: options.phase })\n const level = Math.max(0, Math.min(options.levels - 1, Math.round(intensity * (options.levels - 1))))\n const offset = options.accentColumns.has(cell.col) ? 1 + options.levels : 1\n const colorIndex = offset + level\n const x0 = options.padding + Math.round((cell.col - options.bounds.minCol) * ASCII_CHAR_WIDTH * options.scale)\n const y0 = options.padding + (cell.row - options.bounds.minRow) * charHeight\n const x1 = Math.min(options.width, x0 + charWidth)\n const y1 = Math.min(options.height, y0 + charHeight)\n\n for (let y = y0; y < y1; y++) {\n const row = y * options.width\n for (let x = x0; x < x1; x++) {\n pixels[row + x] = colorIndex\n }\n }\n }\n\n return pixels\n}\n\nfunction getLayoutBounds(layout: AsciiTextLayout): LayoutBounds {\n if (layout.cells.length === 0) {\n return { minCol: 0, minRow: 0, cols: Math.max(1, layout.cols), rows: Math.max(1, layout.rows) }\n }\n\n let minCol = Number.POSITIVE_INFINITY\n let maxCol = Number.NEGATIVE_INFINITY\n let minRow = Number.POSITIVE_INFINITY\n let maxRow = Number.NEGATIVE_INFINITY\n\n for (const cell of layout.cells) {\n minCol = Math.min(minCol, cell.col)\n maxCol = Math.max(maxCol, cell.col)\n minRow = Math.min(minRow, cell.row)\n maxRow = Math.max(maxRow, cell.row)\n }\n\n return {\n minCol,\n minRow,\n cols: maxCol - minCol + 1,\n rows: maxRow - minRow + 1,\n }\n}\n\nfunction resolveFont(font: AsciiFontName | string): string {\n if (font in asciiFonts) return asciiFonts[font as AsciiFontName]\n return readFileSync(font, \"utf-8\")\n}\n\nfunction createPalette(options: {\n backgroundColor: string\n blendColor: string\n color: string\n accentColor: string\n levels: number\n transparent: boolean\n}) {\n const bg = parseColor(options.backgroundColor)\n const blend = parseColor(options.blendColor)\n const base = parseColor(options.color)\n const accent = parseColor(options.accentColor)\n const table: number[] = [bg.r, bg.g, bg.b]\n\n for (let level = 0; level < options.levels; level++) {\n const alpha = level / (options.levels - 1)\n const mixed = mix(blend, base, alpha)\n table.push(mixed.r, mixed.g, mixed.b)\n }\n\n for (let level = 0; level < options.levels; level++) {\n const alpha = level / (options.levels - 1)\n const mixed = mix(blend, accent, alpha)\n table.push(mixed.r, mixed.g, mixed.b)\n }\n\n while (table.length < 256 * 3) table.push(0, 0, 0)\n return { table: Uint8Array.from(table.slice(0, 256 * 3)) }\n}\n\nfunction parseColor(input: string): RGB {\n const color = input.trim()\n const shortHex = /^#([0-9a-f]{3})$/i.exec(color)\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((part) => Number.parseInt(part + part, 16))\n return { r, g, b }\n }\n\n const longHex = /^#([0-9a-f]{6})$/i.exec(color)\n if (longHex) {\n const value = longHex[1]\n return {\n r: Number.parseInt(value.slice(0, 2), 16),\n g: Number.parseInt(value.slice(2, 4), 16),\n b: Number.parseInt(value.slice(4, 6), 16),\n }\n }\n\n const rgb = /^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i.exec(color)\n if (rgb) {\n return {\n r: clampByte(Number.parseInt(rgb[1], 10)),\n g: clampByte(Number.parseInt(rgb[2], 10)),\n b: clampByte(Number.parseInt(rgb[3], 10)),\n }\n }\n\n throw new Error(`Unsupported color \"${input}\". Use #rgb, #rrggbb, or rgb(r,g,b).`)\n}\n\nfunction mix(a: RGB, b: RGB, amount: number): RGB {\n return {\n r: clampByte(a.r + (b.r - a.r) * amount),\n g: clampByte(a.g + (b.g - a.g) * amount),\n b: clampByte(a.b + (b.b - a.b) * amount),\n }\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)))\n}\n\ninterface EncodeGifOptions {\n width: number\n height: number\n delay: number\n palette: Uint8Array\n frames: Uint8Array[]\n transparent: boolean\n}\n\nfunction encodeGif(options: EncodeGifOptions): Uint8Array {\n const bytes: number[] = []\n writeAscii(bytes, \"GIF89a\")\n writeU16(bytes, options.width)\n writeU16(bytes, options.height)\n bytes.push(0xf7, 0, 0)\n pushBytes(bytes, options.palette)\n bytes.push(0x21, 0xff, 0x0b)\n writeAscii(bytes, \"NETSCAPE2.0\")\n bytes.push(0x03, 0x01)\n writeU16(bytes, 0)\n bytes.push(0)\n\n for (const frame of options.frames) {\n bytes.push(0x21, 0xf9, 0x04, options.transparent ? 0x05 : 0x04)\n writeU16(bytes, options.delay)\n bytes.push(0, 0)\n bytes.push(0x2c)\n writeU16(bytes, 0)\n writeU16(bytes, 0)\n writeU16(bytes, options.width)\n writeU16(bytes, options.height)\n bytes.push(0)\n bytes.push(8)\n writeSubBlocks(bytes, lzwEncode(frame, 8))\n }\n\n bytes.push(0x3b)\n return Uint8Array.from(bytes)\n}\n\nfunction lzwEncode(indices: Uint8Array, minCodeSize: number): Uint8Array {\n const clearCode = 1 << minCodeSize\n const endCode = clearCode + 1\n let codeSize = minCodeSize + 1\n const output: number[] = []\n const writeCode = createBitWriter(output)\n\n writeCode(clearCode, codeSize)\n\n let codesSinceClear = 0\n for (const index of indices) {\n if (codesSinceClear >= 240) {\n writeCode(clearCode, codeSize)\n codeSize = minCodeSize + 1\n codesSinceClear = 0\n }\n writeCode(index, codeSize)\n codesSinceClear++\n }\n\n writeCode(endCode, codeSize)\n writeCode(-1, 0)\n\n return Uint8Array.from(output)\n}\n\nfunction createBitWriter(output: number[]) {\n let buffer = 0\n let bitCount = 0\n\n return (code: number, size: number) => {\n if (code < 0) {\n if (bitCount > 0) output.push(buffer & 0xff)\n buffer = 0\n bitCount = 0\n return\n }\n\n buffer |= code << bitCount\n bitCount += size\n\n while (bitCount >= 8) {\n output.push(buffer & 0xff)\n buffer >>= 8\n bitCount -= 8\n }\n }\n}\n\nfunction writeSubBlocks(bytes: number[], data: Uint8Array) {\n for (let offset = 0; offset < data.length; offset += 255) {\n const chunk = data.slice(offset, offset + 255)\n bytes.push(chunk.length)\n pushBytes(bytes, chunk)\n }\n bytes.push(0)\n}\n\nfunction writeAscii(bytes: number[], value: string) {\n for (let i = 0; i < value.length; i++) bytes.push(value.charCodeAt(i))\n}\n\nfunction writeU16(bytes: number[], value: number) {\n bytes.push(value & 0xff, (value >> 8) & 0xff)\n}\n\nfunction pushBytes(bytes: number[], values: Uint8Array) {\n for (const value of values) bytes.push(value)\n}\n"]}
|
package/dist/cli.js
CHANGED
|
@@ -48,16 +48,30 @@ function composeAsciiText(font, text) {
|
|
|
48
48
|
function getAsciiAccentColumns(font, text, accent) {
|
|
49
49
|
if (!accent) return /* @__PURE__ */ new Set();
|
|
50
50
|
const columns = /* @__PURE__ */ new Set();
|
|
51
|
+
const accentRanges = [];
|
|
52
|
+
let searchFrom = 0;
|
|
53
|
+
while (true) {
|
|
54
|
+
const idx = text.indexOf(accent, searchFrom);
|
|
55
|
+
if (idx === -1) break;
|
|
56
|
+
accentRanges.push({ start: idx, end: idx + accent.length });
|
|
57
|
+
searchFrom = idx + 1;
|
|
58
|
+
}
|
|
59
|
+
if (accentRanges.length === 0) return columns;
|
|
51
60
|
let offsetX = 0;
|
|
61
|
+
let charIndex = 0;
|
|
52
62
|
for (const ch of text) {
|
|
53
63
|
const code = ch.charCodeAt(0);
|
|
54
64
|
const glyph = font.chars.get(code) ?? font.chars.get(32);
|
|
55
|
-
if (!glyph)
|
|
65
|
+
if (!glyph) {
|
|
66
|
+
charIndex++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
56
69
|
const width = Math.max(...glyph.map((line) => line.length));
|
|
57
|
-
if (
|
|
70
|
+
if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {
|
|
58
71
|
for (let col = 0; col < width; col++) columns.add(offsetX + col);
|
|
59
72
|
}
|
|
60
73
|
offsetX += width;
|
|
74
|
+
charIndex++;
|
|
61
75
|
}
|
|
62
76
|
return columns;
|
|
63
77
|
}
|
|
@@ -58,29 +58,59 @@ Start it first, then re-run iso:generate.
|
|
|
58
58
|
for (const component of components) {
|
|
59
59
|
const urlPath = component.urlPath ?? `/docs/components/${component.name}`;
|
|
60
60
|
const url = `${baseUrl}${urlPath}`;
|
|
61
|
+
const captureSelector = component.selector !== void 0 ? component.selector : selector;
|
|
61
62
|
for (const theme of themes) {
|
|
62
63
|
const page = await browser.newPage();
|
|
63
64
|
try {
|
|
65
|
+
await page.emulateMediaFeatures([
|
|
66
|
+
{ name: "prefers-color-scheme", value: theme }
|
|
67
|
+
]);
|
|
68
|
+
await page.evaluateOnNewDocument(
|
|
69
|
+
`((scheme) => {
|
|
70
|
+
const isDark = scheme === 'dark';
|
|
71
|
+
const apply = () => {
|
|
72
|
+
const root = document.documentElement;
|
|
73
|
+
root.classList.toggle('dark', isDark);
|
|
74
|
+
root.style.colorScheme = scheme;
|
|
75
|
+
};
|
|
76
|
+
try { localStorage.setItem('theme', scheme); } catch {}
|
|
77
|
+
apply();
|
|
78
|
+
new MutationObserver(apply).observe(document.documentElement, {
|
|
79
|
+
attributes: true,
|
|
80
|
+
attributeFilter: ['class'],
|
|
81
|
+
});
|
|
82
|
+
})(${JSON.stringify(theme)})`
|
|
83
|
+
);
|
|
64
84
|
await page.setViewport({ width: vw, height: vh });
|
|
65
85
|
await page.goto(url, { waitUntil: "networkidle0" });
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
await page.evaluate(
|
|
87
|
+
`((scheme) => {
|
|
88
|
+
const isDark = scheme === 'dark';
|
|
89
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
90
|
+
document.documentElement.style.colorScheme = scheme;
|
|
91
|
+
try { localStorage.setItem('theme', scheme); } catch {}
|
|
92
|
+
})(${JSON.stringify(theme)})`
|
|
93
|
+
);
|
|
94
|
+
await page.waitForFunction(
|
|
95
|
+
`(scheme) => document.documentElement.classList.contains('dark') === (scheme === 'dark')`,
|
|
96
|
+
{ timeout: 5e3 },
|
|
97
|
+
theme
|
|
98
|
+
);
|
|
99
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
70
100
|
const filename = themes.length > 1 ? `${component.name}-${theme}.png` : `${component.name}.png`;
|
|
71
101
|
const filepath = path.join(outputDir, filename);
|
|
72
|
-
if (
|
|
102
|
+
if (captureSelector === null) {
|
|
73
103
|
await page.screenshot({ path: filepath, clip: { x: 0, y: 0, width: vw, height: vh } });
|
|
74
104
|
manifest.push({ name: component.name, theme, file: filename, width: vw, height: vh });
|
|
75
105
|
} else {
|
|
76
|
-
const el = await page.waitForSelector(
|
|
77
|
-
if (!el) throw new Error(`Selector not found: ${
|
|
106
|
+
const el = await page.waitForSelector(captureSelector, { timeout: 1e4 });
|
|
107
|
+
if (!el) throw new Error(`Selector not found: ${captureSelector}`);
|
|
78
108
|
await page.evaluate(
|
|
79
|
-
`document.querySelector(${JSON.stringify(
|
|
109
|
+
`document.querySelector(${JSON.stringify(captureSelector)}).style.minHeight = '0'`
|
|
80
110
|
);
|
|
81
111
|
await new Promise((r) => setTimeout(r, 100));
|
|
82
112
|
const box = await el.boundingBox();
|
|
83
|
-
if (!box) throw new Error(`Could not get bounding box for: ${
|
|
113
|
+
if (!box) throw new Error(`Could not get bounding box for: ${captureSelector}`);
|
|
84
114
|
if (padding > 0) {
|
|
85
115
|
const clip = {
|
|
86
116
|
x: Math.max(0, box.x - padding),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generate-previews.ts"],"names":[],"mappings":"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","file":"generate-previews.js","sourcesContent":["import puppeteer from 'puppeteer-core';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface PreviewEntry {\n name: string;\n urlPath?: string;\n}\n\nexport interface GeneratePreviewsConfig {\n baseUrl: string;\n outputDir: string;\n components: PreviewEntry[];\n selector?: string | null;\n themes?: ('light' | 'dark')[];\n manifestPath?: string;\n executablePath?: string;\n padding?: number;\n viewport?: { width?: number; height?: number };\n}\n\nexport interface ManifestEntry {\n name: string;\n theme: 'light' | 'dark';\n file: string;\n width: number;\n height: number;\n}\n\nfunction findChromePath(): string {\n const candidates =\n process.platform === 'win32'\n ? [\n 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n 'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n `${process.env.LOCALAPPDATA}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n 'C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe',\n `${process.env.ProgramFiles}\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe`,\n ]\n : process.platform === 'darwin'\n ? [\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',\n ]\n : ['/usr/bin/google-chrome', '/usr/bin/chromium-browser', '/usr/bin/chromium'];\n\n for (const p of candidates) {\n if (p && fs.existsSync(p)) return p;\n }\n throw new Error(\n 'No Chrome/Edge executable found. Pass executablePath in config or install Chrome.',\n );\n}\n\nexport async function generatePreviews(config: GeneratePreviewsConfig): Promise<void> {\n const {\n baseUrl,\n outputDir,\n components,\n selector = '[data-slot=\"component-preview-canvas\"]',\n themes = ['light', 'dark'],\n manifestPath,\n executablePath,\n padding = 0,\n viewport,\n } = config;\n\n const vw = viewport?.width ?? 1280;\n const vh = viewport?.height ?? 800;\n\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error();\n } catch {\n console.error(`\\nDev server not running at ${baseUrl}.\\nStart it first, then re-run iso:generate.\\n`);\n process.exit(1);\n }\n\n const chromePath = executablePath ?? findChromePath();\n console.log(`Using browser: ${chromePath}`);\n\n fs.mkdirSync(outputDir, { recursive: true });\n\n const browser = await puppeteer.launch({\n executablePath: chromePath,\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n\n const manifest: ManifestEntry[] = [];\n\n try {\n for (const component of components) {\n const urlPath = component.urlPath ?? `/docs/components/${component.name}`;\n const url = `${baseUrl}${urlPath}`;\n\n for (const theme of themes) {\n const page = await browser.newPage();\n try {\n await page.setViewport({ width: vw, height: vh });\n await page.goto(url, { waitUntil: 'networkidle0' });\n\n if (theme === 'dark') {\n await page.evaluate(\"document.documentElement.classList.add('dark')\");\n await new Promise((r) => setTimeout(r, 150));\n }\n\n const filename =\n themes.length > 1 ? `${component.name}-${theme}.png` : `${component.name}.png`;\n const filepath = path.join(outputDir, filename);\n\n if (selector === null) {\n await page.screenshot({ path: filepath, clip: { x: 0, y: 0, width: vw, height: vh } });\n manifest.push({ name: component.name, theme, file: filename, width: vw, height: vh });\n } else {\n const el = await page.waitForSelector(selector, { timeout: 10_000 });\n if (!el) throw new Error(`Selector not found: ${selector}`);\n\n await page.evaluate(\n `document.querySelector(${JSON.stringify(selector)}).style.minHeight = '0'`,\n );\n await new Promise((r) => setTimeout(r, 100));\n\n const box = await el.boundingBox();\n if (!box) throw new Error(`Could not get bounding box for: ${selector}`);\n\n if (padding > 0) {\n const clip = {\n x: Math.max(0, box.x - padding),\n y: Math.max(0, box.y - padding),\n width: box.width + padding * 2,\n height: box.height + padding * 2,\n };\n await page.screenshot({ path: filepath, clip });\n manifest.push({\n name: component.name,\n theme,\n file: filename,\n width: Math.round(clip.width),\n height: Math.round(clip.height),\n });\n } else {\n await el.screenshot({ path: filepath });\n manifest.push({\n name: component.name,\n theme,\n file: filename,\n width: Math.round(box.width),\n height: Math.round(box.height),\n });\n }\n }\n\n console.log(`✓ ${filename}`);\n } catch (err) {\n console.error(`✗ ${component.name} (${theme}):`, err);\n } finally {\n await page.close();\n }\n }\n }\n } finally {\n await browser.close();\n }\n\n const resolvedManifestPath = manifestPath ?? path.join(outputDir, 'manifest.json');\n fs.mkdirSync(path.dirname(resolvedManifestPath), { recursive: true });\n fs.writeFileSync(resolvedManifestPath, JSON.stringify(manifest, null, 2));\n\n console.log(`\\nGenerated ${manifest.length} previews → ${outputDir}`);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/generate-previews.ts"],"names":[],"mappings":"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","file":"generate-previews.js","sourcesContent":["import puppeteer from 'puppeteer-core';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface PreviewEntry {\n name: string;\n urlPath?: string;\n /** Override config.selector for this entry (e.g. null for full-page captures). */\n selector?: string | null;\n}\n\nexport interface GeneratePreviewsConfig {\n baseUrl: string;\n outputDir: string;\n components: PreviewEntry[];\n selector?: string | null;\n themes?: ('light' | 'dark')[];\n manifestPath?: string;\n executablePath?: string;\n padding?: number;\n viewport?: { width?: number; height?: number };\n}\n\nexport interface ManifestEntry {\n name: string;\n theme: 'light' | 'dark';\n file: string;\n width: number;\n height: number;\n}\n\nfunction findChromePath(): string {\n const candidates =\n process.platform === 'win32'\n ? [\n 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n 'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n `${process.env.LOCALAPPDATA}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n 'C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe',\n `${process.env.ProgramFiles}\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe`,\n ]\n : process.platform === 'darwin'\n ? [\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',\n ]\n : ['/usr/bin/google-chrome', '/usr/bin/chromium-browser', '/usr/bin/chromium'];\n\n for (const p of candidates) {\n if (p && fs.existsSync(p)) return p;\n }\n throw new Error(\n 'No Chrome/Edge executable found. Pass executablePath in config or install Chrome.',\n );\n}\n\nexport async function generatePreviews(config: GeneratePreviewsConfig): Promise<void> {\n const {\n baseUrl,\n outputDir,\n components,\n selector = '[data-slot=\"component-preview-canvas\"]',\n themes = ['light', 'dark'],\n manifestPath,\n executablePath,\n padding = 0,\n viewport,\n } = config;\n\n const vw = viewport?.width ?? 1280;\n const vh = viewport?.height ?? 800;\n\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error();\n } catch {\n console.error(`\\nDev server not running at ${baseUrl}.\\nStart it first, then re-run iso:generate.\\n`);\n process.exit(1);\n }\n\n const chromePath = executablePath ?? findChromePath();\n console.log(`Using browser: ${chromePath}`);\n\n fs.mkdirSync(outputDir, { recursive: true });\n\n const browser = await puppeteer.launch({\n executablePath: chromePath,\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n\n const manifest: ManifestEntry[] = [];\n\n try {\n for (const component of components) {\n const urlPath = component.urlPath ?? `/docs/components/${component.name}`;\n const url = `${baseUrl}${urlPath}`;\n const captureSelector =\n component.selector !== undefined ? component.selector : selector;\n\n for (const theme of themes) {\n const page = await browser.newPage();\n try {\n // next-themes (Fumadocs RootProvider) defaults to system — match OS unless we override early.\n await page.emulateMediaFeatures([\n { name: 'prefers-color-scheme', value: theme },\n ]);\n\n // Run before page scripts (next-themes / ModeSwitcher) so light captures stay light.\n await page.evaluateOnNewDocument(\n `((scheme) => {\n const isDark = scheme === 'dark';\n const apply = () => {\n const root = document.documentElement;\n root.classList.toggle('dark', isDark);\n root.style.colorScheme = scheme;\n };\n try { localStorage.setItem('theme', scheme); } catch {}\n apply();\n new MutationObserver(apply).observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n })(${JSON.stringify(theme)})`,\n );\n\n await page.setViewport({ width: vw, height: vh });\n await page.goto(url, { waitUntil: 'networkidle0' });\n\n await page.evaluate(\n `((scheme) => {\n const isDark = scheme === 'dark';\n document.documentElement.classList.toggle('dark', isDark);\n document.documentElement.style.colorScheme = scheme;\n try { localStorage.setItem('theme', scheme); } catch {}\n })(${JSON.stringify(theme)})`,\n );\n\n await page.waitForFunction(\n `(scheme) => document.documentElement.classList.contains('dark') === (scheme === 'dark')`,\n { timeout: 5000 },\n theme,\n );\n await new Promise((r) => setTimeout(r, 300));\n\n const filename =\n themes.length > 1 ? `${component.name}-${theme}.png` : `${component.name}.png`;\n const filepath = path.join(outputDir, filename);\n\n if (captureSelector === null) {\n await page.screenshot({ path: filepath, clip: { x: 0, y: 0, width: vw, height: vh } });\n manifest.push({ name: component.name, theme, file: filename, width: vw, height: vh });\n } else {\n const el = await page.waitForSelector(captureSelector, { timeout: 10_000 });\n if (!el) throw new Error(`Selector not found: ${captureSelector}`);\n\n await page.evaluate(\n `document.querySelector(${JSON.stringify(captureSelector)}).style.minHeight = '0'`,\n );\n await new Promise((r) => setTimeout(r, 100));\n\n const box = await el.boundingBox();\n if (!box) throw new Error(`Could not get bounding box for: ${captureSelector}`);\n\n if (padding > 0) {\n const clip = {\n x: Math.max(0, box.x - padding),\n y: Math.max(0, box.y - padding),\n width: box.width + padding * 2,\n height: box.height + padding * 2,\n };\n await page.screenshot({ path: filepath, clip });\n manifest.push({\n name: component.name,\n theme,\n file: filename,\n width: Math.round(clip.width),\n height: Math.round(clip.height),\n });\n } else {\n await el.screenshot({ path: filepath });\n manifest.push({\n name: component.name,\n theme,\n file: filename,\n width: Math.round(box.width),\n height: Math.round(box.height),\n });\n }\n }\n\n console.log(`✓ ${filename}`);\n } catch (err) {\n console.error(`✗ ${component.name} (${theme}):`, err);\n } finally {\n await page.close();\n }\n }\n }\n } finally {\n await browser.close();\n }\n\n const resolvedManifestPath = manifestPath ?? path.join(outputDir, 'manifest.json');\n fs.mkdirSync(path.dirname(resolvedManifestPath), { recursive: true });\n fs.writeFileSync(resolvedManifestPath, JSON.stringify(manifest, null, 2));\n\n console.log(`\\nGenerated ${manifest.length} previews → ${outputDir}`);\n}\n"]}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1296,7 +1296,7 @@ function normalizeSegments(input) {
|
|
|
1296
1296
|
}));
|
|
1297
1297
|
const segments = normalize(input.segments);
|
|
1298
1298
|
const compactSegments = input.compactSegments && input.compactSegments.length > 0 ? normalize(input.compactSegments) : void 0;
|
|
1299
|
-
return { segments, compactSegments };
|
|
1299
|
+
return { segments, compactSegments, rowColors: input.rowColors };
|
|
1300
1300
|
}
|
|
1301
1301
|
const suffix = input.suffix ?? "";
|
|
1302
1302
|
if (!suffix) {
|
|
@@ -1330,6 +1330,14 @@ async function renderSegmentedFiglet(segments) {
|
|
|
1330
1330
|
const widestLine = lines.reduce((max, line) => Math.max(max, visibleLen(line)), 0);
|
|
1331
1331
|
return { lines, boundaryLines, ansiBySegment, widestLine };
|
|
1332
1332
|
}
|
|
1333
|
+
function printRowColoredFiglet(lines, rowColors) {
|
|
1334
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1335
|
+
const hex = rowColors[i % rowColors.length] ?? WHITE_HEX;
|
|
1336
|
+
const ansi = hexToAnsi24(hex) ?? "\x1B[97m";
|
|
1337
|
+
process.stdout.write(`${ansi}${lines[i]}${RESET}
|
|
1338
|
+
`);
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1333
1341
|
function printColoredFiglet(lines, boundaryLines, ansiBySegment) {
|
|
1334
1342
|
for (let i = 0; i < lines.length; i++) {
|
|
1335
1343
|
const full = lines[i] ?? "";
|
|
@@ -1347,16 +1355,21 @@ function printColoredFiglet(lines, boundaryLines, ansiBySegment) {
|
|
|
1347
1355
|
}
|
|
1348
1356
|
}
|
|
1349
1357
|
async function printBanner(input) {
|
|
1350
|
-
const normalized = Array.isArray(input) ? { segments: input, compactSegments: void 0 } : normalizeSegments(input);
|
|
1358
|
+
const normalized = Array.isArray(input) ? { segments: input, compactSegments: void 0, rowColors: void 0 } : normalizeSegments(input);
|
|
1351
1359
|
const segments = normalized.segments;
|
|
1352
1360
|
const compactSegments = normalized.compactSegments;
|
|
1361
|
+
const rowColors = normalized.rowColors;
|
|
1353
1362
|
if (!segments.length) return;
|
|
1354
1363
|
process.stdout.write(`${RESET}
|
|
1355
1364
|
`);
|
|
1356
1365
|
const terminalColumns = process.stdout.columns ?? 0;
|
|
1357
1366
|
const primary = await renderSegmentedFiglet(segments);
|
|
1358
1367
|
if (terminalColumns === 0 || primary.widestLine <= terminalColumns) {
|
|
1359
|
-
|
|
1368
|
+
if (rowColors && rowColors.length > 0) {
|
|
1369
|
+
printRowColoredFiglet(primary.lines, rowColors);
|
|
1370
|
+
} else {
|
|
1371
|
+
printColoredFiglet(primary.lines, primary.boundaryLines, primary.ansiBySegment);
|
|
1372
|
+
}
|
|
1360
1373
|
return;
|
|
1361
1374
|
}
|
|
1362
1375
|
if (compactSegments && compactSegments.length > 0) {
|
|
@@ -1390,7 +1403,7 @@ function createTsupBannerHook(project) {
|
|
|
1390
1403
|
}
|
|
1391
1404
|
function createDevBannerPlugin(project) {
|
|
1392
1405
|
let shown = false;
|
|
1393
|
-
const { segments, compactSegments } = normalizeSegments(project);
|
|
1406
|
+
const { segments, compactSegments, rowColors } = normalizeSegments(project);
|
|
1394
1407
|
const bannerText = segments.map((segment) => segment.text).join("");
|
|
1395
1408
|
return {
|
|
1396
1409
|
name: `olwiba-dev-banner-${bannerText.toLowerCase()}`,
|
|
@@ -1398,7 +1411,7 @@ function createDevBannerPlugin(project) {
|
|
|
1398
1411
|
configureServer(_server) {
|
|
1399
1412
|
if (shown) return;
|
|
1400
1413
|
shown = true;
|
|
1401
|
-
void printBanner({ segments, compactSegments });
|
|
1414
|
+
void printBanner({ segments, compactSegments, rowColors });
|
|
1402
1415
|
}
|
|
1403
1416
|
};
|
|
1404
1417
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ascii/compose.ts","../src/ascii/fonts/dosrebel-data.ts","../src/ascii/fonts.ts","../src/ascii/figlet.ts","../src/dos-rebel-font.ts","../src/dev-banner.ts","../src/project-brand.ts"],"names":["segments","renderDosRebel"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;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","file":"index.js","sourcesContent":["import type { FigletFont } from \"./figlet\"\n\nexport interface AsciiCell {\n ch: \"█\" | \"░\"\n col: number\n row: number\n}\n\nexport interface AsciiTextLayout {\n cells: AsciiCell[]\n cols: number\n rows: number\n}\n\nexport function composeAsciiText(font: FigletFont, text: string): AsciiTextLayout {\n const charBlocks: Array<{ lines: string[]; width: number }> = []\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n charBlocks.push({\n lines: glyph.map((line) => line.padEnd(width)),\n width,\n })\n }\n\n const cols = charBlocks.reduce((sum, block) => sum + block.width, 0)\n const rows = font.height\n const cells: AsciiCell[] = []\n let offsetX = 0\n\n for (const block of charBlocks) {\n for (let row = 0; row < rows; row++) {\n const line = block.lines[row] ?? \"\"\n for (let col = 0; col < line.length; col++) {\n const ch = line[col]\n if (ch === \"█\" || ch === \"░\") {\n cells.push({ ch, col: offsetX + col, row })\n }\n }\n }\n offsetX += block.width\n }\n\n return { cells, cols, rows }\n}\n\nexport function getAsciiAccentColumns(\n font: FigletFont,\n text: string,\n accent: string,\n): Set<number> {\n if (!accent) return new Set<number>()\n\n const columns = new Set<number>()\n let offsetX = 0\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n if (accent.includes(ch)) {\n for (let col = 0; col < width; col++) columns.add(offsetX + col)\n }\n offsetX += width\n }\n\n return columns\n}\n","// @generated from dosrebel.flf. Do not edit by hand.\nexport const dosrebelFont: string = \"flf2a$ 11 8 35 -1 15\\nRebel by Valerie Mates (popcorn@cyberspace.org), based on a font by Ron Bliss\\n(who sometimes goes by the name \\\"rebel\\\" because his initials are REB).\\nNOTE: THIS FONT ONLY WORKS IN MS-DOS.\\nMay 27, 1994\\n\\nExplanation of first line:\\nflf2 - \\\"magic number\\\" for file identification\\na - should always be `a', for now\\n$ - the \\\"hardblank\\\" -- prints as a blank, but can't be smushed\\n11 - height of a character\\n8 - height of a character, not including descenders\\n35 - max line length (excluding comment lines) + a fudge factor\\n-1 - default smushmode for this font (like \\\"-m 15\\\" on command line)\\n15 - number of comment lines\\n\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n ███@\\n░░░ @\\n @\\n @\\n @@\\n ██ ██@\\n░██░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ████████████@\\n░░░███░░███░ @\\n ████████████@\\n░░░███░░███░ @\\n ░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n ██████ @\\n ███░░░ @\\n ░░█████ @\\n ░░░░███ @\\n ██████ @\\n ░░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n ███ ███@\\n ░░░ ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ ███ @\\n░░░ ░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███ @\\n ░░██████ @\\n ██████ @\\n░███░░███ @\\n░███ ░░███ @\\n░░█████░███@\\n ░░░░░ ░░░ @\\n @\\n @\\n @@\\n ██@\\n ███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███@\\n ███ @\\n ███ @\\n░███ @\\n░███ @\\n░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███@\\n ░███@\\n ░███@\\n ███ @\\n ██░ @\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n ███ ░███ ███@\\n░░░█████████░ @\\n ░░░█████░ @\\n █████████ @\\n ███░░███░░███@\\n░░░ ░███ ░░░ @\\n ░░░ @\\n @\\n @\\n @@\\n @\\n ███ @\\n ░███ @\\n ███████████@\\n░░░░░███░░░ @\\n ░███ @\\n ░░░ @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n @\\n @\\n @\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n █████ @\\n ███░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░█████░ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ███████ @\\n ███░░░░ @\\n ███ █@\\n░██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ██████░ @\\n ░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████ @\\n░░███ ░░███ @\\n ░███ ░███ █@\\n ░███████████@\\n ░░░░░░░███░█@\\n ░███░ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░░░█@\\n░███ ░ @\\n░█████████ @\\n░░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░░░ @\\n░█████████ @\\n░███░░░░███@\\n░███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░███@\\n░░░ ███ @\\n ███ @\\n ███ @\\n ███ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░███@\\n░░█████████@\\n ░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n ██@\\n ░░ @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░███@\\n░░░ ░███@\\n ███████ @\\n ░███░░░ @\\n ░░░ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░░ @\\n░███ ██████ @\\n░███░███░███@\\n░███░███░███@\\n░███░░░ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ███████████ @\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ @\\n░░███ ███@\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████ @\\n░░███░░░░███ @\\n ░███ ░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███ ███ @\\n ██████████ @\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░░███░░░░░█@\\n ░███ █ ░ @\\n ░██████ @\\n ░███░░█ @\\n ░███ ░ █@\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░░███░░░░░░█@\\n ░███ █ ░ @\\n ░███████ @\\n ░███░░░█ @\\n ░███ ░ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ █████@\\n░░███ ░░███ @\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ ████@\\n░░███ ███░ @\\n ░███ ███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░░███ @\\n █████ ░░████@\\n░░░░░ ░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████ ██████@\\n░░██████ ██████ @\\n ░███░█████░███ @\\n ░███░░███ ░███ @\\n ░███ ░░░ ░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ██████ █████@\\n░░██████ ░░███ @\\n ░███░███ ░███ @\\n ░███░░███░███ @\\n ░███ ░░██████ @\\n ░███ ░░█████ @\\n █████ ░░█████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░███████░ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ██░███@\\n░░███ ░░████ @\\n ░░░██████░██@\\n ░░░░░░ ░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███ @\\n ░███ ░███ @\\n ░██████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n░███ ░░░ @\\n░░█████████ @\\n ░░░░░░░░███@\\n ███ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░███░░░█@\\n░ ░███ ░ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░░█████░ @\\n ░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████ ███ █████@\\n░░███ ░███ ░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n ░░███ █████ ███ @\\n ░░░█████░█████░ @\\n ░░███ ░░███ @\\n ░░░ ░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ███░███ @\\n ███ ░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░░░░███ @\\n░ ███░ @\\n ███ @\\n ███ @\\n ████ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░███░ @\\n░███ @\\n░███ @\\n░███ @\\n░███ @\\n░█████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n █████@\\n░░░███@\\n ░███@\\n ░███@\\n ░███@\\n ░███@\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n ████ @\\n ██░░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n░███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ████████ @\\n░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░░░ @\\n░███ ███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ███████ @\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███████ @\\n░███░░░ @\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███@\\n ░███ ░░░ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ███████@\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████@\\n ░░░░░███@\\n ███ ░███@\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███ █████@\\n ░███░░███ @\\n ░██████░ @\\n ░███░░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████████ @\\n░░███░░███░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n █████░███ █████@\\n░░░░░ ░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███████ @\\n ░███░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @@\\n @\\n @\\n ████████@\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░███████ @\\n ░░░░░███ @\\n ░███ @\\n █████@\\n ░░░░░ @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ @\\n ███░░ @\\n░░█████ @\\n ░░░░███@\\n ██████ @\\n░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n ░░███ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n ░███ ███@\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ███ █████@\\n░░███ ░███░░███ @\\n ░███ ░███ ░███ @\\n ░░███████████ @\\n ░░████░████ @\\n ░░░░ ░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░░░█████░ @\\n ███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░███ @\\n ███ ░███ @\\n ░░██████ @\\n ░░░░░░ @@\\n @\\n @\\n █████████@\\n ░█░░░░███ @\\n ░ ███░ @\\n ███░ █@\\n █████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░ @\\n @\\n @\\n @@\\n @\\n ███ ███@\\n ███░███░ @\\n░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n ███████ @\\n ███░░░███ @\\n ░█████████ @\\n ░███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░█████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ████ ██████ @\\n░░░░ ░░░░░░ @\\n @\\n @\\n @@\\n\"\n\n","import { dosrebelFont } from \"./fonts/dosrebel-data\"\n\nexport { dosrebelFont }\n\nexport const asciiFonts = {\n dosrebel: dosrebelFont,\n} as const\n\nexport type AsciiFontName = keyof typeof asciiFonts\n\nexport function getAsciiFont(name: AsciiFontName): string {\n return asciiFonts[name]\n}\n","export interface FigletFont {\n height: number\n baseline: number\n hardblank: string\n chars: Map<number, string[]>\n}\n\nexport function parseFigletFont(raw: string): FigletFont {\n const lines = raw.split(\"\\n\")\n\n if (lines[0]?.charCodeAt(0) === 0xfeff) {\n lines[0] = lines[0].slice(1)\n }\n\n const header = lines[0]\n if (!header?.startsWith(\"flf2a\")) {\n throw new Error(\"Invalid FIGlet font: missing flf2a header\")\n }\n\n const hardblank = header[5] ?? \"$\"\n const parts = header.slice(6).trim().split(/\\s+/)\n const height = Number.parseInt(parts[0] ?? \"\", 10)\n const baseline = Number.parseInt(parts[1] ?? \"\", 10)\n const commentLines = Number.parseInt(parts[4] ?? \"\", 10)\n\n if (!Number.isFinite(height) || height <= 0) {\n throw new Error(\"Invalid FIGlet font: missing character height\")\n }\n\n const dataStart = 1 + (Number.isFinite(commentLines) ? commentLines : 0)\n const chars = new Map<number, string[]>()\n let lineIndex = dataStart\n let ascii = 32\n\n while (lineIndex + height <= lines.length && ascii <= 126) {\n const charLines: string[] = []\n for (let row = 0; row < height; row++) {\n const line = (lines[lineIndex + row] ?? \"\")\n .replace(/@+$/, \"\")\n .replaceAll(hardblank, \" \")\n charLines.push(line)\n }\n\n chars.set(ascii, charLines)\n lineIndex += height\n ascii++\n }\n\n return { height, baseline, hardblank, chars }\n}\n","import { composeAsciiText } from \"./ascii/compose\"\nimport { dosrebelFont } from \"./ascii/fonts\"\nimport { parseFigletFont } from \"./ascii/figlet\"\n\nlet renderCache = new Map<string, string[]>()\n\nexport async function renderDosRebel(text: string): Promise<string[]> {\n const cached = renderCache.get(text)\n if (cached) return cached\n\n const font = parseFigletFont(dosrebelFont)\n const layout = composeAsciiText(font, text)\n const output = Array.from({ length: layout.rows }, () => \"\")\n const cellByPosition = new Map(layout.cells.map((cell) => [`${cell.row}:${cell.col}`, cell.ch]))\n\n for (let row = 0; row < layout.rows; row++) {\n let line = \"\"\n for (let col = 0; col < layout.cols; col++) {\n line += cellByPosition.get(`${row}:${col}`) ?? \" \"\n }\n output[row] = line.replace(/\\s+$/g, \"\")\n }\n\n renderCache.set(text, output)\n return output\n}\n","const RESET = \"\\x1b[0m\"\nconst DEFAULT_HEX = \"#22D3EE\"\nconst WHITE_HEX = \"#ffffff\"\n\nexport type BannerSegment = {\n text: string\n colorHex?: string\n}\n\ntype BannerOptions = {\n segments: BannerSegment[]\n compactSegments?: BannerSegment[]\n}\n\ntype LegacyBannerOptions = {\n baseText: string\n suffix?: string\n colorHex?: string\n baseColorHex?: string\n}\n\ntype DevPlugin = {\n name: string\n apply: \"serve\"\n configureServer: (server: unknown) => void\n}\n\nfunction hexToAnsi24(hex: string) {\n const normalized = hex.trim().replace(/^#/, \"\")\n if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return null\n }\n const r = parseInt(normalized.slice(0, 2), 16)\n const g = parseInt(normalized.slice(2, 4), 16)\n const b = parseInt(normalized.slice(4, 6), 16)\n return `\\x1b[38;2;${r};${g};${b}m`\n}\n\nfunction visibleLen(value: string) {\n return value.length\n}\n\nfunction normalizeSegments(\n input: string | BannerOptions | LegacyBannerOptions\n): { segments: BannerSegment[]; compactSegments?: BannerSegment[] } {\n if (typeof input === \"string\") {\n return { segments: [{ text: input, colorHex: WHITE_HEX }] }\n }\n\n if (\"segments\" in input) {\n const normalize = (segments: BannerSegment[]) =>\n segments\n .filter((segment) => segment.text.trim().length > 0)\n .map((segment) => ({\n text: segment.text,\n colorHex: segment.colorHex ?? WHITE_HEX,\n }))\n const segments = normalize(input.segments)\n const compactSegments =\n input.compactSegments && input.compactSegments.length > 0\n ? normalize(input.compactSegments)\n : undefined\n return { segments, compactSegments }\n }\n\n const suffix = input.suffix ?? \"\"\n if (!suffix) {\n return {\n segments: [{ text: input.baseText, colorHex: input.colorHex ?? DEFAULT_HEX }],\n }\n }\n\n return {\n segments: [\n { text: input.baseText, colorHex: input.baseColorHex ?? WHITE_HEX },\n { text: suffix, colorHex: input.colorHex ?? DEFAULT_HEX },\n ],\n }\n}\n\nasync function renderSegmentedFiglet(segments: BannerSegment[]) {\n const { renderDosRebel } = await import(\"./dos-rebel-font\")\n const cumulativeTexts: string[] = []\n let textSoFar = \"\"\n for (const segment of segments) {\n textSoFar += segment.text\n cumulativeTexts.push(textSoFar)\n }\n\n const renderedByBoundary = await Promise.all(\n cumulativeTexts.map((text) => renderDosRebel(text))\n )\n const lines = renderedByBoundary[renderedByBoundary.length - 1] ?? []\n const boundaryLines = renderedByBoundary.slice(0, -1)\n const ansiBySegment = segments.map(\n (segment) => hexToAnsi24(segment.colorHex ?? WHITE_HEX) ?? \"\\x1b[97m\"\n )\n const widestLine = lines.reduce((max, line) => Math.max(max, visibleLen(line)), 0)\n\n return { lines, boundaryLines, ansiBySegment, widestLine }\n}\n\nfunction printColoredFiglet(\n lines: string[],\n boundaryLines: string[][],\n ansiBySegment: string[]\n) {\n for (let i = 0; i < lines.length; i++) {\n const full = lines[i] ?? \"\"\n let cursor = 0\n let out = \"\"\n\n for (let segmentIndex = 0; segmentIndex < ansiBySegment.length; segmentIndex += 1) {\n const boundaryLine =\n segmentIndex < boundaryLines.length ? boundaryLines[segmentIndex]?.[i] ?? \"\" : full\n const end = Math.min(boundaryLine.length, full.length)\n const chunk = full.slice(cursor, end)\n out += `${ansiBySegment[segmentIndex]}${chunk}`\n cursor = end\n }\n\n process.stdout.write(`${out}${RESET}\\n`)\n }\n}\n\nexport async function printBanner(input: string | BannerSegment[] | BannerOptions) {\n const normalized = Array.isArray(input)\n ? { segments: input, compactSegments: undefined }\n : normalizeSegments(input)\n const segments = normalized.segments\n const compactSegments = normalized.compactSegments\n if (!segments.length) return\n\n process.stdout.write(`${RESET}\\n`)\n const terminalColumns = process.stdout.columns ?? 0\n const primary = await renderSegmentedFiglet(segments)\n\n if (terminalColumns === 0 || primary.widestLine <= terminalColumns) {\n printColoredFiglet(primary.lines, primary.boundaryLines, primary.ansiBySegment)\n return\n }\n\n if (compactSegments && compactSegments.length > 0) {\n const compactFiglet = await renderSegmentedFiglet(compactSegments)\n if (compactFiglet.widestLine <= terminalColumns) {\n printColoredFiglet(\n compactFiglet.lines,\n compactFiglet.boundaryLines,\n compactFiglet.ansiBySegment\n )\n return\n }\n }\n\n let plain = \"\"\n for (let i = 0; i < segments.length; i++) {\n const text = segments[i]?.text ?? \"\"\n if (!text) continue\n plain += `${primary.ansiBySegment[i]}${text}`\n }\n process.stdout.write(`${plain}${RESET}\\n`)\n}\n\nexport function createTsupBannerHook(\n project: string | BannerOptions | LegacyBannerOptions\n): () => Promise<void> {\n let shown = false\n const normalized = normalizeSegments(project)\n return async () => {\n if (shown) return\n shown = true\n await printBanner(normalized)\n }\n}\n\nexport function createDevBannerPlugin(\n project: string | BannerOptions | LegacyBannerOptions\n): DevPlugin {\n let shown = false\n const { segments, compactSegments } = normalizeSegments(project)\n const bannerText = segments.map((segment) => segment.text).join(\"\")\n return {\n name: `olwiba-dev-banner-${bannerText.toLowerCase()}`,\n apply: \"serve\",\n configureServer(_server: unknown) {\n if (shown) return\n shown = true\n void printBanner({ segments, compactSegments })\n },\n }\n}\n","import {\n createDevBannerPlugin,\n createTsupBannerHook,\n type BannerSegment,\n} from \"./dev-banner\"\n\nexport type ProjectBrandAccent = {\n hex: string\n lightOklch?: string\n darkOklch?: string\n}\n\nexport type ProjectBannerSegment = {\n text: string\n accent?: boolean\n colorHex?: string\n}\n\nexport type ProjectConfig = {\n id: string\n label: string\n brandAccent: ProjectBrandAccent\n banner: {\n segments: readonly ProjectBannerSegment[]\n compactSegments?: readonly ProjectBannerSegment[]\n }\n}\n\nfunction resolveProjectBannerSegments(\n segments: readonly ProjectBannerSegment[],\n accentHex: string\n): BannerSegment[] {\n return segments.map((segment) => ({\n text: segment.text,\n colorHex: segment.accent ? accentHex : segment.colorHex,\n }))\n}\n\nfunction getProjectBanner(project: ProjectConfig) {\n return {\n segments: resolveProjectBannerSegments(project.banner.segments, project.brandAccent.hex),\n compactSegments: project.banner.compactSegments\n ? resolveProjectBannerSegments(project.banner.compactSegments, project.brandAccent.hex)\n : undefined,\n }\n}\n\nexport function createProjectDevBannerPlugin(project: ProjectConfig) {\n return createDevBannerPlugin(getProjectBanner(project))\n}\n\nexport function createProjectTsupBannerHook(project: ProjectConfig) {\n return createTsupBannerHook(getProjectBanner(project))\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ascii/compose.ts","../src/ascii/fonts/dosrebel-data.ts","../src/ascii/fonts.ts","../src/ascii/figlet.ts","../src/dos-rebel-font.ts","../src/dev-banner.ts","../src/project-brand.ts"],"names":["segments","renderDosRebel"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;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","file":"index.js","sourcesContent":["import type { FigletFont } from \"./figlet\"\n\nexport interface AsciiCell {\n ch: \"█\" | \"░\"\n col: number\n row: number\n}\n\nexport interface AsciiTextLayout {\n cells: AsciiCell[]\n cols: number\n rows: number\n}\n\nexport function composeAsciiText(font: FigletFont, text: string): AsciiTextLayout {\n const charBlocks: Array<{ lines: string[]; width: number }> = []\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) continue\n\n const width = Math.max(...glyph.map((line) => line.length))\n charBlocks.push({\n lines: glyph.map((line) => line.padEnd(width)),\n width,\n })\n }\n\n const cols = charBlocks.reduce((sum, block) => sum + block.width, 0)\n const rows = font.height\n const cells: AsciiCell[] = []\n let offsetX = 0\n\n for (const block of charBlocks) {\n for (let row = 0; row < rows; row++) {\n const line = block.lines[row] ?? \"\"\n for (let col = 0; col < line.length; col++) {\n const ch = line[col]\n if (ch === \"█\" || ch === \"░\") {\n cells.push({ ch, col: offsetX + col, row })\n }\n }\n }\n offsetX += block.width\n }\n\n return { cells, cols, rows }\n}\n\nexport function getAsciiAccentColumns(\n font: FigletFont,\n text: string,\n accent: string,\n): Set<number> {\n if (!accent) return new Set<number>()\n\n const columns = new Set<number>()\n const accentRanges: Array<{ start: number; end: number }> = []\n let searchFrom = 0\n while (true) {\n const idx = text.indexOf(accent, searchFrom)\n if (idx === -1) break\n accentRanges.push({ start: idx, end: idx + accent.length })\n searchFrom = idx + 1\n }\n if (accentRanges.length === 0) return columns\n\n let offsetX = 0\n let charIndex = 0\n\n for (const ch of text) {\n const code = ch.charCodeAt(0)\n const glyph = font.chars.get(code) ?? font.chars.get(32)\n if (!glyph) { charIndex++; continue }\n\n const width = Math.max(...glyph.map((line) => line.length))\n if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {\n for (let col = 0; col < width; col++) columns.add(offsetX + col)\n }\n offsetX += width\n charIndex++\n }\n\n return columns\n}\n","// @generated from dosrebel.flf. Do not edit by hand.\nexport const dosrebelFont: string = \"flf2a$ 11 8 35 -1 15\\nRebel by Valerie Mates (popcorn@cyberspace.org), based on a font by Ron Bliss\\n(who sometimes goes by the name \\\"rebel\\\" because his initials are REB).\\nNOTE: THIS FONT ONLY WORKS IN MS-DOS.\\nMay 27, 1994\\n\\nExplanation of first line:\\nflf2 - \\\"magic number\\\" for file identification\\na - should always be `a', for now\\n$ - the \\\"hardblank\\\" -- prints as a blank, but can't be smushed\\n11 - height of a character\\n8 - height of a character, not including descenders\\n35 - max line length (excluding comment lines) + a fudge factor\\n-1 - default smushmode for this font (like \\\"-m 15\\\" on command line)\\n15 - number of comment lines\\n\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@\\n$$$@@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n ███@\\n░░░ @\\n @\\n @\\n @@\\n ██ ██@\\n░██░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ████████████@\\n░░░███░░███░ @\\n ████████████@\\n░░░███░░███░ @\\n ░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n ██████ @\\n ███░░░ @\\n ░░█████ @\\n ░░░░███ @\\n ██████ @\\n ░░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n ███ ███@\\n ░░░ ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ ███ @\\n░░░ ░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███ @\\n ░░██████ @\\n ██████ @\\n░███░░███ @\\n░███ ░░███ @\\n░░█████░███@\\n ░░░░░ ░░░ @\\n @\\n @\\n @@\\n ██@\\n ███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███@\\n ███ @\\n ███ @\\n░███ @\\n░███ @\\n░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███@\\n ░███@\\n ░███@\\n ███ @\\n ██░ @\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n ███ ░███ ███@\\n░░░█████████░ @\\n ░░░█████░ @\\n █████████ @\\n ███░░███░░███@\\n░░░ ░███ ░░░ @\\n ░░░ @\\n @\\n @\\n @@\\n @\\n ███ @\\n ░███ @\\n ███████████@\\n░░░░░███░░░ @\\n ░███ @\\n ░░░ @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n @\\n @\\n @\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n █████ @\\n ███░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░█████░ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ███████ @\\n ███░░░░ @\\n ███ █@\\n░██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░░░ ░███@\\n ██████░ @\\n ░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████ @\\n░░███ ░░███ @\\n ░███ ░███ █@\\n ░███████████@\\n ░░░░░░░███░█@\\n ░███░ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░░░█@\\n░███ ░ @\\n░█████████ @\\n░░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░░░ @\\n░█████████ @\\n░███░░░░███@\\n░███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░███░░░░███@\\n░░░ ███ @\\n ███ @\\n ███ @\\n ███ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ███░░░░███ @\\n░███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ████████ @\\n ███░░░░███@\\n░███ ░███@\\n░░█████████@\\n ░░░░░░░███@\\n ███ ░███@\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n ██@\\n░░ @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n ██@\\n ░░ @\\n ██@\\n ██ @\\n░░ @\\n @\\n @@\\n ███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @\\n @\\n @@\\n ███ @\\n░░░███ @\\n ░░░███ @\\n ░░░███@\\n ███░ @\\n ███░ @\\n ███░ @\\n░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░███@\\n░░░ ░███@\\n ███████ @\\n ░███░░░ @\\n ░░░ @\\n ███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░░ @\\n░███ ██████ @\\n░███░███░███@\\n░███░███░███@\\n░███░░░ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ███████████ @\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ @\\n░░███ ███@\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████ @\\n░░███░░░░███ @\\n ░███ ░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███ ███ @\\n ██████████ @\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████████@\\n░░███░░░░░█@\\n ░███ █ ░ @\\n ░██████ @\\n ░███░░█ @\\n ░███ ░ █@\\n ██████████@\\n░░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░░███░░░░░░█@\\n ░███ █ ░ @\\n ░███████ @\\n ░███░░░█ @\\n ░███ ░ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ███ ░░░ @\\n░███ @\\n░███ █████@\\n░░███ ░░███ @\\n ░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ ████@\\n░░███ ███░ @\\n ░███ ███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░░███ @\\n █████ ░░████@\\n░░░░░ ░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n ██████ ██████@\\n░░██████ ██████ @\\n ░███░█████░███ @\\n ░███░░███ ░███ @\\n ░███ ░░░ ░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ██████ █████@\\n░░██████ ░░███ @\\n ░███░███ ░███ @\\n ░███░░███░███ @\\n ░███ ░░██████ @\\n ░███ ░░█████ @\\n █████ ░░█████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███████ @\\n ███░░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███ ███ @\\n ░░░███████░ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░░░███ @\\n ███ ░░███@\\n░███ ░███@\\n░███ ██░███@\\n░░███ ░░████ @\\n ░░░██████░██@\\n ░░░░░░ ░░ @\\n @\\n @\\n @@\\n ███████████ @\\n░░███░░░░░███ @\\n ░███ ░███ @\\n ░██████████ @\\n ░███░░░░░███ @\\n ░███ ░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n░███ ░░░ @\\n░░█████████ @\\n ░░░░░░░░███@\\n ███ ░███@\\n░░█████████ @\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░███░░░█@\\n░ ░███ ░ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████ @\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░░█████░ @\\n ░░███ @\\n ░░░ @\\n @\\n @\\n @@\\n █████ ███ █████@\\n░░███ ░███ ░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n ░░███ █████ ███ @\\n ░░░█████░█████░ @\\n ░░███ ░░███ @\\n ░░░ ░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ███░███ @\\n ███ ░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n █████ █████@\\n░░███ ░░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░███ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n ███████████@\\n░█░░░░░░███ @\\n░ ███░ @\\n ███ @\\n ███ @\\n ████ █@\\n ███████████@\\n░░░░░░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n░███░ @\\n░███ @\\n░███ @\\n░███ @\\n░███ @\\n░█████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n █████@\\n░░░███@\\n ░███@\\n ░███@\\n ░███@\\n ░███@\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n ████ @\\n ██░░██@\\n░░ ░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n @\\n @\\n @\\n @\\n █████████@\\n░░░░░░░░░ @\\n @\\n @\\n @@\\n ██ @\\n░███@\\n░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ████████ @\\n░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░░░ @\\n░███ ███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n █████@\\n ░░███ @\\n ███████ @\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███████ @\\n░███░░░ @\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n ██████ @\\n ███░░███@\\n ░███ ░░░ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n █████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ███████@\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████@\\n ░░░░░███@\\n ███ ░███@\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███████ @\\n ░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n ███ @\\n ░░░ @\\n █████@\\n ░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ███ ░███ @\\n░░██████ @\\n ░░░░░░ @@\\n █████ @\\n░░███ @\\n ░███ █████@\\n ░███░░███ @\\n ░██████░ @\\n ░███░░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ████ @\\n░░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n ░███ @\\n █████@\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████████████ @\\n░░███░░███░░███ @\\n ░███ ░███ ░███ @\\n ░███ ░███ ░███ @\\n █████░███ █████@\\n░░░░░ ░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ████ █████@\\n░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ██████ @\\n ███░░███@\\n░███ ░███@\\n░███ ░███@\\n░░██████ @\\n ░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░███@\\n ░███ ░███@\\n ░███████ @\\n ░███░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @@\\n @\\n @\\n ████████@\\n ███░░███ @\\n░███ ░███ @\\n░███ ░███ @\\n░░███████ @\\n ░░░░░███ @\\n ░███ @\\n █████@\\n ░░░░░ @@\\n @\\n @\\n ████████ @\\n░░███░░███@\\n ░███ ░░░ @\\n ░███ @\\n █████ @\\n░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ @\\n ███░░ @\\n░░█████ @\\n ░░░░███@\\n ██████ @\\n░░░░░░ @\\n @\\n @\\n @@\\n █████ @\\n ░░███ @\\n ███████ @\\n░░░███░ @\\n ░███ @\\n ░███ ███@\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░░███ ███ @\\n ░░█████ @\\n ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ███ █████@\\n░░███ ░███░░███ @\\n ░███ ░███ ░███ @\\n ░░███████████ @\\n ░░████░████ @\\n ░░░░ ░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ █████@\\n░░███ ░░███ @\\n ░░░█████░ @\\n ███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n @\\n @\\n █████ ████@\\n░░███ ░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░███ @\\n ███ ░███ @\\n ░░██████ @\\n ░░░░░░ @@\\n @\\n @\\n █████████@\\n ░█░░░░███ @\\n ░ ███░ @\\n ███░ █@\\n █████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n ███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ░░░ @\\n @\\n @\\n @@\\n ███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░███@\\n░░░ @\\n @\\n @\\n @@\\n ███ @\\n░░░██ @\\n ░░██ @\\n ░░███@\\n ██░ @\\n ██ @\\n ███ @\\n░░░ @\\n @\\n @\\n @@\\n @\\n ███ ███@\\n ███░███░ @\\n░░░ ░░░ @\\n @\\n @\\n @\\n @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n ███████ @\\n ███░░░███ @\\n ░█████████ @\\n ░███░░░███ @\\n █████ █████@\\n░░░░░ ░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ██████ @\\n ░░░░░███ @\\n ███████ @\\n ███░░███ @\\n░░████████@\\n ░░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n░░░ ░░░ @\\n ███████ @\\n ███░░░███@\\n░███ ░███@\\n░███ ░███@\\n░░███████ @\\n ░░░░░░░ @\\n @\\n @\\n @@\\n ███ ███ @\\n ░░░ ░░░ @\\n █████ █████@\\n░░███ ░░███ @\\n ░███ ░███ @\\n ░███ ░███ @\\n ░░█████████@\\n ░░░░░░░░░ @\\n @\\n @\\n @@\\n █████████ @\\n ███░░░░░███@\\n ░███ ░███@\\n ░██████████ @\\n ░███░░░░░███@\\n ░███ ░███@\\n ████ ██████ @\\n░░░░ ░░░░░░ @\\n @\\n @\\n @@\\n\"\n\n","import { dosrebelFont } from \"./fonts/dosrebel-data\"\n\nexport { dosrebelFont }\n\nexport const asciiFonts = {\n dosrebel: dosrebelFont,\n} as const\n\nexport type AsciiFontName = keyof typeof asciiFonts\n\nexport function getAsciiFont(name: AsciiFontName): string {\n return asciiFonts[name]\n}\n","export interface FigletFont {\n height: number\n baseline: number\n hardblank: string\n chars: Map<number, string[]>\n}\n\nexport function parseFigletFont(raw: string): FigletFont {\n const lines = raw.split(\"\\n\")\n\n if (lines[0]?.charCodeAt(0) === 0xfeff) {\n lines[0] = lines[0].slice(1)\n }\n\n const header = lines[0]\n if (!header?.startsWith(\"flf2a\")) {\n throw new Error(\"Invalid FIGlet font: missing flf2a header\")\n }\n\n const hardblank = header[5] ?? \"$\"\n const parts = header.slice(6).trim().split(/\\s+/)\n const height = Number.parseInt(parts[0] ?? \"\", 10)\n const baseline = Number.parseInt(parts[1] ?? \"\", 10)\n const commentLines = Number.parseInt(parts[4] ?? \"\", 10)\n\n if (!Number.isFinite(height) || height <= 0) {\n throw new Error(\"Invalid FIGlet font: missing character height\")\n }\n\n const dataStart = 1 + (Number.isFinite(commentLines) ? commentLines : 0)\n const chars = new Map<number, string[]>()\n let lineIndex = dataStart\n let ascii = 32\n\n while (lineIndex + height <= lines.length && ascii <= 126) {\n const charLines: string[] = []\n for (let row = 0; row < height; row++) {\n const line = (lines[lineIndex + row] ?? \"\")\n .replace(/@+$/, \"\")\n .replaceAll(hardblank, \" \")\n charLines.push(line)\n }\n\n chars.set(ascii, charLines)\n lineIndex += height\n ascii++\n }\n\n return { height, baseline, hardblank, chars }\n}\n","import { composeAsciiText } from \"./ascii/compose\"\nimport { dosrebelFont } from \"./ascii/fonts\"\nimport { parseFigletFont } from \"./ascii/figlet\"\n\nlet renderCache = new Map<string, string[]>()\n\nexport async function renderDosRebel(text: string): Promise<string[]> {\n const cached = renderCache.get(text)\n if (cached) return cached\n\n const font = parseFigletFont(dosrebelFont)\n const layout = composeAsciiText(font, text)\n const output = Array.from({ length: layout.rows }, () => \"\")\n const cellByPosition = new Map(layout.cells.map((cell) => [`${cell.row}:${cell.col}`, cell.ch]))\n\n for (let row = 0; row < layout.rows; row++) {\n let line = \"\"\n for (let col = 0; col < layout.cols; col++) {\n line += cellByPosition.get(`${row}:${col}`) ?? \" \"\n }\n output[row] = line.replace(/\\s+$/g, \"\")\n }\n\n renderCache.set(text, output)\n return output\n}\n","const RESET = \"\\x1b[0m\"\nconst DEFAULT_HEX = \"#22D3EE\"\nconst WHITE_HEX = \"#ffffff\"\n\nexport type BannerSegment = {\n text: string\n colorHex?: string\n}\n\ntype BannerOptions = {\n segments: BannerSegment[]\n compactSegments?: BannerSegment[]\n rowColors?: string[]\n}\n\ntype LegacyBannerOptions = {\n baseText: string\n suffix?: string\n colorHex?: string\n baseColorHex?: string\n}\n\ntype DevPlugin = {\n name: string\n apply: \"serve\"\n configureServer: (server: unknown) => void\n}\n\nfunction hexToAnsi24(hex: string) {\n const normalized = hex.trim().replace(/^#/, \"\")\n if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return null\n }\n const r = parseInt(normalized.slice(0, 2), 16)\n const g = parseInt(normalized.slice(2, 4), 16)\n const b = parseInt(normalized.slice(4, 6), 16)\n return `\\x1b[38;2;${r};${g};${b}m`\n}\n\nfunction visibleLen(value: string) {\n return value.length\n}\n\nfunction normalizeSegments(\n input: string | BannerOptions | LegacyBannerOptions\n): { segments: BannerSegment[]; compactSegments?: BannerSegment[]; rowColors?: string[] } {\n if (typeof input === \"string\") {\n return { segments: [{ text: input, colorHex: WHITE_HEX }] }\n }\n\n if (\"segments\" in input) {\n const normalize = (segments: BannerSegment[]) =>\n segments\n .filter((segment) => segment.text.trim().length > 0)\n .map((segment) => ({\n text: segment.text,\n colorHex: segment.colorHex ?? WHITE_HEX,\n }))\n const segments = normalize(input.segments)\n const compactSegments =\n input.compactSegments && input.compactSegments.length > 0\n ? normalize(input.compactSegments)\n : undefined\n return { segments, compactSegments, rowColors: input.rowColors }\n }\n\n const suffix = input.suffix ?? \"\"\n if (!suffix) {\n return {\n segments: [{ text: input.baseText, colorHex: input.colorHex ?? DEFAULT_HEX }],\n }\n }\n\n return {\n segments: [\n { text: input.baseText, colorHex: input.baseColorHex ?? WHITE_HEX },\n { text: suffix, colorHex: input.colorHex ?? DEFAULT_HEX },\n ],\n }\n}\n\nasync function renderSegmentedFiglet(segments: BannerSegment[]) {\n const { renderDosRebel } = await import(\"./dos-rebel-font\")\n const cumulativeTexts: string[] = []\n let textSoFar = \"\"\n for (const segment of segments) {\n textSoFar += segment.text\n cumulativeTexts.push(textSoFar)\n }\n\n const renderedByBoundary = await Promise.all(\n cumulativeTexts.map((text) => renderDosRebel(text))\n )\n const lines = renderedByBoundary[renderedByBoundary.length - 1] ?? []\n const boundaryLines = renderedByBoundary.slice(0, -1)\n const ansiBySegment = segments.map(\n (segment) => hexToAnsi24(segment.colorHex ?? WHITE_HEX) ?? \"\\x1b[97m\"\n )\n const widestLine = lines.reduce((max, line) => Math.max(max, visibleLen(line)), 0)\n\n return { lines, boundaryLines, ansiBySegment, widestLine }\n}\n\nfunction printRowColoredFiglet(lines: string[], rowColors: string[]) {\n for (let i = 0; i < lines.length; i++) {\n const hex = rowColors[i % rowColors.length] ?? WHITE_HEX\n const ansi = hexToAnsi24(hex) ?? \"\\x1b[97m\"\n process.stdout.write(`${ansi}${lines[i]}${RESET}\\n`)\n }\n}\n\nfunction printColoredFiglet(\n lines: string[],\n boundaryLines: string[][],\n ansiBySegment: string[]\n) {\n for (let i = 0; i < lines.length; i++) {\n const full = lines[i] ?? \"\"\n let cursor = 0\n let out = \"\"\n\n for (let segmentIndex = 0; segmentIndex < ansiBySegment.length; segmentIndex += 1) {\n const boundaryLine =\n segmentIndex < boundaryLines.length ? boundaryLines[segmentIndex]?.[i] ?? \"\" : full\n const end = Math.min(boundaryLine.length, full.length)\n const chunk = full.slice(cursor, end)\n out += `${ansiBySegment[segmentIndex]}${chunk}`\n cursor = end\n }\n\n process.stdout.write(`${out}${RESET}\\n`)\n }\n}\n\nexport async function printBanner(input: string | BannerSegment[] | BannerOptions) {\n const normalized = Array.isArray(input)\n ? { segments: input, compactSegments: undefined, rowColors: undefined }\n : normalizeSegments(input)\n const segments = normalized.segments\n const compactSegments = normalized.compactSegments\n const rowColors = normalized.rowColors\n if (!segments.length) return\n\n process.stdout.write(`${RESET}\\n`)\n const terminalColumns = process.stdout.columns ?? 0\n const primary = await renderSegmentedFiglet(segments)\n\n if (terminalColumns === 0 || primary.widestLine <= terminalColumns) {\n if (rowColors && rowColors.length > 0) {\n printRowColoredFiglet(primary.lines, rowColors)\n } else {\n printColoredFiglet(primary.lines, primary.boundaryLines, primary.ansiBySegment)\n }\n return\n }\n\n if (compactSegments && compactSegments.length > 0) {\n const compactFiglet = await renderSegmentedFiglet(compactSegments)\n if (compactFiglet.widestLine <= terminalColumns) {\n printColoredFiglet(\n compactFiglet.lines,\n compactFiglet.boundaryLines,\n compactFiglet.ansiBySegment\n )\n return\n }\n }\n\n let plain = \"\"\n for (let i = 0; i < segments.length; i++) {\n const text = segments[i]?.text ?? \"\"\n if (!text) continue\n plain += `${primary.ansiBySegment[i]}${text}`\n }\n process.stdout.write(`${plain}${RESET}\\n`)\n}\n\nexport function createTsupBannerHook(\n project: string | BannerOptions | LegacyBannerOptions\n): () => Promise<void> {\n let shown = false\n const normalized = normalizeSegments(project)\n return async () => {\n if (shown) return\n shown = true\n await printBanner(normalized)\n }\n}\n\nexport function createDevBannerPlugin(\n project: string | BannerOptions | LegacyBannerOptions\n): DevPlugin {\n let shown = false\n const { segments, compactSegments, rowColors } = normalizeSegments(project)\n const bannerText = segments.map((segment) => segment.text).join(\"\")\n return {\n name: `olwiba-dev-banner-${bannerText.toLowerCase()}`,\n apply: \"serve\",\n configureServer(_server: unknown) {\n if (shown) return\n shown = true\n void printBanner({ segments, compactSegments, rowColors })\n },\n }\n}\n","import {\n createDevBannerPlugin,\n createTsupBannerHook,\n type BannerSegment,\n} from \"./dev-banner\"\n\nexport type ProjectBrandAccent = {\n hex: string\n lightOklch?: string\n darkOklch?: string\n}\n\nexport type ProjectBannerSegment = {\n text: string\n accent?: boolean\n colorHex?: string\n}\n\nexport type ProjectConfig = {\n id: string\n label: string\n brandAccent: ProjectBrandAccent\n banner: {\n segments: readonly ProjectBannerSegment[]\n compactSegments?: readonly ProjectBannerSegment[]\n }\n}\n\nfunction resolveProjectBannerSegments(\n segments: readonly ProjectBannerSegment[],\n accentHex: string\n): BannerSegment[] {\n return segments.map((segment) => ({\n text: segment.text,\n colorHex: segment.accent ? accentHex : segment.colorHex,\n }))\n}\n\nfunction getProjectBanner(project: ProjectConfig) {\n return {\n segments: resolveProjectBannerSegments(project.banner.segments, project.brandAccent.hex),\n compactSegments: project.banner.compactSegments\n ? resolveProjectBannerSegments(project.banner.compactSegments, project.brandAccent.hex)\n : undefined,\n }\n}\n\nexport function createProjectDevBannerPlugin(project: ProjectConfig) {\n return createDevBannerPlugin(getProjectBanner(project))\n}\n\nexport function createProjectTsupBannerHook(project: ProjectConfig) {\n return createTsupBannerHook(getProjectBanner(project))\n}\n"]}
|