@effect-tui/core 0.1.0-alpha.1

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 (241) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/anim.d.ts +4 -0
  4. package/dist/anim.d.ts.map +1 -0
  5. package/dist/anim.js +5 -0
  6. package/dist/anim.js.map +1 -0
  7. package/dist/ansi.d.ts +69 -0
  8. package/dist/ansi.d.ts.map +1 -0
  9. package/dist/ansi.js +72 -0
  10. package/dist/ansi.js.map +1 -0
  11. package/dist/index.d.ts +16 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +16 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/keys.d.ts +18 -0
  16. package/dist/keys.d.ts.map +1 -0
  17. package/dist/keys.js +247 -0
  18. package/dist/keys.js.map +1 -0
  19. package/dist/layout/linearStack.d.ts +17 -0
  20. package/dist/layout/linearStack.d.ts.map +1 -0
  21. package/dist/layout/linearStack.js +86 -0
  22. package/dist/layout/linearStack.js.map +1 -0
  23. package/dist/motion-value.d.ts +58 -0
  24. package/dist/motion-value.d.ts.map +1 -0
  25. package/dist/motion-value.js +250 -0
  26. package/dist/motion-value.js.map +1 -0
  27. package/dist/present/display.d.ts +58 -0
  28. package/dist/present/display.d.ts.map +1 -0
  29. package/dist/present/display.js +168 -0
  30. package/dist/present/display.js.map +1 -0
  31. package/dist/present/writers/fullscreen.d.ts +19 -0
  32. package/dist/present/writers/fullscreen.d.ts.map +1 -0
  33. package/dist/present/writers/fullscreen.js +55 -0
  34. package/dist/present/writers/fullscreen.js.map +1 -0
  35. package/dist/present/writers/inline.d.ts +20 -0
  36. package/dist/present/writers/inline.d.ts.map +1 -0
  37. package/dist/present/writers/inline.js +92 -0
  38. package/dist/present/writers/inline.js.map +1 -0
  39. package/dist/render/buffer.d.ts +31 -0
  40. package/dist/render/buffer.d.ts.map +1 -0
  41. package/dist/render/buffer.js +183 -0
  42. package/dist/render/buffer.js.map +1 -0
  43. package/dist/render/color-utils.d.ts +18 -0
  44. package/dist/render/color-utils.d.ts.map +1 -0
  45. package/dist/render/color-utils.js +58 -0
  46. package/dist/render/color-utils.js.map +1 -0
  47. package/dist/render/diff.d.ts +30 -0
  48. package/dist/render/diff.d.ts.map +1 -0
  49. package/dist/render/diff.js +83 -0
  50. package/dist/render/diff.js.map +1 -0
  51. package/dist/render/measure.d.ts +15 -0
  52. package/dist/render/measure.d.ts.map +1 -0
  53. package/dist/render/measure.js +65 -0
  54. package/dist/render/measure.js.map +1 -0
  55. package/dist/render/palette.d.ts +46 -0
  56. package/dist/render/palette.d.ts.map +1 -0
  57. package/dist/render/palette.js +108 -0
  58. package/dist/render/palette.js.map +1 -0
  59. package/dist/render/surface.d.ts +77 -0
  60. package/dist/render/surface.d.ts.map +1 -0
  61. package/dist/render/surface.js +198 -0
  62. package/dist/render/surface.js.map +1 -0
  63. package/dist/runtime/backend_node.d.ts +36 -0
  64. package/dist/runtime/backend_node.d.ts.map +1 -0
  65. package/dist/runtime/backend_node.js +66 -0
  66. package/dist/runtime/backend_node.js.map +1 -0
  67. package/dist/spring-physics.d.ts +36 -0
  68. package/dist/spring-physics.d.ts.map +1 -0
  69. package/dist/spring-physics.js +113 -0
  70. package/dist/spring-physics.js.map +1 -0
  71. package/dist/spring.d.ts +73 -0
  72. package/dist/spring.d.ts.map +1 -0
  73. package/dist/spring.js +136 -0
  74. package/dist/spring.js.map +1 -0
  75. package/dist/ui/containers/canvas.d.ts +13 -0
  76. package/dist/ui/containers/canvas.d.ts.map +1 -0
  77. package/dist/ui/containers/canvas.js +16 -0
  78. package/dist/ui/containers/canvas.js.map +1 -0
  79. package/dist/ui/containers/geometry-reader.d.ts +17 -0
  80. package/dist/ui/containers/geometry-reader.d.ts.map +1 -0
  81. package/dist/ui/containers/geometry-reader.js +24 -0
  82. package/dist/ui/containers/geometry-reader.js.map +1 -0
  83. package/dist/ui/containers/hstack.d.ts +12 -0
  84. package/dist/ui/containers/hstack.d.ts.map +1 -0
  85. package/dist/ui/containers/hstack.js +28 -0
  86. package/dist/ui/containers/hstack.js.map +1 -0
  87. package/dist/ui/containers/scroll.d.ts +28 -0
  88. package/dist/ui/containers/scroll.d.ts.map +1 -0
  89. package/dist/ui/containers/scroll.js +97 -0
  90. package/dist/ui/containers/scroll.js.map +1 -0
  91. package/dist/ui/containers/shared.d.ts +12 -0
  92. package/dist/ui/containers/shared.d.ts.map +1 -0
  93. package/dist/ui/containers/shared.js +19 -0
  94. package/dist/ui/containers/shared.js.map +1 -0
  95. package/dist/ui/containers/vstack.d.ts +12 -0
  96. package/dist/ui/containers/vstack.d.ts.map +1 -0
  97. package/dist/ui/containers/vstack.js +28 -0
  98. package/dist/ui/containers/vstack.js.map +1 -0
  99. package/dist/ui/containers/zstack.d.ts +14 -0
  100. package/dist/ui/containers/zstack.d.ts.map +1 -0
  101. package/dist/ui/containers/zstack.js +36 -0
  102. package/dist/ui/containers/zstack.js.map +1 -0
  103. package/dist/ui/core/geometry-store.d.ts +22 -0
  104. package/dist/ui/core/geometry-store.d.ts.map +1 -0
  105. package/dist/ui/core/geometry-store.js +29 -0
  106. package/dist/ui/core/geometry-store.js.map +1 -0
  107. package/dist/ui/core/geometry.d.ts +34 -0
  108. package/dist/ui/core/geometry.d.ts.map +1 -0
  109. package/dist/ui/core/geometry.js +14 -0
  110. package/dist/ui/core/geometry.js.map +1 -0
  111. package/dist/ui/core/view.d.ts +25 -0
  112. package/dist/ui/core/view.d.ts.map +1 -0
  113. package/dist/ui/core/view.js +34 -0
  114. package/dist/ui/core/view.js.map +1 -0
  115. package/dist/ui/index.d.ts +44 -0
  116. package/dist/ui/index.d.ts.map +1 -0
  117. package/dist/ui/index.js +39 -0
  118. package/dist/ui/index.js.map +1 -0
  119. package/dist/ui/inlinetext.d.ts +24 -0
  120. package/dist/ui/inlinetext.d.ts.map +1 -0
  121. package/dist/ui/inlinetext.js +131 -0
  122. package/dist/ui/inlinetext.js.map +1 -0
  123. package/dist/ui/install.d.ts +22 -0
  124. package/dist/ui/install.d.ts.map +1 -0
  125. package/dist/ui/install.js +66 -0
  126. package/dist/ui/install.js.map +1 -0
  127. package/dist/ui/markdown.d.ts +40 -0
  128. package/dist/ui/markdown.d.ts.map +1 -0
  129. package/dist/ui/markdown.js +351 -0
  130. package/dist/ui/markdown.js.map +1 -0
  131. package/dist/ui/modifiers/border.d.ts +33 -0
  132. package/dist/ui/modifiers/border.d.ts.map +1 -0
  133. package/dist/ui/modifiers/border.js +82 -0
  134. package/dist/ui/modifiers/border.js.map +1 -0
  135. package/dist/ui/modifiers/fill.d.ts +14 -0
  136. package/dist/ui/modifiers/fill.d.ts.map +1 -0
  137. package/dist/ui/modifiers/fill.js +25 -0
  138. package/dist/ui/modifiers/fill.js.map +1 -0
  139. package/dist/ui/modifiers/frame.d.ts +23 -0
  140. package/dist/ui/modifiers/frame.d.ts.map +1 -0
  141. package/dist/ui/modifiers/frame.js +54 -0
  142. package/dist/ui/modifiers/frame.js.map +1 -0
  143. package/dist/ui/modifiers/offset.d.ts +15 -0
  144. package/dist/ui/modifiers/offset.d.ts.map +1 -0
  145. package/dist/ui/modifiers/offset.js +21 -0
  146. package/dist/ui/modifiers/offset.js.map +1 -0
  147. package/dist/ui/modifiers/opacity.d.ts +15 -0
  148. package/dist/ui/modifiers/opacity.d.ts.map +1 -0
  149. package/dist/ui/modifiers/opacity.js +95 -0
  150. package/dist/ui/modifiers/opacity.js.map +1 -0
  151. package/dist/ui/modifiers/padding.d.ts +20 -0
  152. package/dist/ui/modifiers/padding.d.ts.map +1 -0
  153. package/dist/ui/modifiers/padding.js +36 -0
  154. package/dist/ui/modifiers/padding.js.map +1 -0
  155. package/dist/ui/modifiers/styled.d.ts +14 -0
  156. package/dist/ui/modifiers/styled.d.ts.map +1 -0
  157. package/dist/ui/modifiers/styled.js +26 -0
  158. package/dist/ui/modifiers/styled.js.map +1 -0
  159. package/dist/ui/primitives/rectangle.d.ts +15 -0
  160. package/dist/ui/primitives/rectangle.d.ts.map +1 -0
  161. package/dist/ui/primitives/rectangle.js +23 -0
  162. package/dist/ui/primitives/rectangle.js.map +1 -0
  163. package/dist/ui/primitives/spacer.d.ts +13 -0
  164. package/dist/ui/primitives/spacer.d.ts.map +1 -0
  165. package/dist/ui/primitives/spacer.js +16 -0
  166. package/dist/ui/primitives/spacer.js.map +1 -0
  167. package/dist/ui/primitives/text.d.ts +15 -0
  168. package/dist/ui/primitives/text.d.ts.map +1 -0
  169. package/dist/ui/primitives/text.js +79 -0
  170. package/dist/ui/primitives/text.js.map +1 -0
  171. package/dist/ui/primitives/wrapped-text.d.ts +30 -0
  172. package/dist/ui/primitives/wrapped-text.d.ts.map +1 -0
  173. package/dist/ui/primitives/wrapped-text.js +117 -0
  174. package/dist/ui/primitives/wrapped-text.js.map +1 -0
  175. package/dist/ui/shinytext.d.ts +66 -0
  176. package/dist/ui/shinytext.d.ts.map +1 -0
  177. package/dist/ui/shinytext.js +99 -0
  178. package/dist/ui/shinytext.js.map +1 -0
  179. package/dist/ui/text/layout.d.ts +35 -0
  180. package/dist/ui/text/layout.d.ts.map +1 -0
  181. package/dist/ui/text/layout.js +102 -0
  182. package/dist/ui/text/layout.js.map +1 -0
  183. package/dist/ui/textinput.d.ts +140 -0
  184. package/dist/ui/textinput.d.ts.map +1 -0
  185. package/dist/ui/textinput.js +402 -0
  186. package/dist/ui/textinput.js.map +1 -0
  187. package/dist/ui/view-constructors.d.ts +72 -0
  188. package/dist/ui/view-constructors.d.ts.map +1 -0
  189. package/dist/ui/view-constructors.js +74 -0
  190. package/dist/ui/view-constructors.js.map +1 -0
  191. package/package.json +57 -0
  192. package/src/anim.ts +5 -0
  193. package/src/ansi.ts +83 -0
  194. package/src/index.ts +21 -0
  195. package/src/keys.ts +302 -0
  196. package/src/layout/linearStack.ts +115 -0
  197. package/src/motion-value.ts +335 -0
  198. package/src/present/display.ts +206 -0
  199. package/src/present/writers/fullscreen.ts +58 -0
  200. package/src/present/writers/inline.ts +101 -0
  201. package/src/render/buffer.ts +200 -0
  202. package/src/render/color-utils.ts +60 -0
  203. package/src/render/diff.ts +95 -0
  204. package/src/render/measure.ts +74 -0
  205. package/src/render/palette.ts +113 -0
  206. package/src/render/surface.ts +238 -0
  207. package/src/runtime/backend_node.ts +80 -0
  208. package/src/spring-physics.ts +151 -0
  209. package/src/spring.ts +234 -0
  210. package/src/ui/__snapshots__/wrappedtext.test.ts.snap +57 -0
  211. package/src/ui/containers/canvas.ts +18 -0
  212. package/src/ui/containers/geometry-reader.ts +32 -0
  213. package/src/ui/containers/hstack.ts +33 -0
  214. package/src/ui/containers/scroll.ts +106 -0
  215. package/src/ui/containers/shared.ts +27 -0
  216. package/src/ui/containers/vstack.ts +34 -0
  217. package/src/ui/containers/zstack.ts +37 -0
  218. package/src/ui/core/geometry-store.ts +42 -0
  219. package/src/ui/core/geometry.ts +30 -0
  220. package/src/ui/core/view.ts +49 -0
  221. package/src/ui/index.ts +84 -0
  222. package/src/ui/inlinetext.ts +135 -0
  223. package/src/ui/install.ts +110 -0
  224. package/src/ui/markdown.test.ts +74 -0
  225. package/src/ui/markdown.ts +388 -0
  226. package/src/ui/modifiers/border.ts +100 -0
  227. package/src/ui/modifiers/fill.ts +28 -0
  228. package/src/ui/modifiers/frame.ts +74 -0
  229. package/src/ui/modifiers/offset.ts +23 -0
  230. package/src/ui/modifiers/opacity.ts +93 -0
  231. package/src/ui/modifiers/padding.ts +53 -0
  232. package/src/ui/modifiers/styled.ts +31 -0
  233. package/src/ui/primitives/rectangle.ts +25 -0
  234. package/src/ui/primitives/spacer.ts +18 -0
  235. package/src/ui/primitives/text.ts +85 -0
  236. package/src/ui/primitives/wrapped-text.ts +131 -0
  237. package/src/ui/shinytext.ts +159 -0
  238. package/src/ui/text/layout.ts +119 -0
  239. package/src/ui/textinput.ts +496 -0
  240. package/src/ui/view-constructors.ts +96 -0
  241. package/src/ui/wrappedtext.test.ts +138 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Stream a minimal set of style-runs for changes from prev → next.
