@flyingrobots/bijou-tui 1.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -21
- package/dist/animate.d.ts +0 -2
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +17 -26
- package/dist/animate.js.map +1 -1
- package/dist/app-frame-actions.d.ts +37 -0
- package/dist/app-frame-actions.d.ts.map +1 -0
- package/dist/app-frame-actions.js +313 -0
- package/dist/app-frame-actions.js.map +1 -0
- package/dist/app-frame-palette.d.ts +16 -0
- package/dist/app-frame-palette.d.ts.map +1 -0
- package/dist/app-frame-palette.js +158 -0
- package/dist/app-frame-palette.js.map +1 -0
- package/dist/app-frame-render.d.ts +39 -0
- package/dist/app-frame-render.d.ts.map +1 -0
- package/dist/app-frame-render.js +319 -0
- package/dist/app-frame-render.js.map +1 -0
- package/dist/app-frame-types.d.ts +135 -0
- package/dist/app-frame-types.d.ts.map +1 -0
- package/dist/app-frame-types.js +72 -0
- package/dist/app-frame-types.js.map +1 -0
- package/dist/app-frame-utils.d.ts +37 -0
- package/dist/app-frame-utils.d.ts.map +1 -0
- package/dist/app-frame-utils.js +141 -0
- package/dist/app-frame-utils.js.map +1 -0
- package/dist/app-frame.d.ts +13 -8
- package/dist/app-frame.d.ts.map +1 -1
- package/dist/app-frame.js +80 -906
- package/dist/app-frame.js.map +1 -1
- package/dist/canvas.d.ts +37 -25
- package/dist/canvas.d.ts.map +1 -1
- package/dist/canvas.js +116 -30
- package/dist/canvas.js.map +1 -1
- package/dist/commands.js +2 -2
- package/dist/commands.js.map +1 -1
- package/dist/css/install.d.ts +4 -0
- package/dist/css/install.d.ts.map +1 -0
- package/dist/css/install.js +24 -0
- package/dist/css/install.js.map +1 -0
- package/dist/css/parser.d.ts +14 -0
- package/dist/css/parser.d.ts.map +1 -0
- package/dist/css/parser.js +92 -0
- package/dist/css/parser.js.map +1 -0
- package/dist/css/resolver.d.ts +36 -0
- package/dist/css/resolver.d.ts.map +1 -0
- package/dist/css/resolver.js +130 -0
- package/dist/css/resolver.js.map +1 -0
- package/dist/css/text-style.d.ts +17 -0
- package/dist/css/text-style.d.ts.map +1 -0
- package/dist/css/text-style.js +59 -0
- package/dist/css/text-style.js.map +1 -0
- package/dist/css/types.d.ts +27 -0
- package/dist/css/types.d.ts.map +1 -0
- package/dist/css/types.js +5 -0
- package/dist/css/types.js.map +1 -0
- package/dist/driver.d.ts +10 -2
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +25 -2
- package/dist/driver.js.map +1 -1
- package/dist/eventbus.d.ts +42 -3
- package/dist/eventbus.d.ts.map +1 -1
- package/dist/eventbus.js +108 -7
- package/dist/eventbus.js.map +1 -1
- package/dist/focus-area.d.ts +4 -0
- package/dist/focus-area.d.ts.map +1 -1
- package/dist/focus-area.js +11 -1
- package/dist/focus-area.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/layout-v3.d.ts +10 -0
- package/dist/layout-v3.d.ts.map +1 -0
- package/dist/layout-v3.js +35 -0
- package/dist/layout-v3.js.map +1 -0
- package/dist/motion/motion.d.ts +14 -0
- package/dist/motion/motion.d.ts.map +1 -0
- package/dist/motion/motion.js +31 -0
- package/dist/motion/motion.js.map +1 -0
- package/dist/motion/reconciler.d.ts +15 -0
- package/dist/motion/reconciler.d.ts.map +1 -0
- package/dist/motion/reconciler.js +109 -0
- package/dist/motion/reconciler.js.map +1 -0
- package/dist/motion/types.d.ts +52 -0
- package/dist/motion/types.d.ts.map +1 -0
- package/dist/motion/types.js +2 -0
- package/dist/motion/types.js.map +1 -0
- package/dist/pipeline/middleware/css.d.ts +20 -0
- package/dist/pipeline/middleware/css.d.ts.map +1 -0
- package/dist/pipeline/middleware/css.js +41 -0
- package/dist/pipeline/middleware/css.js.map +1 -0
- package/dist/pipeline/middleware/grayscale.d.ts +9 -0
- package/dist/pipeline/middleware/grayscale.d.ts.map +1 -0
- package/dist/pipeline/middleware/grayscale.js +39 -0
- package/dist/pipeline/middleware/grayscale.js.map +1 -0
- package/dist/pipeline/middleware/motion.d.ts +6 -0
- package/dist/pipeline/middleware/motion.d.ts.map +1 -0
- package/dist/pipeline/middleware/motion.js +19 -0
- package/dist/pipeline/middleware/motion.js.map +1 -0
- package/dist/pipeline/middleware/paint.d.ts +6 -0
- package/dist/pipeline/middleware/paint.d.ts.map +1 -0
- package/dist/pipeline/middleware/paint.js +21 -0
- package/dist/pipeline/middleware/paint.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +56 -0
- package/dist/pipeline/pipeline.d.ts.map +1 -0
- package/dist/pipeline/pipeline.js +45 -0
- package/dist/pipeline/pipeline.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +153 -8
- package/dist/runtime.js.map +1 -1
- package/dist/screen.d.ts +12 -1
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +14 -1
- package/dist/screen.js.map +1 -1
- package/dist/subapp/mount.d.ts +67 -0
- package/dist/subapp/mount.d.ts.map +1 -0
- package/dist/subapp/mount.js +60 -0
- package/dist/subapp/mount.js.map +1 -0
- package/dist/transition-shaders.d.ts +101 -3
- package/dist/transition-shaders.d.ts.map +1 -1
- package/dist/transition-shaders.js +281 -6
- package/dist/transition-shaders.js.map +1 -1
- package/dist/types.d.ts +45 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -1
- package/dist/view-output.d.ts +15 -0
- package/dist/view-output.d.ts.map +1 -0
- package/dist/view-output.js +53 -0
- package/dist/view-output.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,9 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Transition shader system — composable pure functions for page transitions.
|
|
3
3
|
*
|
|
4
|
-
* Each shader receives cell metadata (position, dimensions, progress, random
|
|
5
|
-
* and returns whether to show the next page or optionally
|
|
4
|
+
* Each shader receives cell metadata (position, dimensions, progress, random,
|
|
5
|
+
* frame counter) and returns whether to show the next page or optionally
|
|
6
|
+
* override the character.
|
|
7
|
+
*
|
|
8
|
+
* ## Shader types
|
|
9
|
+
*
|
|
10
|
+
* - **Instances** (`wipeShader`, `dissolveShader`, …) — zero-config, ready to use.
|
|
11
|
+
* - **Factories** (`wipe()`, `radial()`, `blinds()`, …) — parameterized, return a shader.
|
|
12
|
+
* - **Combinators** (`reverse()`, `chain()`, `overlay()`) — transform or compose shaders.
|
|
6
13
|
*/
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Pseudo-random helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/** Hash-based pseudo-random that incorporates spatial + temporal seeds. */
|
|
18
|
+
function noise(x, y, seed) {
|
|
19
|
+
// Constant offset (7.31) breaks the degenerate fixed point at (0, 0, 0).
|
|
20
|
+
const v = Math.sin(x * 12.9898 + y * 78.233 + seed * 43.7585 + 7.31) * 43758.5453;
|
|
21
|
+
return v - Math.floor(v);
|
|
22
|
+
}
|
|
23
|
+
/** Compute normalized coordinates, aspect-corrected deltas, and distance metrics. */
|
|
24
|
+
function computeOriginMetrics(x, y, width, height, originX, originY) {
|
|
25
|
+
const nx = x / width;
|
|
26
|
+
const ny = y / height;
|
|
27
|
+
const aspect = width / Math.max(1, height) * 0.5; // chars are ~2:1 tall
|
|
28
|
+
const dx = (nx - originX) * aspect;
|
|
29
|
+
const dy = ny - originY;
|
|
30
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
31
|
+
const maxDist = Math.sqrt(Math.max(originX, 1 - originX) ** 2 * aspect * aspect
|
|
32
|
+
+ Math.max(originY, 1 - originY) ** 2);
|
|
33
|
+
const normDist = maxDist > 0 ? dist / maxDist : 0;
|
|
34
|
+
return { nx, ny, aspect, dx, dy, dist, maxDist, normDist };
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Original shaders (backward-compatible instances)
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
7
39
|
/** Left-to-right wipe. */
|
|
8
40
|
export const wipeShader = ({ x, width, progress }) => ({
|
|
9
41
|
showNext: x / width < progress,
|
|
@@ -37,8 +69,8 @@ export const matrixShader = ({ rand, progress, ctx }) => {
|
|
|
37
69
|
}
|
|
38
70
|
if (rand < threshold + edge) {
|
|
39
71
|
const chars = '01$#@%&*';
|
|
40
|
-
const char = chars[Math.floor(rand * 100) % chars.length];
|
|
41
|
-
return { showNext: false, char: ctx.style.styled(ctx.status('success'), char) };
|
|
72
|
+
const char = chars[Math.min(Math.floor(rand * 100) % chars.length, chars.length - 1)];
|
|
73
|
+
return { showNext: false, char: ctx.style.styled(ctx.status('success'), char), charRole: 'decoration' };
|
|
42
74
|
}
|
|
43
75
|
return { showNext: false };
|
|
44
76
|
};
|
|
@@ -47,11 +79,245 @@ export const scrambleShader = ({ rand, progress, ctx }) => {
|
|
|
47
79
|
const scrambleAmount = 1 - Math.abs(progress - 0.5) * 2;
|
|
48
80
|
if (rand < scrambleAmount * 0.8) {
|
|
49
81
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()';
|
|
50
|
-
const char = chars[Math.floor(rand * 1000) % chars.length];
|
|
51
|
-
return { showNext: false, char: ctx.style.styled(ctx.semantic('muted'), char) };
|
|
82
|
+
const char = chars[Math.min(Math.floor(rand * 1000) % chars.length, chars.length - 1)];
|
|
83
|
+
return { showNext: false, char: ctx.style.styled(ctx.semantic('muted'), char), charRole: 'decoration' };
|
|
52
84
|
}
|
|
53
85
|
return { showNext: progress > 0.5 };
|
|
54
86
|
};
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Shader factories
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
/** Directional wipe factory. Default: left-to-right. */
|
|
91
|
+
export function wipe(direction = 'right') {
|
|
92
|
+
return ({ x, y, width, height, progress }) => {
|
|
93
|
+
const t = direction === 'right' ? x / width
|
|
94
|
+
: direction === 'left' ? 1 - x / width
|
|
95
|
+
: direction === 'down' ? y / height
|
|
96
|
+
: 1 - y / height;
|
|
97
|
+
return { showNext: t < progress };
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Circle expanding from an origin point. Default: center. */
|
|
101
|
+
export function radial(originX = 0.5, originY = 0.5) {
|
|
102
|
+
return ({ x, y, width, height, progress }) => {
|
|
103
|
+
const m = computeOriginMetrics(x, y, width, height, originX, originY);
|
|
104
|
+
return { showNext: progress >= 1 || m.normDist < progress };
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Diamond/rhombus shape expanding from center. */
|
|
108
|
+
export function diamond(originX = 0.5, originY = 0.5) {
|
|
109
|
+
return ({ x, y, width, height, progress }) => {
|
|
110
|
+
const m = computeOriginMetrics(x, y, width, height, originX, originY);
|
|
111
|
+
// Manhattan distance uses absolute deltas
|
|
112
|
+
const dist = Math.abs(m.dx) + Math.abs(m.dy);
|
|
113
|
+
const maxDist = Math.max(originX, 1 - originX) * m.aspect
|
|
114
|
+
+ Math.max(originY, 1 - originY);
|
|
115
|
+
const normDist = maxDist > 0 ? dist / maxDist : 0;
|
|
116
|
+
return { showNext: progress >= 1 || normDist < progress };
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Angular sweep that spirals outward from center. */
|
|
120
|
+
export function spiral(turns = 3, originX = 0.5, originY = 0.5) {
|
|
121
|
+
return ({ x, y, width, height, progress }) => {
|
|
122
|
+
const m = computeOriginMetrics(x, y, width, height, originX, originY);
|
|
123
|
+
const angle = (Math.atan2(m.dy, m.dx) / (2 * Math.PI) + 0.5) % 1; // [0, 1]
|
|
124
|
+
// Combine angle + distance into a spiral threshold
|
|
125
|
+
const spiralT = (angle + m.normDist * turns) % 1;
|
|
126
|
+
return { showNext: spiralT < progress };
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** Venetian blinds (horizontal or vertical bands). */
|
|
130
|
+
export function blinds(count = 8, direction = 'horizontal') {
|
|
131
|
+
return ({ x, y, width, height, progress }) => {
|
|
132
|
+
const pos = direction === 'horizontal' ? y / height : x / width;
|
|
133
|
+
const band = (pos * count) % 1;
|
|
134
|
+
return { showNext: band < progress };
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** Two halves sliding apart from center (vertical split). */
|
|
138
|
+
export function curtain(direction = 'vertical') {
|
|
139
|
+
return ({ x, y, width, height, progress }) => {
|
|
140
|
+
const pos = direction === 'vertical' ? x / width : y / height;
|
|
141
|
+
const distFromCenter = Math.abs(pos - 0.5) * 2; // 0 at center, 1 at edges
|
|
142
|
+
return { showNext: progress >= 1 || distFromCenter < progress };
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/** Progressively shrinking block pixelation that resolves to the next page. */
|
|
146
|
+
export function pixelate(maxBlockSize = 16) {
|
|
147
|
+
return ({ x, y, progress, rand }) => {
|
|
148
|
+
// Phase 1 (0–0.5): pixelate the previous page with growing blocks
|
|
149
|
+
// Phase 2 (0.5–1): de-pixelate to reveal next page with shrinking blocks
|
|
150
|
+
const showNext = progress > 0.5;
|
|
151
|
+
const phase = showNext ? 1 - (progress - 0.5) * 2 : progress * 2;
|
|
152
|
+
const blockSize = Math.max(1, Math.round(phase * maxBlockSize));
|
|
153
|
+
const bx = Math.floor(x / blockSize);
|
|
154
|
+
const by = Math.floor(y / blockSize);
|
|
155
|
+
// Stable random per block
|
|
156
|
+
const blockRand = noise(bx, by, 0);
|
|
157
|
+
// Within each block, either all show or all hide (pixelation effect)
|
|
158
|
+
if (blockSize <= 1)
|
|
159
|
+
return { showNext };
|
|
160
|
+
const scramble = phase > 0.3 && blockRand < phase * 0.6;
|
|
161
|
+
if (scramble) {
|
|
162
|
+
const chars = '░▒▓█';
|
|
163
|
+
const char = chars[Math.min(Math.floor(rand * chars.length), chars.length - 1)];
|
|
164
|
+
return { showNext: false, char, charRole: 'decoration' };
|
|
165
|
+
}
|
|
166
|
+
return { showNext };
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Left-to-right, top-to-bottom typewriter reveal.
|
|
171
|
+
* Shows a cursor character at the leading edge.
|
|
172
|
+
*/
|
|
173
|
+
export function typewriter(cursor = '▌') {
|
|
174
|
+
return ({ x, y, width, height, progress, ctx }) => {
|
|
175
|
+
const totalCells = width * height;
|
|
176
|
+
const revealed = Math.floor(progress * totalCells);
|
|
177
|
+
const cellIndex = y * width + x;
|
|
178
|
+
if (cellIndex < revealed)
|
|
179
|
+
return { showNext: true };
|
|
180
|
+
if (cellIndex === revealed) {
|
|
181
|
+
return { showNext: false, char: ctx.style.styled(ctx.status('info'), cursor), charRole: 'marker' };
|
|
182
|
+
}
|
|
183
|
+
return { showNext: false };
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Horizontal glitch displacement with RGB-split-style character noise.
|
|
188
|
+
* Uses the frame counter for temporal variation.
|
|
189
|
+
*/
|
|
190
|
+
export function glitch(intensity = 0.5) {
|
|
191
|
+
return ({ x, y, progress, frame, ctx }) => {
|
|
192
|
+
// Glitch peaks at midpoint, ramps up then down
|
|
193
|
+
const glitchAmount = (1 - Math.abs(progress - 0.5) * 2) * intensity;
|
|
194
|
+
const rowNoise = noise(0, y, frame * 0.3);
|
|
195
|
+
// Selected rows show block-char corruption across all their cells
|
|
196
|
+
if (rowNoise < glitchAmount * 0.6) {
|
|
197
|
+
const glitchChars = '▓░▒█▄▀';
|
|
198
|
+
const n = noise(x, y, frame);
|
|
199
|
+
const char = glitchChars[Math.min(Math.floor(n * glitchChars.length), glitchChars.length - 1)];
|
|
200
|
+
return { showNext: false, char: ctx.style.styled(ctx.status('error'), char), charRole: 'decoration' };
|
|
201
|
+
}
|
|
202
|
+
// Scattered cells get individual scramble
|
|
203
|
+
const cellNoise = noise(x, y, frame * 0.5);
|
|
204
|
+
if (cellNoise < glitchAmount * 0.3) {
|
|
205
|
+
const glitchChars = '▓░▒█▄▀╪╫╬';
|
|
206
|
+
const char = glitchChars[Math.min(Math.floor(cellNoise * 100) % glitchChars.length, glitchChars.length - 1)];
|
|
207
|
+
return { showNext: false, char: ctx.style.styled(ctx.status('warning'), char), charRole: 'decoration' };
|
|
208
|
+
}
|
|
209
|
+
return { showNext: progress > 0.5 };
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* TV static noise that clears to reveal the next page.
|
|
214
|
+
* Uses the frame counter for flickering.
|
|
215
|
+
*/
|
|
216
|
+
export function tvStatic(density = 0.7) {
|
|
217
|
+
return ({ x, y, progress, frame, ctx }) => {
|
|
218
|
+
// Static covers the screen then clears to reveal next page
|
|
219
|
+
// Phase 1 (0–0.3): static fades in over previous page
|
|
220
|
+
// Phase 2 (0.3–0.7): full static
|
|
221
|
+
// Phase 3 (0.7–1): static clears to reveal next page
|
|
222
|
+
const staticAmount = progress < 0.3
|
|
223
|
+
? progress / 0.3
|
|
224
|
+
: progress > 0.7
|
|
225
|
+
? (1 - progress) / 0.3
|
|
226
|
+
: 1;
|
|
227
|
+
const cellNoise = noise(x, y, frame);
|
|
228
|
+
if (cellNoise < staticAmount * density) {
|
|
229
|
+
const intensity = noise(x + 1, y + 1, frame);
|
|
230
|
+
const chars = ' ░▒▓█';
|
|
231
|
+
const char = chars[Math.min(Math.floor(intensity * chars.length), chars.length - 1)];
|
|
232
|
+
return { showNext: false, char: ctx.style.styled(ctx.semantic('muted'), char), charRole: 'decoration' };
|
|
233
|
+
}
|
|
234
|
+
return { showNext: progress > 0.5 };
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Default instances for the new shaders (zero-config)
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
/** Circle expanding from center. */
|
|
241
|
+
export const radialShader = radial();
|
|
242
|
+
/** Diamond expanding from center. */
|
|
243
|
+
export const diamondShader = diamond();
|
|
244
|
+
/** Spiral sweep from center. */
|
|
245
|
+
export const spiralShader = spiral();
|
|
246
|
+
/** 8-band horizontal blinds. */
|
|
247
|
+
export const blindsShader = blinds();
|
|
248
|
+
/** Vertical curtain split from center. */
|
|
249
|
+
export const curtainShader = curtain();
|
|
250
|
+
/** Block pixelation with 16px max block size. */
|
|
251
|
+
export const pixelateShader = pixelate();
|
|
252
|
+
/** Typewriter reveal with ▌ cursor. */
|
|
253
|
+
export const typewriterShader = typewriter();
|
|
254
|
+
/** Horizontal glitch at 50% intensity. */
|
|
255
|
+
export const glitchShader = glitch();
|
|
256
|
+
/** TV static noise at 70% density. */
|
|
257
|
+
export const staticShader = tvStatic();
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Combinators
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
/**
|
|
262
|
+
* Reverse a shader's spatial reveal order.
|
|
263
|
+
*
|
|
264
|
+
* Cells that would be revealed last are revealed first, and vice versa.
|
|
265
|
+
* At progress=0 nothing is revealed; at progress=1 everything is revealed.
|
|
266
|
+
*/
|
|
267
|
+
export function reverse(shader) {
|
|
268
|
+
return (cell) => {
|
|
269
|
+
const result = shader({ ...cell, progress: 1 - cell.progress });
|
|
270
|
+
// Marker chars (e.g., typewriter cursor) are positional — they become
|
|
271
|
+
// stale when progress is remapped. Decoration chars (glitch noise,
|
|
272
|
+
// static blocks) are ambient and survive the reversal.
|
|
273
|
+
const keepChar = result.char !== undefined && result.charRole !== 'marker';
|
|
274
|
+
return keepChar
|
|
275
|
+
? { showNext: !result.showNext, char: result.char, charRole: result.charRole }
|
|
276
|
+
: { showNext: !result.showNext };
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Chain two shaders sequentially: `a` runs during progress [0, 0.5],
|
|
281
|
+
* `b` runs during (0.5, 1]. Each sub-shader receives a normalized 0→1
|
|
282
|
+
* progress for its half.
|
|
283
|
+
*
|
|
284
|
+
* **Note:** There is a hard cut at the midpoint — shader `a` completes
|
|
285
|
+
* (all cells revealed) then shader `b` starts from scratch (no cells
|
|
286
|
+
* revealed). This is intentional for effects like "dissolve out → wipe in"
|
|
287
|
+
* but will flash if both shaders reveal in the same direction.
|
|
288
|
+
*/
|
|
289
|
+
export function chain(a, b) {
|
|
290
|
+
return (cell) => {
|
|
291
|
+
if (cell.progress <= 0.5) {
|
|
292
|
+
return a({ ...cell, progress: cell.progress * 2 });
|
|
293
|
+
}
|
|
294
|
+
return b({ ...cell, progress: (cell.progress - 0.5) * 2 });
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Overlay two shaders: `top` shader's char override wins when present,
|
|
299
|
+
* otherwise falls through to `base` shader's result.
|
|
300
|
+
*
|
|
301
|
+
* `showNext` uses OR semantics — the composite reveals a cell if *either*
|
|
302
|
+
* shader reveals it. This means the composite always reveals at least as
|
|
303
|
+
* much as either shader alone.
|
|
304
|
+
*/
|
|
305
|
+
export function overlay(base, top) {
|
|
306
|
+
return (cell) => {
|
|
307
|
+
const topResult = top(cell);
|
|
308
|
+
if (topResult.char !== undefined)
|
|
309
|
+
return topResult;
|
|
310
|
+
const baseResult = base(cell);
|
|
311
|
+
return {
|
|
312
|
+
showNext: topResult.showNext || baseResult.showNext,
|
|
313
|
+
char: baseResult.char,
|
|
314
|
+
charRole: baseResult.charRole,
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
// ---------------------------------------------------------------------------
|
|
319
|
+
// Registry
|
|
320
|
+
// ---------------------------------------------------------------------------
|
|
55
321
|
/** Registry mapping built-in transition names to shader functions. `none` maps to `undefined`. */
|
|
56
322
|
export const TRANSITION_SHADERS = {
|
|
57
323
|
none: undefined,
|
|
@@ -62,5 +328,14 @@ export const TRANSITION_SHADERS = {
|
|
|
62
328
|
melt: meltShader,
|
|
63
329
|
matrix: matrixShader,
|
|
64
330
|
scramble: scrambleShader,
|
|
331
|
+
radial: radialShader,
|
|
332
|
+
diamond: diamondShader,
|
|
333
|
+
spiral: spiralShader,
|
|
334
|
+
blinds: blindsShader,
|
|
335
|
+
curtain: curtainShader,
|
|
336
|
+
pixelate: pixelateShader,
|
|
337
|
+
typewriter: typewriterShader,
|
|
338
|
+
glitch: glitchShader,
|
|
339
|
+
static: staticShader,
|
|
65
340
|
};
|
|
66
341
|
//# sourceMappingURL=transition-shaders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transition-shaders.js","sourceRoot":"","sources":["../src/transition-shaders.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transition-shaders.js","sourceRoot":"","sources":["../src/transition-shaders.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
import type { BijouContext } from '@flyingrobots/bijou';
|
|
10
|
+
import type { Middleware } from './eventbus.js';
|
|
11
|
+
import type { RenderPipeline } from './pipeline/pipeline.js';
|
|
12
|
+
import type { ViewOutput } from './view-output.js';
|
|
10
13
|
/** Represent a keyboard input event with key name and modifier flags. */
|
|
11
14
|
export interface KeyMsg {
|
|
12
15
|
/** Discriminant tag identifying this as a keyboard message. */
|
|
@@ -29,6 +32,13 @@ export interface ResizeMsg {
|
|
|
29
32
|
/** New terminal height in rows. */
|
|
30
33
|
readonly rows: number;
|
|
31
34
|
}
|
|
35
|
+
/** Represent a system animation pulse event. */
|
|
36
|
+
export interface PulseMsg {
|
|
37
|
+
/** Discriminant tag identifying this as a pulse message. */
|
|
38
|
+
readonly type: 'pulse';
|
|
39
|
+
/** Time delta in seconds since the last pulse. */
|
|
40
|
+
readonly dt: number;
|
|
41
|
+
}
|
|
32
42
|
/** Mouse button identifier. `"none"` is used for scroll and motion events without a button. */
|
|
33
43
|
export type MouseButton = 'left' | 'middle' | 'right' | 'none';
|
|
34
44
|
/** Mouse action type including press, release, move, and scroll directions. */
|
|
@@ -66,6 +76,13 @@ export declare function isKeyMsg(msg: unknown): msg is KeyMsg;
|
|
|
66
76
|
* @returns `true` if `msg` is a `ResizeMsg`.
|
|
67
77
|
*/
|
|
68
78
|
export declare function isResizeMsg(msg: unknown): msg is ResizeMsg;
|
|
79
|
+
/**
|
|
80
|
+
* Narrow an unknown message to {@link PulseMsg}.
|
|
81
|
+
*
|
|
82
|
+
* @param msg - Value to test.
|
|
83
|
+
* @returns `true` if `msg` is a `PulseMsg`.
|
|
84
|
+
*/
|
|
85
|
+
export declare function isPulseMsg(msg: unknown): msg is PulseMsg;
|
|
69
86
|
/**
|
|
70
87
|
* Narrow an unknown message to {@link MouseMsg}.
|
|
71
88
|
*
|
|
@@ -85,7 +102,17 @@ export type QuitSignal = typeof QUIT;
|
|
|
85
102
|
*
|
|
86
103
|
* @template M - Application message type.
|
|
87
104
|
*/
|
|
88
|
-
export type Cmd<M> = (emit: (msg: M) => void) => Promise<M | QuitSignal | void>;
|
|
105
|
+
export type Cmd<M> = (emit: (msg: M) => void, capabilities: CmdCapabilities) => Promise<M | QuitSignal | void>;
|
|
106
|
+
/** Capabilities provided to commands by the runtime. */
|
|
107
|
+
export interface CmdCapabilities {
|
|
108
|
+
/**
|
|
109
|
+
* Subscribe to the system animation pulse.
|
|
110
|
+
* Returns a dispose function.
|
|
111
|
+
*/
|
|
112
|
+
onPulse(handler: (dt: number) => void): {
|
|
113
|
+
dispose(): void;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
89
116
|
/**
|
|
90
117
|
* TEA (The Elm Architecture) application interface.
|
|
91
118
|
*
|
|
@@ -105,21 +132,25 @@ export interface App<Model, M = never> {
|
|
|
105
132
|
/**
|
|
106
133
|
* Handle a message and return the updated model with commands.
|
|
107
134
|
*
|
|
108
|
-
* @param msg - Incoming message (key, resize, mouse, or custom).
|
|
135
|
+
* @param msg - Incoming message (key, resize, mouse, pulse, or custom).
|
|
109
136
|
* @param model - Current application state.
|
|
110
137
|
* @returns A tuple of `[updatedModel, commands]`.
|
|
111
138
|
*/
|
|
112
|
-
update(msg: KeyMsg | ResizeMsg | MouseMsg | M, model: Model): [Model, Cmd<M>[]];
|
|
139
|
+
update(msg: KeyMsg | ResizeMsg | MouseMsg | PulseMsg | M, model: Model): [Model, Cmd<M>[]];
|
|
113
140
|
/**
|
|
114
|
-
* Render the current model as a
|
|
141
|
+
* Render the current model as a Surface, LayoutNode, or legacy string view.
|
|
115
142
|
*
|
|
116
143
|
* @param model - Current application state.
|
|
117
|
-
* @returns Rendered string output.
|
|
144
|
+
* @returns Rendered Surface, Layout tree, or legacy string output.
|
|
118
145
|
*/
|
|
119
|
-
view(model: Model):
|
|
146
|
+
view(model: Model): ViewOutput;
|
|
120
147
|
}
|
|
121
|
-
/**
|
|
122
|
-
|
|
148
|
+
/**
|
|
149
|
+
* Configuration options for the TEA runtime.
|
|
150
|
+
*
|
|
151
|
+
* @template M - Custom application message type.
|
|
152
|
+
*/
|
|
153
|
+
export interface RunOptions<M = any> {
|
|
123
154
|
/** Enter the alternate screen buffer on startup. */
|
|
124
155
|
altScreen?: boolean;
|
|
125
156
|
/** Hide the cursor on startup. */
|
|
@@ -128,5 +159,11 @@ export interface RunOptions {
|
|
|
128
159
|
mouse?: boolean;
|
|
129
160
|
/** Bijou context providing I/O and runtime ports. */
|
|
130
161
|
ctx?: BijouContext;
|
|
162
|
+
/** Optional middleware to intercept or modify messages. */
|
|
163
|
+
middlewares?: Middleware<M>[];
|
|
164
|
+
/** Optional hook to extend the render pipeline with custom middleware. */
|
|
165
|
+
configurePipeline?: (pipeline: RenderPipeline) => void;
|
|
166
|
+
/** Optional BCSS stylesheet string. */
|
|
167
|
+
css?: string;
|
|
131
168
|
}
|
|
132
169
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -25,6 +25,15 @@ export function isKeyMsg(msg) {
|
|
|
25
25
|
export function isResizeMsg(msg) {
|
|
26
26
|
return typeof msg === 'object' && msg !== null && 'type' in msg && msg.type === 'resize';
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Narrow an unknown message to {@link PulseMsg}.
|
|
30
|
+
*
|
|
31
|
+
* @param msg - Value to test.
|
|
32
|
+
* @returns `true` if `msg` is a `PulseMsg`.
|
|
33
|
+
*/
|
|
34
|
+
export function isPulseMsg(msg) {
|
|
35
|
+
return typeof msg === 'object' && msg !== null && 'type' in msg && msg.type === 'pulse';
|
|
36
|
+
}
|
|
28
37
|
/**
|
|
29
38
|
* Narrow an unknown message to {@link MouseMsg}.
|
|
30
39
|
*
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqEH,sBAAsB;AAEtB;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAK,GAAc,CAAC,IAAI,KAAK,KAAK,CAAC;AACpG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAK,GAAiB,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC1G,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAK,GAAgB,CAAC,IAAI,KAAK,OAAO,CAAC;AACxG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAK,GAAgB,CAAC,IAAI,KAAK,OAAO,CAAC;AACxG,CAAC;AAED,mBAAmB;AAEnB,kEAAkE;AAClE,MAAM,CAAC,MAAM,IAAI,GAAkB,MAAM,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type LayoutNode, type Surface } from '@flyingrobots/bijou';
|
|
2
|
+
export type ViewOutput = Surface | LayoutNode | string;
|
|
3
|
+
export interface ViewportSize {
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}
|
|
7
|
+
export interface NormalizedViewOutput {
|
|
8
|
+
kind: 'surface' | 'layout' | 'string';
|
|
9
|
+
legacyString: boolean;
|
|
10
|
+
surface: Surface;
|
|
11
|
+
}
|
|
12
|
+
export declare function isSurfaceView(value: unknown): value is Surface;
|
|
13
|
+
export declare function normalizeViewOutput(output: ViewOutput, size: ViewportSize): NormalizedViewOutput;
|
|
14
|
+
export declare function wrapViewOutputAsLayoutRoot(output: ViewOutput, size: ViewportSize): LayoutNode;
|
|
15
|
+
//# sourceMappingURL=view-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-output.d.ts","sourceRoot":"","sources":["../src/view-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAE9D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,YAAY,GACjB,oBAAoB,CAsBtB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,YAAY,GACjB,UAAU,CAqBZ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createSurface, paintLayoutNode, parseAnsiToSurface, } from '@flyingrobots/bijou';
|
|
2
|
+
export function isSurfaceView(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && 'cells' in value;
|
|
4
|
+
}
|
|
5
|
+
export function normalizeViewOutput(output, size) {
|
|
6
|
+
if (typeof output === 'string') {
|
|
7
|
+
return {
|
|
8
|
+
kind: 'string',
|
|
9
|
+
legacyString: true,
|
|
10
|
+
surface: parseAnsiToSurface(output, size.width, size.height),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (isSurfaceView(output)) {
|
|
14
|
+
return {
|
|
15
|
+
kind: 'surface',
|
|
16
|
+
legacyString: false,
|
|
17
|
+
surface: output,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
kind: 'layout',
|
|
22
|
+
legacyString: false,
|
|
23
|
+
surface: paintViewLayout(output, size),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function wrapViewOutputAsLayoutRoot(output, size) {
|
|
27
|
+
if (typeof output === 'string') {
|
|
28
|
+
return {
|
|
29
|
+
type: 'LegacyTextView',
|
|
30
|
+
classes: ['legacy-view'],
|
|
31
|
+
rect: { x: 0, y: 0, width: size.width, height: size.height },
|
|
32
|
+
children: [],
|
|
33
|
+
surface: parseAnsiToSurface(output, size.width, size.height),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (isSurfaceView(output)) {
|
|
37
|
+
return {
|
|
38
|
+
type: 'SurfaceView',
|
|
39
|
+
rect: { x: 0, y: 0, width: output.width, height: output.height },
|
|
40
|
+
children: [],
|
|
41
|
+
surface: output,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return output;
|
|
45
|
+
}
|
|
46
|
+
function paintViewLayout(node, size) {
|
|
47
|
+
const width = Math.max(size.width, node.rect.x + node.rect.width, 0);
|
|
48
|
+
const height = Math.max(size.height, node.rect.y + node.rect.height, 0);
|
|
49
|
+
const surface = createSurface(width, height);
|
|
50
|
+
paintLayoutNode(surface, node);
|
|
51
|
+
return surface;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=view-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-output.js","sourceRoot":"","sources":["../src/view-output.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,GAGnB,MAAM,qBAAqB,CAAC;AAe7B,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAkB,EAClB,IAAkB;IAElB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,KAAK;YACnB,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAkB,EAClB,IAAkB;IAElB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YAC5D,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAChE,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB,EAAE,IAAkB;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flyingrobots/bijou-tui",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "TEA runtime for terminal UIs
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "TEA runtime for terminal UIs \u2014 model/update/view with keyboard input, alt screen, and layout helpers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"lint": "tsc --noEmit"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@flyingrobots/bijou": "
|
|
27
|
+
"@flyingrobots/bijou": "3.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "^22.0.0",
|