@promptctl/rich-js 0.1.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 (318) hide show
  1. package/README.md +418 -0
  2. package/dist/core/box.d.ts +91 -0
  3. package/dist/core/box.d.ts.map +1 -0
  4. package/dist/core/box.js +534 -0
  5. package/dist/core/box.js.map +1 -0
  6. package/dist/core/cells.d.ts +24 -0
  7. package/dist/core/cells.d.ts.map +1 -0
  8. package/dist/core/cells.js +114 -0
  9. package/dist/core/cells.js.map +1 -0
  10. package/dist/core/color.d.ts +158 -0
  11. package/dist/core/color.d.ts.map +1 -0
  12. package/dist/core/color.js +825 -0
  13. package/dist/core/color.js.map +1 -0
  14. package/dist/core/console.d.ts +100 -0
  15. package/dist/core/console.d.ts.map +1 -0
  16. package/dist/core/console.js +353 -0
  17. package/dist/core/console.js.map +1 -0
  18. package/dist/core/emoji.d.ts +25 -0
  19. package/dist/core/emoji.d.ts.map +1 -0
  20. package/dist/core/emoji.js +392 -0
  21. package/dist/core/emoji.js.map +1 -0
  22. package/dist/core/highlighter.d.ts +33 -0
  23. package/dist/core/highlighter.d.ts.map +1 -0
  24. package/dist/core/highlighter.js +103 -0
  25. package/dist/core/highlighter.js.map +1 -0
  26. package/dist/core/markup.d.ts +69 -0
  27. package/dist/core/markup.d.ts.map +1 -0
  28. package/dist/core/markup.js +401 -0
  29. package/dist/core/markup.js.map +1 -0
  30. package/dist/core/measure.d.ts +17 -0
  31. package/dist/core/measure.d.ts.map +1 -0
  32. package/dist/core/measure.js +50 -0
  33. package/dist/core/measure.js.map +1 -0
  34. package/dist/core/protocol.d.ts +32 -0
  35. package/dist/core/protocol.d.ts.map +1 -0
  36. package/dist/core/protocol.js +17 -0
  37. package/dist/core/protocol.js.map +1 -0
  38. package/dist/core/render.d.ts +51 -0
  39. package/dist/core/render.d.ts.map +1 -0
  40. package/dist/core/render.js +69 -0
  41. package/dist/core/render.js.map +1 -0
  42. package/dist/core/segment.d.ts +104 -0
  43. package/dist/core/segment.d.ts.map +1 -0
  44. package/dist/core/segment.js +364 -0
  45. package/dist/core/segment.js.map +1 -0
  46. package/dist/core/spinnerData.d.ts +11 -0
  47. package/dist/core/spinnerData.d.ts.map +1 -0
  48. package/dist/core/spinnerData.js +116 -0
  49. package/dist/core/spinnerData.js.map +1 -0
  50. package/dist/core/strip.d.ts +159 -0
  51. package/dist/core/strip.d.ts.map +1 -0
  52. package/dist/core/strip.js +237 -0
  53. package/dist/core/strip.js.map +1 -0
  54. package/dist/core/style.d.ts +115 -0
  55. package/dist/core/style.d.ts.map +1 -0
  56. package/dist/core/style.js +662 -0
  57. package/dist/core/style.js.map +1 -0
  58. package/dist/core/text.d.ts +91 -0
  59. package/dist/core/text.d.ts.map +1 -0
  60. package/dist/core/text.js +610 -0
  61. package/dist/core/text.js.map +1 -0
  62. package/dist/index.d.ts +99 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +72 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/renderables/align.d.ts +17 -0
  67. package/dist/renderables/align.d.ts.map +1 -0
  68. package/dist/renderables/align.js +47 -0
  69. package/dist/renderables/align.js.map +1 -0
  70. package/dist/renderables/columns.d.ts +28 -0
  71. package/dist/renderables/columns.d.ts.map +1 -0
  72. package/dist/renderables/columns.js +92 -0
  73. package/dist/renderables/columns.js.map +1 -0
  74. package/dist/renderables/constrain.d.ts +16 -0
  75. package/dist/renderables/constrain.d.ts.map +1 -0
  76. package/dist/renderables/constrain.js +38 -0
  77. package/dist/renderables/constrain.js.map +1 -0
  78. package/dist/renderables/flexStrip.d.ts +42 -0
  79. package/dist/renderables/flexStrip.d.ts.map +1 -0
  80. package/dist/renderables/flexStrip.js +201 -0
  81. package/dist/renderables/flexStrip.js.map +1 -0
  82. package/dist/renderables/group.d.ts +12 -0
  83. package/dist/renderables/group.d.ts.map +1 -0
  84. package/dist/renderables/group.js +16 -0
  85. package/dist/renderables/group.js.map +1 -0
  86. package/dist/renderables/json.d.ts +23 -0
  87. package/dist/renderables/json.d.ts.map +1 -0
  88. package/dist/renderables/json.js +49 -0
  89. package/dist/renderables/json.js.map +1 -0
  90. package/dist/renderables/layout.d.ts +37 -0
  91. package/dist/renderables/layout.d.ts.map +1 -0
  92. package/dist/renderables/layout.js +151 -0
  93. package/dist/renderables/layout.js.map +1 -0
  94. package/dist/renderables/live.d.ts +48 -0
  95. package/dist/renderables/live.d.ts.map +1 -0
  96. package/dist/renderables/live.js +131 -0
  97. package/dist/renderables/live.js.map +1 -0
  98. package/dist/renderables/markdown.d.ts +25 -0
  99. package/dist/renderables/markdown.d.ts.map +1 -0
  100. package/dist/renderables/markdown.js +190 -0
  101. package/dist/renderables/markdown.js.map +1 -0
  102. package/dist/renderables/padding.d.ts +26 -0
  103. package/dist/renderables/padding.d.ts.map +1 -0
  104. package/dist/renderables/padding.js +92 -0
  105. package/dist/renderables/padding.js.map +1 -0
  106. package/dist/renderables/panel.d.ts +42 -0
  107. package/dist/renderables/panel.d.ts.map +1 -0
  108. package/dist/renderables/panel.js +202 -0
  109. package/dist/renderables/panel.js.map +1 -0
  110. package/dist/renderables/pretty.d.ts +29 -0
  111. package/dist/renderables/pretty.d.ts.map +1 -0
  112. package/dist/renderables/pretty.js +141 -0
  113. package/dist/renderables/pretty.js.map +1 -0
  114. package/dist/renderables/progress.d.ts +91 -0
  115. package/dist/renderables/progress.d.ts.map +1 -0
  116. package/dist/renderables/progress.js +234 -0
  117. package/dist/renderables/progress.js.map +1 -0
  118. package/dist/renderables/progressBar.d.ts +32 -0
  119. package/dist/renderables/progressBar.d.ts.map +1 -0
  120. package/dist/renderables/progressBar.js +59 -0
  121. package/dist/renderables/progressBar.js.map +1 -0
  122. package/dist/renderables/prompt.d.ts +25 -0
  123. package/dist/renderables/prompt.d.ts.map +1 -0
  124. package/dist/renderables/prompt.js +109 -0
  125. package/dist/renderables/prompt.js.map +1 -0
  126. package/dist/renderables/rule.d.ts +25 -0
  127. package/dist/renderables/rule.d.ts.map +1 -0
  128. package/dist/renderables/rule.js +96 -0
  129. package/dist/renderables/rule.js.map +1 -0
  130. package/dist/renderables/spinner.d.ts +30 -0
  131. package/dist/renderables/spinner.d.ts.map +1 -0
  132. package/dist/renderables/spinner.js +70 -0
  133. package/dist/renderables/spinner.js.map +1 -0
  134. package/dist/renderables/status.d.ts +24 -0
  135. package/dist/renderables/status.d.ts.map +1 -0
  136. package/dist/renderables/status.js +67 -0
  137. package/dist/renderables/status.js.map +1 -0
  138. package/dist/renderables/syntax.d.ts +36 -0
  139. package/dist/renderables/syntax.d.ts.map +1 -0
  140. package/dist/renderables/syntax.js +115 -0
  141. package/dist/renderables/syntax.js.map +1 -0
  142. package/dist/renderables/table.d.ts +109 -0
  143. package/dist/renderables/table.d.ts.map +1 -0
  144. package/dist/renderables/table.js +434 -0
  145. package/dist/renderables/table.js.map +1 -0
  146. package/dist/renderables/traceback.d.ts +26 -0
  147. package/dist/renderables/traceback.d.ts.map +1 -0
  148. package/dist/renderables/traceback.js +108 -0
  149. package/dist/renderables/traceback.js.map +1 -0
  150. package/dist/renderables/tree.d.ts +30 -0
  151. package/dist/renderables/tree.d.ts.map +1 -0
  152. package/dist/renderables/tree.js +107 -0
  153. package/dist/renderables/tree.js.map +1 -0
  154. package/dist/template-bindings/index.d.ts +61 -0
  155. package/dist/template-bindings/index.d.ts.map +1 -0
  156. package/dist/template-bindings/index.js +70 -0
  157. package/dist/template-bindings/index.js.map +1 -0
  158. package/dist/template-bindings/style-funcs.d.ts +30 -0
  159. package/dist/template-bindings/style-funcs.d.ts.map +1 -0
  160. package/dist/template-bindings/style-funcs.js +172 -0
  161. package/dist/template-bindings/style-funcs.js.map +1 -0
  162. package/dist/themes/buildPalette.d.ts +31 -0
  163. package/dist/themes/buildPalette.d.ts.map +1 -0
  164. package/dist/themes/buildPalette.js +43 -0
  165. package/dist/themes/buildPalette.js.map +1 -0
  166. package/dist/themes/colorMath.d.ts +23 -0
  167. package/dist/themes/colorMath.d.ts.map +1 -0
  168. package/dist/themes/colorMath.js +99 -0
  169. package/dist/themes/colorMath.js.map +1 -0
  170. package/dist/themes/data/atom-one-dark.d.ts +4 -0
  171. package/dist/themes/data/atom-one-dark.d.ts.map +1 -0
  172. package/dist/themes/data/atom-one-dark.js +159 -0
  173. package/dist/themes/data/atom-one-dark.js.map +1 -0
  174. package/dist/themes/data/atom-one-light.d.ts +4 -0
  175. package/dist/themes/data/atom-one-light.d.ts.map +1 -0
  176. package/dist/themes/data/atom-one-light.js +159 -0
  177. package/dist/themes/data/atom-one-light.js.map +1 -0
  178. package/dist/themes/data/catppuccin-latte.d.ts +4 -0
  179. package/dist/themes/data/catppuccin-latte.d.ts.map +1 -0
  180. package/dist/themes/data/catppuccin-latte.js +159 -0
  181. package/dist/themes/data/catppuccin-latte.js.map +1 -0
  182. package/dist/themes/data/catppuccin-mocha.d.ts +4 -0
  183. package/dist/themes/data/catppuccin-mocha.d.ts.map +1 -0
  184. package/dist/themes/data/catppuccin-mocha.js +159 -0
  185. package/dist/themes/data/catppuccin-mocha.js.map +1 -0
  186. package/dist/themes/data/dracula.d.ts +4 -0
  187. package/dist/themes/data/dracula.d.ts.map +1 -0
  188. package/dist/themes/data/dracula.js +159 -0
  189. package/dist/themes/data/dracula.js.map +1 -0
  190. package/dist/themes/data/flexoki.d.ts +4 -0
  191. package/dist/themes/data/flexoki.d.ts.map +1 -0
  192. package/dist/themes/data/flexoki.js +159 -0
  193. package/dist/themes/data/flexoki.js.map +1 -0
  194. package/dist/themes/data/gruvbox.d.ts +4 -0
  195. package/dist/themes/data/gruvbox.d.ts.map +1 -0
  196. package/dist/themes/data/gruvbox.js +159 -0
  197. package/dist/themes/data/gruvbox.js.map +1 -0
  198. package/dist/themes/data/index.d.ts +29 -0
  199. package/dist/themes/data/index.d.ts.map +1 -0
  200. package/dist/themes/data/index.js +48 -0
  201. package/dist/themes/data/index.js.map +1 -0
  202. package/dist/themes/data/monokai.d.ts +4 -0
  203. package/dist/themes/data/monokai.d.ts.map +1 -0
  204. package/dist/themes/data/monokai.js +159 -0
  205. package/dist/themes/data/monokai.js.map +1 -0
  206. package/dist/themes/data/nord.d.ts +4 -0
  207. package/dist/themes/data/nord.d.ts.map +1 -0
  208. package/dist/themes/data/nord.js +159 -0
  209. package/dist/themes/data/nord.js.map +1 -0
  210. package/dist/themes/data/rose-pine-dawn.d.ts +4 -0
  211. package/dist/themes/data/rose-pine-dawn.d.ts.map +1 -0
  212. package/dist/themes/data/rose-pine-dawn.js +159 -0
  213. package/dist/themes/data/rose-pine-dawn.js.map +1 -0
  214. package/dist/themes/data/rose-pine-moon.d.ts +4 -0
  215. package/dist/themes/data/rose-pine-moon.d.ts.map +1 -0
  216. package/dist/themes/data/rose-pine-moon.js +159 -0
  217. package/dist/themes/data/rose-pine-moon.js.map +1 -0
  218. package/dist/themes/data/rose-pine.d.ts +4 -0
  219. package/dist/themes/data/rose-pine.d.ts.map +1 -0
  220. package/dist/themes/data/rose-pine.js +159 -0
  221. package/dist/themes/data/rose-pine.js.map +1 -0
  222. package/dist/themes/data/solarized-dark.d.ts +4 -0
  223. package/dist/themes/data/solarized-dark.d.ts.map +1 -0
  224. package/dist/themes/data/solarized-dark.js +159 -0
  225. package/dist/themes/data/solarized-dark.js.map +1 -0
  226. package/dist/themes/data/solarized-light.d.ts +4 -0
  227. package/dist/themes/data/solarized-light.d.ts.map +1 -0
  228. package/dist/themes/data/solarized-light.js +159 -0
  229. package/dist/themes/data/solarized-light.js.map +1 -0
  230. package/dist/themes/data/textual-ansi.d.ts +4 -0
  231. package/dist/themes/data/textual-ansi.d.ts.map +1 -0
  232. package/dist/themes/data/textual-ansi.js +159 -0
  233. package/dist/themes/data/textual-ansi.js.map +1 -0
  234. package/dist/themes/data/textual-dark.d.ts +4 -0
  235. package/dist/themes/data/textual-dark.d.ts.map +1 -0
  236. package/dist/themes/data/textual-dark.js +159 -0
  237. package/dist/themes/data/textual-dark.js.map +1 -0
  238. package/dist/themes/data/textual-light.d.ts +4 -0
  239. package/dist/themes/data/textual-light.d.ts.map +1 -0
  240. package/dist/themes/data/textual-light.js +159 -0
  241. package/dist/themes/data/textual-light.js.map +1 -0
  242. package/dist/themes/data/tokyo-night.d.ts +4 -0
  243. package/dist/themes/data/tokyo-night.d.ts.map +1 -0
  244. package/dist/themes/data/tokyo-night.js +159 -0
  245. package/dist/themes/data/tokyo-night.js.map +1 -0
  246. package/dist/themes/data/types.d.ts +15 -0
  247. package/dist/themes/data/types.d.ts.map +1 -0
  248. package/dist/themes/data/types.js +2 -0
  249. package/dist/themes/data/types.js.map +1 -0
  250. package/dist/themes/palette.d.ts +20 -0
  251. package/dist/themes/palette.d.ts.map +1 -0
  252. package/dist/themes/palette.js +27 -0
  253. package/dist/themes/palette.js.map +1 -0
  254. package/dist/themes/paletteResolver.d.ts +35 -0
  255. package/dist/themes/paletteResolver.d.ts.map +1 -0
  256. package/dist/themes/paletteResolver.js +88 -0
  257. package/dist/themes/paletteResolver.js.map +1 -0
  258. package/dist/themes/registry.d.ts +17 -0
  259. package/dist/themes/registry.d.ts.map +1 -0
  260. package/dist/themes/registry.js +33 -0
  261. package/dist/themes/registry.js.map +1 -0
  262. package/dist/themes/terminalThemes.d.ts +46 -0
  263. package/dist/themes/terminalThemes.d.ts.map +1 -0
  264. package/dist/themes/terminalThemes.js +268 -0
  265. package/dist/themes/terminalThemes.js.map +1 -0
  266. package/dist/widgets/button.d.ts +47 -0
  267. package/dist/widgets/button.d.ts.map +1 -0
  268. package/dist/widgets/button.js +183 -0
  269. package/dist/widgets/button.js.map +1 -0
  270. package/dist/widgets/checkbox.d.ts +43 -0
  271. package/dist/widgets/checkbox.d.ts.map +1 -0
  272. package/dist/widgets/checkbox.js +144 -0
  273. package/dist/widgets/checkbox.js.map +1 -0
  274. package/dist/widgets/dropdown.d.ts +67 -0
  275. package/dist/widgets/dropdown.d.ts.map +1 -0
  276. package/dist/widgets/dropdown.js +373 -0
  277. package/dist/widgets/dropdown.js.map +1 -0
  278. package/dist/widgets/event-router.d.ts +73 -0
  279. package/dist/widgets/event-router.d.ts.map +1 -0
  280. package/dist/widgets/event-router.js +479 -0
  281. package/dist/widgets/event-router.js.map +1 -0
  282. package/dist/widgets/focus-manager.d.ts +26 -0
  283. package/dist/widgets/focus-manager.d.ts.map +1 -0
  284. package/dist/widgets/focus-manager.js +179 -0
  285. package/dist/widgets/focus-manager.js.map +1 -0
  286. package/dist/widgets/index.d.ts +23 -0
  287. package/dist/widgets/index.d.ts.map +1 -0
  288. package/dist/widgets/index.js +13 -0
  289. package/dist/widgets/index.js.map +1 -0
  290. package/dist/widgets/screen.d.ts +90 -0
  291. package/dist/widgets/screen.d.ts.map +1 -0
  292. package/dist/widgets/screen.js +440 -0
  293. package/dist/widgets/screen.js.map +1 -0
  294. package/dist/widgets/slider.d.ts +55 -0
  295. package/dist/widgets/slider.d.ts.map +1 -0
  296. package/dist/widgets/slider.js +248 -0
  297. package/dist/widgets/slider.js.map +1 -0
  298. package/dist/widgets/static-item.d.ts +41 -0
  299. package/dist/widgets/static-item.d.ts.map +1 -0
  300. package/dist/widgets/static-item.js +62 -0
  301. package/dist/widgets/static-item.js.map +1 -0
  302. package/dist/widgets/text-input.d.ts +50 -0
  303. package/dist/widgets/text-input.d.ts.map +1 -0
  304. package/dist/widgets/text-input.js +242 -0
  305. package/dist/widgets/text-input.js.map +1 -0
  306. package/dist/widgets/toggle.d.ts +46 -0
  307. package/dist/widgets/toggle.d.ts.map +1 -0
  308. package/dist/widgets/toggle.js +169 -0
  309. package/dist/widgets/toggle.js.map +1 -0
  310. package/dist/widgets/types.d.ts +92 -0
  311. package/dist/widgets/types.d.ts.map +1 -0
  312. package/dist/widgets/types.js +13 -0
  313. package/dist/widgets/types.js.map +1 -0
  314. package/dist/widgets/widget-base.d.ts +41 -0
  315. package/dist/widgets/widget-base.d.ts.map +1 -0
  316. package/dist/widgets/widget-base.js +159 -0
  317. package/dist/widgets/widget-base.js.map +1 -0
  318. package/package.json +76 -0
