@promptctl/rich-js 0.16.0 → 0.18.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 (206) hide show
  1. package/README.md +14 -27
  2. package/package.json +7 -3
  3. package/dist/core/box.d.ts +0 -144
  4. package/dist/core/box.js +0 -391
  5. package/dist/core/cells.d.ts +0 -148
  6. package/dist/core/cells.js +0 -266
  7. package/dist/core/color.d.ts +0 -229
  8. package/dist/core/color.js +0 -992
  9. package/dist/core/console.d.ts +0 -142
  10. package/dist/core/console.js +0 -477
  11. package/dist/core/emoji.d.ts +0 -24
  12. package/dist/core/emoji.js +0 -391
  13. package/dist/core/export-html.d.ts +0 -24
  14. package/dist/core/export-html.js +0 -106
  15. package/dist/core/export-lines.d.ts +0 -121
  16. package/dist/core/export-lines.js +0 -141
  17. package/dist/core/highlighter.d.ts +0 -33
  18. package/dist/core/highlighter.js +0 -124
  19. package/dist/core/json.d.ts +0 -27
  20. package/dist/core/json.js +0 -53
  21. package/dist/core/markup.d.ts +0 -97
  22. package/dist/core/markup.js +0 -619
  23. package/dist/core/measure.d.ts +0 -27
  24. package/dist/core/measure.js +0 -61
  25. package/dist/core/oklch.d.ts +0 -161
  26. package/dist/core/oklch.js +0 -312
  27. package/dist/core/osc8.d.ts +0 -68
  28. package/dist/core/osc8.js +0 -90
  29. package/dist/core/pretty.d.ts +0 -141
  30. package/dist/core/pretty.js +0 -472
  31. package/dist/core/protocol.d.ts +0 -137
  32. package/dist/core/protocol.js +0 -101
  33. package/dist/core/render.d.ts +0 -69
  34. package/dist/core/render.js +0 -140
  35. package/dist/core/segment.d.ts +0 -142
  36. package/dist/core/segment.js +0 -433
  37. package/dist/core/spinnerData.d.ts +0 -10
  38. package/dist/core/spinnerData.js +0 -115
  39. package/dist/core/strip.d.ts +0 -139
  40. package/dist/core/strip.js +0 -302
  41. package/dist/core/style.d.ts +0 -149
  42. package/dist/core/style.js +0 -741
  43. package/dist/core/subscription.d.ts +0 -12
  44. package/dist/core/subscription.js +0 -12
  45. package/dist/core/text.d.ts +0 -255
  46. package/dist/core/text.js +0 -990
  47. package/dist/core/wrap.d.ts +0 -41
  48. package/dist/core/wrap.js +0 -127
  49. package/dist/host/host-stream.d.ts +0 -30
  50. package/dist/host/host-stream.js +0 -35
  51. package/dist/host/index.d.ts +0 -3
  52. package/dist/host/index.js +0 -2
  53. package/dist/host/terminal-host.d.ts +0 -143
  54. package/dist/host/terminal-host.js +0 -132
  55. package/dist/index.d.ts +0 -87
  56. package/dist/index.js +0 -104
  57. package/dist/node/prompt.d.ts +0 -21
  58. package/dist/node/prompt.js +0 -30
  59. package/dist/node/save.d.ts +0 -17
  60. package/dist/node/save.js +0 -21
  61. package/dist/node/terminal-host.d.ts +0 -84
  62. package/dist/node/terminal-host.js +0 -160
  63. package/dist/node/traceback.d.ts +0 -27
  64. package/dist/node/traceback.js +0 -112
  65. package/dist/renderables/align.d.ts +0 -16
  66. package/dist/renderables/align.js +0 -46
  67. package/dist/renderables/columns.d.ts +0 -61
  68. package/dist/renderables/columns.js +0 -168
  69. package/dist/renderables/constrain.d.ts +0 -15
  70. package/dist/renderables/constrain.js +0 -37
  71. package/dist/renderables/flexStrip.d.ts +0 -41
  72. package/dist/renderables/flexStrip.js +0 -200
  73. package/dist/renderables/group.d.ts +0 -11
  74. package/dist/renderables/group.js +0 -15
  75. package/dist/renderables/layout.d.ts +0 -92
  76. package/dist/renderables/layout.js +0 -315
  77. package/dist/renderables/live.d.ts +0 -47
  78. package/dist/renderables/live.js +0 -131
  79. package/dist/renderables/markdown.d.ts +0 -24
  80. package/dist/renderables/markdown.js +0 -182
  81. package/dist/renderables/padding.d.ts +0 -38
  82. package/dist/renderables/padding.js +0 -140
  83. package/dist/renderables/panel.d.ts +0 -116
  84. package/dist/renderables/panel.js +0 -322
  85. package/dist/renderables/progress.d.ts +0 -90
  86. package/dist/renderables/progress.js +0 -241
  87. package/dist/renderables/progressBar.d.ts +0 -31
  88. package/dist/renderables/progressBar.js +0 -52
  89. package/dist/renderables/prompt.d.ts +0 -49
  90. package/dist/renderables/prompt.js +0 -125
  91. package/dist/renderables/rule.d.ts +0 -24
  92. package/dist/renderables/rule.js +0 -90
  93. package/dist/renderables/spinner.d.ts +0 -29
  94. package/dist/renderables/spinner.js +0 -64
  95. package/dist/renderables/status.d.ts +0 -23
  96. package/dist/renderables/status.js +0 -60
  97. package/dist/renderables/syntax.d.ts +0 -35
  98. package/dist/renderables/syntax.js +0 -114
  99. package/dist/renderables/table.d.ts +0 -182
  100. package/dist/renderables/table.js +0 -697
  101. package/dist/renderables/traceback.d.ts +0 -31
  102. package/dist/renderables/traceback.js +0 -109
  103. package/dist/renderables/tree.d.ts +0 -54
  104. package/dist/renderables/tree.js +0 -159
  105. package/dist/template-bindings/color-funcs.d.ts +0 -87
  106. package/dist/template-bindings/color-funcs.js +0 -219
  107. package/dist/template-bindings/helpers.d.ts +0 -24
  108. package/dist/template-bindings/helpers.js +0 -48
  109. package/dist/template-bindings/index.d.ts +0 -107
  110. package/dist/template-bindings/index.js +0 -144
  111. package/dist/template-bindings/palette-funcs.d.ts +0 -94
  112. package/dist/template-bindings/palette-funcs.js +0 -151
  113. package/dist/template-bindings/style-funcs.d.ts +0 -28
  114. package/dist/template-bindings/style-funcs.js +0 -151
  115. package/dist/themes/buildPalette.d.ts +0 -36
  116. package/dist/themes/buildPalette.js +0 -56
  117. package/dist/themes/colorMath.d.ts +0 -82
  118. package/dist/themes/colorMath.js +0 -254
  119. package/dist/themes/colorRef.d.ts +0 -51
  120. package/dist/themes/colorRef.js +0 -96
  121. package/dist/themes/data/atom-one-dark.d.ts +0 -3
  122. package/dist/themes/data/atom-one-dark.js +0 -158
  123. package/dist/themes/data/atom-one-light.d.ts +0 -3
  124. package/dist/themes/data/atom-one-light.js +0 -158
  125. package/dist/themes/data/catppuccin-frappe.d.ts +0 -3
  126. package/dist/themes/data/catppuccin-frappe.js +0 -158
  127. package/dist/themes/data/catppuccin-latte.d.ts +0 -3
  128. package/dist/themes/data/catppuccin-latte.js +0 -158
  129. package/dist/themes/data/catppuccin-macchiato.d.ts +0 -3
  130. package/dist/themes/data/catppuccin-macchiato.js +0 -158
  131. package/dist/themes/data/catppuccin-mocha.d.ts +0 -3
  132. package/dist/themes/data/catppuccin-mocha.js +0 -158
  133. package/dist/themes/data/cyberpunk.d.ts +0 -17
  134. package/dist/themes/data/cyberpunk.js +0 -191
  135. package/dist/themes/data/default.d.ts +0 -3
  136. package/dist/themes/data/default.js +0 -158
  137. package/dist/themes/data/dracula.d.ts +0 -3
  138. package/dist/themes/data/dracula.js +0 -158
  139. package/dist/themes/data/flexoki.d.ts +0 -3
  140. package/dist/themes/data/flexoki.js +0 -158
  141. package/dist/themes/data/gruvbox.d.ts +0 -3
  142. package/dist/themes/data/gruvbox.js +0 -158
  143. package/dist/themes/data/index.d.ts +0 -35
  144. package/dist/themes/data/index.js +0 -64
  145. package/dist/themes/data/monokai.d.ts +0 -3
  146. package/dist/themes/data/monokai.js +0 -158
  147. package/dist/themes/data/nord.d.ts +0 -3
  148. package/dist/themes/data/nord.js +0 -158
  149. package/dist/themes/data/rose-pine-dawn.d.ts +0 -3
  150. package/dist/themes/data/rose-pine-dawn.js +0 -158
  151. package/dist/themes/data/rose-pine-moon.d.ts +0 -3
  152. package/dist/themes/data/rose-pine-moon.js +0 -158
  153. package/dist/themes/data/rose-pine.d.ts +0 -3
  154. package/dist/themes/data/rose-pine.js +0 -158
  155. package/dist/themes/data/solarized-dark.d.ts +0 -3
  156. package/dist/themes/data/solarized-dark.js +0 -158
  157. package/dist/themes/data/solarized-light.d.ts +0 -3
  158. package/dist/themes/data/solarized-light.js +0 -158
  159. package/dist/themes/data/svg-export.d.ts +0 -3
  160. package/dist/themes/data/svg-export.js +0 -158
  161. package/dist/themes/data/textual-ansi.d.ts +0 -3
  162. package/dist/themes/data/textual-ansi.js +0 -158
  163. package/dist/themes/data/textual-dark.d.ts +0 -3
  164. package/dist/themes/data/textual-dark.js +0 -158
  165. package/dist/themes/data/textual-light.d.ts +0 -3
  166. package/dist/themes/data/textual-light.js +0 -158
  167. package/dist/themes/data/tokyo-night.d.ts +0 -3
  168. package/dist/themes/data/tokyo-night.js +0 -158
  169. package/dist/themes/data/types.d.ts +0 -15
  170. package/dist/themes/data/types.js +0 -1
  171. package/dist/themes/palette.d.ts +0 -21
  172. package/dist/themes/palette.js +0 -28
  173. package/dist/themes/ramp.d.ts +0 -83
  174. package/dist/themes/ramp.js +0 -122
  175. package/dist/themes/registry.d.ts +0 -43
  176. package/dist/themes/registry.js +0 -82
  177. package/dist/themes/terminalThemes.d.ts +0 -54
  178. package/dist/themes/terminalThemes.js +0 -68
  179. package/dist/themes/transpose.d.ts +0 -87
  180. package/dist/themes/transpose.js +0 -138
  181. package/dist/widgets/button.d.ts +0 -49
  182. package/dist/widgets/button.js +0 -206
  183. package/dist/widgets/checkbox.d.ts +0 -41
  184. package/dist/widgets/checkbox.js +0 -155
  185. package/dist/widgets/dropdown.d.ts +0 -67
  186. package/dist/widgets/dropdown.js +0 -453
  187. package/dist/widgets/event-router.d.ts +0 -78
  188. package/dist/widgets/event-router.js +0 -622
  189. package/dist/widgets/focus-manager.d.ts +0 -26
  190. package/dist/widgets/focus-manager.js +0 -193
  191. package/dist/widgets/index.d.ts +0 -22
  192. package/dist/widgets/index.js +0 -15
  193. package/dist/widgets/screen.d.ts +0 -98
  194. package/dist/widgets/screen.js +0 -542
  195. package/dist/widgets/slider.d.ts +0 -57
  196. package/dist/widgets/slider.js +0 -270
  197. package/dist/widgets/static-item.d.ts +0 -40
  198. package/dist/widgets/static-item.js +0 -60
  199. package/dist/widgets/text-input.d.ts +0 -274
  200. package/dist/widgets/text-input.js +0 -1162
  201. package/dist/widgets/toggle.d.ts +0 -44
  202. package/dist/widgets/toggle.js +0 -179
  203. package/dist/widgets/types.d.ts +0 -108
  204. package/dist/widgets/types.js +0 -31
  205. package/dist/widgets/widget-base.d.ts +0 -42
  206. package/dist/widgets/widget-base.js +0 -173
