@flyingrobots/bijou-tui 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 +244 -21
- package/dist/animate.d.ts +4 -0
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +47 -20
- package/dist/animate.js.map +1 -1
- package/dist/app-frame-actions.d.ts.map +1 -1
- package/dist/app-frame-actions.js +55 -0
- package/dist/app-frame-actions.js.map +1 -1
- package/dist/app-frame-i18n.d.ts.map +1 -1
- package/dist/app-frame-i18n.js +51 -0
- package/dist/app-frame-i18n.js.map +1 -1
- package/dist/app-frame-layers.d.ts +11 -1
- package/dist/app-frame-layers.d.ts.map +1 -1
- package/dist/app-frame-layers.js +19 -0
- package/dist/app-frame-layers.js.map +1 -1
- package/dist/app-frame-overlays.d.ts +82 -0
- package/dist/app-frame-overlays.d.ts.map +1 -0
- package/dist/app-frame-overlays.js +480 -0
- package/dist/app-frame-overlays.js.map +1 -0
- package/dist/app-frame-palette.d.ts.map +1 -1
- package/dist/app-frame-palette.js +36 -16
- package/dist/app-frame-palette.js.map +1 -1
- package/dist/app-frame-render.d.ts.map +1 -1
- package/dist/app-frame-render.js +16 -7
- package/dist/app-frame-render.js.map +1 -1
- package/dist/app-frame-types.d.ts +141 -5
- package/dist/app-frame-types.d.ts.map +1 -1
- package/dist/app-frame-types.js +17 -1
- package/dist/app-frame-types.js.map +1 -1
- package/dist/app-frame-utils.d.ts +3 -1
- package/dist/app-frame-utils.d.ts.map +1 -1
- package/dist/app-frame-utils.js +11 -5
- package/dist/app-frame-utils.js.map +1 -1
- package/dist/app-frame.d.ts +22 -86
- package/dist/app-frame.d.ts.map +1 -1
- package/dist/app-frame.js +475 -629
- package/dist/app-frame.js.map +1 -1
- package/dist/browsable-list.d.ts +12 -0
- package/dist/browsable-list.d.ts.map +1 -1
- package/dist/browsable-list.js +17 -6
- package/dist/browsable-list.js.map +1 -1
- package/dist/canvas.d.ts +11 -3
- package/dist/canvas.d.ts.map +1 -1
- package/dist/canvas.js +146 -13
- package/dist/canvas.js.map +1 -1
- package/dist/cell-glyph-fit.d.ts +20 -0
- package/dist/cell-glyph-fit.d.ts.map +1 -0
- package/dist/cell-glyph-fit.js +82 -0
- package/dist/cell-glyph-fit.js.map +1 -0
- package/dist/collection-surface.d.ts +8 -0
- package/dist/collection-surface.d.ts.map +1 -1
- package/dist/collection-surface.js +72 -8
- package/dist/collection-surface.js.map +1 -1
- package/dist/command-palette.d.ts +2 -0
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +36 -19
- package/dist/command-palette.js.map +1 -1
- package/dist/css/text-style.d.ts +2 -0
- package/dist/css/text-style.d.ts.map +1 -1
- package/dist/css/text-style.js +18 -8
- package/dist/css/text-style.js.map +1 -1
- package/dist/debug-overlay.d.ts +19 -0
- package/dist/debug-overlay.d.ts.map +1 -0
- package/dist/debug-overlay.js +25 -0
- package/dist/debug-overlay.js.map +1 -0
- package/dist/design-language.d.ts.map +1 -1
- package/dist/design-language.js +4 -5
- package/dist/design-language.js.map +1 -1
- package/dist/driver.d.ts +102 -0
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +259 -19
- package/dist/driver.js.map +1 -1
- package/dist/eventbus.d.ts +20 -0
- package/dist/eventbus.d.ts.map +1 -1
- package/dist/eventbus.js +47 -0
- package/dist/eventbus.js.map +1 -1
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +2 -2
- package/dist/file-picker.js.map +1 -1
- package/dist/flex.d.ts.map +1 -1
- package/dist/flex.js +6 -6
- package/dist/flex.js.map +1 -1
- package/dist/focus-area.d.ts +13 -4
- package/dist/focus-area.d.ts.map +1 -1
- package/dist/focus-area.js +56 -14
- package/dist/focus-area.js.map +1 -1
- package/dist/focus-map.d.ts +40 -0
- package/dist/focus-map.d.ts.map +1 -0
- package/dist/focus-map.js +133 -0
- package/dist/focus-map.js.map +1 -0
- package/dist/grid.d.ts +2 -2
- package/dist/grid.d.ts.map +1 -1
- package/dist/grid.js +11 -148
- package/dist/grid.js.map +1 -1
- package/dist/help.d.ts +2 -0
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +6 -4
- package/dist/help.js.map +1 -1
- package/dist/icon-presentation.d.ts +10 -0
- package/dist/icon-presentation.d.ts.map +1 -0
- package/dist/icon-presentation.js +12 -0
- package/dist/icon-presentation.js.map +1 -0
- package/dist/index.d.ts +32 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -5
- package/dist/index.js.map +1 -1
- package/dist/input-map.d.ts +68 -0
- package/dist/input-map.d.ts.map +1 -0
- package/dist/input-map.js +162 -0
- package/dist/input-map.js.map +1 -0
- package/dist/input-routing-inspector.d.ts +24 -0
- package/dist/input-routing-inspector.d.ts.map +1 -0
- package/dist/input-routing-inspector.js +76 -0
- package/dist/input-routing-inspector.js.map +1 -0
- package/dist/keybindings.d.ts.map +1 -1
- package/dist/keybindings.js +3 -0
- package/dist/keybindings.js.map +1 -1
- package/dist/layout-inspector.d.ts +31 -0
- package/dist/layout-inspector.d.ts.map +1 -0
- package/dist/layout-inspector.js +133 -0
- package/dist/layout-inspector.js.map +1 -0
- package/dist/layout-preset.d.ts +1 -1
- package/dist/layout-preset.d.ts.map +1 -1
- package/dist/motion/reconciler.d.ts +6 -2
- package/dist/motion/reconciler.d.ts.map +1 -1
- package/dist/motion/reconciler.js +40 -10
- package/dist/motion/reconciler.js.map +1 -1
- package/dist/motion/types.d.ts +3 -1
- package/dist/motion/types.d.ts.map +1 -1
- package/dist/navigable-table.d.ts +9 -10
- package/dist/navigable-table.d.ts.map +1 -1
- package/dist/navigable-table.js +33 -14
- package/dist/navigable-table.js.map +1 -1
- package/dist/notification.d.ts +15 -0
- package/dist/notification.d.ts.map +1 -1
- package/dist/notification.js +136 -34
- package/dist/notification.js.map +1 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +40 -14
- package/dist/overlay.js.map +1 -1
- package/dist/pager.d.ts +3 -1
- package/dist/pager.d.ts.map +1 -1
- package/dist/pager.js +4 -0
- package/dist/pager.js.map +1 -1
- package/dist/pipeline/middleware/grayscale.d.ts.map +1 -1
- package/dist/pipeline/middleware/grayscale.js +5 -5
- package/dist/pipeline/middleware/grayscale.js.map +1 -1
- package/dist/pipeline/middleware/motion.d.ts.map +1 -1
- package/dist/pipeline/middleware/motion.js +4 -3
- package/dist/pipeline/middleware/motion.js.map +1 -1
- package/dist/pipeline/middleware/paint.d.ts.map +1 -1
- package/dist/pipeline/middleware/paint.js +2 -1
- package/dist/pipeline/middleware/paint.js.map +1 -1
- package/dist/pipeline/middleware/surface-shaders.d.ts +37 -0
- package/dist/pipeline/middleware/surface-shaders.d.ts.map +1 -0
- package/dist/pipeline/middleware/surface-shaders.js +164 -0
- package/dist/pipeline/middleware/surface-shaders.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +37 -2
- package/dist/pipeline/pipeline.d.ts.map +1 -1
- package/dist/pipeline/pipeline.js +121 -22
- package/dist/pipeline/pipeline.js.map +1 -1
- package/dist/raytrace.d.ts +59 -0
- package/dist/raytrace.d.ts.map +1 -0
- package/dist/raytrace.js +121 -0
- package/dist/raytrace.js.map +1 -0
- package/dist/runtime-binding.d.ts +59 -0
- package/dist/runtime-binding.d.ts.map +1 -0
- package/dist/runtime-binding.js +271 -0
- package/dist/runtime-binding.js.map +1 -0
- package/dist/runtime.d.ts +19 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +222 -31
- package/dist/runtime.js.map +1 -1
- package/dist/split-pane.d.ts +2 -2
- package/dist/split-pane.d.ts.map +1 -1
- package/dist/split-pane.js +28 -49
- package/dist/split-pane.js.map +1 -1
- package/dist/subapp/mount.d.ts +17 -0
- package/dist/subapp/mount.d.ts.map +1 -1
- package/dist/subapp/mount.js +13 -0
- package/dist/subapp/mount.js.map +1 -1
- package/dist/surface-budget.d.ts +27 -0
- package/dist/surface-budget.d.ts.map +1 -0
- package/dist/surface-budget.js +61 -0
- package/dist/surface-budget.js.map +1 -0
- package/dist/surface-diff.d.ts +36 -0
- package/dist/surface-diff.d.ts.map +1 -0
- package/dist/surface-diff.js +202 -0
- package/dist/surface-diff.js.map +1 -0
- package/dist/surface-layout.d.ts +19 -3
- package/dist/surface-layout.d.ts.map +1 -1
- package/dist/surface-layout.js +42 -12
- package/dist/surface-layout.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/view-output.js +2 -2
- package/dist/view-output.js.map +1 -1
- package/dist/viewport.d.ts +13 -1
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +33 -11
- package/dist/viewport.js.map +1 -1
- package/package.json +4 -4
package/dist/subapp/mount.d.ts
CHANGED
|
@@ -33,6 +33,13 @@ export interface MountedApp<SubMsg> {
|
|
|
33
33
|
*/
|
|
34
34
|
cmds: Cmd<SubMsg>[];
|
|
35
35
|
}
|
|
36
|
+
export type SubAppAdapterCases<ParentMsg, SubMsg extends {
|
|
37
|
+
readonly type: string;
|
|
38
|
+
}> = {
|
|
39
|
+
readonly [K in SubMsg['type']]: (msg: Extract<SubMsg, {
|
|
40
|
+
type: K;
|
|
41
|
+
}>) => ParentMsg;
|
|
42
|
+
};
|
|
36
43
|
/**
|
|
37
44
|
* Mount a sub-app, returning its rendered surface and any pending commands.
|
|
38
45
|
*
|
|
@@ -45,6 +52,16 @@ export interface MountedApp<SubMsg> {
|
|
|
45
52
|
* @returns A tuple of `[Surface | LayoutNode, mapped Cmds]`.
|
|
46
53
|
*/
|
|
47
54
|
export declare function mount<SubModel, SubMsg, ParentMsg>(app: App<SubModel, SubMsg>, options: MountOptions<SubModel, SubMsg, ParentMsg>): [ViewOutput, Cmd<ParentMsg>[]];
|
|
55
|
+
/**
|
|
56
|
+
* Build an exhaustive discriminant-based sub-app message mapper.
|
|
57
|
+
*
|
|
58
|
+
* The returned function matches the `onMsg` signature expected by
|
|
59
|
+
* `initSubApp()`, `updateSubApp()`, and `mount()`, while TypeScript enforces
|
|
60
|
+
* that every `SubMsg['type']` variant is covered up front.
|
|
61
|
+
*/
|
|
62
|
+
export declare function createSubAppAdapter<ParentMsg, SubMsg extends {
|
|
63
|
+
readonly type: string;
|
|
64
|
+
}>(cases: SubAppAdapterCases<ParentMsg, SubMsg>): (msg: SubMsg) => ParentMsg;
|
|
48
65
|
export interface SubAppOptions<SubMsg, ParentMsg> {
|
|
49
66
|
/** Function to map a sub-app message into a parent message. */
|
|
50
67
|
onMsg: (msg: SubMsg) => ParentMsg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/subapp/mount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAc,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS;IACvD,wCAAwC;IACxC,KAAK,EAAE,QAAQ,CAAC;IAChB,+DAA+D;IAC/D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM;IAChC,0DAA0D;IAC1D,aAAa,EAAE,UAAU,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAC/C,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,GACjD,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAMhC;AAED,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,SAAS;IAC9C,+DAA+D;IAC/D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;CAC/C;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EACpD,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,GACxC,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAG9B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EACtD,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,GACxC,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAG9B;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,EACvC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EACnB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GACjC,GAAG,CAAC,SAAS,CAAC,EAAE,CAElB"}
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/subapp/mount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAc,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS;IACvD,wCAAwC;IACxC,KAAK,EAAE,QAAQ,CAAC;IAChB,+DAA+D;IAC/D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM;IAChC,0DAA0D;IAC1D,aAAa,EAAE,UAAU,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,CAAC,SAAS,EAAE,MAAM,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,IAAI;IACpF,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,KAAK,SAAS;CACjF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAC/C,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,GACjD,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAMhC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACrF,KAAK,EAAE,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,GAC3C,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAK5B;AAED,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,SAAS;IAC9C,+DAA+D;IAC/D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;CAC/C;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EACpD,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,GACxC,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAG9B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EACtD,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,GACxC,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAG9B;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,EACvC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EACnB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GACjC,GAAG,CAAC,SAAS,CAAC,EAAE,CAElB"}
|
package/dist/subapp/mount.js
CHANGED
|
@@ -15,6 +15,19 @@ export function mount(app, options) {
|
|
|
15
15
|
const surfaceOrNode = app.view(model);
|
|
16
16
|
return [surfaceOrNode, []];
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Build an exhaustive discriminant-based sub-app message mapper.
|
|
20
|
+
*
|
|
21
|
+
* The returned function matches the `onMsg` signature expected by
|
|
22
|
+
* `initSubApp()`, `updateSubApp()`, and `mount()`, while TypeScript enforces
|
|
23
|
+
* that every `SubMsg['type']` variant is covered up front.
|
|
24
|
+
*/
|
|
25
|
+
export function createSubAppAdapter(cases) {
|
|
26
|
+
return (msg) => {
|
|
27
|
+
const handler = cases[msg.type];
|
|
28
|
+
return handler(msg);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
18
31
|
export function initSubApp(app, options) {
|
|
19
32
|
const [model, cmds] = app.init();
|
|
20
33
|
return [model, mapSubAppCmds(cmds, options)];
|
package/dist/subapp/mount.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/subapp/mount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/subapp/mount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0C3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CACnB,GAA0B,EAC1B,OAAkD;IAElD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA4C;IAE5C,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAmD,CAA+B,CAAC;QAC7G,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,UAAU,CACxB,GAA0B,EAC1B,OAAyC;IAEzC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,GAA0B,EAC1B,GAAW,EACX,KAAe,EACf,OAAyC;IAEzC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CACrB,IAAmB,EACnB,MAAkC;IAElC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CACpB,IAAmB,EACnB,OAAyC;IAEzC,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,GAAgB,EAChB,MAAkC;IAElC,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC1B,8DAA8D;QAC9D,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,sDAAsD;QACtD,6CAA6C;QAC7C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAoB,CAAC,CAAC,OAAO;QACpE,IAAI,YAAY,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACxC,OAAO,MAAM,CAAC,MAAgB,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Surface } from '@flyingrobots/bijou';
|
|
2
|
+
import { type RenderStage, type RenderStageTiming } from './pipeline/pipeline.js';
|
|
3
|
+
export type SurfaceBudgetMetric = 'surface-width' | 'surface-height' | 'surface-area' | 'styled-cells' | 'frame-duration' | 'stage-duration';
|
|
4
|
+
export interface SurfaceBudgetThresholds {
|
|
5
|
+
readonly maxWidth?: number;
|
|
6
|
+
readonly maxHeight?: number;
|
|
7
|
+
readonly maxArea?: number;
|
|
8
|
+
readonly maxStyledCells?: number;
|
|
9
|
+
readonly maxFrameDurationMs?: number;
|
|
10
|
+
readonly maxStageDurationMs?: Partial<Record<RenderStage, number>>;
|
|
11
|
+
}
|
|
12
|
+
export interface EvaluateSurfaceBudgetOptions {
|
|
13
|
+
readonly surface: Surface;
|
|
14
|
+
readonly thresholds: SurfaceBudgetThresholds;
|
|
15
|
+
readonly timings?: readonly RenderStageTiming[];
|
|
16
|
+
readonly label?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SurfaceBudgetWarning {
|
|
19
|
+
readonly label: string;
|
|
20
|
+
readonly metric: SurfaceBudgetMetric;
|
|
21
|
+
readonly actual: number;
|
|
22
|
+
readonly limit: number;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
readonly stage?: RenderStage;
|
|
25
|
+
}
|
|
26
|
+
export declare function evaluateSurfaceBudget(options: EvaluateSurfaceBudgetOptions): readonly SurfaceBudgetWarning[];
|
|
27
|
+
//# sourceMappingURL=surface-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-budget.d.ts","sourceRoot":"","sources":["../src/surface-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B;AAOD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,SAAS,oBAAoB,EAAE,CAgDjC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const DEFAULT_SURFACE_BUDGET_LABEL = 'surface';
|
|
2
|
+
const MILLISECOND_UNIT = 'ms';
|
|
3
|
+
const HUNDREDTHS = 100;
|
|
4
|
+
const OPAQUE_OPACITY = 1;
|
|
5
|
+
export function evaluateSurfaceBudget(options) {
|
|
6
|
+
const { surface, thresholds, timings = [], label = DEFAULT_SURFACE_BUDGET_LABEL } = options;
|
|
7
|
+
const warnings = [];
|
|
8
|
+
pushBudgetWarning(warnings, label, 'surface-width', surface.width, thresholds.maxWidth);
|
|
9
|
+
pushBudgetWarning(warnings, label, 'surface-height', surface.height, thresholds.maxHeight);
|
|
10
|
+
pushBudgetWarning(warnings, label, 'surface-area', surface.width * surface.height, thresholds.maxArea);
|
|
11
|
+
if (thresholds.maxStyledCells !== undefined) {
|
|
12
|
+
pushBudgetWarning(warnings, label, 'styled-cells', countStyledCells(surface), thresholds.maxStyledCells);
|
|
13
|
+
}
|
|
14
|
+
pushBudgetWarning(warnings, label, 'frame-duration', timings.reduce((total, timing) => total + timing.durationMs, 0), thresholds.maxFrameDurationMs, MILLISECOND_UNIT);
|
|
15
|
+
if (thresholds.maxStageDurationMs !== undefined) {
|
|
16
|
+
for (const timing of timings) {
|
|
17
|
+
pushBudgetWarning(warnings, label, 'stage-duration', timing.durationMs, thresholds.maxStageDurationMs[timing.stage], MILLISECOND_UNIT, timing.stage);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return warnings;
|
|
21
|
+
}
|
|
22
|
+
function pushBudgetWarning(warnings, label, metric, actual, limit, unit = '', stage) {
|
|
23
|
+
if (limit === undefined || !Number.isFinite(limit) || actual <= limit) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
warnings.push({
|
|
27
|
+
label,
|
|
28
|
+
metric,
|
|
29
|
+
actual,
|
|
30
|
+
limit,
|
|
31
|
+
stage,
|
|
32
|
+
message: surfaceBudgetMessage(label, metric, actual, limit, unit, stage),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function surfaceBudgetMessage(label, metric, actual, limit, unit, stage) {
|
|
36
|
+
const metricLabel = stage === undefined ? metric : `${metric} ${stage}`;
|
|
37
|
+
return `${label} ${metricLabel} ${formatBudgetNumber(actual)}${unit} > ${formatBudgetNumber(limit)}${unit}`;
|
|
38
|
+
}
|
|
39
|
+
function formatBudgetNumber(value) {
|
|
40
|
+
return String(Math.round(value * HUNDREDTHS) / HUNDREDTHS);
|
|
41
|
+
}
|
|
42
|
+
function countStyledCells(surface) {
|
|
43
|
+
let count = 0;
|
|
44
|
+
for (let y = 0; y < surface.height; y++) {
|
|
45
|
+
for (let x = 0; x < surface.width; x++) {
|
|
46
|
+
if (isStyledCell(surface.get(x, y))) {
|
|
47
|
+
count++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return count;
|
|
52
|
+
}
|
|
53
|
+
function isStyledCell(cell) {
|
|
54
|
+
return cell.fg !== undefined
|
|
55
|
+
|| cell.bg !== undefined
|
|
56
|
+
|| cell.fgRGB !== undefined
|
|
57
|
+
|| cell.bgRGB !== undefined
|
|
58
|
+
|| (cell.modifiers?.length ?? 0) > 0
|
|
59
|
+
|| (cell.opacity !== undefined && cell.opacity < OPAQUE_OPACITY);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=surface-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-budget.js","sourceRoot":"","sources":["../src/surface-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Cell, type Surface } from '@flyingrobots/bijou';
|
|
2
|
+
export type SurfaceDiffCellKind = 'char' | 'style';
|
|
3
|
+
export type SurfaceDiffRenderMode = 'side-by-side' | 'overlay';
|
|
4
|
+
export interface SurfaceDiffBounds {
|
|
5
|
+
readonly x: number;
|
|
6
|
+
readonly y: number;
|
|
7
|
+
readonly width: number;
|
|
8
|
+
readonly height: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SurfaceDiffCell {
|
|
11
|
+
readonly x: number;
|
|
12
|
+
readonly y: number;
|
|
13
|
+
readonly kind: SurfaceDiffCellKind;
|
|
14
|
+
readonly before: Cell;
|
|
15
|
+
readonly after: Cell;
|
|
16
|
+
}
|
|
17
|
+
export interface SurfaceDiff {
|
|
18
|
+
readonly width: number;
|
|
19
|
+
readonly height: number;
|
|
20
|
+
readonly beforeWidth: number;
|
|
21
|
+
readonly beforeHeight: number;
|
|
22
|
+
readonly afterWidth: number;
|
|
23
|
+
readonly afterHeight: number;
|
|
24
|
+
readonly changedCells: number;
|
|
25
|
+
readonly charChanges: number;
|
|
26
|
+
readonly styleOnlyChanges: number;
|
|
27
|
+
readonly bounds: SurfaceDiffBounds | undefined;
|
|
28
|
+
readonly cells: readonly SurfaceDiffCell[];
|
|
29
|
+
}
|
|
30
|
+
export interface SurfaceDiffRenderOptions {
|
|
31
|
+
readonly mode?: SurfaceDiffRenderMode;
|
|
32
|
+
}
|
|
33
|
+
export declare function diffSurfaces(before: Surface, after: Surface): SurfaceDiff;
|
|
34
|
+
export declare function surfaceDiffSurface(before: Surface, after: Surface, options?: SurfaceDiffRenderOptions): Surface;
|
|
35
|
+
export declare function surfaceDiffText(before: Surface, after: Surface, options?: SurfaceDiffRenderOptions): string;
|
|
36
|
+
//# sourceMappingURL=surface-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-diff.d.ts","sourceRoot":"","sources":["../src/surface-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AACnD,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC;CACvC;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CA2DzE;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAQT;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAiBR"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { createSurface } from '@flyingrobots/bijou';
|
|
2
|
+
const EMPTY_CELL = Object.freeze({ char: ' ', empty: true });
|
|
3
|
+
export function diffSurfaces(before, after) {
|
|
4
|
+
const width = Math.max(before.width, after.width);
|
|
5
|
+
const height = Math.max(before.height, after.height);
|
|
6
|
+
const cells = [];
|
|
7
|
+
let charChanges = 0;
|
|
8
|
+
let styleOnlyChanges = 0;
|
|
9
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
10
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
11
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
12
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
13
|
+
for (let y = 0; y < height; y++) {
|
|
14
|
+
for (let x = 0; x < width; x++) {
|
|
15
|
+
const beforeCell = cellAt(before, x, y);
|
|
16
|
+
const afterCell = cellAt(after, x, y);
|
|
17
|
+
const charChanged = cellGlyphKey(beforeCell) !== cellGlyphKey(afterCell);
|
|
18
|
+
const styleChanged = cellStyleKey(beforeCell) !== cellStyleKey(afterCell);
|
|
19
|
+
if (!charChanged && !styleChanged) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const kind = charChanged ? 'char' : 'style';
|
|
23
|
+
if (kind === 'char') {
|
|
24
|
+
charChanges++;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
styleOnlyChanges++;
|
|
28
|
+
}
|
|
29
|
+
minX = Math.min(minX, x);
|
|
30
|
+
minY = Math.min(minY, y);
|
|
31
|
+
maxX = Math.max(maxX, x);
|
|
32
|
+
maxY = Math.max(maxY, y);
|
|
33
|
+
cells.push({ x, y, kind, before: beforeCell, after: afterCell });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const bounds = cells.length === 0
|
|
37
|
+
? undefined
|
|
38
|
+
: {
|
|
39
|
+
x: minX,
|
|
40
|
+
y: minY,
|
|
41
|
+
width: maxX - minX + 1,
|
|
42
|
+
height: maxY - minY + 1,
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
width,
|
|
46
|
+
height,
|
|
47
|
+
beforeWidth: before.width,
|
|
48
|
+
beforeHeight: before.height,
|
|
49
|
+
afterWidth: after.width,
|
|
50
|
+
afterHeight: after.height,
|
|
51
|
+
changedCells: cells.length,
|
|
52
|
+
charChanges,
|
|
53
|
+
styleOnlyChanges,
|
|
54
|
+
bounds,
|
|
55
|
+
cells,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function surfaceDiffSurface(before, after, options = {}) {
|
|
59
|
+
const diff = diffSurfaces(before, after);
|
|
60
|
+
const mode = options.mode ?? 'side-by-side';
|
|
61
|
+
const lines = mode === 'overlay'
|
|
62
|
+
? overlayLines(diff, after)
|
|
63
|
+
: sideBySideLines(diff, before, after);
|
|
64
|
+
return linesToSurface(lines, diff);
|
|
65
|
+
}
|
|
66
|
+
export function surfaceDiffText(before, after, options = {}) {
|
|
67
|
+
const diff = diffSurfaces(before, after);
|
|
68
|
+
const lines = [
|
|
69
|
+
summaryLine(diff),
|
|
70
|
+
boundsLine(diff),
|
|
71
|
+
`mode: ${options.mode ?? 'side-by-side'}`,
|
|
72
|
+
];
|
|
73
|
+
for (const cell of diff.cells) {
|
|
74
|
+
if (cell.kind === 'char') {
|
|
75
|
+
lines.push(`(${cell.x},${cell.y}) char ${quoteChar(cell.before)} -> ${quoteChar(cell.after)}`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
lines.push(`(${cell.x},${cell.y}) style ${styleLabel(cell.before)} -> ${styleLabel(cell.after)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return lines.join('\n');
|
|
82
|
+
}
|
|
83
|
+
function cellAt(surface, x, y) {
|
|
84
|
+
if (x < 0 || y < 0 || x >= surface.width || y >= surface.height) {
|
|
85
|
+
return EMPTY_CELL;
|
|
86
|
+
}
|
|
87
|
+
return surface.get(x, y);
|
|
88
|
+
}
|
|
89
|
+
function cellGlyphKey(cell) {
|
|
90
|
+
return `${cell.empty === true ? 'empty' : 'paint'}:${cell.char}`;
|
|
91
|
+
}
|
|
92
|
+
function cellStyleKey(cell) {
|
|
93
|
+
return JSON.stringify({
|
|
94
|
+
fg: cell.fg ?? null,
|
|
95
|
+
bg: cell.bg ?? null,
|
|
96
|
+
fgRGB: cell.fgRGB ?? null,
|
|
97
|
+
bgRGB: cell.bgRGB ?? null,
|
|
98
|
+
modifiers: cell.modifiers ?? null,
|
|
99
|
+
opacity: cell.opacity ?? null,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function sideBySideLines(diff, before, after) {
|
|
103
|
+
const beforeWidth = Math.max(6, before.width);
|
|
104
|
+
const afterWidth = Math.max(5, after.width);
|
|
105
|
+
const lines = [
|
|
106
|
+
summaryLine(diff),
|
|
107
|
+
boundsLine(diff),
|
|
108
|
+
`${'before'.padEnd(beforeWidth)} | ${'after'.padEnd(afterWidth)}`,
|
|
109
|
+
];
|
|
110
|
+
for (let y = 0; y < diff.height; y++) {
|
|
111
|
+
lines.push(`${surfaceRow(before, y, beforeWidth).trimEnd()} | ${surfaceRow(after, y, afterWidth).trimEnd()}`);
|
|
112
|
+
}
|
|
113
|
+
return lines;
|
|
114
|
+
}
|
|
115
|
+
function overlayLines(diff, after) {
|
|
116
|
+
const overlayWidth = Math.max(1, diff.width);
|
|
117
|
+
const lines = [
|
|
118
|
+
summaryLine(diff),
|
|
119
|
+
boundsLine(diff),
|
|
120
|
+
'overlay',
|
|
121
|
+
];
|
|
122
|
+
const changed = new Map(diff.cells.map((cell) => [`${cell.x},${cell.y}`, cell.kind]));
|
|
123
|
+
for (let y = 0; y < diff.height; y++) {
|
|
124
|
+
let row = '';
|
|
125
|
+
let markers = '';
|
|
126
|
+
for (let x = 0; x < overlayWidth; x++) {
|
|
127
|
+
row += displayChar(cellAt(after, x, y));
|
|
128
|
+
const kind = changed.get(`${x},${y}`);
|
|
129
|
+
markers += kind === 'char' ? '!' : kind === 'style' ? '~' : '.';
|
|
130
|
+
}
|
|
131
|
+
lines.push(row, markers);
|
|
132
|
+
}
|
|
133
|
+
return lines;
|
|
134
|
+
}
|
|
135
|
+
function linesToSurface(lines, diff) {
|
|
136
|
+
const width = Math.max(1, ...lines.map((line) => line.length));
|
|
137
|
+
const surface = createSurface(width, lines.length);
|
|
138
|
+
const changed = new Map(diff.cells.map((cell) => [`${cell.x},${cell.y}`, cell.kind]));
|
|
139
|
+
const overlayStart = lines.indexOf('overlay') + 1;
|
|
140
|
+
for (let y = 0; y < lines.length; y++) {
|
|
141
|
+
const line = lines[y] ?? '';
|
|
142
|
+
for (let x = 0; x < line.length; x++) {
|
|
143
|
+
const style = overlayStart > 0 && y >= overlayStart && ((y - overlayStart) % 2 === 0)
|
|
144
|
+
? changedStyle(changed.get(`${x},${Math.floor((y - overlayStart) / 2)}`))
|
|
145
|
+
: {};
|
|
146
|
+
surface.set(x, y, { char: line[x] ?? ' ', empty: false, ...style });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return surface;
|
|
150
|
+
}
|
|
151
|
+
function changedStyle(kind) {
|
|
152
|
+
if (kind === 'char') {
|
|
153
|
+
return { fg: '#111111', bg: '#ffcc00' };
|
|
154
|
+
}
|
|
155
|
+
if (kind === 'style') {
|
|
156
|
+
return { fg: '#111111', bg: '#66ccff' };
|
|
157
|
+
}
|
|
158
|
+
return {};
|
|
159
|
+
}
|
|
160
|
+
function surfaceRow(surface, y, width) {
|
|
161
|
+
let row = '';
|
|
162
|
+
for (let x = 0; x < width; x++) {
|
|
163
|
+
row += displayChar(cellAt(surface, x, y));
|
|
164
|
+
}
|
|
165
|
+
return row;
|
|
166
|
+
}
|
|
167
|
+
function displayChar(cell) {
|
|
168
|
+
return cell.empty === true || cell.char === '' ? ' ' : cell.char;
|
|
169
|
+
}
|
|
170
|
+
function summaryLine(diff) {
|
|
171
|
+
return `surface diff: ${diff.changedCells} changed, ${diff.charChanges} char, ${diff.styleOnlyChanges} style`;
|
|
172
|
+
}
|
|
173
|
+
function boundsLine(diff) {
|
|
174
|
+
if (diff.bounds === undefined) {
|
|
175
|
+
return 'bounds: none';
|
|
176
|
+
}
|
|
177
|
+
return `bounds: x=${diff.bounds.x} y=${diff.bounds.y} w=${diff.bounds.width} h=${diff.bounds.height}`;
|
|
178
|
+
}
|
|
179
|
+
function quoteChar(cell) {
|
|
180
|
+
return JSON.stringify(displayChar(cell));
|
|
181
|
+
}
|
|
182
|
+
function styleLabel(cell) {
|
|
183
|
+
return [
|
|
184
|
+
`fg=${colorLabel(cell.fg)}`,
|
|
185
|
+
`bg=${colorLabel(cell.bg)}`,
|
|
186
|
+
`fgRGB=${rgbLabel(cell.fgRGB)}`,
|
|
187
|
+
`bgRGB=${rgbLabel(cell.bgRGB)}`,
|
|
188
|
+
`modifiers=${cell.modifiers?.join('+') ?? 'none'}`,
|
|
189
|
+
`opacity=${cell.opacity ?? 'default'}`,
|
|
190
|
+
].join(' ');
|
|
191
|
+
}
|
|
192
|
+
function colorLabel(value) {
|
|
193
|
+
if (value == null)
|
|
194
|
+
return 'default';
|
|
195
|
+
if (typeof value === 'string')
|
|
196
|
+
return value;
|
|
197
|
+
return JSON.stringify(value);
|
|
198
|
+
}
|
|
199
|
+
function rgbLabel(value) {
|
|
200
|
+
return value === undefined ? 'default' : value.join(',');
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=surface-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-diff.js","sourceRoot":"","sources":["../src/surface-diff.ts"],"names":[],"mappings":"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"}
|
package/dist/surface-layout.d.ts
CHANGED
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import { type Surface } from '@flyingrobots/bijou';
|
|
2
2
|
import type { PlaceOptions } from './layout.js';
|
|
3
|
+
export type SurfaceContent = string | Surface;
|
|
4
|
+
export interface ProseSurfaceOptions {
|
|
5
|
+
readonly width: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Bridge raw text into surface-land at the composition edge.
|
|
9
|
+
*/
|
|
10
|
+
export declare function contentSurface(content: string): Surface;
|
|
11
|
+
/**
|
|
12
|
+
* Bridge prose text into surface-land after wrapping at word boundaries.
|
|
13
|
+
*
|
|
14
|
+
* Use this for paragraph-like text that should reflow inside a known column
|
|
15
|
+
* width. Keep `contentSurface()` for preformatted output, tables, boxes, and
|
|
16
|
+
* other surfaces where callers already control line breaks.
|
|
17
|
+
*/
|
|
18
|
+
export declare function proseSurface(content: string, options: ProseSurfaceOptions): Surface;
|
|
3
19
|
/**
|
|
4
20
|
* Vertical stack for surfaces.
|
|
5
21
|
*/
|
|
6
|
-
export declare function vstackSurface(...
|
|
22
|
+
export declare function vstackSurface(...content: SurfaceContent[]): Surface;
|
|
7
23
|
/**
|
|
8
24
|
* Horizontal stack for surfaces with an optional gap.
|
|
9
25
|
*/
|
|
10
|
-
export declare function hstackSurface(gap: number, ...
|
|
26
|
+
export declare function hstackSurface(gap: number, ...content: SurfaceContent[]): Surface;
|
|
11
27
|
/**
|
|
12
28
|
* Place a surface within a fixed-size rectangle using horizontal and vertical alignment.
|
|
13
29
|
*
|
|
@@ -15,5 +31,5 @@ export declare function hstackSurface(gap: number, ...surfaces: Surface[]): Surf
|
|
|
15
31
|
* region, mirroring the string-based `place()` behavior. When the content is smaller than
|
|
16
32
|
* the target rectangle, it is aligned within the blank result surface.
|
|
17
33
|
*/
|
|
18
|
-
export declare function placeSurface(content:
|
|
34
|
+
export declare function placeSurface(content: SurfaceContent, options: PlaceOptions): Surface;
|
|
19
35
|
//# sourceMappingURL=surface-layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-layout.d.ts","sourceRoot":"","sources":["../src/surface-layout.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"surface-layout.d.ts","sourceRoot":"","sources":["../src/surface-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAOnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAgBnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAiBhF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAkDpF"}
|
package/dist/surface-layout.js
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
|
-
import { createSurface } from '@flyingrobots/bijou';
|
|
1
|
+
import { createSurface, graphemeWidth, parseAnsiToSurface, stripAnsi, wrapToWidth, } from '@flyingrobots/bijou';
|
|
2
|
+
/**
|
|
3
|
+
* Bridge raw text into surface-land at the composition edge.
|
|
4
|
+
*/
|
|
5
|
+
export function contentSurface(content) {
|
|
6
|
+
const lines = content.split(/\r?\n/);
|
|
7
|
+
const width = Math.max(1, ...lines.map((line) => graphemeWidth(stripAnsi(line))));
|
|
8
|
+
const height = Math.max(1, lines.length);
|
|
9
|
+
return parseAnsiToSurface(content, width, height);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Bridge prose text into surface-land after wrapping at word boundaries.
|
|
13
|
+
*
|
|
14
|
+
* Use this for paragraph-like text that should reflow inside a known column
|
|
15
|
+
* width. Keep `contentSurface()` for preformatted output, tables, boxes, and
|
|
16
|
+
* other surfaces where callers already control line breaks.
|
|
17
|
+
*/
|
|
18
|
+
export function proseSurface(content, options) {
|
|
19
|
+
const finiteWidth = Number.isFinite(options.width) ? options.width : 1;
|
|
20
|
+
const width = Math.max(1, Math.floor(finiteWidth));
|
|
21
|
+
const wrapped = wrapToWidth(content, width);
|
|
22
|
+
const text = wrapped.join('\n');
|
|
23
|
+
const height = Math.max(1, wrapped.length);
|
|
24
|
+
return parseAnsiToSurface(text, width, height);
|
|
25
|
+
}
|
|
2
26
|
/**
|
|
3
27
|
* Vertical stack for surfaces.
|
|
4
28
|
*/
|
|
5
|
-
export function vstackSurface(...
|
|
29
|
+
export function vstackSurface(...content) {
|
|
30
|
+
const surfaces = content.map(resolveSurfaceContent);
|
|
6
31
|
if (surfaces.length === 0)
|
|
7
32
|
return createSurface(0, 0);
|
|
8
33
|
const width = Math.max(...surfaces.map(s => s.width));
|
|
@@ -18,7 +43,8 @@ export function vstackSurface(...surfaces) {
|
|
|
18
43
|
/**
|
|
19
44
|
* Horizontal stack for surfaces with an optional gap.
|
|
20
45
|
*/
|
|
21
|
-
export function hstackSurface(gap, ...
|
|
46
|
+
export function hstackSurface(gap, ...content) {
|
|
47
|
+
const surfaces = content.map(resolveSurfaceContent);
|
|
22
48
|
if (surfaces.length === 0)
|
|
23
49
|
return createSurface(0, 0);
|
|
24
50
|
const width = surfaces.reduce((acc, s) => acc + s.width, 0) + (surfaces.length - 1) * gap;
|
|
@@ -40,6 +66,7 @@ export function hstackSurface(gap, ...surfaces) {
|
|
|
40
66
|
* the target rectangle, it is aligned within the blank result surface.
|
|
41
67
|
*/
|
|
42
68
|
export function placeSurface(content, options) {
|
|
69
|
+
const surfaceContent = resolveSurfaceContent(content);
|
|
43
70
|
const width = Math.max(0, Math.floor(options.width));
|
|
44
71
|
const height = Math.max(0, Math.floor(options.height));
|
|
45
72
|
const hAlign = options.hAlign ?? 'left';
|
|
@@ -47,16 +74,16 @@ export function placeSurface(content, options) {
|
|
|
47
74
|
if (width === 0 || height === 0)
|
|
48
75
|
return createSurface(0, 0);
|
|
49
76
|
const result = createSurface(width, height);
|
|
50
|
-
const clipWidth = Math.min(width,
|
|
51
|
-
const clipHeight = Math.min(height,
|
|
77
|
+
const clipWidth = Math.min(width, surfaceContent.width);
|
|
78
|
+
const clipHeight = Math.min(height, surfaceContent.height);
|
|
52
79
|
let col = 0;
|
|
53
|
-
if (
|
|
80
|
+
if (surfaceContent.width < width) {
|
|
54
81
|
switch (hAlign) {
|
|
55
82
|
case 'right':
|
|
56
|
-
col = width -
|
|
83
|
+
col = width - surfaceContent.width;
|
|
57
84
|
break;
|
|
58
85
|
case 'center':
|
|
59
|
-
col = Math.floor((width -
|
|
86
|
+
col = Math.floor((width - surfaceContent.width) / 2);
|
|
60
87
|
break;
|
|
61
88
|
case 'left':
|
|
62
89
|
default:
|
|
@@ -65,13 +92,13 @@ export function placeSurface(content, options) {
|
|
|
65
92
|
}
|
|
66
93
|
}
|
|
67
94
|
let row = 0;
|
|
68
|
-
if (
|
|
95
|
+
if (surfaceContent.height < height) {
|
|
69
96
|
switch (vAlign) {
|
|
70
97
|
case 'bottom':
|
|
71
|
-
row = height -
|
|
98
|
+
row = height - surfaceContent.height;
|
|
72
99
|
break;
|
|
73
100
|
case 'middle':
|
|
74
|
-
row = Math.floor((height -
|
|
101
|
+
row = Math.floor((height - surfaceContent.height) / 2);
|
|
75
102
|
break;
|
|
76
103
|
case 'top':
|
|
77
104
|
default:
|
|
@@ -80,8 +107,11 @@ export function placeSurface(content, options) {
|
|
|
80
107
|
}
|
|
81
108
|
}
|
|
82
109
|
if (clipWidth > 0 && clipHeight > 0) {
|
|
83
|
-
result.blit(
|
|
110
|
+
result.blit(surfaceContent, Math.max(0, col), Math.max(0, row), 0, 0, clipWidth, clipHeight);
|
|
84
111
|
}
|
|
85
112
|
return result;
|
|
86
113
|
}
|
|
114
|
+
function resolveSurfaceContent(content) {
|
|
115
|
+
return typeof content === 'string' ? contentSurface(content) : content;
|
|
116
|
+
}
|
|
87
117
|
//# sourceMappingURL=surface-layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-layout.js","sourceRoot":"","sources":["../src/surface-layout.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"surface-layout.js","sourceRoot":"","sources":["../src/surface-layout.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import type { BijouContext } from '@flyingrobots/bijou';
|
|
10
10
|
import type { Middleware } from './eventbus.js';
|
|
11
11
|
import type { RenderPipeline } from './pipeline/pipeline.js';
|
|
12
|
+
import type { SurfaceBudgetThresholds } from './surface-budget.js';
|
|
12
13
|
import type { ViewOutput } from './view-output.js';
|
|
13
14
|
/** Represent a keyboard input event with key name and modifier flags. */
|
|
14
15
|
export interface KeyMsg {
|
|
@@ -207,6 +208,13 @@ export interface RunOptions<M = any> {
|
|
|
207
208
|
middlewares?: Middleware<M>[];
|
|
208
209
|
/** Optional hook to extend the render pipeline with custom middleware. */
|
|
209
210
|
configurePipeline?: (pipeline: RenderPipeline) => void;
|
|
211
|
+
/** Optional non-fatal render budget warnings routed as runtime issues. */
|
|
212
|
+
surfaceBudget?: SurfaceBudgetThresholds;
|
|
213
|
+
/**
|
|
214
|
+
* Pending command count that triggers runtime backpressure diagnostics.
|
|
215
|
+
* Defaults to 1000. Set to 0 to disable the warning.
|
|
216
|
+
*/
|
|
217
|
+
commandBackpressureThreshold?: number;
|
|
210
218
|
/** Optional BCSS stylesheet string. */
|
|
211
219
|
css?: string;
|
|
212
220
|
}
|