@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,33 @@
1
+ import type { Palette, Surface, StyleSpec, ColorLike } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export type BorderKind = "none" | "rounded" | "square" | "ascii";
5
+ export type BorderOptions = {
6
+ kind?: BorderKind;
7
+ color?: ColorLike;
8
+ padding?: number | {
9
+ x?: number;
10
+ y?: number;
11
+ };
12
+ chars?: Partial<{
13
+ tl: string;
14
+ tr: string;
15
+ bl: string;
16
+ br: string;
17
+ h: string;
18
+ v: string;
19
+ }>;
20
+ style?: StyleSpec;
21
+ };
22
+ export declare class Border extends View {
23
+ readonly child: View;
24
+ readonly opts?: BorderOptions | undefined;
25
+ constructor(child: View, opts?: BorderOptions | undefined);
26
+ private get thickness();
27
+ protected measureContent(maxW: number, maxH: number): {
28
+ w: number;
29
+ h: number;
30
+ };
31
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
32
+ }
33
+ //# sourceMappingURL=border.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/border.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAErF,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAChE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzF,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAoBD,qBAAa,MAAO,SAAQ,IAAI;IAE5B,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa;gBADpB,KAAK,EAAE,IAAI,EACX,IAAI,CAAC,EAAE,aAAa,YAAA;IAK/B,OAAO,KAAK,SAAS,GAEpB;IAED,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAUnD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CA6C7D"}
@@ -0,0 +1,82 @@
1
+ import { Colors, parseColor } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ function resolveBorderPadding(p) {
4
+ if (typeof p === "number")
5
+ return { x: Math.max(0, p | 0), y: Math.max(0, p | 0) };
6
+ return { x: Math.max(0, p?.x ?? 0), y: Math.max(0, p?.y ?? 0) };
7
+ }
8
+ function borderKindChars(kind) {
9
+ switch (kind) {
10
+ case "rounded":
11
+ return { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│" };
12
+ case "square":
13
+ return { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│" };
14
+ case "ascii":
15
+ return { tl: "+", tr: "+", bl: "+", br: "+", h: "-", v: "|" };
16
+ default:
17
+ return { tl: "", tr: "", bl: "", br: "", h: "", v: "" };
18
+ }
19
+ }
20
+ export class Border extends View {
21
+ child;
22
+ opts;
23
+ constructor(child, opts) {
24
+ super();
25
+ this.child = child;
26
+ this.opts = opts;
27
+ }
28
+ get thickness() {
29
+ return this.opts?.kind === "none" ? 0 : 1;
30
+ }
31
+ measureContent(maxW, maxH) {
32
+ const t = this.thickness;
33
+ const pad = resolveBorderPadding(this.opts?.padding);
34
+ const m = this.child.measure(Math.max(0, maxW - t * 2 - pad.x * 2), Math.max(0, maxH - t * 2 - pad.y * 2));
35
+ return {
36
+ w: Math.min(maxW, m.w + t * 2 + pad.x * 2),
37
+ h: Math.min(maxH, m.h + t * 2 + pad.y * 2),
38
+ };
39
+ }
40
+ renderContent(s, pal, rect) {
41
+ const k = this.opts?.kind ?? "square";
42
+ const t = this.thickness;
43
+ const pad = resolveBorderPadding(this.opts?.padding);
44
+ const baseChars = borderKindChars(k);
45
+ const chars = { ...baseChars, ...(this.opts?.chars ?? {}) };
46
+ const safeChars = {
47
+ tl: (chars.tl ?? baseChars.tl),
48
+ tr: (chars.tr ?? baseChars.tr),
49
+ bl: (chars.bl ?? baseChars.bl),
50
+ br: (chars.br ?? baseChars.br),
51
+ h: (chars.h ?? baseChars.h),
52
+ v: (chars.v ?? baseChars.v),
53
+ };
54
+ const borderStyle = this.opts?.style ?? {};
55
+ const color = this.opts?.color != null ? parseColor(this.opts.color) : Colors.gray(8);
56
+ const idBorder = pal.id({ ...borderStyle, fg: color ?? borderStyle.fg });
57
+ const w = rect.w;
58
+ const h = rect.h;
59
+ if (w <= 0 || h <= 0)
60
+ return;
61
+ if (t === 1 && w >= 2 && h >= 2) {
62
+ s.drawCP(rect.x, rect.y, safeChars.tl.codePointAt(0), idBorder);
63
+ s.fillRect(rect.x + 1, rect.y, w - 2, 1, safeChars.h.codePointAt(0), idBorder);
64
+ s.drawCP(rect.x + w - 1, rect.y, safeChars.tr.codePointAt(0), idBorder);
65
+ for (let yy = rect.y + 1; yy < rect.y + h - 1; yy++) {
66
+ s.drawCP(rect.x, yy, safeChars.v.codePointAt(0), idBorder);
67
+ s.drawCP(rect.x + w - 1, yy, safeChars.v.codePointAt(0), idBorder);
68
+ }
69
+ s.drawCP(rect.x, rect.y + h - 1, safeChars.bl.codePointAt(0), idBorder);
70
+ s.fillRect(rect.x + 1, rect.y + h - 1, w - 2, 1, safeChars.h.codePointAt(0), idBorder);
71
+ s.drawCP(rect.x + w - 1, rect.y + h - 1, safeChars.br.codePointAt(0), idBorder);
72
+ }
73
+ const inner = {
74
+ x: rect.x + t + pad.x,
75
+ y: rect.y + t + pad.y,
76
+ w: Math.max(0, rect.w - (t + pad.x) * 2),
77
+ h: Math.max(0, rect.h - (t + pad.y) * 2),
78
+ };
79
+ this.child.render(s, pal, inner);
80
+ }
81
+ }
82
+ //# sourceMappingURL=border.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border.js","sourceRoot":"","sources":["../../../src/ui/modifiers/border.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Palette, Surface } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export declare class Fill extends View {
5
+ readonly child: View;
6
+ readonly axis: "horizontal" | "vertical";
7
+ constructor(child: View, axis: "horizontal" | "vertical");
8
+ protected measureContent(maxW: number, maxH: number): {
9
+ w: number;
10
+ h: number;
11
+ };
12
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
13
+ }
14
+ //# sourceMappingURL=fill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG/C,qBAAa,IAAK,SAAQ,IAAI;IAE1B,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU;gBAD/B,KAAK,EAAE,IAAI,EACX,IAAI,EAAE,YAAY,GAAG,UAAU;IAK1C,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAWnD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAG7D"}
@@ -0,0 +1,25 @@
1
+ import { View } from "../core/view.js";
2
+ // Fill wrapper (SwiftUI's .frame(maxWidth: .infinity) / .frame(maxHeight: .infinity))
3
+ export class Fill extends View {
4
+ child;
5
+ axis;
6
+ constructor(child, axis) {
7
+ super();
8
+ this.child = child;
9
+ this.axis = axis;
10
+ }
11
+ measureContent(maxW, maxH) {
12
+ const childMeasure = this.child.measure(maxW, maxH);
13
+ // Fill the requested axis to maximum available space
14
+ if (this.axis === "horizontal") {
15
+ return { w: maxW, h: childMeasure.h };
16
+ }
17
+ else {
18
+ return { w: childMeasure.w, h: maxH };
19
+ }
20
+ }
21
+ renderContent(s, pal, rect) {
22
+ this.child.render(s, pal, rect);
23
+ }
24
+ }
25
+ //# sourceMappingURL=fill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill.js","sourceRoot":"","sources":["../../../src/ui/modifiers/fill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGtC,sFAAsF;AACtF,MAAM,OAAO,IAAK,SAAQ,IAAI;IAEjB;IACA;IAFX,YACW,KAAW,EACX,IAA+B;QAExC,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAM;QACX,SAAI,GAAJ,IAAI,CAA2B;IAG1C,CAAC;IAES,cAAc,CAAC,IAAY,EAAE,IAAY;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAEnD,qDAAqD;QACrD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;QACvC,CAAC;IACH,CAAC;IAES,aAAa,CAAC,CAAU,EAAE,GAAY,EAAE,IAAU;QAC1D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import type { Palette, Surface } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect, Align2D } from "../core/geometry.js";
4
+ export interface FrameSpec {
5
+ width?: number;
6
+ height?: number;
7
+ minWidth?: number;
8
+ maxWidth?: number;
9
+ minHeight?: number;
10
+ maxHeight?: number;
11
+ alignment?: Align2D;
12
+ }
13
+ export declare class Frame extends View {
14
+ readonly child: View;
15
+ readonly opts: FrameSpec;
16
+ constructor(child: View, opts: FrameSpec);
17
+ protected measureContent(maxW: number, maxH: number): {
18
+ w: number;
19
+ h: number;
20
+ };
21
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
22
+ }
23
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,qBAAa,KAAM,SAAQ,IAAI;IAE3B,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS;gBADf,KAAK,EAAE,IAAI,EACX,IAAI,EAAE,SAAS;IAK1B,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAmBnD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAgC7D"}
@@ -0,0 +1,54 @@
1
+ import { View } from "../core/view.js";
2
+ export class Frame extends View {
3
+ child;
4
+ opts;
5
+ constructor(child, opts) {
6
+ super();
7
+ this.child = child;
8
+ this.opts = opts;
9
+ }
10
+ measureContent(maxW, maxH) {
11
+ const childMeasure = this.child.measure(maxW, maxH);
12
+ const fs = this.opts;
13
+ const capW = Math.min(maxW, fs.maxWidth ?? maxW);
14
+ const capH = Math.min(maxH, fs.maxHeight ?? maxH);
15
+ let targetW = fs.width === Infinity ? capW : (fs.width ?? childMeasure.w);
16
+ let targetH = fs.height === Infinity ? capH : (fs.height ?? childMeasure.h);
17
+ targetW = Math.max(fs.minWidth ?? 0, Math.min(capW, targetW));
18
+ targetH = Math.max(fs.minHeight ?? 0, Math.min(capH, targetH));
19
+ return {
20
+ w: Math.min(maxW, targetW),
21
+ h: Math.min(maxH, targetH),
22
+ };
23
+ }
24
+ renderContent(s, pal, rect) {
25
+ // Measure child within our rect bounds
26
+ const childMeasure = this.child.measure(rect.w, rect.h);
27
+ const childW = Math.min(rect.w, childMeasure.w);
28
+ const childH = Math.min(rect.h, childMeasure.h);
29
+ // Apply alignment
30
+ const alignment = this.opts.alignment ?? { h: "leading", v: "top" };
31
+ let offsetX = 0;
32
+ let offsetY = 0;
33
+ if (alignment.h === "center") {
34
+ offsetX = Math.floor((rect.w - childW) / 2);
35
+ }
36
+ else if (alignment.h === "trailing") {
37
+ offsetX = Math.max(0, rect.w - childW);
38
+ }
39
+ if (alignment.v === "center") {
40
+ offsetY = Math.floor((rect.h - childH) / 2);
41
+ }
42
+ else if (alignment.v === "bottom") {
43
+ offsetY = Math.max(0, rect.h - childH);
44
+ }
45
+ const childRect = {
46
+ x: rect.x + offsetX,
47
+ y: rect.y + offsetY,
48
+ w: childW,
49
+ h: childH,
50
+ };
51
+ this.child.render(s, pal, childRect);
52
+ }
53
+ }
54
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../src/ui/modifiers/frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Palette, Surface } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export declare class Offset extends View {
5
+ readonly child: View;
6
+ readonly dx: number;
7
+ readonly dy: number;
8
+ constructor(child: View, dx?: number, dy?: number);
9
+ protected measureContent(maxW: number, maxH: number): {
10
+ w: number;
11
+ h: number;
12
+ };
13
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
14
+ }
15
+ //# sourceMappingURL=offset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offset.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG/C,qBAAa,MAAO,SAAQ,IAAI;IAE5B,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,EAAE;IACX,QAAQ,CAAC,EAAE;gBAFF,KAAK,EAAE,IAAI,EACX,EAAE,SAAI,EACN,EAAE,SAAI;IAKjB,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAInD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAI7D"}
@@ -0,0 +1,21 @@
1
+ import { View } from "../core/view.js";
2
+ // Offset wrapper: translate child's render position by (dx, dy) without affecting measurement
3
+ export class Offset extends View {
4
+ child;
5
+ dx;
6
+ dy;
7
+ constructor(child, dx = 0, dy = 0) {
8
+ super();
9
+ this.child = child;
10
+ this.dx = dx;
11
+ this.dy = dy;
12
+ }
13
+ measureContent(maxW, maxH) {
14
+ return this.child.measure(maxW, maxH);
15
+ }
16
+ renderContent(s, pal, rect) {
17
+ const r = { x: rect.x + (this.dx | 0), y: rect.y + (this.dy | 0), w: rect.w, h: rect.h };
18
+ this.child.render(s, pal, r);
19
+ }
20
+ }
21
+ //# sourceMappingURL=offset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offset.js","sourceRoot":"","sources":["../../../src/ui/modifiers/offset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGtC,8FAA8F;AAC9F,MAAM,OAAO,MAAO,SAAQ,IAAI;IAEnB;IACA;IACA;IAHX,YACW,KAAW,EACX,KAAK,CAAC,EACN,KAAK,CAAC;QAEf,KAAK,EAAE,CAAA;QAJE,UAAK,GAAL,KAAK,CAAM;QACX,OAAE,GAAF,EAAE,CAAI;QACN,OAAE,GAAF,EAAE,CAAI;IAGjB,CAAC;IAES,cAAc,CAAC,IAAY,EAAE,IAAY;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACvC,CAAC;IAES,aAAa,CAAC,CAAU,EAAE,GAAY,EAAE,IAAU;QAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAA;QACxF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC9B,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { Surface } from "../../render/surface.js";
2
+ import { Palette } from "../../render/surface.js";
3
+ import { View } from "../core/view.js";
4
+ import type { Rect } from "../core/geometry.js";
5
+ export declare class Opacity extends View {
6
+ readonly child: View;
7
+ readonly alpha: number;
8
+ constructor(child: View, alpha?: number);
9
+ protected measureContent(maxW: number, maxH: number): {
10
+ w: number;
11
+ h: number;
12
+ };
13
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
14
+ }
15
+ //# sourceMappingURL=opacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opacity.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/opacity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAyB,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAc,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAE7D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAwC/C,qBAAa,OAAQ,SAAQ,IAAI;IAE7B,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,KAAK;gBADL,KAAK,EAAE,IAAI,EACX,KAAK,SAAI;IAKpB,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAInD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAM7D"}
@@ -0,0 +1,95 @@
1
+ import { mergeStyle, Palette } from "../../render/surface.js";
2
+ import { clamp255, idxToRGB } from "../../render/color-utils.js";
3
+ import { View } from "../core/view.js";
4
+ // Minimal palette wrapper that applies a style transform before delegating to the base palette
5
+ class FilterPalette extends Palette {
6
+ base;
7
+ transform;
8
+ constructor(base, transform) {
9
+ super();
10
+ this.base = base;
11
+ this.transform = transform;
12
+ }
13
+ id(spec) {
14
+ return this.base.id(this.transform(spec));
15
+ }
16
+ sgr(id) {
17
+ return this.base.sgr(id);
18
+ }
19
+ }
20
+ function toRGB(c) {
21
+ if (c == null)
22
+ return undefined;
23
+ if (typeof c === "number")
24
+ return idxToRGB(c);
25
+ return { r: clamp255(c.r), g: clamp255(c.g), b: clamp255(c.b) };
26
+ }
27
+ function applyOpacity(spec, alpha) {
28
+ if (!spec)
29
+ return spec;
30
+ const a = Math.max(0, Math.min(1, alpha));
31
+ if (a === 1)
32
+ return spec;
33
+ if (a <= 0)
34
+ return {}; // render as default style; caller may skip drawing entirely
35
+ const next = { ...spec };
36
+ const fgc = toRGB(spec.fg);
37
+ const bgc = toRGB(spec.bg);
38
+ if (fgc)
39
+ next.fg = { r: clamp255(fgc.r * a), g: clamp255(fgc.g * a), b: clamp255(fgc.b * a) };
40
+ if (bgc)
41
+ next.bg = { r: clamp255(bgc.r * a), g: clamp255(bgc.g * a), b: clamp255(bgc.b * a) };
42
+ // Optionally taper bold to avoid harshness at low alpha
43
+ if (spec.bold && a < 0.5)
44
+ next.bold = false;
45
+ return next;
46
+ }
47
+ export class Opacity extends View {
48
+ child;
49
+ alpha;
50
+ constructor(child, alpha = 1) {
51
+ super();
52
+ this.child = child;
53
+ this.alpha = alpha;
54
+ }
55
+ measureContent(maxW, maxH) {
56
+ return this.child.measure(maxW, maxH);
57
+ }
58
+ renderContent(s, pal, rect) {
59
+ const a = Math.max(0, Math.min(1, this.alpha));
60
+ if (a <= 0.001)
61
+ return; // invisible; keep layout but skip drawing
62
+ const filtered = new FilterPalette(pal, (spec) => applyOpacity(mergeStyle(undefined, spec), a));
63
+ this.child.render(s, filtered, rect);
64
+ }
65
+ }
66
+ /*
67
+ * opacity.ts — composable opacity modifier for terminal views
68
+ *
69
+ * How it works (no real alpha in terminals):
70
+ * - Terminals don’t support true alpha blending, and we can’t read the
71
+ * current screen contents to composite. To approximate “opacity”, we
72
+ * dim colors toward black by scaling their RGB channels by `alpha`.
73
+ * At alpha=1 the colors are unchanged; at alpha=0 they become black.
74
+ *
75
+ * Implementation:
76
+ * - We wrap the palette with a tiny FilterPalette that transforms any
77
+ * StyleSpec handed to `palette.id()` before it is converted to SGR.
78
+ * - The transform scales fg/bg colors by `alpha` and optionally disables
79
+ * bold at low alpha to avoid harsh flashes.
80
+ * - Rendering is skipped entirely when alpha ≤ ~0.001 (keeps layout but
81
+ * avoids drawing noise while effectively invisible).
82
+ *
83
+ * Composition:
84
+ * - This is a real modifier (wrapper node). You can chain it on any view:
85
+ * View.text("Loading").opacity(0.5)
86
+ * ShinyText.view(model).opacity(alpha).padding(0,1,0,1)
87
+ * - Multiple opacities compound (roughly multiplicative dimming).
88
+ * - Use it for fade in/out by driving `alpha` with a spring/motion value.
89
+ *
90
+ * Trade-offs:
91
+ * - Fades toward black, not toward the terminal background color. For most
92
+ * themes this reads as a natural fade. If you prefer a different look,
93
+ * we could add a color-tint/brightness modifier using the same pattern.
94
+ */
95
+ //# sourceMappingURL=opacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opacity.js","sourceRoot":"","sources":["../../../src/ui/modifiers/opacity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Palette, Surface } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export interface PaddingSpec {
5
+ t: number;
6
+ r: number;
7
+ b: number;
8
+ l: number;
9
+ }
10
+ export declare class Padding extends View {
11
+ readonly child: View;
12
+ private readonly pad;
13
+ constructor(child: View, t: number, r?: number, b?: number, l?: number);
14
+ protected measureContent(maxW: number, maxH: number): {
15
+ w: number;
16
+ h: number;
17
+ };
18
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
19
+ }
20
+ //# sourceMappingURL=padding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"padding.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/padding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAUD,qBAAa,OAAQ,SAAQ,IAAI;IAI7B,QAAQ,CAAC,KAAK,EAAE,IAAI;IAHtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAGtB,KAAK,EAAE,IAAI,EACpB,CAAC,EAAE,MAAM,EACT,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM;IAMZ,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAUnD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAS7D"}
@@ -0,0 +1,36 @@
1
+ import { View } from "../core/view.js";
2
+ function resolvePadding(t, r, b, l) {
3
+ const top = Math.max(0, t | 0);
4
+ const right = r == null ? top : Math.max(0, r | 0);
5
+ const bottom = b == null ? top : Math.max(0, b | 0);
6
+ const left = l == null ? right : Math.max(0, l | 0);
7
+ return { t: top, r: right, b: bottom, l: left };
8
+ }
9
+ export class Padding extends View {
10
+ child;
11
+ pad;
12
+ constructor(child, t, r, b, l) {
13
+ super();
14
+ this.child = child;
15
+ this.pad = resolvePadding(t, r, b, l);
16
+ }
17
+ measureContent(maxW, maxH) {
18
+ const innerW = Math.max(0, maxW - this.pad.l - this.pad.r);
19
+ const innerH = Math.max(0, maxH - this.pad.t - this.pad.b);
20
+ const m = this.child.measure(innerW, innerH);
21
+ return {
22
+ w: Math.min(maxW, m.w + this.pad.l + this.pad.r),
23
+ h: Math.min(maxH, m.h + this.pad.t + this.pad.b),
24
+ };
25
+ }
26
+ renderContent(s, pal, rect) {
27
+ const inner = {
28
+ x: rect.x + this.pad.l,
29
+ y: rect.y + this.pad.t,
30
+ w: Math.max(0, rect.w - this.pad.l - this.pad.r),
31
+ h: Math.max(0, rect.h - this.pad.t - this.pad.b),
32
+ };
33
+ this.child.render(s, pal, inner);
34
+ }
35
+ }
36
+ //# sourceMappingURL=padding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"padding.js","sourceRoot":"","sources":["../../../src/ui/modifiers/padding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Palette, Surface, StyleSpec } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export declare class Styled extends View {
5
+ readonly child: View;
6
+ readonly styleSpec: StyleSpec;
7
+ constructor(child: View, styleSpec: StyleSpec);
8
+ protected measureContent(maxW: number, maxH: number): {
9
+ w: number;
10
+ h: number;
11
+ };
12
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
13
+ }
14
+ //# sourceMappingURL=styled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/ui/modifiers/styled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAE1E,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE/C,qBAAa,MAAO,SAAQ,IAAI;IAE5B,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS;gBADpB,KAAK,EAAE,IAAI,EACX,SAAS,EAAE,SAAS;IAK/B,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAInD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAa7D"}
@@ -0,0 +1,26 @@
1
+ import { derivePalette } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ export class Styled extends View {
4
+ child;
5
+ styleSpec;
6
+ constructor(child, styleSpec) {
7
+ super();
8
+ this.child = child;
9
+ this.styleSpec = styleSpec;
10
+ }
11
+ measureContent(maxW, maxH) {
12
+ return this.child.measure(maxW, maxH);
13
+ }
14
+ renderContent(s, pal, rect) {
15
+ // Create derived palette with our style applied
16
+ const derivedPal = derivePalette(pal, this.styleSpec);
17
+ // If we have a background color, fill the entire rect
18
+ if (this.styleSpec.bg != null) {
19
+ const id = derivedPal.id(this.styleSpec);
20
+ s.fillRect(rect.x, rect.y, rect.w, rect.h, 32, id); // 32 = space character
21
+ }
22
+ // Render child with the styled palette
23
+ this.child.render(s, derivedPal, rect);
24
+ }
25
+ }
26
+ //# sourceMappingURL=styled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.js","sourceRoot":"","sources":["../../../src/ui/modifiers/styled.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGtC,MAAM,OAAO,MAAO,SAAQ,IAAI;IAEnB;IACA;IAFX,YACW,KAAW,EACX,SAAoB;QAE7B,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAM;QACX,cAAS,GAAT,SAAS,CAAW;IAG/B,CAAC;IAES,cAAc,CAAC,IAAY,EAAE,IAAY;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACvC,CAAC;IAES,aAAa,CAAC,CAAU,EAAE,GAAY,EAAE,IAAU;QAC1D,gDAAgD;QAChD,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAErD,sDAAsD;QACtD,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACxC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA,CAAC,uBAAuB;QAC5E,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { Palette, Surface } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export declare class Rectangle extends View {
5
+ readonly width: number;
6
+ readonly height: number;
7
+ readonly fillCP: number;
8
+ constructor(width: number, height: number, fillCP?: number);
9
+ protected measureContent(maxW: number, maxH: number): {
10
+ w: number;
11
+ h: number;
12
+ };
13
+ protected renderContent(s: Surface, pal: Palette, rect: Rect): void;
14
+ }
15
+ //# sourceMappingURL=rectangle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rectangle.d.ts","sourceRoot":"","sources":["../../../src/ui/primitives/rectangle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG/C,qBAAa,SAAU,SAAQ,IAAI;IAE/B,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM;gBAFN,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,SAAK;IAKtB,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;IAMnD,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAI7D"}
@@ -0,0 +1,23 @@
1
+ import { View } from "../core/view.js";
2
+ // Rectangle primitive (fills area with a codepoint, default space). Useful as a block element.
3
+ export class Rectangle extends View {
4
+ width;
5
+ height;
6
+ fillCP;
7
+ constructor(width, height, fillCP = 32) {
8
+ super();
9
+ this.width = width;
10
+ this.height = height;
11
+ this.fillCP = fillCP;
12
+ }
13
+ measureContent(maxW, maxH) {
14
+ const w = Math.min(maxW, Math.max(0, this.width | 0));
15
+ const h = Math.min(maxH, Math.max(0, this.height | 0));
16
+ return { w, h };
17
+ }
18
+ renderContent(s, pal, rect) {
19
+ const id = pal.id();
20
+ s.fillRect(rect.x, rect.y, rect.w, rect.h, this.fillCP, id);
21
+ }
22
+ }
23
+ //# sourceMappingURL=rectangle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rectangle.js","sourceRoot":"","sources":["../../../src/ui/primitives/rectangle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGtC,+FAA+F;AAC/F,MAAM,OAAO,SAAU,SAAQ,IAAI;IAEtB;IACA;IACA;IAHX,YACW,KAAa,EACb,MAAc,EACd,SAAS,EAAE;QAEpB,KAAK,EAAE,CAAA;QAJE,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAK;IAGtB,CAAC;IAES,cAAc,CAAC,IAAY,EAAE,IAAY;QACjD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;QACtD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;IACjB,CAAC;IAES,aAAa,CAAC,CAAU,EAAE,GAAY,EAAE,IAAU;QAC1D,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,CAAA;QACnB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC7D,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { Palette, Surface } from "../../render/surface.js";
2
+ import { View } from "../core/view.js";
3
+ import type { Rect } from "../core/geometry.js";
4
+ export declare class Spacer extends View {
5
+ readonly minLength: number;
6
+ constructor(minLength?: number);
7
+ protected measureContent(_maxW: number, _maxH: number): {
8
+ w: number;
9
+ h: number;
10
+ };
11
+ protected renderContent(_s: Surface, _pal: Palette, _rect: Rect): void;
12
+ }
13
+ //# sourceMappingURL=spacer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spacer.d.ts","sourceRoot":"","sources":["../../../src/ui/primitives/spacer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG/C,qBAAa,MAAO,SAAQ,IAAI;IAClB,QAAQ,CAAC,SAAS;gBAAT,SAAS,SAAI;IAIlC,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;IAIrD,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI;CAGhE"}