@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.
- package/README.md +14 -27
- package/package.json +7 -3
- package/dist/core/box.d.ts +0 -144
- package/dist/core/box.js +0 -391
- package/dist/core/cells.d.ts +0 -148
- package/dist/core/cells.js +0 -266
- package/dist/core/color.d.ts +0 -229
- package/dist/core/color.js +0 -992
- package/dist/core/console.d.ts +0 -142
- package/dist/core/console.js +0 -477
- package/dist/core/emoji.d.ts +0 -24
- package/dist/core/emoji.js +0 -391
- package/dist/core/export-html.d.ts +0 -24
- package/dist/core/export-html.js +0 -106
- package/dist/core/export-lines.d.ts +0 -121
- package/dist/core/export-lines.js +0 -141
- package/dist/core/highlighter.d.ts +0 -33
- package/dist/core/highlighter.js +0 -124
- package/dist/core/json.d.ts +0 -27
- package/dist/core/json.js +0 -53
- package/dist/core/markup.d.ts +0 -97
- package/dist/core/markup.js +0 -619
- package/dist/core/measure.d.ts +0 -27
- package/dist/core/measure.js +0 -61
- package/dist/core/oklch.d.ts +0 -161
- package/dist/core/oklch.js +0 -312
- package/dist/core/osc8.d.ts +0 -68
- package/dist/core/osc8.js +0 -90
- package/dist/core/pretty.d.ts +0 -141
- package/dist/core/pretty.js +0 -472
- package/dist/core/protocol.d.ts +0 -137
- package/dist/core/protocol.js +0 -101
- package/dist/core/render.d.ts +0 -69
- package/dist/core/render.js +0 -140
- package/dist/core/segment.d.ts +0 -142
- package/dist/core/segment.js +0 -433
- package/dist/core/spinnerData.d.ts +0 -10
- package/dist/core/spinnerData.js +0 -115
- package/dist/core/strip.d.ts +0 -139
- package/dist/core/strip.js +0 -302
- package/dist/core/style.d.ts +0 -149
- package/dist/core/style.js +0 -741
- package/dist/core/subscription.d.ts +0 -12
- package/dist/core/subscription.js +0 -12
- package/dist/core/text.d.ts +0 -255
- package/dist/core/text.js +0 -990
- package/dist/core/wrap.d.ts +0 -41
- package/dist/core/wrap.js +0 -127
- package/dist/host/host-stream.d.ts +0 -30
- package/dist/host/host-stream.js +0 -35
- package/dist/host/index.d.ts +0 -3
- package/dist/host/index.js +0 -2
- package/dist/host/terminal-host.d.ts +0 -143
- package/dist/host/terminal-host.js +0 -132
- package/dist/index.d.ts +0 -87
- package/dist/index.js +0 -104
- package/dist/node/prompt.d.ts +0 -21
- package/dist/node/prompt.js +0 -30
- package/dist/node/save.d.ts +0 -17
- package/dist/node/save.js +0 -21
- package/dist/node/terminal-host.d.ts +0 -84
- package/dist/node/terminal-host.js +0 -160
- package/dist/node/traceback.d.ts +0 -27
- package/dist/node/traceback.js +0 -112
- package/dist/renderables/align.d.ts +0 -16
- package/dist/renderables/align.js +0 -46
- package/dist/renderables/columns.d.ts +0 -61
- package/dist/renderables/columns.js +0 -168
- package/dist/renderables/constrain.d.ts +0 -15
- package/dist/renderables/constrain.js +0 -37
- package/dist/renderables/flexStrip.d.ts +0 -41
- package/dist/renderables/flexStrip.js +0 -200
- package/dist/renderables/group.d.ts +0 -11
- package/dist/renderables/group.js +0 -15
- package/dist/renderables/layout.d.ts +0 -92
- package/dist/renderables/layout.js +0 -315
- package/dist/renderables/live.d.ts +0 -47
- package/dist/renderables/live.js +0 -131
- package/dist/renderables/markdown.d.ts +0 -24
- package/dist/renderables/markdown.js +0 -182
- package/dist/renderables/padding.d.ts +0 -38
- package/dist/renderables/padding.js +0 -140
- package/dist/renderables/panel.d.ts +0 -116
- package/dist/renderables/panel.js +0 -322
- package/dist/renderables/progress.d.ts +0 -90
- package/dist/renderables/progress.js +0 -241
- package/dist/renderables/progressBar.d.ts +0 -31
- package/dist/renderables/progressBar.js +0 -52
- package/dist/renderables/prompt.d.ts +0 -49
- package/dist/renderables/prompt.js +0 -125
- package/dist/renderables/rule.d.ts +0 -24
- package/dist/renderables/rule.js +0 -90
- package/dist/renderables/spinner.d.ts +0 -29
- package/dist/renderables/spinner.js +0 -64
- package/dist/renderables/status.d.ts +0 -23
- package/dist/renderables/status.js +0 -60
- package/dist/renderables/syntax.d.ts +0 -35
- package/dist/renderables/syntax.js +0 -114
- package/dist/renderables/table.d.ts +0 -182
- package/dist/renderables/table.js +0 -697
- package/dist/renderables/traceback.d.ts +0 -31
- package/dist/renderables/traceback.js +0 -109
- package/dist/renderables/tree.d.ts +0 -54
- package/dist/renderables/tree.js +0 -159
- package/dist/template-bindings/color-funcs.d.ts +0 -87
- package/dist/template-bindings/color-funcs.js +0 -219
- package/dist/template-bindings/helpers.d.ts +0 -24
- package/dist/template-bindings/helpers.js +0 -48
- package/dist/template-bindings/index.d.ts +0 -107
- package/dist/template-bindings/index.js +0 -144
- package/dist/template-bindings/palette-funcs.d.ts +0 -94
- package/dist/template-bindings/palette-funcs.js +0 -151
- package/dist/template-bindings/style-funcs.d.ts +0 -28
- package/dist/template-bindings/style-funcs.js +0 -151
- package/dist/themes/buildPalette.d.ts +0 -36
- package/dist/themes/buildPalette.js +0 -56
- package/dist/themes/colorMath.d.ts +0 -82
- package/dist/themes/colorMath.js +0 -254
- package/dist/themes/colorRef.d.ts +0 -51
- package/dist/themes/colorRef.js +0 -96
- package/dist/themes/data/atom-one-dark.d.ts +0 -3
- package/dist/themes/data/atom-one-dark.js +0 -158
- package/dist/themes/data/atom-one-light.d.ts +0 -3
- package/dist/themes/data/atom-one-light.js +0 -158
- package/dist/themes/data/catppuccin-frappe.d.ts +0 -3
- package/dist/themes/data/catppuccin-frappe.js +0 -158
- package/dist/themes/data/catppuccin-latte.d.ts +0 -3
- package/dist/themes/data/catppuccin-latte.js +0 -158
- package/dist/themes/data/catppuccin-macchiato.d.ts +0 -3
- package/dist/themes/data/catppuccin-macchiato.js +0 -158
- package/dist/themes/data/catppuccin-mocha.d.ts +0 -3
- package/dist/themes/data/catppuccin-mocha.js +0 -158
- package/dist/themes/data/cyberpunk.d.ts +0 -17
- package/dist/themes/data/cyberpunk.js +0 -191
- package/dist/themes/data/default.d.ts +0 -3
- package/dist/themes/data/default.js +0 -158
- package/dist/themes/data/dracula.d.ts +0 -3
- package/dist/themes/data/dracula.js +0 -158
- package/dist/themes/data/flexoki.d.ts +0 -3
- package/dist/themes/data/flexoki.js +0 -158
- package/dist/themes/data/gruvbox.d.ts +0 -3
- package/dist/themes/data/gruvbox.js +0 -158
- package/dist/themes/data/index.d.ts +0 -35
- package/dist/themes/data/index.js +0 -64
- package/dist/themes/data/monokai.d.ts +0 -3
- package/dist/themes/data/monokai.js +0 -158
- package/dist/themes/data/nord.d.ts +0 -3
- package/dist/themes/data/nord.js +0 -158
- package/dist/themes/data/rose-pine-dawn.d.ts +0 -3
- package/dist/themes/data/rose-pine-dawn.js +0 -158
- package/dist/themes/data/rose-pine-moon.d.ts +0 -3
- package/dist/themes/data/rose-pine-moon.js +0 -158
- package/dist/themes/data/rose-pine.d.ts +0 -3
- package/dist/themes/data/rose-pine.js +0 -158
- package/dist/themes/data/solarized-dark.d.ts +0 -3
- package/dist/themes/data/solarized-dark.js +0 -158
- package/dist/themes/data/solarized-light.d.ts +0 -3
- package/dist/themes/data/solarized-light.js +0 -158
- package/dist/themes/data/svg-export.d.ts +0 -3
- package/dist/themes/data/svg-export.js +0 -158
- package/dist/themes/data/textual-ansi.d.ts +0 -3
- package/dist/themes/data/textual-ansi.js +0 -158
- package/dist/themes/data/textual-dark.d.ts +0 -3
- package/dist/themes/data/textual-dark.js +0 -158
- package/dist/themes/data/textual-light.d.ts +0 -3
- package/dist/themes/data/textual-light.js +0 -158
- package/dist/themes/data/tokyo-night.d.ts +0 -3
- package/dist/themes/data/tokyo-night.js +0 -158
- package/dist/themes/data/types.d.ts +0 -15
- package/dist/themes/data/types.js +0 -1
- package/dist/themes/palette.d.ts +0 -21
- package/dist/themes/palette.js +0 -28
- package/dist/themes/ramp.d.ts +0 -83
- package/dist/themes/ramp.js +0 -122
- package/dist/themes/registry.d.ts +0 -43
- package/dist/themes/registry.js +0 -82
- package/dist/themes/terminalThemes.d.ts +0 -54
- package/dist/themes/terminalThemes.js +0 -68
- package/dist/themes/transpose.d.ts +0 -87
- package/dist/themes/transpose.js +0 -138
- package/dist/widgets/button.d.ts +0 -49
- package/dist/widgets/button.js +0 -206
- package/dist/widgets/checkbox.d.ts +0 -41
- package/dist/widgets/checkbox.js +0 -155
- package/dist/widgets/dropdown.d.ts +0 -67
- package/dist/widgets/dropdown.js +0 -453
- package/dist/widgets/event-router.d.ts +0 -78
- package/dist/widgets/event-router.js +0 -622
- package/dist/widgets/focus-manager.d.ts +0 -26
- package/dist/widgets/focus-manager.js +0 -193
- package/dist/widgets/index.d.ts +0 -22
- package/dist/widgets/index.js +0 -15
- package/dist/widgets/screen.d.ts +0 -98
- package/dist/widgets/screen.js +0 -542
- package/dist/widgets/slider.d.ts +0 -57
- package/dist/widgets/slider.js +0 -270
- package/dist/widgets/static-item.d.ts +0 -40
- package/dist/widgets/static-item.js +0 -60
- package/dist/widgets/text-input.d.ts +0 -274
- package/dist/widgets/text-input.js +0 -1162
- package/dist/widgets/toggle.d.ts +0 -44
- package/dist/widgets/toggle.js +0 -179
- package/dist/widgets/types.d.ts +0 -108
- package/dist/widgets/types.js +0 -31
- package/dist/widgets/widget-base.d.ts +0 -42
- package/dist/widgets/widget-base.js +0 -173
package/dist/widgets/button.js
DELETED
|
@@ -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
|
-
}
|
package/dist/widgets/checkbox.js
DELETED
|
@@ -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
|
-
}
|