@flyingrobots/bijou 4.4.1 → 7.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 +71 -1
- package/dist/adapters/test/index.d.ts.map +1 -1
- package/dist/adapters/test/index.js +1 -3
- package/dist/adapters/test/index.js.map +1 -1
- package/dist/adapters/test/runtime.d.ts.map +1 -1
- package/dist/adapters/test/runtime.js +4 -3
- package/dist/adapters/test/runtime.js.map +1 -1
- package/dist/context-theme.d.ts +25 -0
- package/dist/context-theme.d.ts.map +1 -1
- package/dist/context-theme.js +19 -0
- package/dist/context-theme.js.map +1 -1
- package/dist/context.d.ts +13 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +24 -3
- package/dist/context.js.map +1 -1
- package/dist/core/active-binding-collection.d.ts +49 -0
- package/dist/core/active-binding-collection.d.ts.map +1 -0
- package/dist/core/active-binding-collection.js +264 -0
- package/dist/core/active-binding-collection.js.map +1 -0
- package/dist/core/app-shell-composition.d.ts +44 -0
- package/dist/core/app-shell-composition.d.ts.map +1 -0
- package/dist/core/app-shell-composition.js +123 -0
- package/dist/core/app-shell-composition.js.map +1 -0
- package/dist/core/binding-frame-update.d.ts +18 -0
- package/dist/core/binding-frame-update.d.ts.map +1 -0
- package/dist/core/binding-frame-update.js +133 -0
- package/dist/core/binding-frame-update.js.map +1 -0
- package/dist/core/binding-lifecycle.d.ts +65 -0
- package/dist/core/binding-lifecycle.d.ts.map +1 -0
- package/dist/core/binding-lifecycle.js +357 -0
- package/dist/core/binding-lifecycle.js.map +1 -0
- package/dist/core/binding.d.ts +192 -0
- package/dist/core/binding.d.ts.map +1 -0
- package/dist/core/binding.js +587 -0
- package/dist/core/binding.js.map +1 -0
- package/dist/core/block-metadata.d.ts +113 -0
- package/dist/core/block-metadata.d.ts.map +1 -0
- package/dist/core/block-metadata.js +376 -0
- package/dist/core/block-metadata.js.map +1 -0
- package/dist/core/block-tree-render.d.ts +17 -0
- package/dist/core/block-tree-render.d.ts.map +1 -0
- package/dist/core/block-tree-render.js +186 -0
- package/dist/core/block-tree-render.js.map +1 -0
- package/dist/core/component-metadata.d.ts +63 -0
- package/dist/core/component-metadata.d.ts.map +1 -0
- package/dist/core/component-metadata.js +158 -0
- package/dist/core/component-metadata.js.map +1 -0
- package/dist/core/components/alert-v3.d.ts.map +1 -1
- package/dist/core/components/alert-v3.js +5 -4
- package/dist/core/components/alert-v3.js.map +1 -1
- package/dist/core/components/alert.d.ts.map +1 -1
- package/dist/core/components/alert.js +7 -8
- package/dist/core/components/alert.js.map +1 -1
- package/dist/core/components/badge.d.ts.map +1 -1
- package/dist/core/components/badge.js +19 -18
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/box-v3.d.ts.map +1 -1
- package/dist/core/components/box-v3.js +29 -29
- package/dist/core/components/box-v3.js.map +1 -1
- package/dist/core/components/dag-edges.d.ts +28 -5
- package/dist/core/components/dag-edges.d.ts.map +1 -1
- package/dist/core/components/dag-edges.js +116 -22
- package/dist/core/components/dag-edges.js.map +1 -1
- package/dist/core/components/dag-layout.d.ts +3 -4
- package/dist/core/components/dag-layout.d.ts.map +1 -1
- package/dist/core/components/dag-layout.js +42 -9
- package/dist/core/components/dag-layout.js.map +1 -1
- package/dist/core/components/dag-render.d.ts +4 -3
- package/dist/core/components/dag-render.d.ts.map +1 -1
- package/dist/core/components/dag-render.js +209 -105
- package/dist/core/components/dag-render.js.map +1 -1
- package/dist/core/components/dag-source.d.ts +4 -0
- package/dist/core/components/dag-source.d.ts.map +1 -1
- package/dist/core/components/dag-source.js +10 -0
- package/dist/core/components/dag-source.js.map +1 -1
- package/dist/core/components/dag.d.ts +20 -4
- package/dist/core/components/dag.d.ts.map +1 -1
- package/dist/core/components/dag.js.map +1 -1
- package/dist/core/components/explainability.d.ts.map +1 -1
- package/dist/core/components/explainability.js +30 -87
- package/dist/core/components/explainability.js.map +1 -1
- package/dist/core/components/guided-flow.d.ts +32 -0
- package/dist/core/components/guided-flow.d.ts.map +1 -0
- package/dist/core/components/guided-flow.js +131 -0
- package/dist/core/components/guided-flow.js.map +1 -0
- package/dist/core/components/hyperlink.d.ts.map +1 -1
- package/dist/core/components/hyperlink.js +7 -4
- package/dist/core/components/hyperlink.js.map +1 -1
- package/dist/core/components/index.d.ts +5 -3
- package/dist/core/components/index.d.ts.map +1 -1
- package/dist/core/components/index.js +1 -0
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/markdown-parse.d.ts +4 -0
- package/dist/core/components/markdown-parse.d.ts.map +1 -1
- package/dist/core/components/markdown-parse.js +66 -2
- package/dist/core/components/markdown-parse.js.map +1 -1
- package/dist/core/components/markdown-render.d.ts.map +1 -1
- package/dist/core/components/markdown-render.js +220 -14
- package/dist/core/components/markdown-render.js.map +1 -1
- package/dist/core/components/markdown.d.ts +4 -3
- package/dist/core/components/markdown.d.ts.map +1 -1
- package/dist/core/components/markdown.js +6 -5
- package/dist/core/components/markdown.js.map +1 -1
- package/dist/core/components/paginator.d.ts.map +1 -1
- package/dist/core/components/paginator.js +5 -3
- package/dist/core/components/paginator.js.map +1 -1
- package/dist/core/components/perf-overlay.d.ts.map +1 -1
- package/dist/core/components/perf-overlay.js +3 -2
- package/dist/core/components/perf-overlay.js.map +1 -1
- package/dist/core/components/preference-list.d.ts.map +1 -1
- package/dist/core/components/preference-list.js +75 -37
- package/dist/core/components/preference-list.js.map +1 -1
- package/dist/core/components/progress.d.ts.map +1 -1
- package/dist/core/components/progress.js +4 -3
- package/dist/core/components/progress.js.map +1 -1
- package/dist/core/components/separator-v3.d.ts.map +1 -1
- package/dist/core/components/separator-v3.js +11 -11
- package/dist/core/components/separator-v3.js.map +1 -1
- package/dist/core/components/separator.d.ts.map +1 -1
- package/dist/core/components/separator.js +4 -1
- package/dist/core/components/separator.js.map +1 -1
- package/dist/core/components/skeleton.d.ts.map +1 -1
- package/dist/core/components/skeleton.js +3 -2
- package/dist/core/components/skeleton.js.map +1 -1
- package/dist/core/components/surface-text.d.ts +7 -0
- package/dist/core/components/surface-text.d.ts.map +1 -1
- package/dist/core/components/surface-text.js +33 -25
- package/dist/core/components/surface-text.js.map +1 -1
- package/dist/core/components/table-v3.d.ts +5 -2
- package/dist/core/components/table-v3.d.ts.map +1 -1
- package/dist/core/components/table-v3.js +162 -37
- package/dist/core/components/table-v3.js.map +1 -1
- package/dist/core/components/table.d.ts +51 -7
- package/dist/core/components/table.d.ts.map +1 -1
- package/dist/core/components/table.js +655 -81
- package/dist/core/components/table.js.map +1 -1
- package/dist/core/fixture-promotion.d.ts +33 -0
- package/dist/core/fixture-promotion.d.ts.map +1 -0
- package/dist/core/fixture-promotion.js +62 -0
- package/dist/core/fixture-promotion.js.map +1 -0
- package/dist/core/forms/filter-interactive.d.ts.map +1 -1
- package/dist/core/forms/filter-interactive.js +2 -4
- package/dist/core/forms/filter-interactive.js.map +1 -1
- package/dist/core/forms/multiselect.d.ts.map +1 -1
- package/dist/core/forms/multiselect.js +2 -4
- package/dist/core/forms/multiselect.js.map +1 -1
- package/dist/core/forms/note.d.ts.map +1 -1
- package/dist/core/forms/note.js +2 -1
- package/dist/core/forms/note.js.map +1 -1
- package/dist/core/forms/select.d.ts.map +1 -1
- package/dist/core/forms/select.js +2 -4
- package/dist/core/forms/select.js.map +1 -1
- package/dist/core/forms/textarea-editor.d.ts.map +1 -1
- package/dist/core/forms/textarea-editor.js +7 -5
- package/dist/core/forms/textarea-editor.js.map +1 -1
- package/dist/core/layout/envelope.d.ts +174 -0
- package/dist/core/layout/envelope.d.ts.map +1 -0
- package/dist/core/layout/envelope.js +336 -0
- package/dist/core/layout/envelope.js.map +1 -0
- package/dist/core/layout/geometry.d.ts +39 -0
- package/dist/core/layout/geometry.d.ts.map +1 -0
- package/dist/core/layout/geometry.js +201 -0
- package/dist/core/layout/geometry.js.map +1 -0
- package/dist/core/mode-lowering.d.ts +48 -0
- package/dist/core/mode-lowering.d.ts.map +1 -0
- package/dist/core/mode-lowering.js +176 -0
- package/dist/core/mode-lowering.js.map +1 -0
- package/dist/core/numeric.d.ts +16 -0
- package/dist/core/numeric.d.ts.map +1 -0
- package/dist/core/numeric.js +37 -0
- package/dist/core/numeric.js.map +1 -0
- package/dist/core/render/differ.d.ts.map +1 -1
- package/dist/core/render/differ.js +15 -13
- package/dist/core/render/differ.js.map +1 -1
- package/dist/core/runtime-viewport.d.ts.map +1 -1
- package/dist/core/runtime-viewport.js +2 -3
- package/dist/core/runtime-viewport.js.map +1 -1
- package/dist/core/schema-block.d.ts +63 -0
- package/dist/core/schema-block.d.ts.map +1 -0
- package/dist/core/schema-block.js +361 -0
- package/dist/core/schema-block.js.map +1 -0
- package/dist/core/selection.d.ts +127 -0
- package/dist/core/selection.d.ts.map +1 -0
- package/dist/core/selection.js +350 -0
- package/dist/core/selection.js.map +1 -0
- package/dist/core/standard-blocks.d.ts +264 -0
- package/dist/core/standard-blocks.d.ts.map +1 -0
- package/dist/core/standard-blocks.js +2518 -0
- package/dist/core/standard-blocks.js.map +1 -0
- package/dist/core/story-capture.d.ts +48 -0
- package/dist/core/story-capture.d.ts.map +1 -0
- package/dist/core/story-capture.js +64 -0
- package/dist/core/story-capture.js.map +1 -0
- package/dist/core/text/grapheme.d.ts +51 -0
- package/dist/core/text/grapheme.d.ts.map +1 -1
- package/dist/core/text/grapheme.js +68 -0
- package/dist/core/text/grapheme.js.map +1 -1
- package/dist/core/text/icon-presentation.d.ts +10 -0
- package/dist/core/text/icon-presentation.d.ts.map +1 -0
- package/dist/core/text/icon-presentation.js +12 -0
- package/dist/core/text/icon-presentation.js.map +1 -0
- package/dist/core/text/index.d.ts +2 -1
- package/dist/core/text/index.d.ts.map +1 -1
- package/dist/core/text/index.js +2 -1
- package/dist/core/text/index.js.map +1 -1
- package/dist/core/text/wrap.d.ts.map +1 -1
- package/dist/core/text/wrap.js +37 -20
- package/dist/core/text/wrap.js.map +1 -1
- package/dist/core/theme/color.d.ts +32 -0
- package/dist/core/theme/color.d.ts.map +1 -1
- package/dist/core/theme/color.js +68 -0
- package/dist/core/theme/color.js.map +1 -1
- package/dist/core/theme/doctor.d.ts +37 -0
- package/dist/core/theme/doctor.d.ts.map +1 -0
- package/dist/core/theme/doctor.js +175 -0
- package/dist/core/theme/doctor.js.map +1 -0
- package/dist/core/theme/dtcg.d.ts.map +1 -1
- package/dist/core/theme/dtcg.js +10 -1
- package/dist/core/theme/dtcg.js.map +1 -1
- package/dist/core/theme/graph-types.d.ts +5 -0
- package/dist/core/theme/graph-types.d.ts.map +1 -1
- package/dist/core/theme/graph.d.ts.map +1 -1
- package/dist/core/theme/graph.js +52 -5
- package/dist/core/theme/graph.js.map +1 -1
- package/dist/core/theme/index.d.ts +4 -1
- package/dist/core/theme/index.d.ts.map +1 -1
- package/dist/core/theme/index.js +3 -1
- package/dist/core/theme/index.js.map +1 -1
- package/dist/core/theme/presets.d.ts +3 -2
- package/dist/core/theme/presets.d.ts.map +1 -1
- package/dist/core/theme/presets.js +22 -29
- package/dist/core/theme/presets.js.map +1 -1
- package/dist/core/theme/tokens.d.ts +1 -1
- package/dist/core/theme/tokens.d.ts.map +1 -1
- package/dist/factory.d.ts +3 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +4 -6
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +23 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -6
- package/dist/index.js.map +1 -1
- package/dist/ports/context.d.ts +6 -1
- package/dist/ports/context.d.ts.map +1 -1
- package/dist/ports/surface.d.ts +6 -4
- package/dist/ports/surface.d.ts.map +1 -1
- package/dist/ports/surface.js +40 -23
- package/dist/ports/surface.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { sanitizeNonNegativeInt } from '../numeric.js';
|
|
2
|
+
export function solveSplitPaneRects(options) {
|
|
3
|
+
const direction = options.direction ?? 'row';
|
|
4
|
+
const width = sanitizeNonNegativeInt(options.width, 0);
|
|
5
|
+
const height = sanitizeNonNegativeInt(options.height, 0);
|
|
6
|
+
const dividerSize = sanitizeNonNegativeInt(options.dividerSize, 1);
|
|
7
|
+
if (direction === 'row') {
|
|
8
|
+
const available = Math.max(0, width - dividerSize);
|
|
9
|
+
const { paneA: a, paneB: b } = solveSplitAxisSizes({
|
|
10
|
+
available,
|
|
11
|
+
ratio: options.ratio,
|
|
12
|
+
minA: options.minA,
|
|
13
|
+
minB: options.minB,
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
paneA: { x: 0, y: 0, width: a, height },
|
|
17
|
+
divider: { x: a, y: 0, width: dividerSize, height },
|
|
18
|
+
paneB: { x: a + dividerSize, y: 0, width: b, height },
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const available = Math.max(0, height - dividerSize);
|
|
22
|
+
const { paneA: a, paneB: b } = solveSplitAxisSizes({
|
|
23
|
+
available,
|
|
24
|
+
ratio: options.ratio,
|
|
25
|
+
minA: options.minA,
|
|
26
|
+
minB: options.minB,
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
paneA: { x: 0, y: 0, width, height: a },
|
|
30
|
+
divider: { x: 0, y: a, width, height: dividerSize },
|
|
31
|
+
paneB: { x: 0, y: a + dividerSize, width, height: b },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function solveSplitAxisSizes(options) {
|
|
35
|
+
const available = sanitizeNonNegativeInt(options.available, 0);
|
|
36
|
+
const minA = sanitizeNonNegativeInt(options.minA, 0);
|
|
37
|
+
const minB = sanitizeNonNegativeInt(options.minB, 0);
|
|
38
|
+
const [paneA, paneB] = solveSplitAxis(available, options.ratio, minA, minB);
|
|
39
|
+
return { paneA, paneB };
|
|
40
|
+
}
|
|
41
|
+
export function solveGridRects(options) {
|
|
42
|
+
const width = sanitizeNonNegativeInt(options.width, 0);
|
|
43
|
+
const height = sanitizeNonNegativeInt(options.height, 0);
|
|
44
|
+
const gap = sanitizeNonNegativeInt(options.gap, 0);
|
|
45
|
+
if (options.columns.length === 0 || options.rows.length === 0) {
|
|
46
|
+
throw new Error('solveGridRects: columns and rows must be non-empty');
|
|
47
|
+
}
|
|
48
|
+
if (options.areas.length !== options.rows.length) {
|
|
49
|
+
throw new Error(`solveGridRects: areas row count (${options.areas.length}) must match rows track count (${options.rows.length})`);
|
|
50
|
+
}
|
|
51
|
+
const matrix = options.areas.map((row, rowIndex) => {
|
|
52
|
+
const tokens = row.trim().length === 0 ? [] : row.trim().split(/\s+/);
|
|
53
|
+
if (tokens.length !== options.columns.length) {
|
|
54
|
+
throw new Error(`solveGridRects: area row ${rowIndex} has ${tokens.length} columns, expected ${options.columns.length}`);
|
|
55
|
+
}
|
|
56
|
+
return tokens;
|
|
57
|
+
});
|
|
58
|
+
const colSizes = solveTracks(width, options.columns, gap);
|
|
59
|
+
const rowSizes = solveTracks(height, options.rows, gap);
|
|
60
|
+
const colStarts = trackStarts(colSizes, gap);
|
|
61
|
+
const rowStarts = trackStarts(rowSizes, gap);
|
|
62
|
+
const areaCells = new Map();
|
|
63
|
+
for (let rowIndex = 0; rowIndex < matrix.length; rowIndex++) {
|
|
64
|
+
for (let colIndex = 0; colIndex < matrix[rowIndex].length; colIndex++) {
|
|
65
|
+
const area = matrix[rowIndex][colIndex];
|
|
66
|
+
if (area === '.')
|
|
67
|
+
continue;
|
|
68
|
+
const cells = areaCells.get(area) ?? [];
|
|
69
|
+
cells.push({ row: rowIndex, col: colIndex });
|
|
70
|
+
areaCells.set(area, cells);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const rects = new Map();
|
|
74
|
+
for (const [name, cells] of areaCells) {
|
|
75
|
+
const rows = cells.map((cell) => cell.row);
|
|
76
|
+
const cols = cells.map((cell) => cell.col);
|
|
77
|
+
const minRow = Math.min(...rows);
|
|
78
|
+
const maxRow = Math.max(...rows);
|
|
79
|
+
const minCol = Math.min(...cols);
|
|
80
|
+
const maxCol = Math.max(...cols);
|
|
81
|
+
for (let rowIndex = minRow; rowIndex <= maxRow; rowIndex++) {
|
|
82
|
+
for (let colIndex = minCol; colIndex <= maxCol; colIndex++) {
|
|
83
|
+
if (matrix[rowIndex][colIndex] !== name) {
|
|
84
|
+
throw new Error(`solveGridRects: area "${name}" must form a contiguous rectangle; gap at row ${rowIndex}, column ${colIndex}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const colSpan = maxCol - minCol + 1;
|
|
89
|
+
const rowSpan = maxRow - minRow + 1;
|
|
90
|
+
const rectWidth = Math.min(width, sum(colSizes.slice(minCol, maxCol + 1)) + gap * Math.max(0, colSpan - 1));
|
|
91
|
+
const rectHeight = Math.min(height, sum(rowSizes.slice(minRow, maxRow + 1)) + gap * Math.max(0, rowSpan - 1));
|
|
92
|
+
rects.set(name, {
|
|
93
|
+
x: colStarts[minCol] ?? 0,
|
|
94
|
+
y: rowStarts[minRow] ?? 0,
|
|
95
|
+
width: rectWidth,
|
|
96
|
+
height: rectHeight,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return rects;
|
|
100
|
+
}
|
|
101
|
+
function solveSplitAxis(available, ratio, minA, minB) {
|
|
102
|
+
if (available <= 0)
|
|
103
|
+
return [0, 0];
|
|
104
|
+
const maxAFromMinB = Math.max(0, available - Math.min(minB, available));
|
|
105
|
+
const clampedMinA = Math.min(minA, maxAFromMinB);
|
|
106
|
+
let desiredA = Math.round(clampRatio(ratio) * available);
|
|
107
|
+
desiredA = clamp(desiredA, clampedMinA, maxAFromMinB);
|
|
108
|
+
const desiredB = available - desiredA;
|
|
109
|
+
if (desiredB < Math.min(minB, available)) {
|
|
110
|
+
desiredA = Math.max(clampedMinA, available - Math.min(minB, available));
|
|
111
|
+
}
|
|
112
|
+
const a = clamp(desiredA, 0, available);
|
|
113
|
+
const b = Math.max(0, available - a);
|
|
114
|
+
return [a, b];
|
|
115
|
+
}
|
|
116
|
+
function solveTracks(total, tracks, gap) {
|
|
117
|
+
const available = Math.max(0, total - gap * Math.max(0, tracks.length - 1));
|
|
118
|
+
const sizes = new Array(tracks.length).fill(0);
|
|
119
|
+
let fixed = 0;
|
|
120
|
+
let frTotal = 0;
|
|
121
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
122
|
+
const track = tracks[i];
|
|
123
|
+
if (typeof track === 'number') {
|
|
124
|
+
const size = Math.max(0, Math.floor(track));
|
|
125
|
+
sizes[i] = size;
|
|
126
|
+
fixed += size;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
frTotal += parseFr(track);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (fixed > available) {
|
|
133
|
+
let remainingBudget = available;
|
|
134
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
135
|
+
if (typeof tracks[i] !== 'number')
|
|
136
|
+
continue;
|
|
137
|
+
const next = Math.min(sizes[i] ?? 0, remainingBudget);
|
|
138
|
+
sizes[i] = next;
|
|
139
|
+
remainingBudget -= next;
|
|
140
|
+
if (remainingBudget <= 0)
|
|
141
|
+
remainingBudget = 0;
|
|
142
|
+
}
|
|
143
|
+
return sizes.map((size) => Math.max(0, size));
|
|
144
|
+
}
|
|
145
|
+
const remaining = Math.max(0, available - fixed);
|
|
146
|
+
if (frTotal > 0) {
|
|
147
|
+
let assigned = 0;
|
|
148
|
+
const fractionalShares = [];
|
|
149
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
150
|
+
const track = tracks[i];
|
|
151
|
+
if (typeof track === 'number')
|
|
152
|
+
continue;
|
|
153
|
+
const fr = parseFr(track);
|
|
154
|
+
const rawShare = (remaining * fr) / frTotal;
|
|
155
|
+
const size = Math.floor(rawShare);
|
|
156
|
+
sizes[i] = size;
|
|
157
|
+
assigned += size;
|
|
158
|
+
fractionalShares.push({ index: i, remainder: rawShare - size });
|
|
159
|
+
}
|
|
160
|
+
let leftover = remaining - assigned;
|
|
161
|
+
fractionalShares.sort((left, right) => right.remainder - left.remainder || left.index - right.index);
|
|
162
|
+
for (let i = 0; i < fractionalShares.length && leftover > 0; i++) {
|
|
163
|
+
const index = fractionalShares[i].index;
|
|
164
|
+
sizes[index] = (sizes[index] ?? 0) + 1;
|
|
165
|
+
leftover -= 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return sizes.map((size) => Math.max(0, size));
|
|
169
|
+
}
|
|
170
|
+
function parseFr(track) {
|
|
171
|
+
const raw = track.slice(0, -2);
|
|
172
|
+
const parsed = Number(raw);
|
|
173
|
+
if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
|
|
174
|
+
throw new Error(`solveGridRects: invalid fr track "${track}"`);
|
|
175
|
+
}
|
|
176
|
+
return parsed;
|
|
177
|
+
}
|
|
178
|
+
function trackStarts(sizes, gap) {
|
|
179
|
+
const starts = [];
|
|
180
|
+
let cursor = 0;
|
|
181
|
+
for (let i = 0; i < sizes.length; i++) {
|
|
182
|
+
starts.push(cursor);
|
|
183
|
+
cursor += sizes[i] + (i < sizes.length - 1 ? gap : 0);
|
|
184
|
+
}
|
|
185
|
+
return starts;
|
|
186
|
+
}
|
|
187
|
+
function sum(values) {
|
|
188
|
+
let acc = 0;
|
|
189
|
+
for (const value of values)
|
|
190
|
+
acc += value;
|
|
191
|
+
return acc;
|
|
192
|
+
}
|
|
193
|
+
function clampRatio(value) {
|
|
194
|
+
if (!Number.isFinite(value))
|
|
195
|
+
return 0.5;
|
|
196
|
+
return Math.max(0, Math.min(1, value));
|
|
197
|
+
}
|
|
198
|
+
function clamp(value, min, max) {
|
|
199
|
+
return Math.max(min, Math.min(max, value));
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../src/core/layout/geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { OutputMode } from './detect/tty.js';
|
|
2
|
+
export type ModeLoweringFactKind = 'entity' | 'edge' | 'count' | 'label' | 'state' | 'custom';
|
|
3
|
+
export type ModeLoweringFactValue = string | number | boolean;
|
|
4
|
+
export interface ModeLoweringFact {
|
|
5
|
+
readonly kind: ModeLoweringFactKind;
|
|
6
|
+
readonly key: string;
|
|
7
|
+
readonly value?: ModeLoweringFactValue;
|
|
8
|
+
readonly label?: string;
|
|
9
|
+
readonly required?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ModeLoweringModeFacts {
|
|
12
|
+
readonly mode: OutputMode;
|
|
13
|
+
readonly facts: readonly ModeLoweringFact[];
|
|
14
|
+
}
|
|
15
|
+
export type ModeLoweringSeverity = 'warning' | 'error';
|
|
16
|
+
export type ModeLoweringIssueKind = 'missing-required-fact' | 'mismatched-fact-value' | 'duplicate-fact' | 'custom-assertion-failed';
|
|
17
|
+
export interface ModeLoweringIssue {
|
|
18
|
+
readonly kind: ModeLoweringIssueKind;
|
|
19
|
+
readonly severity: ModeLoweringSeverity;
|
|
20
|
+
readonly mode?: OutputMode;
|
|
21
|
+
readonly baselineMode?: OutputMode;
|
|
22
|
+
readonly factKind?: ModeLoweringFactKind;
|
|
23
|
+
readonly key?: string;
|
|
24
|
+
readonly expected?: ModeLoweringFactValue;
|
|
25
|
+
readonly actual?: ModeLoweringFactValue;
|
|
26
|
+
readonly message: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ModeLoweringAssertionResult {
|
|
29
|
+
readonly passed: boolean;
|
|
30
|
+
readonly message: string;
|
|
31
|
+
readonly mode?: OutputMode;
|
|
32
|
+
readonly key?: string;
|
|
33
|
+
readonly severity?: ModeLoweringSeverity;
|
|
34
|
+
}
|
|
35
|
+
export interface ModeLoweringOptions {
|
|
36
|
+
readonly baselineMode?: OutputMode;
|
|
37
|
+
readonly modes: readonly ModeLoweringModeFacts[];
|
|
38
|
+
readonly assertions?: readonly ModeLoweringAssertionResult[];
|
|
39
|
+
}
|
|
40
|
+
export interface ModeLoweringReport {
|
|
41
|
+
readonly baselineMode: OutputMode;
|
|
42
|
+
readonly checkedModes: readonly OutputMode[];
|
|
43
|
+
readonly issues: readonly ModeLoweringIssue[];
|
|
44
|
+
readonly passed: boolean;
|
|
45
|
+
}
|
|
46
|
+
export declare function lintModeLowering(options: ModeLoweringOptions): ModeLoweringReport;
|
|
47
|
+
export declare function modeLoweringReportText(report: ModeLoweringReport): string;
|
|
48
|
+
//# sourceMappingURL=mode-lowering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-lowering.d.ts","sourceRoot":"","sources":["../../src/core/mode-lowering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC7C;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvD,MAAM,MAAM,qBAAqB,GAC7B,uBAAuB,GACvB,uBAAuB,GACvB,gBAAgB,GAChB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAC1C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC9D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAQD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAgDjF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiBzE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
const DEFAULT_BASELINE_MODE = 'interactive';
|
|
2
|
+
const MODE_ORDER = ['interactive', 'static', 'pipe', 'accessible'];
|
|
3
|
+
const FACT_SEPARATOR = ':';
|
|
4
|
+
const LIST_SEPARATOR = ',';
|
|
5
|
+
const EMPTY_LABEL = '-';
|
|
6
|
+
export function lintModeLowering(options) {
|
|
7
|
+
const modes = [...options.modes].sort(compareModeFacts);
|
|
8
|
+
const modeNames = modes.map((modeFacts) => modeFacts.mode);
|
|
9
|
+
const modeFactsByMode = new Map();
|
|
10
|
+
for (const modeFacts of modes) {
|
|
11
|
+
modeFactsByMode.set(modeFacts.mode, modeFacts);
|
|
12
|
+
}
|
|
13
|
+
const baselineMode = resolveBaselineMode(options.baselineMode, modeFactsByMode, modes);
|
|
14
|
+
const baselineFacts = modeFactsByMode.get(baselineMode)?.facts ?? [];
|
|
15
|
+
const issues = [];
|
|
16
|
+
for (const modeFacts of modes) {
|
|
17
|
+
issues.push(...duplicateFactIssues(modeFacts));
|
|
18
|
+
}
|
|
19
|
+
for (const modeFacts of modes) {
|
|
20
|
+
if (modeFacts.mode === baselineMode) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
issues.push(...compareAgainstBaseline({
|
|
24
|
+
baselineMode,
|
|
25
|
+
baselineFacts,
|
|
26
|
+
modeFacts,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
for (const assertion of options.assertions ?? []) {
|
|
30
|
+
if (assertion.passed) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
issues.push({
|
|
34
|
+
kind: 'custom-assertion-failed',
|
|
35
|
+
severity: assertion.severity ?? 'error',
|
|
36
|
+
mode: assertion.mode,
|
|
37
|
+
key: assertion.key,
|
|
38
|
+
message: assertion.message,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
baselineMode,
|
|
43
|
+
checkedModes: modeNames,
|
|
44
|
+
issues,
|
|
45
|
+
passed: issues.length === 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function modeLoweringReportText(report) {
|
|
49
|
+
const status = report.passed ? 'passed' : 'failed';
|
|
50
|
+
const checked = report.checkedModes.length === 0
|
|
51
|
+
? EMPTY_LABEL
|
|
52
|
+
: report.checkedModes.join(LIST_SEPARATOR);
|
|
53
|
+
const lines = [`mode lowering: ${status} baseline=${report.baselineMode} checked=${checked}`];
|
|
54
|
+
if (report.issues.length === 0) {
|
|
55
|
+
return lines.join('\n');
|
|
56
|
+
}
|
|
57
|
+
lines.push('issues:');
|
|
58
|
+
for (const issue of report.issues) {
|
|
59
|
+
lines.push(`- ${issue.severity} ${issue.kind}${issueModeText(issue)}${issueFactText(issue)}: ${issue.message}`);
|
|
60
|
+
}
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
function compareAgainstBaseline(options) {
|
|
64
|
+
const issues = [];
|
|
65
|
+
const factsByIdentity = firstFactsByIdentity(options.modeFacts.facts);
|
|
66
|
+
for (const baselineFact of options.baselineFacts) {
|
|
67
|
+
if (baselineFact.required === false) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const candidate = factsByIdentity.get(factIdentity(baselineFact));
|
|
71
|
+
if (candidate === undefined) {
|
|
72
|
+
issues.push(missingFactIssue(options.baselineMode, options.modeFacts.mode, baselineFact));
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (factValueDiffers(baselineFact, candidate)) {
|
|
76
|
+
issues.push(mismatchedFactIssue(options.baselineMode, options.modeFacts.mode, baselineFact, candidate));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return issues;
|
|
80
|
+
}
|
|
81
|
+
function duplicateFactIssues(modeFacts) {
|
|
82
|
+
const seenIdentities = new Set();
|
|
83
|
+
const duplicateIdentities = new Set();
|
|
84
|
+
const issues = [];
|
|
85
|
+
for (const fact of modeFacts.facts) {
|
|
86
|
+
const identity = factIdentity(fact);
|
|
87
|
+
if (!seenIdentities.has(identity)) {
|
|
88
|
+
seenIdentities.add(identity);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (duplicateIdentities.has(identity)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
duplicateIdentities.add(identity);
|
|
95
|
+
issues.push({
|
|
96
|
+
kind: 'duplicate-fact',
|
|
97
|
+
severity: 'warning',
|
|
98
|
+
mode: modeFacts.mode,
|
|
99
|
+
factKind: fact.kind,
|
|
100
|
+
key: fact.key,
|
|
101
|
+
message: `${modeFacts.mode} has duplicate ${fact.kind} ${fact.key}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return issues;
|
|
105
|
+
}
|
|
106
|
+
function missingFactIssue(baselineMode, mode, fact) {
|
|
107
|
+
return {
|
|
108
|
+
kind: 'missing-required-fact',
|
|
109
|
+
severity: 'error',
|
|
110
|
+
mode,
|
|
111
|
+
baselineMode,
|
|
112
|
+
factKind: fact.kind,
|
|
113
|
+
key: fact.key,
|
|
114
|
+
message: `${mode} is missing required ${fact.kind} ${fact.key} from ${baselineMode}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function mismatchedFactIssue(baselineMode, mode, expected, actual) {
|
|
118
|
+
return {
|
|
119
|
+
kind: 'mismatched-fact-value',
|
|
120
|
+
severity: 'error',
|
|
121
|
+
mode,
|
|
122
|
+
baselineMode,
|
|
123
|
+
factKind: expected.kind,
|
|
124
|
+
key: expected.key,
|
|
125
|
+
expected: expected.value,
|
|
126
|
+
actual: actual.value,
|
|
127
|
+
message: `${mode} ${expected.kind} ${expected.key} differs from ${baselineMode}: expected ${formatFactValue(expected.value)}, got ${formatFactValue(actual.value)}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function firstFactsByIdentity(facts) {
|
|
131
|
+
const factsByIdentity = new Map();
|
|
132
|
+
for (const fact of facts) {
|
|
133
|
+
const identity = factIdentity(fact);
|
|
134
|
+
if (!factsByIdentity.has(identity)) {
|
|
135
|
+
factsByIdentity.set(identity, fact);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return factsByIdentity;
|
|
139
|
+
}
|
|
140
|
+
function factIdentity(fact) {
|
|
141
|
+
return `${fact.kind}${FACT_SEPARATOR}${fact.key}`;
|
|
142
|
+
}
|
|
143
|
+
function factValueDiffers(expected, actual) {
|
|
144
|
+
if (expected.value === undefined) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return expected.value !== actual.value;
|
|
148
|
+
}
|
|
149
|
+
function resolveBaselineMode(requestedMode, modeFactsByMode, modes) {
|
|
150
|
+
if (requestedMode !== undefined) {
|
|
151
|
+
return requestedMode;
|
|
152
|
+
}
|
|
153
|
+
if (modeFactsByMode.has(DEFAULT_BASELINE_MODE)) {
|
|
154
|
+
return DEFAULT_BASELINE_MODE;
|
|
155
|
+
}
|
|
156
|
+
return modes[0]?.mode ?? DEFAULT_BASELINE_MODE;
|
|
157
|
+
}
|
|
158
|
+
function compareModeFacts(a, b) {
|
|
159
|
+
return modeRank(a.mode) - modeRank(b.mode);
|
|
160
|
+
}
|
|
161
|
+
function modeRank(mode) {
|
|
162
|
+
return MODE_ORDER.indexOf(mode);
|
|
163
|
+
}
|
|
164
|
+
function issueModeText(issue) {
|
|
165
|
+
return issue.mode === undefined ? '' : ` mode=${issue.mode}`;
|
|
166
|
+
}
|
|
167
|
+
function issueFactText(issue) {
|
|
168
|
+
if (issue.factKind === undefined || issue.key === undefined) {
|
|
169
|
+
return '';
|
|
170
|
+
}
|
|
171
|
+
return ` fact=${issue.factKind}${FACT_SEPARATOR}${issue.key}`;
|
|
172
|
+
}
|
|
173
|
+
function formatFactValue(value) {
|
|
174
|
+
return value === undefined ? EMPTY_LABEL : String(value);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=mode-lowering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-lowering.js","sourceRoot":"","sources":["../../src/core/mode-lowering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared numeric sanitizers for user-facing option boundaries.
|
|
3
|
+
*
|
|
4
|
+
* Bijou internals want whole, finite numbers. These helpers normalize
|
|
5
|
+
* nullish, non-finite, negative, and fractional inputs at the boundary so
|
|
6
|
+
* components do not each reinvent slightly different guards.
|
|
7
|
+
*/
|
|
8
|
+
/** Clamp to a finite whole number greater than or equal to zero. */
|
|
9
|
+
export declare function sanitizeNonNegativeInt(value: number | undefined, fallback?: number): number;
|
|
10
|
+
/** Clamp to a finite whole number greater than or equal to one. */
|
|
11
|
+
export declare function sanitizePositiveInt(value: number | undefined, fallback?: number): number;
|
|
12
|
+
/** Normalize an optional finite whole number greater than or equal to zero. */
|
|
13
|
+
export declare function sanitizeOptionalNonNegativeInt(value: number | undefined): number | undefined;
|
|
14
|
+
/** Normalize an optional finite whole number greater than or equal to one. */
|
|
15
|
+
export declare function sanitizeOptionalPositiveInt(value: number | undefined): number | undefined;
|
|
16
|
+
//# sourceMappingURL=numeric.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric.d.ts","sourceRoot":"","sources":["../../src/core/numeric.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,SAAI,GAAG,MAAM,CAEtF;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,SAAI,GAAG,MAAM,CAEnF;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG5F;AAED,8EAA8E;AAC9E,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGzF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared numeric sanitizers for user-facing option boundaries.
|
|
3
|
+
*
|
|
4
|
+
* Bijou internals want whole, finite numbers. These helpers normalize
|
|
5
|
+
* nullish, non-finite, negative, and fractional inputs at the boundary so
|
|
6
|
+
* components do not each reinvent slightly different guards.
|
|
7
|
+
*/
|
|
8
|
+
function normalizeFiniteInt(value) {
|
|
9
|
+
if (value == null || !Number.isFinite(value))
|
|
10
|
+
return undefined;
|
|
11
|
+
return Math.floor(value);
|
|
12
|
+
}
|
|
13
|
+
function sanitizeInt(value, fallback, min) {
|
|
14
|
+
const safeMin = normalizeFiniteInt(min) ?? 0;
|
|
15
|
+
const safeFallback = Math.max(safeMin, normalizeFiniteInt(fallback) ?? safeMin);
|
|
16
|
+
const safeValue = normalizeFiniteInt(value);
|
|
17
|
+
return safeValue == null ? safeFallback : Math.max(safeMin, safeValue);
|
|
18
|
+
}
|
|
19
|
+
/** Clamp to a finite whole number greater than or equal to zero. */
|
|
20
|
+
export function sanitizeNonNegativeInt(value, fallback = 0) {
|
|
21
|
+
return sanitizeInt(value, fallback, 0);
|
|
22
|
+
}
|
|
23
|
+
/** Clamp to a finite whole number greater than or equal to one. */
|
|
24
|
+
export function sanitizePositiveInt(value, fallback = 1) {
|
|
25
|
+
return sanitizeInt(value, fallback, 1);
|
|
26
|
+
}
|
|
27
|
+
/** Normalize an optional finite whole number greater than or equal to zero. */
|
|
28
|
+
export function sanitizeOptionalNonNegativeInt(value) {
|
|
29
|
+
const safeValue = normalizeFiniteInt(value);
|
|
30
|
+
return safeValue == null ? undefined : Math.max(0, safeValue);
|
|
31
|
+
}
|
|
32
|
+
/** Normalize an optional finite whole number greater than or equal to one. */
|
|
33
|
+
export function sanitizeOptionalPositiveInt(value) {
|
|
34
|
+
const safeValue = normalizeFiniteInt(value);
|
|
35
|
+
return safeValue == null ? undefined : Math.max(1, safeValue);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=numeric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric.js","sourceRoot":"","sources":["../../src/core/numeric.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,SAAS,kBAAkB,CAAC,KAAyB;IACnD,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB,EAAE,QAAgB,EAAE,GAAW;IAC3E,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACzE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CAAC,KAAyB,EAAE,QAAQ,GAAG,CAAC;IAC5E,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAE,QAAQ,GAAG,CAAC;IACzE,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B,CAAC,KAAyB;IACtE,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,2BAA2B,CAAC,KAAyB;IACnE,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../../src/core/render/differ.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../../src/core/render/differ.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,OAAO,EAAsB,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACtI,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAuBjE;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAgBpF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAyFvF;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAgB1E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAQvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAkBpD;AAUD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,OAAO,EACf,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,UAAU,GAClB,IAAI,CAON"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { createSurface } from '../../ports/surface.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { createSurface, isPackedSurface } from '../../ports/surface.js';
|
|
2
|
+
import { colorHex, colorRgb } from '../theme/color.js';
|
|
3
|
+
import { ANSI_OSC8_RE, graphemeClusterWidth, sanitizeTerminalText, segmentGraphemes } from '../text/index.js';
|
|
4
|
+
import { CELL_STRIDE, OFF_FG_R, OFF_BG_R, OFF_BG_G, OFF_BG_B, FLAG_BOLD, FLAG_DIM, FLAG_STRIKETHROUGH, FLAG_INVERSE, FLAG_FG_SET, FLAG_BG_SET, FLAG_EMPTY, FLAG_DASHED, SIDE_TABLE_THRESHOLD, decodeChar, } from './packed-cell.js';
|
|
4
5
|
const EMPTY_CELL = { char: ' ', empty: true };
|
|
5
6
|
const EMPTY_MODIFIERS = [];
|
|
6
|
-
function isPackedSurface(s) {
|
|
7
|
-
return 'buffer' in s && s.buffer instanceof Uint8Array;
|
|
8
|
-
}
|
|
9
7
|
function hasVisibleStyle(cell) {
|
|
10
8
|
return cell.fg !== undefined
|
|
11
9
|
|| cell.bg !== undefined
|
|
@@ -19,8 +17,8 @@ function hasVisibleStyle(cell) {
|
|
|
19
17
|
*/
|
|
20
18
|
export function stringToSurface(text, width, height) {
|
|
21
19
|
const surface = createSurface(width, height);
|
|
22
|
-
const plainText =
|
|
23
|
-
const lines = plainText.split(
|
|
20
|
+
const plainText = sanitizeTerminalText(text);
|
|
21
|
+
const lines = plainText.split('\n');
|
|
24
22
|
for (let y = 0; y < Math.min(height, lines.length); y++) {
|
|
25
23
|
const line = lines[y];
|
|
26
24
|
const gs = segmentGraphemes(line);
|
|
@@ -38,7 +36,11 @@ export function stringToSurface(text, width, height) {
|
|
|
38
36
|
*/
|
|
39
37
|
export function parseAnsiToSurface(text, width, height) {
|
|
40
38
|
const surface = createSurface(width, height);
|
|
41
|
-
const
|
|
39
|
+
const safeText = sanitizeTerminalText(text, {
|
|
40
|
+
allowAnsiStyling: true,
|
|
41
|
+
allowHyperlinks: true,
|
|
42
|
+
});
|
|
43
|
+
const lines = safeText.replace(ANSI_OSC8_RE, '').split('\n');
|
|
42
44
|
const ANSI_RE = /\x1b\[([0-9;]*)m/g;
|
|
43
45
|
for (let y = 0; y < Math.min(height, lines.length); y++) {
|
|
44
46
|
const line = lines[y];
|
|
@@ -136,14 +138,14 @@ function writeSurfaceGrapheme(surface, x, y, char, style) {
|
|
|
136
138
|
return 0;
|
|
137
139
|
const width = Math.max(1, graphemeClusterWidth(char));
|
|
138
140
|
if (isPackedSurface(surface) && (style?.fg || style?.bg)) {
|
|
139
|
-
const fg = style?.fg
|
|
141
|
+
const fg = colorRgb(style?.fg);
|
|
140
142
|
let fR = -1, fG = 0, fB = 0;
|
|
141
143
|
if (fg) {
|
|
142
144
|
fR = fg[0];
|
|
143
145
|
fG = fg[1];
|
|
144
146
|
fB = fg[2];
|
|
145
147
|
}
|
|
146
|
-
const bg = style?.bg
|
|
148
|
+
const bg = colorRgb(style?.bg);
|
|
147
149
|
let bR = -1, bG = 0, bB = 0;
|
|
148
150
|
if (bg) {
|
|
149
151
|
bR = bg[0];
|
|
@@ -810,8 +812,8 @@ function renderDiffCells(current, target, io, style) {
|
|
|
810
812
|
batchX++;
|
|
811
813
|
}
|
|
812
814
|
if (hasVisibleStyle(targetCell)) {
|
|
813
|
-
token.hex = targetCell.fg;
|
|
814
|
-
token.bg = targetCell.bg;
|
|
815
|
+
token.hex = colorHex(targetCell.fg) ?? token.hex;
|
|
816
|
+
token.bg = colorHex(targetCell.bg);
|
|
815
817
|
token.modifiers = targetCell.modifiers;
|
|
816
818
|
output += style.styled(token, batchText);
|
|
817
819
|
}
|