@flyingrobots/bijou 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.
Files changed (91) hide show
  1. package/README.md +11 -11
  2. package/dist/adapters/test/index.d.ts +0 -1
  3. package/dist/adapters/test/index.d.ts.map +1 -1
  4. package/dist/adapters/test/index.js +4 -1
  5. package/dist/adapters/test/index.js.map +1 -1
  6. package/dist/adapters/test/runtime.d.ts +2 -0
  7. package/dist/adapters/test/runtime.d.ts.map +1 -1
  8. package/dist/adapters/test/runtime.js +1 -0
  9. package/dist/adapters/test/runtime.js.map +1 -1
  10. package/dist/core/components/alert.d.ts +2 -4
  11. package/dist/core/components/alert.d.ts.map +1 -1
  12. package/dist/core/components/alert.js.map +1 -1
  13. package/dist/core/components/badge.d.ts +6 -12
  14. package/dist/core/components/badge.d.ts.map +1 -1
  15. package/dist/core/components/badge.js +39 -24
  16. package/dist/core/components/badge.js.map +1 -1
  17. package/dist/core/components/bcss-style.d.ts +6 -0
  18. package/dist/core/components/bcss-style.d.ts.map +1 -0
  19. package/dist/core/components/bcss-style.js +44 -0
  20. package/dist/core/components/bcss-style.js.map +1 -0
  21. package/dist/core/components/box-v3.d.ts +9 -0
  22. package/dist/core/components/box-v3.d.ts.map +1 -0
  23. package/dist/core/components/box-v3.js +91 -0
  24. package/dist/core/components/box-v3.js.map +1 -0
  25. package/dist/core/components/box.d.ts +4 -4
  26. package/dist/core/components/box.d.ts.map +1 -1
  27. package/dist/core/components/box.js +26 -4
  28. package/dist/core/components/box.js.map +1 -1
  29. package/dist/core/components/log.d.ts.map +1 -1
  30. package/dist/core/components/log.js +2 -1
  31. package/dist/core/components/log.js.map +1 -1
  32. package/dist/core/components/separator.d.ts +2 -4
  33. package/dist/core/components/separator.d.ts.map +1 -1
  34. package/dist/core/components/separator.js.map +1 -1
  35. package/dist/core/components/types.d.ts +15 -0
  36. package/dist/core/components/types.d.ts.map +1 -0
  37. package/dist/core/components/types.js +2 -0
  38. package/dist/core/components/types.js.map +1 -0
  39. package/dist/core/detect/tty.d.ts +5 -15
  40. package/dist/core/detect/tty.d.ts.map +1 -1
  41. package/dist/core/detect/tty.js +3 -13
  42. package/dist/core/detect/tty.js.map +1 -1
  43. package/dist/core/layout/flex.d.ts +28 -0
  44. package/dist/core/layout/flex.d.ts.map +1 -0
  45. package/dist/core/layout/flex.js +126 -0
  46. package/dist/core/layout/flex.js.map +1 -0
  47. package/dist/core/render/differ.d.ts +49 -0
  48. package/dist/core/render/differ.d.ts.map +1 -0
  49. package/dist/core/render/differ.js +271 -0
  50. package/dist/core/render/differ.js.map +1 -0
  51. package/dist/core/theme/accessors.d.ts.map +1 -1
  52. package/dist/core/theme/accessors.js +21 -5
  53. package/dist/core/theme/accessors.js.map +1 -1
  54. package/dist/core/theme/graph-types.d.ts +58 -0
  55. package/dist/core/theme/graph-types.d.ts.map +1 -0
  56. package/dist/core/theme/graph-types.js +2 -0
  57. package/dist/core/theme/graph-types.js.map +1 -0
  58. package/dist/core/theme/graph.d.ts +27 -0
  59. package/dist/core/theme/graph.d.ts.map +1 -0
  60. package/dist/core/theme/graph.js +155 -0
  61. package/dist/core/theme/graph.js.map +1 -0
  62. package/dist/core/theme/index.d.ts +4 -1
  63. package/dist/core/theme/index.d.ts.map +1 -1
  64. package/dist/core/theme/index.js +3 -1
  65. package/dist/core/theme/index.js.map +1 -1
  66. package/dist/core/theme/resolve.d.ts +8 -33
  67. package/dist/core/theme/resolve.d.ts.map +1 -1
  68. package/dist/core/theme/resolve.js +6 -39
  69. package/dist/core/theme/resolve.js.map +1 -1
  70. package/dist/factory.d.ts.map +1 -1
  71. package/dist/factory.js +5 -0
  72. package/dist/factory.js.map +1 -1
  73. package/dist/index.d.ts +6 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +9 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/ports/context.d.ts +9 -0
  78. package/dist/ports/context.d.ts.map +1 -1
  79. package/dist/ports/env.d.ts +7 -14
  80. package/dist/ports/env.d.ts.map +1 -1
  81. package/dist/ports/env.js +7 -16
  82. package/dist/ports/env.js.map +1 -1
  83. package/dist/ports/io.d.ts +6 -0
  84. package/dist/ports/io.d.ts.map +1 -1
  85. package/dist/ports/runtime.d.ts +5 -0
  86. package/dist/ports/runtime.d.ts.map +1 -1
  87. package/dist/ports/surface.d.ts +152 -0
  88. package/dist/ports/surface.d.ts.map +1 -0
  89. package/dist/ports/surface.js +199 -0
  90. package/dist/ports/surface.js.map +1 -0
  91. package/package.json +2 -2
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Core types for buffered terminal rendering in Bijou v3.
3
+ *
4
+ * A Surface is a 2D grid of Cells. Each Cell is a self-contained unit
5
+ * of terminal output (character + styling).
6
+ */
7
+ /**
8
+ * A single terminal character cell.
9
+ */
10
+ export interface Cell {
11
+ /** The character to display. Must be a single grapheme. */
12
+ char: string;
13
+ /** Foreground hex color (e.g. '#ffffff'). Undefined = terminal default. */
14
+ fg?: string;
15
+ /** Background hex color (e.g. '#000000'). Undefined = terminal default. */
16
+ bg?: string;
17
+ /** Text modifiers (bold, dim, underline, etc.). */
18
+ modifiers?: string[];
19
+ /**
20
+ * Whether this cell is 'empty' (transparent).
21
+ * When true, this cell is ignored during blit/fill operations (acting as a brush hole).
22
+ */
23
+ empty?: boolean;
24
+ /**
25
+ * Opacity of the cell (0.0 to 1.0).
26
+ * Used for alpha blending colors during post-processing.
27
+ */
28
+ opacity?: number;
29
+ }
30
+ /**
31
+ * A mask determining which properties of a cell are affected by an operation.
32
+ */
33
+ export interface CellMask {
34
+ /** Whether to affect the character. */
35
+ char?: boolean;
36
+ /** Whether to affect the foreground color. */
37
+ fg?: boolean;
38
+ /** Whether to affect the background color. */
39
+ bg?: boolean;
40
+ /** Whether to affect the text modifiers. */
41
+ modifiers?: boolean;
42
+ /** Whether to affect the empty/opacity flags. */
43
+ alpha?: boolean;
44
+ }
45
+ /** A mask that affects all properties of a cell. */
46
+ export declare const FULL_MASK: CellMask;
47
+ /**
48
+ * A rectangular area in terminal coordinates.
49
+ */
50
+ export interface LayoutRect {
51
+ /** 0-based column index. */
52
+ x: number;
53
+ /** 0-based row index. */
54
+ y: number;
55
+ /** Width in columns. */
56
+ width: number;
57
+ /** Height in rows. */
58
+ height: number;
59
+ }
60
+ /**
61
+ * A node in the layout tree.
62
+ */
63
+ export interface LayoutNode {
64
+ /** Unique identifier for this layout node. Matches CSS #id. */
65
+ id?: string;
66
+ /** Component type name. Matches CSS type selectors (e.g. 'Badge'). */
67
+ type?: string;
68
+ /** List of CSS class names. Matches CSS .class selectors. */
69
+ classes?: string[];
70
+ /** The calculated rectangle for this node. */
71
+ rect: LayoutRect;
72
+ /** Child layout nodes. */
73
+ children: LayoutNode[];
74
+ /** Optional surface (texture) to be painted at this node's position. */
75
+ surface?: Surface;
76
+ }
77
+ /**
78
+ * Interface for a layout engine (e.g. Flex, Grid).
79
+ */
80
+ export interface LayoutEngine<Options, Child> {
81
+ /** Calculate the layout tree for a given set of options and children. */
82
+ calculate(options: Options, children: Child[], bounds: LayoutRect): LayoutNode;
83
+ }
84
+ /**
85
+ * Options for a surface transformation (rotation, scaling, etc.).
86
+ */
87
+ export interface TransformOptions {
88
+ /**
89
+ * Optional map to swap characters during rotation (e.g. {'|': '-'} for 90deg).
90
+ * Bijou provides a default map for standard box-drawing and line-art characters.
91
+ */
92
+ charMap?: Record<string, string>;
93
+ /**
94
+ * Whether to blend colors during scaling/rotation (requires hex math).
95
+ * Default: false (nearest-neighbor).
96
+ */
97
+ interpolateColors?: boolean;
98
+ /** Mask to apply during the transform. Default: FULL_MASK. */
99
+ mask?: CellMask;
100
+ }
101
+ /**
102
+ * A 3x3 Affine Transformation Matrix (flattened as [a, b, c, d, tx, ty]).
103
+ * Used for scale, rotate, skew, and translate.
104
+ */
105
+ export type Matrix3x3 = [number, number, number, number, number, number];
106
+ /**
107
+ * A rectangular grid of cells.
108
+ */
109
+ export interface Surface {
110
+ /** Width in columns. */
111
+ readonly width: number;
112
+ /** Height in rows. */
113
+ readonly height: number;
114
+ /** Flattened cell array (index = y * width + x). */
115
+ readonly cells: Cell[];
116
+ /** Reset all cells in the surface to the default empty state. */
117
+ clear(): void;
118
+ /** Get a cell at (x, y). Returns an empty cell if out of bounds. Apply optional mask. */
119
+ get(x: number, y: number, mask?: CellMask): Cell;
120
+ /** Set a cell at (x, y). No-op if out of bounds. */
121
+ set(x: number, y: number, cell: Cell, mask?: CellMask): void;
122
+ /** Fill a rectangular region with a specific cell. Defaults to entire surface. */
123
+ fill(cell: Cell, x?: number, y?: number, w?: number, h?: number, mask?: CellMask): void;
124
+ /** Copy a region from another surface onto this one at (x, y). */
125
+ blit(source: Surface, x: number, y: number, srcX?: number, srcY?: number, srcW?: number, srcH?: number, mask?: CellMask): void;
126
+ /**
127
+ * Apply an affine transformation (rotate, scale, flip) to a source surface
128
+ * and paint the result onto this surface.
129
+ */
130
+ transform(source: Surface, matrix: Matrix3x3, options?: TransformOptions): void;
131
+ /** Get a horizontal span (row) of cells. Apply optional mask. */
132
+ getRow(y: number, x?: number, w?: number, mask?: CellMask): Cell[];
133
+ /** Set a horizontal span (row) of cells. */
134
+ setRow(y: number, cells: Cell[], x?: number, mask?: CellMask): void;
135
+ /** Create a deep clone of this surface. */
136
+ clone(): Surface;
137
+ }
138
+ /**
139
+ * Default character remapping table for 90/180/270 degree rotations
140
+ * of common line-art and box-drawing characters.
141
+ */
142
+ export declare const ROTATION_CHAR_MAP: Record<string, string>;
143
+ /**
144
+ * Factory for creating a blank surface.
145
+ *
146
+ * @param width - Width in columns.
147
+ * @param height - Height in rows.
148
+ * @param fill - Optional cell to fill the surface with (defaults to space).
149
+ * @returns A new Surface instance.
150
+ */
151
+ export declare function createSurface(width: number, height: number, fill?: Cell): Surface;
152
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../src/ports/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Core types for buffered terminal rendering in Bijou v3.
3
+ *
4
+ * A Surface is a 2D grid of Cells. Each Cell is a self-contained unit
5
+ * of terminal output (character + styling).
6
+ */
7
+ /** A mask that affects all properties of a cell. */
8
+ export const FULL_MASK = {
9
+ char: true,
10
+ fg: true,
11
+ bg: true,
12
+ modifiers: true,
13
+ alpha: true
14
+ };
15
+ /**
16
+ * Default character remapping table for 90/180/270 degree rotations
17
+ * of common line-art and box-drawing characters.
18
+ */
19
+ export const ROTATION_CHAR_MAP = {
20
+ '|': '-', '-': '|',
21
+ '/': '\\', '\\': '/',
22
+ '┘': '┐', '┐': '┌', '┌': '└', '└': '┘',
23
+ '┤': '┴', '┴': '├', '├': '┬', '┬': '┤',
24
+ '▲': '▶', '▶': '▼', '▼': '◀', '◀': '▲',
25
+ };
26
+ /**
27
+ * Sanitize a cell by applying a mask, returning only the requested properties.
28
+ *
29
+ * @param cell - The source cell to mask.
30
+ * @param mask - The mask determining which fields to keep.
31
+ * @returns A new Cell with only masked properties populated.
32
+ */
33
+ function maskCell(cell, mask) {
34
+ return {
35
+ char: mask.char ? cell.char : ' ',
36
+ fg: mask.fg ? cell.fg : undefined,
37
+ bg: mask.bg ? cell.bg : undefined,
38
+ modifiers: mask.modifiers ? cell.modifiers : undefined,
39
+ empty: mask.alpha ? (cell.empty ?? false) : false,
40
+ opacity: mask.alpha ? (cell.opacity ?? 1) : 1,
41
+ };
42
+ }
43
+ /**
44
+ * Apply a source cell to a target cell using a mask, respecting 'empty' transparency.
45
+ *
46
+ * @param target - The existing cell to be modified.
47
+ * @param source - The cell containing the new values.
48
+ * @param mask - Determines which fields of `source` are applied to `target`.
49
+ * @returns A new Cell with the masked values applied.
50
+ */
51
+ function applyMask(target, source, mask) {
52
+ // Brush/Stamp behavior: if source is empty, do not modify the target.
53
+ if (source.empty)
54
+ return target;
55
+ return {
56
+ char: mask.char ? source.char : target.char,
57
+ fg: mask.fg ? source.fg : target.fg,
58
+ bg: mask.bg ? source.bg : target.bg,
59
+ modifiers: mask.modifiers ? source.modifiers : target.modifiers,
60
+ empty: mask.alpha ? (source.empty ?? false) : (target.empty ?? false),
61
+ opacity: mask.alpha ? (source.opacity ?? 1) : (target.opacity ?? 1),
62
+ };
63
+ }
64
+ /**
65
+ * Factory for creating a blank surface.
66
+ *
67
+ * @param width - Width in columns.
68
+ * @param height - Height in rows.
69
+ * @param fill - Optional cell to fill the surface with (defaults to space).
70
+ * @returns A new Surface instance.
71
+ */
72
+ export function createSurface(width, height, fill) {
73
+ const w = Math.max(0, Math.floor(width));
74
+ const h = Math.max(0, Math.floor(height));
75
+ const size = w * h;
76
+ const defaultCell = fill ?? { char: ' ', empty: true };
77
+ const cells = Array.from({ length: size }, () => ({ ...defaultCell }));
78
+ const surface = {
79
+ width: w,
80
+ height: h,
81
+ cells,
82
+ clear() {
83
+ for (let i = 0; i < cells.length; i++) {
84
+ cells[i] = { ...defaultCell };
85
+ }
86
+ },
87
+ get(x, y, mask = FULL_MASK) {
88
+ if (x < 0 || x >= w || y < 0 || y >= h) {
89
+ return { char: ' ', empty: true };
90
+ }
91
+ return maskCell(cells[y * w + x], mask);
92
+ },
93
+ set(x, y, cell, mask = FULL_MASK) {
94
+ if (x < 0 || x >= w || y < 0 || y >= h)
95
+ return;
96
+ const idx = y * w + x;
97
+ cells[idx] = applyMask(cells[idx], cell, mask);
98
+ },
99
+ fill(cell, fx = 0, fy = 0, fw = w, fh = h, mask = FULL_MASK) {
100
+ const xStart = Math.max(0, fx);
101
+ const yStart = Math.max(0, fy);
102
+ const xEnd = Math.min(w, xStart + fw);
103
+ const yEnd = Math.min(h, yStart + fh);
104
+ for (let y = yStart; y < yEnd; y++) {
105
+ for (let x = xStart; x < xEnd; x++) {
106
+ const idx = y * w + x;
107
+ cells[idx] = applyMask(cells[idx], cell, mask);
108
+ }
109
+ }
110
+ },
111
+ blit(source, dx, dy, sx = 0, sy = 0, sw = source.width, sh = source.height, mask = FULL_MASK) {
112
+ // 1. Clamp source rectangle to source surface bounds
113
+ const sX = Math.max(0, sx);
114
+ const sY = Math.max(0, sy);
115
+ const sW = Math.min(sw - (sX - sx), source.width - sX);
116
+ const sH = Math.min(sh - (sY - sy), source.height - sY);
117
+ if (sW <= 0 || sH <= 0)
118
+ return;
119
+ // 2. Map to destination and clamp to target surface bounds
120
+ const dX = dx + (sX - sx);
121
+ const dY = dy + (sY - sy);
122
+ const xStart = Math.max(0, dX);
123
+ const yStart = Math.max(0, dY);
124
+ const srcXStart = sX + (xStart - dX);
125
+ const srcYStart = sY + (yStart - dY);
126
+ const blitW = Math.min(w - xStart, sW - (srcXStart - sX));
127
+ const blitH = Math.min(h - yStart, sH - (srcYStart - sY));
128
+ if (blitW <= 0 || blitH <= 0)
129
+ return;
130
+ for (let i = 0; i < blitH; i++) {
131
+ const targetY = yStart + i;
132
+ const sourceY = srcYStart + i;
133
+ const tRowOffset = targetY * w;
134
+ const sRowOffset = sourceY * source.width;
135
+ for (let j = 0; j < blitW; j++) {
136
+ const targetX = xStart + j;
137
+ const sourceX = srcXStart + j;
138
+ const tIdx = tRowOffset + targetX;
139
+ const sIdx = sRowOffset + sourceX;
140
+ cells[tIdx] = applyMask(cells[tIdx], source.cells[sIdx], mask);
141
+ }
142
+ }
143
+ },
144
+ transform(source, matrix, options = {}) {
145
+ const { charMap = {}, mask = FULL_MASK } = options;
146
+ const [a, b, c, d, tx, ty] = matrix;
147
+ const det = a * d - b * c;
148
+ if (Math.abs(det) < 0.0001)
149
+ return;
150
+ for (let y = 0; y < h; y++) {
151
+ for (let x = 0; x < w; x++) {
152
+ const srcX = Math.round((d * (x - tx) - b * (y - ty)) / det);
153
+ const srcY = Math.round((a * (y - ty) - c * (x - tx)) / det);
154
+ if (srcX >= 0 && srcX < source.width && srcY >= 0 && srcY < source.height) {
155
+ const sourceCell = source.get(srcX, srcY);
156
+ if (sourceCell.empty)
157
+ continue;
158
+ const transformedCell = { ...sourceCell };
159
+ if (charMap[transformedCell.char]) {
160
+ transformedCell.char = charMap[transformedCell.char];
161
+ }
162
+ const idx = y * w + x;
163
+ cells[idx] = applyMask(cells[idx], transformedCell, mask);
164
+ }
165
+ }
166
+ }
167
+ },
168
+ getRow(y, rx = 0, rw = w - rx, mask = FULL_MASK) {
169
+ if (y < 0 || y >= h)
170
+ return [];
171
+ const xStart = Math.max(0, rx);
172
+ const count = Math.min(w - xStart, rw);
173
+ if (count <= 0)
174
+ return [];
175
+ return cells
176
+ .slice(y * w + xStart, y * w + xStart + count)
177
+ .map((c) => maskCell(c, mask));
178
+ },
179
+ setRow(y, rowCells, sx = 0, mask = FULL_MASK) {
180
+ if (y < 0 || y >= h)
181
+ return;
182
+ const xStart = Math.max(0, sx);
183
+ const count = Math.min(w - xStart, rowCells.length);
184
+ for (let i = 0; i < count; i++) {
185
+ const idx = y * w + xStart + i;
186
+ cells[idx] = applyMask(cells[idx], rowCells[i], mask);
187
+ }
188
+ },
189
+ clone() {
190
+ const s = createSurface(w, h);
191
+ for (let i = 0; i < cells.length; i++) {
192
+ s.cells[i] = { ...cells[i] };
193
+ }
194
+ return s;
195
+ },
196
+ };
197
+ return surface;
198
+ }
199
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/ports/surface.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flyingrobots/bijou",
3
- "version": "1.8.0",
4
- "description": "Themed terminal components for CLIs, loggers, and scripts graceful degradation included.",
3
+ "version": "3.0.0",
4
+ "description": "Themed terminal components for CLIs, loggers, and scripts \u2014 graceful degradation included.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",