@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.
Files changed (203) hide show
  1. package/README.md +244 -21
  2. package/dist/animate.d.ts +4 -0
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +47 -20
  5. package/dist/animate.js.map +1 -1
  6. package/dist/app-frame-actions.d.ts.map +1 -1
  7. package/dist/app-frame-actions.js +55 -0
  8. package/dist/app-frame-actions.js.map +1 -1
  9. package/dist/app-frame-i18n.d.ts.map +1 -1
  10. package/dist/app-frame-i18n.js +51 -0
  11. package/dist/app-frame-i18n.js.map +1 -1
  12. package/dist/app-frame-layers.d.ts +11 -1
  13. package/dist/app-frame-layers.d.ts.map +1 -1
  14. package/dist/app-frame-layers.js +19 -0
  15. package/dist/app-frame-layers.js.map +1 -1
  16. package/dist/app-frame-overlays.d.ts +82 -0
  17. package/dist/app-frame-overlays.d.ts.map +1 -0
  18. package/dist/app-frame-overlays.js +480 -0
  19. package/dist/app-frame-overlays.js.map +1 -0
  20. package/dist/app-frame-palette.d.ts.map +1 -1
  21. package/dist/app-frame-palette.js +36 -16
  22. package/dist/app-frame-palette.js.map +1 -1
  23. package/dist/app-frame-render.d.ts.map +1 -1
  24. package/dist/app-frame-render.js +16 -7
  25. package/dist/app-frame-render.js.map +1 -1
  26. package/dist/app-frame-types.d.ts +141 -5
  27. package/dist/app-frame-types.d.ts.map +1 -1
  28. package/dist/app-frame-types.js +17 -1
  29. package/dist/app-frame-types.js.map +1 -1
  30. package/dist/app-frame-utils.d.ts +3 -1
  31. package/dist/app-frame-utils.d.ts.map +1 -1
  32. package/dist/app-frame-utils.js +11 -5
  33. package/dist/app-frame-utils.js.map +1 -1
  34. package/dist/app-frame.d.ts +22 -86
  35. package/dist/app-frame.d.ts.map +1 -1
  36. package/dist/app-frame.js +475 -629
  37. package/dist/app-frame.js.map +1 -1
  38. package/dist/browsable-list.d.ts +12 -0
  39. package/dist/browsable-list.d.ts.map +1 -1
  40. package/dist/browsable-list.js +17 -6
  41. package/dist/browsable-list.js.map +1 -1
  42. package/dist/canvas.d.ts +11 -3
  43. package/dist/canvas.d.ts.map +1 -1
  44. package/dist/canvas.js +146 -13
  45. package/dist/canvas.js.map +1 -1
  46. package/dist/cell-glyph-fit.d.ts +20 -0
  47. package/dist/cell-glyph-fit.d.ts.map +1 -0
  48. package/dist/cell-glyph-fit.js +82 -0
  49. package/dist/cell-glyph-fit.js.map +1 -0
  50. package/dist/collection-surface.d.ts +8 -0
  51. package/dist/collection-surface.d.ts.map +1 -1
  52. package/dist/collection-surface.js +72 -8
  53. package/dist/collection-surface.js.map +1 -1
  54. package/dist/command-palette.d.ts +2 -0
  55. package/dist/command-palette.d.ts.map +1 -1
  56. package/dist/command-palette.js +36 -19
  57. package/dist/command-palette.js.map +1 -1
  58. package/dist/css/text-style.d.ts +2 -0
  59. package/dist/css/text-style.d.ts.map +1 -1
  60. package/dist/css/text-style.js +18 -8
  61. package/dist/css/text-style.js.map +1 -1
  62. package/dist/debug-overlay.d.ts +19 -0
  63. package/dist/debug-overlay.d.ts.map +1 -0
  64. package/dist/debug-overlay.js +25 -0
  65. package/dist/debug-overlay.js.map +1 -0
  66. package/dist/design-language.d.ts.map +1 -1
  67. package/dist/design-language.js +4 -5
  68. package/dist/design-language.js.map +1 -1
  69. package/dist/driver.d.ts +102 -0
  70. package/dist/driver.d.ts.map +1 -1
  71. package/dist/driver.js +259 -19
  72. package/dist/driver.js.map +1 -1
  73. package/dist/eventbus.d.ts +20 -0
  74. package/dist/eventbus.d.ts.map +1 -1
  75. package/dist/eventbus.js +47 -0
  76. package/dist/eventbus.js.map +1 -1
  77. package/dist/file-picker.d.ts.map +1 -1
  78. package/dist/file-picker.js +2 -2
  79. package/dist/file-picker.js.map +1 -1
  80. package/dist/flex.d.ts.map +1 -1
  81. package/dist/flex.js +6 -6
  82. package/dist/flex.js.map +1 -1
  83. package/dist/focus-area.d.ts +13 -4
  84. package/dist/focus-area.d.ts.map +1 -1
  85. package/dist/focus-area.js +56 -14
  86. package/dist/focus-area.js.map +1 -1
  87. package/dist/focus-map.d.ts +40 -0
  88. package/dist/focus-map.d.ts.map +1 -0
  89. package/dist/focus-map.js +133 -0
  90. package/dist/focus-map.js.map +1 -0
  91. package/dist/grid.d.ts +2 -2
  92. package/dist/grid.d.ts.map +1 -1
  93. package/dist/grid.js +11 -148
  94. package/dist/grid.js.map +1 -1
  95. package/dist/help.d.ts +2 -0
  96. package/dist/help.d.ts.map +1 -1
  97. package/dist/help.js +6 -4
  98. package/dist/help.js.map +1 -1
  99. package/dist/icon-presentation.d.ts +10 -0
  100. package/dist/icon-presentation.d.ts.map +1 -0
  101. package/dist/icon-presentation.js +12 -0
  102. package/dist/icon-presentation.js.map +1 -0
  103. package/dist/index.d.ts +32 -9
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +17 -5
  106. package/dist/index.js.map +1 -1
  107. package/dist/input-map.d.ts +68 -0
  108. package/dist/input-map.d.ts.map +1 -0
  109. package/dist/input-map.js +162 -0
  110. package/dist/input-map.js.map +1 -0
  111. package/dist/input-routing-inspector.d.ts +24 -0
  112. package/dist/input-routing-inspector.d.ts.map +1 -0
  113. package/dist/input-routing-inspector.js +76 -0
  114. package/dist/input-routing-inspector.js.map +1 -0
  115. package/dist/keybindings.d.ts.map +1 -1
  116. package/dist/keybindings.js +3 -0
  117. package/dist/keybindings.js.map +1 -1
  118. package/dist/layout-inspector.d.ts +31 -0
  119. package/dist/layout-inspector.d.ts.map +1 -0
  120. package/dist/layout-inspector.js +133 -0
  121. package/dist/layout-inspector.js.map +1 -0
  122. package/dist/layout-preset.d.ts +1 -1
  123. package/dist/layout-preset.d.ts.map +1 -1
  124. package/dist/motion/reconciler.d.ts +6 -2
  125. package/dist/motion/reconciler.d.ts.map +1 -1
  126. package/dist/motion/reconciler.js +40 -10
  127. package/dist/motion/reconciler.js.map +1 -1
  128. package/dist/motion/types.d.ts +3 -1
  129. package/dist/motion/types.d.ts.map +1 -1
  130. package/dist/navigable-table.d.ts +9 -10
  131. package/dist/navigable-table.d.ts.map +1 -1
  132. package/dist/navigable-table.js +33 -14
  133. package/dist/navigable-table.js.map +1 -1
  134. package/dist/notification.d.ts +15 -0
  135. package/dist/notification.d.ts.map +1 -1
  136. package/dist/notification.js +136 -34
  137. package/dist/notification.js.map +1 -1
  138. package/dist/overlay.d.ts.map +1 -1
  139. package/dist/overlay.js +40 -14
  140. package/dist/overlay.js.map +1 -1
  141. package/dist/pager.d.ts +3 -1
  142. package/dist/pager.d.ts.map +1 -1
  143. package/dist/pager.js +4 -0
  144. package/dist/pager.js.map +1 -1
  145. package/dist/pipeline/middleware/grayscale.d.ts.map +1 -1
  146. package/dist/pipeline/middleware/grayscale.js +5 -5
  147. package/dist/pipeline/middleware/grayscale.js.map +1 -1
  148. package/dist/pipeline/middleware/motion.d.ts.map +1 -1
  149. package/dist/pipeline/middleware/motion.js +4 -3
  150. package/dist/pipeline/middleware/motion.js.map +1 -1
  151. package/dist/pipeline/middleware/paint.d.ts.map +1 -1
  152. package/dist/pipeline/middleware/paint.js +2 -1
  153. package/dist/pipeline/middleware/paint.js.map +1 -1
  154. package/dist/pipeline/middleware/surface-shaders.d.ts +37 -0
  155. package/dist/pipeline/middleware/surface-shaders.d.ts.map +1 -0
  156. package/dist/pipeline/middleware/surface-shaders.js +164 -0
  157. package/dist/pipeline/middleware/surface-shaders.js.map +1 -0
  158. package/dist/pipeline/pipeline.d.ts +37 -2
  159. package/dist/pipeline/pipeline.d.ts.map +1 -1
  160. package/dist/pipeline/pipeline.js +121 -22
  161. package/dist/pipeline/pipeline.js.map +1 -1
  162. package/dist/raytrace.d.ts +59 -0
  163. package/dist/raytrace.d.ts.map +1 -0
  164. package/dist/raytrace.js +121 -0
  165. package/dist/raytrace.js.map +1 -0
  166. package/dist/runtime-binding.d.ts +59 -0
  167. package/dist/runtime-binding.d.ts.map +1 -0
  168. package/dist/runtime-binding.js +271 -0
  169. package/dist/runtime-binding.js.map +1 -0
  170. package/dist/runtime.d.ts +19 -0
  171. package/dist/runtime.d.ts.map +1 -1
  172. package/dist/runtime.js +222 -31
  173. package/dist/runtime.js.map +1 -1
  174. package/dist/split-pane.d.ts +2 -2
  175. package/dist/split-pane.d.ts.map +1 -1
  176. package/dist/split-pane.js +28 -49
  177. package/dist/split-pane.js.map +1 -1
  178. package/dist/subapp/mount.d.ts +17 -0
  179. package/dist/subapp/mount.d.ts.map +1 -1
  180. package/dist/subapp/mount.js +13 -0
  181. package/dist/subapp/mount.js.map +1 -1
  182. package/dist/surface-budget.d.ts +27 -0
  183. package/dist/surface-budget.d.ts.map +1 -0
  184. package/dist/surface-budget.js +61 -0
  185. package/dist/surface-budget.js.map +1 -0
  186. package/dist/surface-diff.d.ts +36 -0
  187. package/dist/surface-diff.d.ts.map +1 -0
  188. package/dist/surface-diff.js +202 -0
  189. package/dist/surface-diff.js.map +1 -0
  190. package/dist/surface-layout.d.ts +19 -3
  191. package/dist/surface-layout.d.ts.map +1 -1
  192. package/dist/surface-layout.js +42 -12
  193. package/dist/surface-layout.js.map +1 -1
  194. package/dist/types.d.ts +8 -0
  195. package/dist/types.d.ts.map +1 -1
  196. package/dist/types.js.map +1 -1
  197. package/dist/view-output.js +2 -2
  198. package/dist/view-output.js.map +1 -1
  199. package/dist/viewport.d.ts +13 -1
  200. package/dist/viewport.d.ts.map +1 -1
  201. package/dist/viewport.js +33 -11
  202. package/dist/viewport.js.map +1 -1
  203. package/package.json +4 -4