@@ -1,206 +0,0 @@
1
- /**
2
- * Button widget — labeled action trigger with variant styling.
3
- * [LAW:dataflow-not-control-flow] rendering is a pure function of observable state.
4
- * [LAW:one-type-per-behavior] shared widget infrastructure lives on WidgetBase.
5
- *
6
- * Four visual states:
7
- * normal — variant colors from theme semantic palette (muted)
8
- * hover — full variant accent bg + on-accent fg (WCAG contrast)
9
- * focus — brackets [ label ] surrounding the button
10
- * active — same color pair as hover, plus bold (pressed cue)
11
- *
12
- * States compose: active > focus > hover > normal. Active and hover
13
- * deliberately share colors — active differentiates via bold rather
14
- * than fg/bg inversion, because inversion produces mostly-accent text
15
- * on bg-tinted surface, which is unreadable for accents whose contrast
16
- * partner depends on luminance.
17
- */
18
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
19
- var useValue = arguments.length > 2;
20
- for (var i = 0; i < initializers.length; i++) {
21
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
22
- }
23
- return useValue ? value : void 0;
24
- };
25
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
26
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
27
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
28
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
29
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
30
- var _, done = false;
31
- for (var i = decorators.length - 1; i >= 0; i--) {
32
- var context = {};
33
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
34
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
35
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
36
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
37
- if (kind === "accessor") {
38
- if (result === void 0) continue;
39
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
40
- if (_ = accept(result.get)) descriptor.get = _;
41
- if (_ = accept(result.set)) descriptor.set = _;
42
- if (_ = accept(result.init)) initializers.unshift(_);
43
- }
44
- else if (_ = accept(result)) {
45
- if (kind === "field") initializers.unshift(_);
46
- else descriptor[key] = _;
47
- }
48
- }
49
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
50
- done = true;
51
- };
52
- import { observable, action, observableRef } from "mobx";
53
- import { Segment } from "../core/segment.js";
54
- import { Style } from "../core/style.js";
55
- import { ColorSpec } from "../core/color.js";
56
- import { cellLen } from "../core/cells.js";
57
- import { DEFAULT_TERMINAL_THEME } from "../themes/terminalThemes.js";
58
- import { WidgetBase } from "./widget-base.js";
59
- // Variant → palette key mapping. Per variant:
60
- // bg / fg — normal state. Muted accent bg + mostly-accent fg → readable.
61
- // hover — full accent bg; pair with hoverFg, NOT with `fg`. The
62
- // text-* keys are mostly-accent and would clash on a full
63
- // accent bg.
64
- // hoverFg — WCAG-correct contrast colour (on-${accent}) for full bg.
65
- const VARIANT_KEYS = {
66
- default: { bg: "surface", fg: "foreground", hover: "primary", hoverFg: "on-primary" },
67
- primary: { bg: "primary-muted", fg: "text-primary", hover: "primary", hoverFg: "on-primary" },
68
- success: { bg: "success-muted", fg: "text-success", hover: "success", hoverFg: "on-success" },
69
- warning: { bg: "warning-muted", fg: "text-warning", hover: "warning", hoverFg: "on-warning" },
70
- danger: { bg: "error-muted", fg: "text-error", hover: "error", hoverFg: "on-error" },
71
- };
72
- let Button = (() => {
73
- let _classSuper = WidgetBase;
74
- let _instanceExtraInitializers = [];
75
- let _label_decorators;
76
- let _label_initializers = [];
77
- let _label_extraInitializers = [];
78
- let _variant_decorators;
79
- let _variant_initializers = [];
80
- let _variant_extraInitializers = [];
81
- let __theme_decorators;
82
- let __theme_initializers = [];
83
- let __theme_extraInitializers = [];
84
- let _setTheme_decorators;
85
- let _handleKey_decorators;
86
- let _handleMouse_decorators;
87
- let _setActive_decorators;
88
- return class Button extends _classSuper {
89
- static {
90
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
91
- _label_decorators = [observable];
92
- _variant_decorators = [observableRef];
93
- __theme_decorators = [observableRef];
94
- _setTheme_decorators = [action];
95
- _handleKey_decorators = [action];
96
- _handleMouse_decorators = [action];
97
- _setActive_decorators = [action];
98
- __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);
99
- __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);
100
- __esDecorate(this, null, __theme_decorators, { kind: "accessor", name: "_theme", static: false, private: false, access: { has: obj => "_theme" in obj, get: obj => obj._theme, set: (obj, value) => { obj._theme = value; } }, metadata: _metadata }, __theme_initializers, __theme_extraInitializers);
101
- __esDecorate(this, null, _setTheme_decorators, { kind: "method", name: "setTheme", static: false, private: false, access: { has: obj => "setTheme" in obj, get: obj => obj.setTheme }, metadata: _metadata }, null, _instanceExtraInitializers);
102
- __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);
103
- __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);
104
- __esDecorate(this, null, _setActive_decorators, { kind: "method", name: "setActive", static: false, private: false, access: { has: obj => "setActive" in obj, get: obj => obj.setActive }, metadata: _metadata }, null, _instanceExtraInitializers);
105
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
106
- }
107
- id = __runInitializers(this, _instanceExtraInitializers);
108
- focusable = true;
109
- #label_accessor_storage = __runInitializers(this, _label_initializers, void 0);
110
- get label() { return this.#label_accessor_storage; }
111
- set label(value) { this.#label_accessor_storage = value; }
112
- #variant_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _variant_initializers, void 0));
113
- get variant() { return this.#variant_accessor_storage; }
114
- set variant(value) { this.#variant_accessor_storage = value; }
115
- #_theme_accessor_storage = (__runInitializers(this, _variant_extraInitializers), __runInitializers(this, __theme_initializers, void 0));
116
- // [LAW:types-are-the-program] @observableRef so setTheme() triggers a
117
- // re-render — see slider.ts.
118
- get _theme() { return this.#_theme_accessor_storage; }
119
- set _theme(value) { this.#_theme_accessor_storage = value; }
120
- constructor(options) {
121
- super();
122
- __runInitializers(this, __theme_extraInitializers);
123
- this.id = options.id ?? `button-${options.label.toLowerCase().replace(/\s+/g, "-")}`;
124
- this.label = options.label;
125
- this.variant = options.variant ?? "default";
126
- this.disabled = options.disabled ?? false;
127
- this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
128
- }
129
- setTheme(theme) { this._theme = theme; }
130
- // --- Event handlers ---
131
- handleKey(event) {
132
- if (this.disabled)
133
- return;
134
- if (event.key === "enter" || event.key === "space") {
135
- this.active = true;
136
- this.emitSubmit();
137
- // [LAW:one-source-of-truth] Keyboard activation must leave the widget
138
- // in the same end state as mouse activation: `active` cleared after
139
- // the press. Mouse has a natural mouse_up to clear it; keyboard does
140
- // not, so we schedule the clear on the next microtask. The single-
141
- // frame `active=true` paint gives the user the visual "pressed" cue
142
- // and is then cleared, matching mouse behaviour.
143
- queueMicrotask(() => { if (this.active)
144
- this.setActive(false); });
145
- event.stop();
146
- }
147
- }
148
- handleMouse(event) {
149
- if (this.disabled)
150
- return;
151
- if (event.type === "mouse_down") {
152
- this.active = true;
153
- }
154
- if (event.type === "mouse_up") {
155
- if (this.active) {
156
- this.active = false;
157
- this.emitSubmit();
158
- }
159
- }
160
- }
161
- // --- Active mutator (the keyboard-activation microtask uses this) ---
162
- setActive(value) { this.active = value; }
163
- // --- Rendering ---
164
- render(_options) {
165
- // [LAW:dataflow-not-control-flow] same segment count and width every state
166
- const focused = this.focused;
167
- const left = focused ? "[" : " ";
168
- const right = focused ? "]" : " ";
169
- const text = `${left} ${this.label} ${right}`;
170
- if (this.disabled) {
171
- return [new Segment(text, new Style({ color: "#666666", bgcolor: "#333333", dim: true }))];
172
- }
173
- // Active and hover share the same colour pair (full accent bg + on-accent fg).
174
- // Active is differentiated by bold, not by inverting fg/bg — inversion gives
175
- // mostly-accent text on mostly-bg-tinted background, which is unreadable for
176
- // accents whose contrast partner depends on luminance.
177
- if (this.active || this.hovered) {
178
- const fg = this.resolvePalette(VARIANT_KEYS[this.variant].hoverFg);
179
- const bg = this.resolvePalette(VARIANT_KEYS[this.variant].hover);
180
- return [new Segment(text, new Style({ color: fg, bgcolor: bg, bold: this.active }))];
181
- }
182
- const { fg, bg } = this.resolveColors("bg");
183
- return [new Segment(text, new Style({ color: fg, bgcolor: bg }))];
184
- }
185
- measure(_options) {
186
- // [LAW:one-source-of-truth] cellLen is the cell-width authority; .length
187
- // counts UTF-16 code units and miscounts wide / emoji characters.
188
- const width = cellLen(this.label) + 4;
189
- return { minimum: width, maximum: width };
190
- }
191
- // --- Palette resolution ---
192
- resolveColors(bgKey) {
193
- const keys = VARIANT_KEYS[this.variant];
194
- return {
195
- fg: this.resolvePalette(keys.fg),
196
- bg: this.resolvePalette(bgKey === "hover" ? keys.hover : keys.bg),
197
- };
198
- }
199
- resolvePalette(key) {
200
- const rgba = this._theme.palette.get(key);
201
- // [LAW:no-defensive-null-guards] palette is required and must contain all keys.
202
- return ColorSpec.fromRgba(rgba);
203
- }
204
- };
205
- })();
206
- export { Button };
@@ -1,41 +0,0 @@
1
- /**
2
- * Checkbox widget — boolean toggle with label.
3
- * [LAW:dataflow-not-control-flow] one Segment of fixed width every render;
4
- * the indicator character and style come from observable state.
5
- * [LAW:one-type-per-behavior] shared widget infrastructure lives on WidgetBase.
6
- *
7
- * Visual states:
8
- * unchecked — "[ ] label"
9
- * checked — "[✓] label" (ASCII fallback "[x] label" when options.asciiOnly)
10
- * focused — underline on the rendered 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 interface CheckboxOptions {
19
- label: string;
20
- checked?: boolean;
21
- id?: string;
22
- disabled?: boolean;
23
- theme?: TerminalTheme;
24
- }
25
- export declare class Checkbox extends WidgetBase {
26
- readonly id: string;
27
- readonly focusable = true;
28
- accessor label: string;
29
- accessor checked: boolean;
30
- private accessor _theme;
31
- constructor(options: CheckboxOptions);
32
- setTheme(theme: TerminalTheme): void;
33
- handleKey(event: KeyEvent): void;
34
- handleMouse(event: WidgetMouseEvent): void;
35
- render(options: RenderOptions): Iterable<Segment>;
36
- measure(_options: RenderOptions): {
37
- minimum: number;
38
- maximum: number;
39
- };
40
- private resolvePalette;
41
- }
@@ -1,155 +0,0 @@
1
- /**
2
- * Checkbox widget — boolean toggle with label.
3
- * [LAW:dataflow-not-control-flow] one Segment of fixed width every render;
4
- * the indicator character and style come from observable state.
5
- * [LAW:one-type-per-behavior] shared widget infrastructure lives on WidgetBase.
6
- *
7
- * Visual states:
8
- * unchecked — "[ ] label"
9
- * checked — "[✓] label" (ASCII fallback "[x] label" when options.asciiOnly)
10
- * focused — underline on the rendered 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, observableRef } 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 { cellLen } from "../core/cells.js";
52
- import { DEFAULT_TERMINAL_THEME } from "../themes/terminalThemes.js";
53
- import { WidgetBase } from "./widget-base.js";
54
- let Checkbox = (() => {
55
- let _classSuper = WidgetBase;
56
- let _instanceExtraInitializers = [];
57
- let _label_decorators;
58
- let _label_initializers = [];
59
- let _label_extraInitializers = [];
60
- let _checked_decorators;
61
- let _checked_initializers = [];
62
- let _checked_extraInitializers = [];
63
- let __theme_decorators;
64
- let __theme_initializers = [];
65
- let __theme_extraInitializers = [];
66
- let _setTheme_decorators;
67
- let _handleKey_decorators;
68
- let _handleMouse_decorators;
69
- return class Checkbox extends _classSuper {
70
- static {
71
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
72
- _label_decorators = [observable];
73
- _checked_decorators = [observable];
74
- __theme_decorators = [observableRef];
75
- _setTheme_decorators = [action];
76
- _handleKey_decorators = [action];
77
- _handleMouse_decorators = [action];
78
- __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);
79
- __esDecorate(this, null, _checked_decorators, { kind: "accessor", name: "checked", static: false, private: false, access: { has: obj => "checked" in obj, get: obj => obj.checked, set: (obj, value) => { obj.checked = value; } }, metadata: _metadata }, _checked_initializers, _checked_extraInitializers);
80
- __esDecorate(this, null, __theme_decorators, { kind: "accessor", name: "_theme", static: false, private: false, access: { has: obj => "_theme" in obj, get: obj => obj._theme, set: (obj, value) => { obj._theme = value; } }, metadata: _metadata }, __theme_initializers, __theme_extraInitializers);
81
- __esDecorate(this, null, _setTheme_decorators, { kind: "method", name: "setTheme", static: false, private: false, access: { has: obj => "setTheme" in obj, get: obj => obj.setTheme }, metadata: _metadata }, null, _instanceExtraInitializers);
82
- __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);
83
- __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);
84
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
85
- }
86
- id = __runInitializers(this, _instanceExtraInitializers);
87
- focusable = true;
88
- #label_accessor_storage = __runInitializers(this, _label_initializers, void 0);
89
- get label() { return this.#label_accessor_storage; }
90
- set label(value) { this.#label_accessor_storage = value; }
91
- #checked_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _checked_initializers, void 0));
92
- get checked() { return this.#checked_accessor_storage; }
93
- set checked(value) { this.#checked_accessor_storage = value; }
94
- #_theme_accessor_storage = (__runInitializers(this, _checked_extraInitializers), __runInitializers(this, __theme_initializers, void 0));
95
- // [LAW:types-are-the-program] @observableRef so setTheme() triggers a
96
- // re-render — see slider.ts.
97
- get _theme() { return this.#_theme_accessor_storage; }
98
- set _theme(value) { this.#_theme_accessor_storage = value; }
99
- constructor(options) {
100
- super();
101
- __runInitializers(this, __theme_extraInitializers);
102
- this.id = options.id ?? `checkbox-${options.label.toLowerCase().replace(/\s+/g, "-")}`;
103
- this.label = options.label;
104
- this.checked = options.checked ?? false;
105
- this.disabled = options.disabled ?? false;
106
- this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
107
- }
108
- setTheme(theme) { this._theme = theme; }
109
- // --- Event handlers ---
110
- handleKey(event) {
111
- if (this.disabled)
112
- return;
113
- if (event.key === "space") {
114
- this.checked = !this.checked;
115
- this.emitChange();
116
- event.stop();
117
- return;
118
- }
119
- if (event.key === "enter") {
120
- this.emitSubmit();
121
- event.stop();
122
- }
123
- }
124
- handleMouse(event) {
125
- if (this.disabled)
126
- return;
127
- if (event.type === "mouse_up") {
128
- this.checked = !this.checked;
129
- this.emitChange();
130
- }
131
- }
132
- // --- Rendering ---
133
- render(options) {
134
- const indicator = this.checked ? (options.asciiOnly ? "x" : "✓") : " ";
135
- const text = `[${indicator}] ${this.label}`;
136
- if (this.disabled) {
137
- return [new Segment(text, new Style({ color: "#666666", bgcolor: "#333333", dim: true }))];
138
- }
139
- const fg = this.checked ? this.resolvePalette("primary") : this.resolvePalette("foreground");
140
- return [new Segment(text, new Style({ color: fg, underline: this.focused }))];
141
- }
142
- measure(_options) {
143
- // [LAW:one-source-of-truth] cellLen — see button.ts.
144
- const width = cellLen(this.label) + 4;
145
- return { minimum: width, maximum: width };
146
- }
147
- // --- Palette resolution ---
148
- resolvePalette(key) {
149
- const rgba = this._theme.palette.get(key);
150
- // [LAW:no-defensive-null-guards] palette must contain all keys; missing is a construction bug.
151
- return ColorSpec.fromRgba(rgba);
152
- }
153
- };
154
- })();
155
- export { Checkbox };
@@ -1,67 +0,0 @@
1
- /**
2
- * Dropdown widget — single-select from option list, with built-in filter.
3
- *
4
- * [LAW:one-source-of-truth] Inline footprint (always 1 row, the header)
5
- * is independent of rendered shape (1 row collapsed, 1 + M rows expanded
6
- * where M = filteredOptions.length, or 1 when no matches). render() emits
7
- * the header row only; renderOverlay() emits option rows or a
8
- * "(no matches)" placeholder.
9
- *
10
- * [LAW:dataflow-not-control-flow] `expanded` and `filter` are data;
11
- * layout never reserves space for the option list; the overlay pass
12
- * paints over whatever is below.
13
- *
14
- * [LAW:one-source-of-truth] `options` and `selectedIndex` are canonical.
15
- * `filter` is internal view state. `filteredOptions` is the derived
16
- * subsequence (case-insensitive substring match). `highlightedIndex`
17
- * indexes into `filteredOptions`. Commit maps the filtered position
18
- * back to canonical idx by reference, so selection survives any filter
19
- * mutation.
20
- *
21
- * Width invariant: measure() always returns maxLabelLen(options) + 4
22
- * regardless of filter state — the query is right-clipped, never wider
23
- * than the header. See docs/widgets.md → Dropdown.
24
- */
25
- import { Segment } from "../core/segment.js";
26
- import type { RenderOptions } from "../core/protocol.js";
27
- import type { TerminalTheme } from "../core/color.js";
28
- import { WidgetBase } from "./widget-base.js";
29
- import type { KeyEvent, WidgetMouseEvent, WidgetFocusEvent, OverlayRenderable } from "./types.js";
30
- export interface DropdownOptions {
31
- options: string[];
32
- selectedIndex?: number;
33
- id?: string;
34
- disabled?: boolean;
35
- theme?: TerminalTheme;
36
- }
37
- export declare class Dropdown extends WidgetBase implements OverlayRenderable {
38
- readonly id: string;
39
- readonly focusable = true;
40
- accessor options: string[];
41
- accessor selectedIndex: number;
42
- accessor expanded: boolean;
43
- accessor highlightedIndex: number;
44
- accessor filter: string;
45
- get filteredOptions(): {
46
- label: string;
47
- idx: number;
48
- }[];
49
- private accessor _theme;
50
- constructor(options: DropdownOptions);
51
- private clampIndex;
52
- setTheme(theme: TerminalTheme): void;
53
- handleKey(event: KeyEvent): void;
54
- handleMouse(event: WidgetMouseEvent): void;
55
- handleFocus(event: WidgetFocusEvent): void;
56
- render(options: RenderOptions): Iterable<Segment>;
57
- private headerText;
58
- renderOverlay(_options: RenderOptions): Iterable<Segment> | null;
59
- private renderNoMatchRow;
60
- private renderOptionRow;
61
- private maxLabelLen;
62
- measure(_options: RenderOptions): {
63
- minimum: number;
64
- maximum: number;
65
- };
66
- private resolvePalette;
67
- }