@@ -0,0 +1,242 @@
1
+ /**
2
+ * TextInput widget — single-line editable text field with cursor.
3
+ * [LAW:dataflow-not-control-flow] cursor is a data position; when focused,
4
+ * exactly one cell is rendered with reverse-video styling on every frame.
5
+ * [LAW:one-type-per-behavior] shared infrastructure inherited from WidgetBase.
6
+ *
7
+ * Visual states:
8
+ * normal — "[value______]" with brackets bracketing fixed-width content
9
+ * focused — same width with cursor cell (reverse video) at cursorPosition
10
+ * placeholder — focused + empty value: dimmed placeholder text shown,
11
+ * cursor at position 0
12
+ * password — every value char rendered as "•"
13
+ * disabled — entire segment dimmed
14
+ */
15
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
16
+ var useValue = arguments.length > 2;
17
+ for (var i = 0; i < initializers.length; i++) {
18
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
19
+ }
20
+ return useValue ? value : void 0;
21
+ };
22
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
23
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
24
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
25
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
26
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
27
+ var _, done = false;
28
+ for (var i = decorators.length - 1; i >= 0; i--) {
29
+ var context = {};
30
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
31
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
32
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
33
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
34
+ if (kind === "accessor") {
35
+ if (result === void 0) continue;
36
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
37
+ if (_ = accept(result.get)) descriptor.get = _;
38
+ if (_ = accept(result.set)) descriptor.set = _;
39
+ if (_ = accept(result.init)) initializers.unshift(_);
40
+ }
41
+ else if (_ = accept(result)) {
42
+ if (kind === "field") initializers.unshift(_);
43
+ else descriptor[key] = _;
44
+ }
45
+ }
46
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
47
+ done = true;
48
+ };
49
+ import { observable, action } from "mobx";
50
+ import { Segment } from "../core/segment.js";
51
+ import { Style } from "../core/style.js";
52
+ import { ColorSpec } from "../core/color.js";
53
+ import { DEFAULT_TERMINAL_THEME } from "../themes/terminalThemes.js";
54
+ import { WidgetBase } from "./widget-base.js";
55
+ const MIN_CONTENT_WIDTH = 8;
56
+ let TextInput = (() => {
57
+ var _a;
58
+ let _classSuper = WidgetBase;
59
+ let _instanceExtraInitializers = [];
60
+ let _value_decorators;
61
+ let _value_initializers = [];
62
+ let _value_extraInitializers = [];
63
+ let _cursorPosition_decorators;
64
+ let _cursorPosition_initializers = [];
65
+ let _cursorPosition_extraInitializers = [];
66
+ let _placeholder_decorators;
67
+ let _placeholder_initializers = [];
68
+ let _placeholder_extraInitializers = [];
69
+ let _handleKey_decorators;
70
+ let _handleMouse_decorators;
71
+ let _setHovered_decorators;
72
+ return class TextInput extends _classSuper {
73
+ static {
74
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
75
+ _value_decorators = [observable];
76
+ _cursorPosition_decorators = [observable];
77
+ _placeholder_decorators = [(_a = observable).ref.bind(_a)];
78
+ _handleKey_decorators = [action];
79
+ _handleMouse_decorators = [action];
80
+ _setHovered_decorators = [action];
81
+ __esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
82
+ __esDecorate(this, null, _cursorPosition_decorators, { kind: "accessor", name: "cursorPosition", static: false, private: false, access: { has: obj => "cursorPosition" in obj, get: obj => obj.cursorPosition, set: (obj, value) => { obj.cursorPosition = value; } }, metadata: _metadata }, _cursorPosition_initializers, _cursorPosition_extraInitializers);
83
+ __esDecorate(this, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: obj => "placeholder" in obj, get: obj => obj.placeholder, set: (obj, value) => { obj.placeholder = value; } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
84
+ __esDecorate(this, null, _handleKey_decorators, { kind: "method", name: "handleKey", static: false, private: false, access: { has: obj => "handleKey" in obj, get: obj => obj.handleKey }, metadata: _metadata }, null, _instanceExtraInitializers);
85
+ __esDecorate(this, null, _handleMouse_decorators, { kind: "method", name: "handleMouse", static: false, private: false, access: { has: obj => "handleMouse" in obj, get: obj => obj.handleMouse }, metadata: _metadata }, null, _instanceExtraInitializers);
86
+ __esDecorate(this, null, _setHovered_decorators, { kind: "method", name: "setHovered", static: false, private: false, access: { has: obj => "setHovered" in obj, get: obj => obj.setHovered }, metadata: _metadata }, null, _instanceExtraInitializers);
87
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
88
+ }
89
+ id = __runInitializers(this, _instanceExtraInitializers);
90
+ focusable = true;
91
+ #value_accessor_storage = __runInitializers(this, _value_initializers, void 0);
92
+ get value() { return this.#value_accessor_storage; }
93
+ set value(value) { this.#value_accessor_storage = value; }
94
+ #cursorPosition_accessor_storage = (__runInitializers(this, _value_extraInitializers), __runInitializers(this, _cursorPosition_initializers, void 0));
95
+ get cursorPosition() { return this.#cursorPosition_accessor_storage; }
96
+ set cursorPosition(value) { this.#cursorPosition_accessor_storage = value; }
97
+ #placeholder_accessor_storage = (__runInitializers(this, _cursorPosition_extraInitializers), __runInitializers(this, _placeholder_initializers, void 0));
98
+ get placeholder() { return this.#placeholder_accessor_storage; }
99
+ set placeholder(value) { this.#placeholder_accessor_storage = value; }
100
+ _theme = __runInitializers(this, _placeholder_extraInitializers);
101
+ _maxLength;
102
+ _password;
103
+ constructor(options = {}) {
104
+ super();
105
+ this.id = options.id ?? `text-input-${Math.random().toString(36).slice(2, 8)}`;
106
+ this.value = options.value ?? "";
107
+ this.placeholder = options.placeholder ?? "";
108
+ this.cursorPosition = this.value.length;
109
+ this.disabled = options.disabled ?? false;
110
+ this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
111
+ this._maxLength = options.maxLength;
112
+ this._password = options.password ?? false;
113
+ }
114
+ setTheme(theme) { this._theme = theme; }
115
+ // --- Event handlers ---
116
+ handleKey(event) {
117
+ if (this.disabled)
118
+ return;
119
+ switch (event.key) {
120
+ case "left":
121
+ this.cursorPosition = Math.max(0, this.cursorPosition - 1);
122
+ return;
123
+ case "right":
124
+ this.cursorPosition = Math.min(this.value.length, this.cursorPosition + 1);
125
+ return;
126
+ case "home":
127
+ this.cursorPosition = 0;
128
+ return;
129
+ case "end":
130
+ this.cursorPosition = this.value.length;
131
+ return;
132
+ case "backspace":
133
+ if (this.cursorPosition > 0) {
134
+ this.value = this.value.slice(0, this.cursorPosition - 1) + this.value.slice(this.cursorPosition);
135
+ this.cursorPosition -= 1;
136
+ this.emitChange();
137
+ }
138
+ return;
139
+ case "delete":
140
+ if (this.cursorPosition < this.value.length) {
141
+ this.value = this.value.slice(0, this.cursorPosition) + this.value.slice(this.cursorPosition + 1);
142
+ this.emitChange();
143
+ }
144
+ return;
145
+ case "enter":
146
+ this.emitSubmit();
147
+ return;
148
+ }
149
+ // Printable insertion: single-character event.character with no modifier.
150
+ if (event.character.length === 1 &&
151
+ !event.ctrl &&
152
+ !event.meta &&
153
+ event.character >= " " &&
154
+ event.character !== "\x7f") {
155
+ if (this._maxLength !== undefined && this.value.length >= this._maxLength)
156
+ return;
157
+ this.value =
158
+ this.value.slice(0, this.cursorPosition) +
159
+ event.character +
160
+ this.value.slice(this.cursorPosition);
161
+ this.cursorPosition += 1;
162
+ this.emitChange();
163
+ }
164
+ }
165
+ handleMouse(event) {
166
+ if (this.disabled)
167
+ return;
168
+ if (event.type !== "mouse_down")
169
+ return;
170
+ const b = this.bounds;
171
+ if (!b)
172
+ return;
173
+ // Click position relative to the content area (skip the leading "[" bracket).
174
+ const relX = event.x - b.x - 1;
175
+ this.cursorPosition = Math.max(0, Math.min(this.value.length, relX));
176
+ }
177
+ // --- Hover mutator (router fast-path) ---
178
+ setHovered(value) { this.hovered = value; }
179
+ // --- Rendering ---
180
+ render(options) {
181
+ const showPlaceholder = this.focused && this.value.length === 0 && this.placeholder.length > 0;
182
+ const rawDisplay = showPlaceholder
183
+ ? this.placeholder
184
+ : this._password
185
+ ? "•".repeat(this.value.length)
186
+ : this.value;
187
+ // [LAW:dataflow-not-control-flow] content width is data — derived from
188
+ // value/placeholder length, MIN_CONTENT_WIDTH floor, maxWidth ceiling.
189
+ const maxAvailable = Math.max(MIN_CONTENT_WIDTH, options.maxWidth - 2);
190
+ const desiredWidth = Math.max(MIN_CONTENT_WIDTH, rawDisplay.length, this.cursorPosition + 1);
191
+ const contentWidth = Math.min(maxAvailable, desiredWidth);
192
+ // Slide window to keep cursor visible when content overflows.
193
+ const startIdx = Math.max(0, Math.min(rawDisplay.length - contentWidth, this.cursorPosition - contentWidth + 1));
194
+ const sliced = rawDisplay.slice(Math.max(0, startIdx), Math.max(0, startIdx) + contentWidth);
195
+ const display = sliced.padEnd(contentWidth, " ");
196
+ const cursorDisplayIdx = this.cursorPosition - Math.max(0, startIdx);
197
+ const bracketStyle = this.disabled
198
+ ? new Style({ color: "#666666", bgcolor: "#333333", dim: true })
199
+ : new Style({ color: this.resolvePalette("foreground") });
200
+ const contentStyle = this.disabled
201
+ ? new Style({ color: "#666666", bgcolor: "#333333", dim: true })
202
+ : showPlaceholder
203
+ ? new Style({ color: this.resolvePalette("foreground"), dim: true })
204
+ : new Style({ color: this.resolvePalette("foreground") });
205
+ // Cursor cell paints on a full primary bg → use on-primary for fg so
206
+ // contrast is WCAG-correct across all themes, not theme-bg-dependent.
207
+ const cursorStyle = new Style({
208
+ color: this.resolvePalette("on-primary"),
209
+ bgcolor: this.resolvePalette("primary"),
210
+ });
211
+ const segments = [new Segment("[", bracketStyle)];
212
+ if (this.focused && !this.disabled && cursorDisplayIdx >= 0 && cursorDisplayIdx < contentWidth) {
213
+ const before = display.slice(0, cursorDisplayIdx);
214
+ const at = display.slice(cursorDisplayIdx, cursorDisplayIdx + 1);
215
+ const after = display.slice(cursorDisplayIdx + 1);
216
+ if (before.length > 0)
217
+ segments.push(new Segment(before, contentStyle));
218
+ segments.push(new Segment(at.length > 0 ? at : " ", cursorStyle));
219
+ if (after.length > 0)
220
+ segments.push(new Segment(after, contentStyle));
221
+ }
222
+ else {
223
+ segments.push(new Segment(display, contentStyle));
224
+ }
225
+ segments.push(new Segment("]", bracketStyle));
226
+ return segments;
227
+ }
228
+ measure(_options) {
229
+ const minimum = MIN_CONTENT_WIDTH + 2;
230
+ const maximum = Math.max(minimum, Math.max(this.value.length, this.placeholder.length) + 2);
231
+ return { minimum, maximum };
232
+ }
233
+ // --- Palette resolution ---
234
+ resolvePalette(key) {
235
+ const rgba = this._theme.palette.get(key);
236
+ // [LAW:no-defensive-null-guards] palette must contain all keys.
237
+ return ColorSpec.fromRgba(rgba);
238
+ }
239
+ };
240
+ })();
241
+ export { TextInput };
242
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.js","sourceRoot":"","sources":["../../src/widgets/text-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAa9C,MAAM,iBAAiB,GAAG,CAAC,CAAC;IAEf,SAAS;;sBAAS,UAAU;;;;;;;;;;;;;;iBAA5B,SAAU,SAAQ,WAAU;;;iCAItC,UAAU;0CACV,UAAU;uCACV,CAAA,KAAA,UAAU,CAAA,CAAC,GAAG;qCAsBd,MAAM;uCAqDN,MAAM;sCAcN,MAAM;YA3FK,oKAAS,KAAK,6BAAL,KAAK,qFAAS;YACvB,+LAAS,cAAc,6BAAd,cAAc,uGAAS;YAC5B,sLAAS,WAAW,6BAAX,WAAW,iGAAS;YAuB7C,8KAAA,SAAS,6DAkDR;YAGD,oLAAS,WAAW,6DASnB;YAKD,iLAAA,UAAU,6DAAgD;;;QA/FjD,EAAE,GADA,mDAAS,CACA;QACX,SAAS,GAAG,IAAI,CAAC;QAEd,+EAAuB;QAAvB,IAAS,KAAK,2CAAS;QAAvB,IAAS,KAAK,iDAAS;QACvB,sJAAgC;QAAhC,IAAS,cAAc,oDAAS;QAAhC,IAAS,cAAc,0DAAS;QAC5B,yJAA6B;QAA7B,IAAS,WAAW,iDAAS;QAA7B,IAAS,WAAW,uDAAS;QAErC,MAAM,2DAAgB;QACb,UAAU,CAAqB;QAC/B,SAAS,CAAU;QAEpC,YAAY,UAA4B,EAAE;YACxC,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/E,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,sBAAsB,CAAC;YACtD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC7C,CAAC;QAED,QAAQ,CAAC,KAAoB,IAAU,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAE7D,yBAAyB;QAGzB,SAAS,CAAC,KAAe;YACvB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAE1B,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;gBAClB,KAAK,MAAM;oBACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;oBAC3D,OAAO;gBACT,KAAK,OAAO;oBACV,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;oBAC3E,OAAO;gBACT,KAAK,MAAM;oBACT,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;oBACxB,OAAO;gBACT,KAAK,KAAK;oBACR,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;oBACxC,OAAO;gBACT,KAAK,WAAW;oBACd,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;wBAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBAClG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;wBACzB,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,CAAC;oBACD,OAAO;gBACT,KAAK,QAAQ;oBACX,IAAI,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;wBAClG,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,CAAC;oBACD,OAAO;gBACT,KAAK,OAAO;oBACV,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO;YACX,CAAC;YAED,0EAA0E;YAC1E,IACE,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC5B,CAAC,KAAK,CAAC,IAAI;gBACX,CAAC,KAAK,CAAC,IAAI;gBACX,KAAK,CAAC,SAAS,IAAI,GAAG;gBACtB,KAAK,CAAC,SAAS,KAAK,MAAM,EAC1B,CAAC;gBACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;oBAAE,OAAO;gBAClF,IAAI,CAAC,KAAK;oBACR,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC;wBACxC,KAAK,CAAC,SAAS;wBACf,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACxC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;gBACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAGQ,WAAW,CAAC,KAAuB;YAC1C,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO;YAExC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACtB,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,8EAA8E;YAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,2CAA2C;QAG3C,UAAU,CAAC,KAAc,IAAU,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;QAE1D,oBAAoB;QAEpB,MAAM,CAAC,OAAsB;YAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAE/F,MAAM,UAAU,GAAG,eAAe;gBAChC,CAAC,CAAC,IAAI,CAAC,WAAW;gBAClB,CAAC,CAAC,IAAI,CAAC,SAAS;oBACd,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAEjB,uEAAuE;YACvE,uEAAuE;YACvE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACvE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAE1D,8DAA8D;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,YAAY,EAAE,IAAI,CAAC,cAAc,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;YACjH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC;YAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAErE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ;gBAChC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChE,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAE5D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ;gBAChC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChE,CAAC,CAAC,eAAe;oBACf,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;oBACpE,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAE9D,qEAAqE;YACrE,sEAAsE;YACtE,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC;gBAC5B,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;gBACxC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;aACxC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAc,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;YAE7D,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,gBAAgB,IAAI,CAAC,IAAI,gBAAgB,GAAG,YAAY,EAAE,CAAC;gBAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAClD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;gBACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;gBACxE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;gBAClE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YACpD,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;YAC9C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,QAAuB;YAC7B,MAAM,OAAO,GAAG,iBAAiB,GAAG,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5F,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,CAAC;QAED,6BAA6B;QAErB,cAAc,CAAC,GAAW;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,gEAAgE;YAChE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAK,CAAC,CAAC;QACnC,CAAC;;;SAvKU,SAAS"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Toggle widget — on/off switch with label and variant colour.
3
+ * [LAW:dataflow-not-control-flow] one Segment of fixed width every render;
4
+ * indicator and palette keys come from observable state via lookup tables.
5
+ * [LAW:one-type-per-behavior] shared infrastructure inherited from WidgetBase.
6
+ *
7
+ * Visual states:
8
+ * off — "[OFF] label" with muted variant background
9
+ * on — "[ON] label" with full variant accent background
10
+ * focused — underline on the segment (no width change)
11
+ * disabled — dimmed
12
+ */
13
+ import { Segment } from "../core/segment.js";
14
+ import type { RenderOptions } from "../core/protocol.js";
15
+ import type { TerminalTheme } from "../core/color.js";
16
+ import { WidgetBase } from "./widget-base.js";
17
+ import type { KeyEvent, WidgetMouseEvent } from "./types.js";
18
+ export type ToggleVariant = "default" | "primary" | "success" | "warning" | "danger";
19
+ export interface ToggleOptions {
20
+ label: string;
21
+ on?: boolean;
22
+ id?: string;
23
+ disabled?: boolean;
24
+ theme?: TerminalTheme;
25
+ variant?: ToggleVariant;
26
+ }
27
+ export declare class Toggle extends WidgetBase {
28
+ readonly id: string;
29
+ readonly focusable = true;
30
+ accessor label: string;
31
+ accessor on: boolean;
32
+ accessor variant: ToggleVariant;
33
+ private _theme;
34
+ constructor(options: ToggleOptions);
35
+ setTheme(theme: TerminalTheme): void;
36
+ handleKey(event: KeyEvent): void;
37
+ handleMouse(event: WidgetMouseEvent): void;
38
+ setHovered(value: boolean): void;
39
+ render(_options: RenderOptions): Iterable<Segment>;
40
+ measure(_options: RenderOptions): {
41
+ minimum: number;
42
+ maximum: number;
43
+ };
44
+ private resolvePalette;
45
+ }
46
+ //# sourceMappingURL=toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/widgets/toggle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAkBD,qBAAa,MAAO,SAAQ,UAAU;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,QAAQ;IAEd,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAEhD,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,aAAa;IAUlC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKpC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAavB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAWnD,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIhC,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;IAgBlD,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAOtE,OAAO,CAAC,cAAc;CAKvB"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Toggle widget — on/off switch with label and variant colour.
3
+ * [LAW:dataflow-not-control-flow] one Segment of fixed width every render;
4
+ * indicator and palette keys come from observable state via lookup tables.
5
+ * [LAW:one-type-per-behavior] shared infrastructure inherited from WidgetBase.
6
+ *
7
+ * Visual states:
8
+ * off — "[OFF] label" with muted variant background
9
+ * on — "[ON] label" with full variant accent background
10
+ * focused — underline on the segment (no width change)
11
+ * disabled — dimmed
12
+ */
13
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
14
+ var useValue = arguments.length > 2;
15
+ for (var i = 0; i < initializers.length; i++) {
16
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
17
+ }
18
+ return useValue ? value : void 0;
19
+ };
20
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
21
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
22
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
23
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
24
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
25
+ var _, done = false;
26
+ for (var i = decorators.length - 1; i >= 0; i--) {
27
+ var context = {};
28
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
29
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
30
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
31
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
32
+ if (kind === "accessor") {
33
+ if (result === void 0) continue;
34
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
35
+ if (_ = accept(result.get)) descriptor.get = _;
36
+ if (_ = accept(result.set)) descriptor.set = _;
37
+ if (_ = accept(result.init)) initializers.unshift(_);
38
+ }
39
+ else if (_ = accept(result)) {
40
+ if (kind === "field") initializers.unshift(_);
41
+ else descriptor[key] = _;
42
+ }
43
+ }
44
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
45
+ done = true;
46
+ };
47
+ import { observable, action } from "mobx";
48
+ import { Segment } from "../core/segment.js";
49
+ import { Style } from "../core/style.js";
50
+ import { ColorSpec } from "../core/color.js";
51
+ import { DEFAULT_TERMINAL_THEME } from "../themes/terminalThemes.js";
52
+ import { WidgetBase } from "./widget-base.js";
53
+ // onFg uses on-${accent} (WCAG-correct contrast, picked once at palette
54
+ // build time) so the ON state stays readable on a full accent bg. Earlier
55
+ // versions used text-${accent} here, which is mostly-accent and clashed
56
+ // with the same accent as background. offFg keeps text-${accent} because
57
+ // offBg is mostly-bg-tinted and the contrast holds.
58
+ const VARIANT_KEYS = {
59
+ default: { onBg: "primary", onFg: "on-primary", offBg: "surface", offFg: "foreground" },
60
+ primary: { onBg: "primary", onFg: "on-primary", offBg: "primary-muted", offFg: "text-primary" },
61
+ success: { onBg: "success", onFg: "on-success", offBg: "success-muted", offFg: "text-success" },
62
+ warning: { onBg: "warning", onFg: "on-warning", offBg: "warning-muted", offFg: "text-warning" },
63
+ danger: { onBg: "error", onFg: "on-error", offBg: "error-muted", offFg: "text-error" },
64
+ };
65
+ let Toggle = (() => {
66
+ var _a;
67
+ let _classSuper = WidgetBase;
68
+ let _instanceExtraInitializers = [];
69
+ let _label_decorators;
70
+ let _label_initializers = [];
71
+ let _label_extraInitializers = [];
72
+ let _on_decorators;
73
+ let _on_initializers = [];
74
+ let _on_extraInitializers = [];
75
+ let _variant_decorators;
76
+ let _variant_initializers = [];
77
+ let _variant_extraInitializers = [];
78
+ let _handleKey_decorators;
79
+ let _handleMouse_decorators;
80
+ let _setHovered_decorators;
81
+ return class Toggle extends _classSuper {
82
+ static {
83
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
84
+ _label_decorators = [observable];
85
+ _on_decorators = [observable];
86
+ _variant_decorators = [(_a = observable).ref.bind(_a)];
87
+ _handleKey_decorators = [action];
88
+ _handleMouse_decorators = [action];
89
+ _setHovered_decorators = [action];
90
+ __esDecorate(this, null, _label_decorators, { kind: "accessor", name: "label", static: false, private: false, access: { has: obj => "label" in obj, get: obj => obj.label, set: (obj, value) => { obj.label = value; } }, metadata: _metadata }, _label_initializers, _label_extraInitializers);
91
+ __esDecorate(this, null, _on_decorators, { kind: "accessor", name: "on", static: false, private: false, access: { has: obj => "on" in obj, get: obj => obj.on, set: (obj, value) => { obj.on = value; } }, metadata: _metadata }, _on_initializers, _on_extraInitializers);
92
+ __esDecorate(this, null, _variant_decorators, { kind: "accessor", name: "variant", static: false, private: false, access: { has: obj => "variant" in obj, get: obj => obj.variant, set: (obj, value) => { obj.variant = value; } }, metadata: _metadata }, _variant_initializers, _variant_extraInitializers);
93
+ __esDecorate(this, null, _handleKey_decorators, { kind: "method", name: "handleKey", static: false, private: false, access: { has: obj => "handleKey" in obj, get: obj => obj.handleKey }, metadata: _metadata }, null, _instanceExtraInitializers);
94
+ __esDecorate(this, null, _handleMouse_decorators, { kind: "method", name: "handleMouse", static: false, private: false, access: { has: obj => "handleMouse" in obj, get: obj => obj.handleMouse }, metadata: _metadata }, null, _instanceExtraInitializers);
95
+ __esDecorate(this, null, _setHovered_decorators, { kind: "method", name: "setHovered", static: false, private: false, access: { has: obj => "setHovered" in obj, get: obj => obj.setHovered }, metadata: _metadata }, null, _instanceExtraInitializers);
96
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
97
+ }
98
+ id = __runInitializers(this, _instanceExtraInitializers);
99
+ focusable = true;
100
+ #label_accessor_storage = __runInitializers(this, _label_initializers, void 0);
101
+ get label() { return this.#label_accessor_storage; }
102
+ set label(value) { this.#label_accessor_storage = value; }
103
+ #on_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _on_initializers, void 0));
104
+ get on() { return this.#on_accessor_storage; }
105
+ set on(value) { this.#on_accessor_storage = value; }
106
+ #variant_accessor_storage = (__runInitializers(this, _on_extraInitializers), __runInitializers(this, _variant_initializers, void 0));
107
+ get variant() { return this.#variant_accessor_storage; }
108
+ set variant(value) { this.#variant_accessor_storage = value; }
109
+ _theme = __runInitializers(this, _variant_extraInitializers);
110
+ constructor(options) {
111
+ super();
112
+ this.id = options.id ?? `toggle-${options.label.toLowerCase().replace(/\s+/g, "-")}`;
113
+ this.label = options.label;
114
+ this.on = options.on ?? false;
115
+ this.variant = options.variant ?? "default";
116
+ this.disabled = options.disabled ?? false;
117
+ this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
118
+ }
119
+ setTheme(theme) { this._theme = theme; }
120
+ // --- Event handlers ---
121
+ handleKey(event) {
122
+ if (this.disabled)
123
+ return;
124
+ if (event.key === "space") {
125
+ this.on = !this.on;
126
+ this.emitChange();
127
+ return;
128
+ }
129
+ if (event.key === "enter") {
130
+ this.emitSubmit();
131
+ }
132
+ }
133
+ handleMouse(event) {
134
+ if (this.disabled)
135
+ return;
136
+ if (event.type === "mouse_up") {
137
+ this.on = !this.on;
138
+ this.emitChange();
139
+ }
140
+ }
141
+ // --- Hover mutator (router fast-path) ---
142
+ setHovered(value) { this.hovered = value; }
143
+ // --- Rendering ---
144
+ render(_options) {
145
+ // Both indicators are exactly 5 cells: "[ON] " and "[OFF]".
146
+ const indicator = this.on ? "[ON] " : "[OFF]";
147
+ const text = `${indicator} ${this.label}`;
148
+ if (this.disabled) {
149
+ return [new Segment(text, new Style({ color: "#666666", bgcolor: "#333333", dim: true }))];
150
+ }
151
+ const keys = VARIANT_KEYS[this.variant];
152
+ const fg = this.resolvePalette(this.on ? keys.onFg : keys.offFg);
153
+ const bg = this.resolvePalette(this.on ? keys.onBg : keys.offBg);
154
+ return [new Segment(text, new Style({ color: fg, bgcolor: bg, underline: this.focused }))];
155
+ }
156
+ measure(_options) {
157
+ const width = 5 + 1 + this.label.length;
158
+ return { minimum: width, maximum: width };
159
+ }
160
+ // --- Palette resolution ---
161
+ resolvePalette(key) {
162
+ const rgba = this._theme.palette.get(key);
163
+ // [LAW:no-defensive-null-guards] palette must contain all keys; missing is a construction bug.
164
+ return ColorSpec.fromRgba(rgba);
165
+ }
166
+ };
167
+ })();
168
+ export { Toggle };
169
+ //# sourceMappingURL=toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.js","sourceRoot":"","sources":["../../src/widgets/toggle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Interactive widget event types and core interfaces.
3
+ * [LAW:one-source-of-truth] These types are the single authority for the widget contract.
4
+ * Widgets are MobX-observable state machines that implement Renderable,
5
+ * producing Segment[] from current state. They have no knowledge of stdin,
6
+ * terminal escape sequences, or their host environment.
7
+ */
8
+ import type { Renderable, Measurable, RenderOptions } from "../core/protocol.js";
9
+ import type { Segment } from "../core/segment.js";
10
+ export interface KeyEvent {
11
+ key: string;
12
+ character: string;
13
+ shift: boolean;
14
+ ctrl: boolean;
15
+ meta: boolean;
16
+ }
17
+ export interface WidgetMouseEvent {
18
+ type: "click" | "mouse_down" | "mouse_up" | "mouse_move" | "scroll_up" | "scroll_down";
19
+ x: number;
20
+ y: number;
21
+ button: number;
22
+ shift: boolean;
23
+ ctrl: boolean;
24
+ }
25
+ export interface WidgetFocusEvent {
26
+ type: "focus" | "blur";
27
+ }
28
+ export interface WidgetBounds {
29
+ x: number;
30
+ y: number;
31
+ width: number;
32
+ height: number;
33
+ }
34
+ export interface InteractiveWidget extends Renderable, Measurable {
35
+ readonly id: string;
36
+ readonly focusable: boolean;
37
+ focused: boolean;
38
+ hovered: boolean;
39
+ active: boolean;
40
+ disabled: boolean;
41
+ visible: boolean;
42
+ bounds: WidgetBounds | null;
43
+ handleKey(event: KeyEvent): void;
44
+ handleMouse(event: WidgetMouseEvent): void;
45
+ handleFocus(event: WidgetFocusEvent): void;
46
+ focus(): void;
47
+ blur(): void;
48
+ setDisabled(value: boolean): void;
49
+ containsPoint(x: number, y: number): boolean;
50
+ onChange(handler: (widget: InteractiveWidget) => void): () => void;
51
+ onSubmit(handler: (widget: InteractiveWidget) => void): () => void;
52
+ }
53
+ export type Placement = {
54
+ kind: "flow";
55
+ } | {
56
+ kind: "inline";
57
+ } | {
58
+ kind: "fixed";
59
+ x: number;
60
+ y: number;
61
+ };
62
+ export declare const FLOW: Placement;
63
+ export interface OverlayRenderable {
64
+ renderOverlay(options: RenderOptions): Iterable<Segment> | null;
65
+ }
66
+ export declare function hasOverlay(value: object): value is OverlayRenderable;
67
+ export type Unsubscribe = () => void;
68
+ export interface FocusManager {
69
+ readonly current: InteractiveWidget | null;
70
+ readonly widgets: readonly InteractiveWidget[];
71
+ register(widget: InteractiveWidget): void;
72
+ unregister(widget: InteractiveWidget): void;
73
+ next(): void;
74
+ prev(): void;
75
+ focus(widget: InteractiveWidget): void;
76
+ blur(): void;
77
+ onChange(handler: (current: InteractiveWidget | null) => void): Unsubscribe;
78
+ }
79
+ export type MountEntry = InteractiveWidget | {
80
+ widget: InteractiveWidget;
81
+ placement: Placement;
82
+ };
83
+ export interface Screen {
84
+ mount(...entries: MountEntry[]): void;
85
+ unmount(widget: InteractiveWidget): void;
86
+ start(): void;
87
+ stop(): void;
88
+ readonly focusManager: FocusManager;
89
+ readonly running: boolean;
90
+ readonly widgets: readonly InteractiveWidget[];
91
+ }
92
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;IACvF,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,iBAAkB,SAAQ,UAAU,EAAE,UAAU;IAC/D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAM5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IAGjB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAG5B,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAG3C,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAGlC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAG7C,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnE,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACpE;AAeD,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,eAAO,MAAM,IAAI,EAAE,SAA4B,CAAC;AAkBhD,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAKpE;AAID,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAIrC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAE/C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE5C,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,IAAI,IAAI,IAAI,CAAC;IAEb,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,GAAG,WAAW,CAAC;CAC7E;AAOD,MAAM,MAAM,UAAU,GAClB,iBAAiB,GACjB;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAExD,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAEzC,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IAEb,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAI1B,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Interactive widget event types and core interfaces.
3
+ * [LAW:one-source-of-truth] These types are the single authority for the widget contract.
4
+ * Widgets are MobX-observable state machines that implement Renderable,
5
+ * producing Segment[] from current state. They have no knowledge of stdin,
6
+ * terminal escape sequences, or their host environment.
7
+ */
8
+ export const FLOW = { kind: "flow" };
9
+ export function hasOverlay(value) {
10
+ return ("renderOverlay" in value &&
11
+ typeof value.renderOverlay === "function");
12
+ }
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+FH,MAAM,CAAC,MAAM,IAAI,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAsBhD,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,CACL,eAAe,IAAI,KAAK;QACxB,OAAQ,KAA2B,CAAC,aAAa,KAAK,UAAU,CACjE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * WidgetBase — shared MobX observable foundation for interactive widgets.
3
+ * [LAW:one-type-per-behavior] All widgets share the same base; differences
4
+ * are in configuration and state, not in infrastructure.
5
+ *
6
+ * Uses makeObservable (not makeAutoObservable) because subclasses extend this.
7
+ * MobX 6.x with TC39 decorators requires `accessor` keyword.
8
+ */
9
+ import type { Segment } from "../core/segment.js";
10
+ import type { RenderOptions } from "../core/protocol.js";
11
+ import type { InteractiveWidget, KeyEvent, WidgetMouseEvent, WidgetFocusEvent, WidgetBounds, Unsubscribe } from "./types.js";
12
+ export declare abstract class WidgetBase implements InteractiveWidget {
13
+ abstract readonly id: string;
14
+ abstract readonly focusable: boolean;
15
+ accessor focused: boolean;
16
+ accessor hovered: boolean;
17
+ accessor active: boolean;
18
+ accessor disabled: boolean;
19
+ accessor visible: boolean;
20
+ accessor bounds: WidgetBounds | null;
21
+ private readonly changeHandlers;
22
+ private readonly submitHandlers;
23
+ constructor();
24
+ abstract handleKey(event: KeyEvent): void;
25
+ handleMouse(_event: WidgetMouseEvent): void;
26
+ handleFocus(event: WidgetFocusEvent): void;
27
+ focus(): void;
28
+ blur(): void;
29
+ setDisabled(value: boolean): void;
30
+ containsPoint(x: number, y: number): boolean;
31
+ onChange(handler: (widget: InteractiveWidget) => void): Unsubscribe;
32
+ onSubmit(handler: (widget: InteractiveWidget) => void): Unsubscribe;
33
+ protected emitChange(): void;
34
+ protected emitSubmit(): void;
35
+ abstract render(options: RenderOptions): Iterable<Segment>;
36
+ abstract measure(options: RenderOptions): {
37
+ minimum: number;
38
+ maximum: number;
39
+ };
40
+ }
41
+ //# sourceMappingURL=widget-base.d.ts.map