@@ -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"}
@@ -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)];
@@ -1 +1 @@
1
- {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/subapp/mount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsC3C;;;;;;;;;;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;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"}
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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"}
@@ -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(...surfaces: Surface[]): Surface;
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, ...surfaces: Surface[]): Surface;
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: Surface, options: PlaceOptions): Surface;
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,EAAiB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAe7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAgB1E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAiD7E"}
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"}
@@ -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(...surfaces) {
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, ...surfaces) {
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, content.width);
51
- const clipHeight = Math.min(height, content.height);
77
+ const clipWidth = Math.min(width, surfaceContent.width);
78
+ const clipHeight = Math.min(height, surfaceContent.height);
52
79
  let col = 0;
53
- if (content.width < width) {
80
+ if (surfaceContent.width < width) {
54
81
  switch (hAlign) {
55
82
  case 'right':
56
- col = width - content.width;
83
+ col = width - surfaceContent.width;
57
84
  break;
58
85
  case 'center':
59
- col = Math.floor((width - content.width) / 2);
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 (content.height < height) {
95
+ if (surfaceContent.height < height) {
69
96
  switch (vAlign) {
70
97
  case 'bottom':
71
- row = height - content.height;
98
+ row = height - surfaceContent.height;
72
99
  break;
73
100
  case 'middle':
74
- row = Math.floor((height - content.height) / 2);
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(content, Math.max(0, col), Math.max(0, row), 0, 0, clipWidth, clipHeight);
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":"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"}
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
  }