3
+ *
4
+ * Algorithm (row-wise):
5
+ * - For each row, compute a tight change window [left, right]. Skip entirely if equal.
6
+ * - Within the window, emit contiguous runs grouped by style. A new run begins when:
7
+ * - A cell changes, and
8
+ * - Its style differs from the current run (or the run just started).
9
+ * - Wide glyph continuation cells (cw=0) are skipped so they are not reprinted.
10
+ *
11
+ * Assumes both Surfaces are same size and compares their back buffers (B).
12
+ */
13
+ export function diffFrames(prev, next, w) {
14
+ const width = next.w;
15
+ const height = next.h;
16
+ // Access back buffers (like Surface.flush does). B is private on Surface, so use `any`.
17
+ const gA = prev.B.g;
18
+ const sA = prev.B.s;
19
+ const gB = next.B.g;
20
+ const sB = next.B.s;
21
+ const cwB = next.B.cw;
22
+ w.begin({ cols: width, rows: height });
23
+ for (let y = 0; y < height; y++) {
24
+ const row = y * width;
25
+ // Fast skip window: [left..right] bounds that changed
26
+ let left = 0, right = width - 1;
27
+ while (left <= right) {
28
+ const i = row + left;
29
+ if (gA[i] === gB[i] && sA[i] === sB[i])
30
+ left++;
31
+ else
32
+ break;
33
+ }
34
+ if (left > right)
35
+ continue;
36
+ while (right >= left) {
37
+ const i = row + right;
38
+ if (gA[i] === gB[i] && sA[i] === sB[i])
39
+ right--;
40
+ else
41
+ break;
42
+ }
43
+ // Emit contiguous style runs within [left..right]
44
+ let x = left;
45
+ while (x <= right) {
46
+ // Skip unchanged within window
47
+ while (x <= right) {
48
+ const i = row + x;
49
+ if (gA[i] !== gB[i] || sA[i] !== sB[i])
50
+ break;
51
+ x++;
52
+ }
53
+ if (x > right)
54
+ break;
55
+ const style = sB[row + x];
56
+ const runX = x;
57
+ let text = "";
58
+ while (x <= right) {
59
+ const i = row + x;
60
+ if (sB[i] !== style)
61
+ break;
62
+ const cp = gB[i];
63
+ const ww = cwB[i];
64
+ if (ww !== 0)
65
+ text += cp === 32 ? " " : String.fromCodePoint(cp);
66
+ x++;
67
+ // skip continuation cells of wide glyphs from the next buffer
68
+ while (x <= right && cwB[row + x] === 0)
69
+ x++;
70
+ // Stop run if next cell is unchanged; diff window will reposition
71
+ if (x <= right) {
72
+ const j = row + x;
73
+ if (gA[j] === gB[j] && sA[j] === sB[j])
74
+ break;
75
+ }
76
+ }
77
+ if (text.length > 0)
78
+ w.run(y, runX, style, text);
79
+ }
80
+ }
81
+ w.end();
82
+ }
83
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/render/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Wcwidth } from "./buffer.js";
2
+ /** Split a string into grapheme clusters (ZWJ sequences kept together when supported). */
3
+ export declare function graphemes(text: string): string[];
4
+ /** Compute display width using wcwidth of the first code point of each grapheme. */
5
+ export declare function displayWidth(text: string, wc?: Wcwidth): number;
6
+ /**
7
+ * Take as many graphemes as fit within maxWidth cells.
8
+ * Returns the substring, its display width, and whether the whole input fit.
9
+ */
10
+ export declare function sliceByWidth(text: string, maxWidth: number, wc?: Wcwidth): {
11
+ text: string;
12
+ width: number;
13
+ complete: boolean;
14
+ };
15
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/render/measure.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAqB1C,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAShD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,OAAwB,GAAG,MAAM,CAS/E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,EAAE,GAAE,OAAwB,GAC3B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAapD"}
@@ -0,0 +1,65 @@
1
+ /* measure.ts — shared grapheme segmentation and display width helpers
2
+ *
3
+ * These helpers intentionally mirror CellBuffer.drawText semantics:
4
+ * - Prefer Intl.Segmenter('grapheme') when available; otherwise iterate code points.
5
+ * - Width is derived from wcwidth(first code point) with a minimum of 1.
6
+ */
7
+ import { defaultWcwidth } from "./buffer.js";
8
+ function getGraphemeSegmenter() {
9
+ const SegCtor = globalThis.Intl?.Segmenter;
10
+ if (typeof SegCtor === "function") {
11
+ try {
12
+ return new SegCtor(undefined, {
13
+ granularity: "grapheme",
14
+ });
15
+ }
16
+ catch {
17
+ // ignore and fall back
18
+ }
19
+ }
20
+ return null;
21
+ }
22
+ /** Split a string into grapheme clusters (ZWJ sequences kept together when supported). */
23
+ export function graphemes(text) {
24
+ const seg = getGraphemeSegmenter();
25
+ if (seg) {
26
+ const out = [];
27
+ for (const { segment } of seg.segment(text))
28
+ out.push(segment);
29
+ return out;
30
+ }
31
+ // Fallback: iterate code points (may split ZWJ sequences)
32
+ return Array.from(text);
33
+ }
34
+ /** Compute display width using wcwidth of the first code point of each grapheme. */
35
+ export function displayWidth(text, wc = defaultWcwidth) {
36
+ let w = 0;
37
+ const gs = graphemes(text);
38
+ for (const g of gs) {
39
+ const cp = g.codePointAt(0) ?? 32;
40
+ const ww = wc(cp) || 1;
41
+ w += ww;
42
+ }
43
+ return w;
44
+ }
45
+ /**
46
+ * Take as many graphemes as fit within maxWidth cells.
47
+ * Returns the substring, its display width, and whether the whole input fit.
48
+ */
49
+ export function sliceByWidth(text, maxWidth, wc = defaultWcwidth) {
50
+ if (maxWidth <= 0)
51
+ return { text: "", width: 0, complete: text.length === 0 };
52
+ const gs = graphemes(text);
53
+ const out = [];
54
+ let used = 0;
55
+ for (const g of gs) {
56
+ const cp = g.codePointAt(0) ?? 32;
57
+ const ww = wc(cp) || 1;
58
+ if (used + ww > maxWidth)
59
+ break;
60
+ out.push(g);
61
+ used += ww;
62
+ }
63
+ return { text: out.join(""), width: used, complete: out.length === gs.length };
64
+ }
65
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.js","sourceRoot":"","sources":["../../src/render/measure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAM5C,SAAS,oBAAoB;IAC3B,MAAM,OAAO,GAA6D,UAAkB,CAAC,IAAI,EAAE,SAAS,CAAA;IAC5G,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,IAAK,OAAqD,CAAC,SAAS,EAAE;gBAC3E,WAAW,EAAE,UAAU;aACxB,CAAsB,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAA;IAClC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,GAAa,EAAE,CAAA;QACxB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC9D,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,0DAA0D;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAc,cAAc;IACrE,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC,IAAI,EAAE,CAAA;IACT,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,QAAgB,EAChB,KAAc,cAAc;IAE5B,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAA;IAC7E,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,GAAG,EAAE,GAAG,QAAQ;YAAE,MAAK;QAC/B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACX,IAAI,IAAI,EAAE,CAAA;IACZ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,CAAA;AAChF,CAAC"}
@@ -0,0 +1,46 @@
1
+ export type ColorValue = number | {
2
+ r: number;
3
+ g: number;
4
+ b: number;
5
+ };
6
+ export type StyleSpec = {
7
+ fg?: ColorValue;
8
+ bg?: ColorValue;
9
+ bold?: boolean;
10
+ italic?: boolean;
11
+ underline?: boolean;
12
+ inverse?: boolean;
13
+ };
14
+ /**
15
+ * Palette interns "style specs" into small numeric ids and caches their
16
+ * ANSI SGR escape strings. Id 0 always represents the default terminal style.
17
+ */
18
+ export declare class Palette {
19
+ private nextId;
20
+ private idByKey;
21
+ private sgrById;
22
+ /** Get or create a numeric style id for a given style spec. */
23
+ id(spec?: StyleSpec): number;
24
+ /** Look up the ANSI SGR sequence for a style id. Id 0 resets attributes. */
25
+ sgr(id: number): string;
26
+ /**
27
+ * Build an ANSI SGR sequence for a style spec.
28
+ * We always begin with reset (0) to avoid style drift across runs,
29
+ * then add only the requested attributes.
30
+ */
31
+ private buildSGR;
32
+ }
33
+ /**
34
+ * ScopedPalette provides style scoping: it merges a base style with any
35
+ * requested style, while delegating id/sgr generation to a shared Palette.
36
+ */
37
+ export declare class ScopedPalette extends Palette {
38
+ private readonly base;
39
+ private readonly baseStyle?;
40
+ constructor(base: Palette, baseStyle?: StyleSpec | undefined);
41
+ id(spec?: StyleSpec): number;
42
+ sgr(id: number): string;
43
+ }
44
+ /** Merge two style specs (b overrides a). Returns undefined if nothing to set. */
45
+ export declare function mergeStyle(a?: StyleSpec, b?: StyleSpec): StyleSpec | undefined;
46
+ //# sourceMappingURL=palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/render/palette.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAGrE,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAA4B;IAE3C,+DAA+D;IAC/D,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM;IAW5B,4EAA4E;IAC5E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAMvB;;;;OAIG;IACH,OAAO,CAAC,QAAQ;CAsBjB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,OAAO;IAEtC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBADV,IAAI,EAAE,OAAO,EACb,SAAS,CAAC,EAAE,SAAS,YAAA;IAK/B,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM;IAI5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;CAGjC;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAgB9E"}
@@ -0,0 +1,108 @@
1
+ const ESC = "\x1b[";
2
+ const CSI = ESC; // alias for clarity
3
+ /**
4
+ * Palette interns "style specs" into small numeric ids and caches their
5
+ * ANSI SGR escape strings. Id 0 always represents the default terminal style.
6
+ */
7
+ export class Palette {
8
+ nextId = 1; // 0 = default terminal style
9
+ idByKey = new Map();
10
+ sgrById = new Map();
11
+ /** Get or create a numeric style id for a given style spec. */
12
+ id(spec) {
13
+ if (!spec)
14
+ return 0;
15
+ const key = JSON.stringify(spec);
16
+ let id = this.idByKey.get(key);
17
+ if (id)
18
+ return id;
19
+ id = this.nextId++;
20
+ this.idByKey.set(key, id);
21
+ this.sgrById.set(id, this.buildSGR(spec));
22
+ return id;
23
+ }
24
+ /** Look up the ANSI SGR sequence for a style id. Id 0 resets attributes. */
25
+ sgr(id) {
26
+ if (id === 0)
27
+ return `${ESC}0m`;
28
+ const s = this.sgrById.get(id);
29
+ return s ?? `${ESC}0m`;
30
+ }
31
+ /**
32
+ * Build an ANSI SGR sequence for a style spec.
33
+ * We always begin with reset (0) to avoid style drift across runs,
34
+ * then add only the requested attributes.
35
+ */
36
+ buildSGR(spec) {
37
+ const parts = [];
38
+ parts.push("0"); // reset, then set exact attrs to avoid drift
39
+ if (spec.bold)
40
+ parts.push("1");
41
+ if (spec.italic)
42
+ parts.push("3");
43
+ if (spec.underline)
44
+ parts.push("4");
45
+ if (spec.inverse)
46
+ parts.push("7");
47
+ const colorToCodes = (c, isBg) => {
48
+ if (c == null)
49
+ return undefined;
50
+ if (typeof c === "number")
51
+ return (isBg ? "48;5;" : "38;5;") + String(c | 0);
52
+ const clamp = (n) => (n < 0 ? 0 : n > 255 ? 255 : n | 0);
53
+ return `${isBg ? "48;2;" : "38;2;"}${clamp(c.r)};${clamp(c.g)};${clamp(c.b)}`;
54
+ };
55
+ const fgc = colorToCodes(spec.fg, false);
56
+ const bgc = colorToCodes(spec.bg, true);
57
+ if (fgc)
58
+ parts.push(fgc);
59
+ if (bgc)
60
+ parts.push(bgc);
61
+ return `${CSI}${parts.join(";")}m`;
62
+ }
63
+ }
64
+ /**
65
+ * ScopedPalette provides style scoping: it merges a base style with any
66
+ * requested style, while delegating id/sgr generation to a shared Palette.
67
+ */
68
+ export class ScopedPalette extends Palette {
69
+ base;
70
+ baseStyle;
71
+ constructor(base, baseStyle) {
72
+ super();
73
+ this.base = base;
74
+ this.baseStyle = baseStyle;
75
+ }
76
+ id(spec) {
77
+ return this.base.id(mergeStyle(this.baseStyle, spec));
78
+ }
79
+ sgr(id) {
80
+ return this.base.sgr(id);
81
+ }
82
+ }
83
+ /** Merge two style specs (b overrides a). Returns undefined if nothing to set. */
84
+ export function mergeStyle(a, b) {
85
+ if (!a && !b)
86
+ return undefined;
87
+ const merged = {};
88
+ const fg = b?.fg ?? a?.fg;
89
+ const bg = b?.bg ?? a?.bg;
90
+ const bold = b?.bold ?? a?.bold;
91
+ const italic = b?.italic ?? a?.italic;
92
+ const underline = b?.underline ?? a?.underline;
93
+ const inverse = b?.inverse ?? a?.inverse;
94
+ if (fg !== undefined)
95
+ merged.fg = fg;
96
+ if (bg !== undefined)
97
+ merged.bg = bg;
98
+ if (bold !== undefined)
99
+ merged.bold = bold;
100
+ if (italic !== undefined)
101
+ merged.italic = italic;
102
+ if (underline !== undefined)
103
+ merged.underline = underline;
104
+ if (inverse !== undefined)
105
+ merged.inverse = inverse;
106
+ return Object.keys(merged).length > 0 ? merged : undefined;
107
+ }
108
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/render/palette.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type Wcwidth } from "./buffer.js";
2
+ import { Palette, type ColorValue, type StyleSpec, mergeStyle } from "./palette.js";
3
+ export type { ColorValue, StyleSpec };
4
+ export { Palette, mergeStyle };
5
+ /** Color inputs accepted by helpers: numeric, rgb object, or string (hex/name/grayN). */
6
+ export type ColorLike = ColorValue | string;
7
+ export declare const BASE_NAMES: {
8
+ readonly black: 0;
9
+ readonly red: 1;
10
+ readonly green: 2;
11
+ readonly yellow: 3;
12
+ readonly blue: 4;
13
+ readonly magenta: 5;
14
+ readonly cyan: 6;
15
+ readonly white: 7;
16
+ readonly brightBlack: 8;
17
+ readonly brightRed: 9;
18
+ readonly brightGreen: 10;
19
+ readonly brightYellow: 11;
20
+ readonly brightBlue: 12;
21
+ readonly brightMagenta: 13;
22
+ readonly brightCyan: 14;
23
+ readonly brightWhite: 15;
24
+ };
25
+ /**
26
+ * Parse flexible color inputs into a ColorValue.
27
+ * Supports: number (0..255), {r,g,b}, "#rrggbb", base names, and gray0..gray23.
28
+ */
29
+ export declare function parseColor(c: ColorLike): ColorValue;
30
+ type ColorsApi = typeof BASE_NAMES & {
31
+ rgb(r: number, g: number, b: number): ColorValue;
32
+ hex(hex: string): ColorValue;
33
+ gray(level: number): number;
34
+ };
35
+ export declare const Colors: ColorsApi;
36
+ export declare function derivePalette(p: Palette, base?: StyleSpec): Palette;
37
+ export declare class Surface {
38
+ readonly w: number;
39
+ readonly h: number;
40
+ private B;
41
+ private palette;
42
+ constructor(width: number, height: number, opts?: {
43
+ palette?: Palette;
44
+ wcwidth?: Wcwidth;
45
+ });
46
+ /** Clear the back buffer (B) to spaces in the given style. */
47
+ clear(styleId?: number): void;
48
+ /** Draw a single code point at (x,y). If width=2, marks the following cell as continuation (w=0). */
49
+ drawCP(x: number, y: number, cp: number, styleId?: number): void;
50
+ /** Draw plain text (no wrapping) clipped to width. Uses Intl.Segmenter if available. */
51
+ drawText(x: number, y: number, text: string, styleId?: number, maxWidth?: number): void;
52
+ /** Fill a rectangle with a code point + style. */
53
+ fillRect(x: number, y: number, w: number, h: number, cp?: number, styleId?: number): void;
54
+ pushClip(x: number, y: number, w: number, h: number): void;
55
+ popClip(): void;
56
+ withClip(x: number, y: number, w: number, h: number, fn: () => void): void;
57
+ pushOffset(dx: number, dy: number): void;
58
+ popOffset(): void;
59
+ withOffset(dx: number, dy: number, fn: () => void): void;
60
+ /** Convert surface to plain text (for testing). */
61
+ toString(): string;
62
+ /** Compute tight bounding box of content in back buffer: any non-space glyph or non-default style. */
63
+ contentBounds(): {
64
+ x: number;
65
+ y: number;
66
+ w: number;
67
+ h: number;
68
+ };
69
+ /** Build styled text lines for a given bounds region of the back buffer (without trailing newlines). */
70
+ buildStyledLines(bounds: {
71
+ x: number;
72
+ y: number;
73
+ w: number;
74
+ h: number;
75
+ }, palette?: Palette): string[];
76
+ }
77
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../src/render/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ import { CellBuffer, defaultWcwidth } from "./buffer.js";
2
+ import { Palette, ScopedPalette, mergeStyle } from "./palette.js";
3
+ export { Palette, mergeStyle };
4
+ export const BASE_NAMES = {
5
+ black: 0,
6
+ red: 1,
7
+ green: 2,
8
+ yellow: 3,
9
+ blue: 4,
10
+ magenta: 5,
11
+ cyan: 6,
12
+ white: 7,
13
+ brightBlack: 8,
14
+ brightRed: 9,
15
+ brightGreen: 10,
16
+ brightYellow: 11,
17
+ brightBlue: 12,
18
+ brightMagenta: 13,
19
+ brightCyan: 14,
20
+ brightWhite: 15,
21
+ };
22
+ /**
23
+ * Parse flexible color inputs into a ColorValue.
24
+ * Supports: number (0..255), {r,g,b}, "#rrggbb", base names, and gray0..gray23.
25
+ */
26
+ export function parseColor(c) {
27
+ if (typeof c === "number")
28
+ return c;
29
+ if (typeof c === "object")
30
+ return { r: c.r | 0, g: c.g | 0, b: c.b | 0 };
31
+ const s = String(c).trim();
32
+ if (s.startsWith("#")) {
33
+ const hex = s.slice(1);
34
+ if (hex.length === 6) {
35
+ const r = parseInt(hex.slice(0, 2), 16);
36
+ const g = parseInt(hex.slice(2, 4), 16);
37
+ const b = parseInt(hex.slice(4, 6), 16);
38
+ return { r, g, b };
39
+ }
40
+ }
41
+ if (s in BASE_NAMES)
42
+ return BASE_NAMES[s];
43
+ const m = /^(?:gray|grey)(\d{1,2})$/.exec(s);
44
+ if (m?.[1]) {
45
+ const n = Math.max(0, Math.min(23, parseInt(m[1], 10)));
46
+ return 232 + n;
47
+ }
48
+ return 7; // default to white if unrecognized
49
+ }
50
+ export const Colors = Object.assign({
51
+ rgb(r, g, b) {
52
+ return { r, g, b };
53
+ },
54
+ hex(hex) {
55
+ return parseColor(hex);
56
+ },
57
+ gray(level) {
58
+ const n = Math.max(0, Math.min(23, level | 0));
59
+ return 232 + n;
60
+ },
61
+ }, BASE_NAMES);
62
+ export function derivePalette(p, base) {
63
+ return new ScopedPalette(p, base);
64
+ }
65
+ export class Surface {
66
+ w;
67
+ h;
68
+ B;
69
+ palette;
70
+ constructor(width, height, opts) {
71
+ this.w = Math.max(1, width | 0);
72
+ this.h = Math.max(1, height | 0);
73
+ const wc = opts?.wcwidth ?? defaultWcwidth;
74
+ this.B = new CellBuffer(this.w, this.h, wc);
75
+ this.palette = opts?.palette ?? new Palette();
76
+ this.B.clear(0);
77
+ }
78
+ /** Clear the back buffer (B) to spaces in the given style. */
79
+ clear(styleId = 0) {
80
+ this.B.clear(styleId);
81
+ }
82
+ /** Draw a single code point at (x,y). If width=2, marks the following cell as continuation (w=0). */
83
+ drawCP(x, y, cp, styleId = 0) {
84
+ this.B.drawCP(x, y, cp, styleId);
85
+ }
86
+ /** Draw plain text (no wrapping) clipped to width. Uses Intl.Segmenter if available. */
87
+ drawText(x, y, text, styleId = 0, maxWidth) {
88
+ this.B.drawText(x, y, text, styleId, maxWidth);
89
+ }
90
+ /** Fill a rectangle with a code point + style. */
91
+ fillRect(x, y, w, h, cp = 32, styleId = 0) {
92
+ this.B.fillRect(x, y, w, h, cp, styleId);
93
+ }
94
+ // --- Clipping helpers (forwarded to back buffer) ---
95
+ pushClip(x, y, w, h) {
96
+ this.B.pushClip(x, y, w, h);
97
+ }
98
+ popClip() {
99
+ this.B.popClip();
100
+ }
101
+ withClip(x, y, w, h, fn) {
102
+ this.B.withClip(x, y, w, h, fn);
103
+ }
104
+ // --- Offset helpers (forwarded to back buffer) ---
105
+ pushOffset(dx, dy) {
106
+ this.B.pushOffset(dx, dy);
107
+ }
108
+ popOffset() {
109
+ this.B.popOffset();
110
+ }
111
+ withOffset(dx, dy, fn) {
112
+ this.B.withOffset(dx, dy, fn);
113
+ }
114
+ /** Convert surface to plain text (for testing). */
115
+ toString() {
116
+ const lines = [];
117
+ for (let y = 0; y < this.h; y++) {
118
+ const row = y * this.w;
119
+ let line = "";
120
+ for (let x = 0; x < this.w; x++) {
121
+ const i = row + x;
122
+ const cp = this.B.g[i];
123
+ const w = this.B.cw[i];
124
+ if (w !== 0)
125
+ line += cp === 32 ? " " : String.fromCodePoint(cp);
126
+ }
127
+ // trim right spaces
128
+ line = line.replace(/\s+$/, "");
129
+ lines.push(line);
130
+ }
131
+ return lines.join("\n");
132
+ }
133
+ /** Compute tight bounding box of content in back buffer: any non-space glyph or non-default style. */
134
+ contentBounds() {
135
+ const W = this.w;
136
+ const H = this.h;
137
+ const g = this.B.g;
138
+ const s = this.B.s;
139
+ const cw = this.B.cw;
140
+ let minX = W, minY = H, maxX = -1, maxY = -1;
141
+ for (let y = 0; y < H; y++) {
142
+ const row = y * W;
143
+ for (let x = 0; x < W; x++) {
144
+ const i = row + x;
145
+ if (cw[i] === 0)
146
+ continue;
147
+ if (g[i] !== 32 || s[i] !== 0) {
148
+ if (x < minX)
149
+ minX = x;
150
+ if (y < minY)
151
+ minY = y;
152
+ if (x > maxX)
153
+ maxX = x;
154
+ if (y > maxY)
155
+ maxY = y;
156
+ }
157
+ }
158
+ }
159
+ if (maxX < minX || maxY < minY)
160
+ return { x: 0, y: 0, w: 0, h: 0 };
161
+ return { x: minX, y: minY, w: maxX - minX + 1, h: maxY - minY + 1 };
162
+ }
163
+ /** Build styled text lines for a given bounds region of the back buffer (without trailing newlines). */
164
+ buildStyledLines(bounds, palette = this.palette) {
165
+ const W = this.w;
166
+ const g = this.B.g;
167
+ const s = this.B.s;
168
+ const cw = this.B.cw;
169
+ const lines = [];
170
+ const { x: bx, y: by, w: bw, h: bh } = bounds;
171
+ const endY = Math.min(by + bh, this.h);
172
+ const endX = Math.min(bx + bw, W);
173
+ for (let y = Math.max(0, by); y < endY; y++) {
174
+ const row = y * W;
175
+ let line = "";
176
+ let currentStyle = -1;
177
+ for (let x = Math.max(0, bx); x < endX; x++) {
178
+ const i = row + x;
179
+ if (cw[i] === 0)
180
+ continue; // skip continuation cells
181
+ const styleId = s[i];
182
+ if (styleId !== currentStyle) {
183
+ line += palette.sgr(styleId);
184
+ currentStyle = styleId;
185
+ }
186
+ const cp = g[i];
187
+ line += cp === 32 ? " " : String.fromCodePoint(cp);
188
+ }
189
+ // reset style at end of line
190
+ if (currentStyle !== 0) {
191
+ line += palette.sgr(0);
192
+ }
193
+ lines.push(line);
194
+ }
195
+ return lines;
196
+ }
197
+ }
198
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/render/surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,cAAc,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAmC,UAAU,EAAE,MAAM,cAAc,CAAA;AAIlG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AAK9B,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;CACP,CAAA;AAEV;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,CAAY;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAA;IACnC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;IACxE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAE1B,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,CAA4B,CAAC,CAAA;IAEpE,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACvD,OAAO,GAAG,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,CAAC,CAAA,CAAC,mCAAmC;AAC9C,CAAC;AAQD,MAAM,CAAC,MAAM,MAAM,GAAc,MAAM,CAAC,MAAM,CAC5C;IACE,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;QACjC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;IACpB,CAAC;IACD,GAAG,CAAC,GAAW;QACb,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,CAAC,KAAa;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;QAC9C,OAAO,GAAG,GAAG,CAAC,CAAA;IAChB,CAAC;CACF,EACD,UAAU,CACE,CAAA;AAEd,MAAM,UAAU,aAAa,CAAC,CAAU,EAAE,IAAgB;IACxD,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,OAAO,OAAO;IACT,CAAC,CAAQ;IACT,CAAC,CAAQ;IACV,CAAC,CAAY;IACb,OAAO,CAAS;IAExB,YAAY,KAAa,EAAE,MAAc,EAAE,IAA+C;QACxF,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;QAEhC,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,IAAI,cAAc,CAAA;QAC1C,IAAI,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,OAAO,EAAE,CAAA;QAE7C,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAO,GAAG,CAAC;QACf,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;IAED,qGAAqG;IACrG,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,EAAU,EAAE,OAAO,GAAG,CAAC;QAClD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,wFAAwF;IACxF,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,OAAO,GAAG,CAAC,EAAE,QAAiB;QACzE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;IAED,kDAAkD;IAClD,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC;QACvE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,sDAAsD;IAEtD,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACjD,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IAClB,CAAC;IAED,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAc;QACjE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,oDAAoD;IAEpD,UAAU,CAAC,EAAU,EAAE,EAAU;QAC/B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED,SAAS;QACP,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACpB,CAAC;IAED,UAAU,CAAC,EAAU,EAAE,EAAU,EAAE,EAAc;QAC/C,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAC/B,CAAC;IAED,mDAAmD;IACnD,QAAQ;QACN,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;YACtB,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;gBACjB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACtB,IAAI,CAAC,KAAK,CAAC;oBAAE,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YACjE,CAAC;YACD,oBAAoB;YACpB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,sGAAsG;IACtG,aAAa;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QACpB,IAAI,IAAI,GAAG,CAAC,EACV,IAAI,GAAG,CAAC,EACR,IAAI,GAAG,CAAC,CAAC,EACT,IAAI,GAAG,CAAC,CAAC,CAAA;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;gBACjB,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAE,SAAQ;gBACzB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAA;oBACtB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAA;oBACtB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAA;oBACtB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAA;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QACjE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA;IACrE,CAAC;IAED,wGAAwG;IACxG,gBAAgB,CAAC,MAAsD,EAAE,UAAmB,IAAI,CAAC,OAAO;QACtG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QACpB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAA;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;QAEjC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YACjB,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,IAAI,YAAY,GAAG,CAAC,CAAC,CAAA;YAErB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;gBACjB,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAE,SAAQ,CAAC,0BAA0B;gBAEpD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpB,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;oBAC7B,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBAC5B,YAAY,GAAG,OAAO,CAAA;gBACxB,CAAC;gBAED,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBACf,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YACpD,CAAC;YAED,6BAA6B;YAC7B,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACxB,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}