@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.
- package/README.md +418 -0
- package/dist/core/box.d.ts +91 -0
- package/dist/core/box.d.ts.map +1 -0
- package/dist/core/box.js +534 -0
- package/dist/core/box.js.map +1 -0
- package/dist/core/cells.d.ts +24 -0
- package/dist/core/cells.d.ts.map +1 -0
- package/dist/core/cells.js +114 -0
- package/dist/core/cells.js.map +1 -0
- package/dist/core/color.d.ts +158 -0
- package/dist/core/color.d.ts.map +1 -0
- package/dist/core/color.js +825 -0
- package/dist/core/color.js.map +1 -0
- package/dist/core/console.d.ts +100 -0
- package/dist/core/console.d.ts.map +1 -0
- package/dist/core/console.js +353 -0
- package/dist/core/console.js.map +1 -0
- package/dist/core/emoji.d.ts +25 -0
- package/dist/core/emoji.d.ts.map +1 -0
- package/dist/core/emoji.js +392 -0
- package/dist/core/emoji.js.map +1 -0
- package/dist/core/highlighter.d.ts +33 -0
- package/dist/core/highlighter.d.ts.map +1 -0
- package/dist/core/highlighter.js +103 -0
- package/dist/core/highlighter.js.map +1 -0
- package/dist/core/markup.d.ts +69 -0
- package/dist/core/markup.d.ts.map +1 -0
- package/dist/core/markup.js +401 -0
- package/dist/core/markup.js.map +1 -0
- package/dist/core/measure.d.ts +17 -0
- package/dist/core/measure.d.ts.map +1 -0
- package/dist/core/measure.js +50 -0
- package/dist/core/measure.js.map +1 -0
- package/dist/core/protocol.d.ts +32 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +17 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/render.d.ts +51 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +69 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/segment.d.ts +104 -0
- package/dist/core/segment.d.ts.map +1 -0
- package/dist/core/segment.js +364 -0
- package/dist/core/segment.js.map +1 -0
- package/dist/core/spinnerData.d.ts +11 -0
- package/dist/core/spinnerData.d.ts.map +1 -0
- package/dist/core/spinnerData.js +116 -0
- package/dist/core/spinnerData.js.map +1 -0
- package/dist/core/strip.d.ts +159 -0
- package/dist/core/strip.d.ts.map +1 -0
- package/dist/core/strip.js +237 -0
- package/dist/core/strip.js.map +1 -0
- package/dist/core/style.d.ts +115 -0
- package/dist/core/style.d.ts.map +1 -0
- package/dist/core/style.js +662 -0
- package/dist/core/style.js.map +1 -0
- package/dist/core/text.d.ts +91 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +610 -0
- package/dist/core/text.js.map +1 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/renderables/align.d.ts +17 -0
- package/dist/renderables/align.d.ts.map +1 -0
- package/dist/renderables/align.js +47 -0
- package/dist/renderables/align.js.map +1 -0
- package/dist/renderables/columns.d.ts +28 -0
- package/dist/renderables/columns.d.ts.map +1 -0
- package/dist/renderables/columns.js +92 -0
- package/dist/renderables/columns.js.map +1 -0
- package/dist/renderables/constrain.d.ts +16 -0
- package/dist/renderables/constrain.d.ts.map +1 -0
- package/dist/renderables/constrain.js +38 -0
- package/dist/renderables/constrain.js.map +1 -0
- package/dist/renderables/flexStrip.d.ts +42 -0
- package/dist/renderables/flexStrip.d.ts.map +1 -0
- package/dist/renderables/flexStrip.js +201 -0
- package/dist/renderables/flexStrip.js.map +1 -0
- package/dist/renderables/group.d.ts +12 -0
- package/dist/renderables/group.d.ts.map +1 -0
- package/dist/renderables/group.js +16 -0
- package/dist/renderables/group.js.map +1 -0
- package/dist/renderables/json.d.ts +23 -0
- package/dist/renderables/json.d.ts.map +1 -0
- package/dist/renderables/json.js +49 -0
- package/dist/renderables/json.js.map +1 -0
- package/dist/renderables/layout.d.ts +37 -0
- package/dist/renderables/layout.d.ts.map +1 -0
- package/dist/renderables/layout.js +151 -0
- package/dist/renderables/layout.js.map +1 -0
- package/dist/renderables/live.d.ts +48 -0
- package/dist/renderables/live.d.ts.map +1 -0
- package/dist/renderables/live.js +131 -0
- package/dist/renderables/live.js.map +1 -0
- package/dist/renderables/markdown.d.ts +25 -0
- package/dist/renderables/markdown.d.ts.map +1 -0
- package/dist/renderables/markdown.js +190 -0
- package/dist/renderables/markdown.js.map +1 -0
- package/dist/renderables/padding.d.ts +26 -0
- package/dist/renderables/padding.d.ts.map +1 -0
- package/dist/renderables/padding.js +92 -0
- package/dist/renderables/padding.js.map +1 -0
- package/dist/renderables/panel.d.ts +42 -0
- package/dist/renderables/panel.d.ts.map +1 -0
- package/dist/renderables/panel.js +202 -0
- package/dist/renderables/panel.js.map +1 -0
- package/dist/renderables/pretty.d.ts +29 -0
- package/dist/renderables/pretty.d.ts.map +1 -0
- package/dist/renderables/pretty.js +141 -0
- package/dist/renderables/pretty.js.map +1 -0
- package/dist/renderables/progress.d.ts +91 -0
- package/dist/renderables/progress.d.ts.map +1 -0
- package/dist/renderables/progress.js +234 -0
- package/dist/renderables/progress.js.map +1 -0
- package/dist/renderables/progressBar.d.ts +32 -0
- package/dist/renderables/progressBar.d.ts.map +1 -0
- package/dist/renderables/progressBar.js +59 -0
- package/dist/renderables/progressBar.js.map +1 -0
- package/dist/renderables/prompt.d.ts +25 -0
- package/dist/renderables/prompt.d.ts.map +1 -0
- package/dist/renderables/prompt.js +109 -0
- package/dist/renderables/prompt.js.map +1 -0
- package/dist/renderables/rule.d.ts +25 -0
- package/dist/renderables/rule.d.ts.map +1 -0
- package/dist/renderables/rule.js +96 -0
- package/dist/renderables/rule.js.map +1 -0
- package/dist/renderables/spinner.d.ts +30 -0
- package/dist/renderables/spinner.d.ts.map +1 -0
- package/dist/renderables/spinner.js +70 -0
- package/dist/renderables/spinner.js.map +1 -0
- package/dist/renderables/status.d.ts +24 -0
- package/dist/renderables/status.d.ts.map +1 -0
- package/dist/renderables/status.js +67 -0
- package/dist/renderables/status.js.map +1 -0
- package/dist/renderables/syntax.d.ts +36 -0
- package/dist/renderables/syntax.d.ts.map +1 -0
- package/dist/renderables/syntax.js +115 -0
- package/dist/renderables/syntax.js.map +1 -0
- package/dist/renderables/table.d.ts +109 -0
- package/dist/renderables/table.d.ts.map +1 -0
- package/dist/renderables/table.js +434 -0
- package/dist/renderables/table.js.map +1 -0
- package/dist/renderables/traceback.d.ts +26 -0
- package/dist/renderables/traceback.d.ts.map +1 -0
- package/dist/renderables/traceback.js +108 -0
- package/dist/renderables/traceback.js.map +1 -0
- package/dist/renderables/tree.d.ts +30 -0
- package/dist/renderables/tree.d.ts.map +1 -0
- package/dist/renderables/tree.js +107 -0
- package/dist/renderables/tree.js.map +1 -0
- package/dist/template-bindings/index.d.ts +61 -0
- package/dist/template-bindings/index.d.ts.map +1 -0
- package/dist/template-bindings/index.js +70 -0
- package/dist/template-bindings/index.js.map +1 -0
- package/dist/template-bindings/style-funcs.d.ts +30 -0
- package/dist/template-bindings/style-funcs.d.ts.map +1 -0
- package/dist/template-bindings/style-funcs.js +172 -0
- package/dist/template-bindings/style-funcs.js.map +1 -0
- package/dist/themes/buildPalette.d.ts +31 -0
- package/dist/themes/buildPalette.d.ts.map +1 -0
- package/dist/themes/buildPalette.js +43 -0
- package/dist/themes/buildPalette.js.map +1 -0
- package/dist/themes/colorMath.d.ts +23 -0
- package/dist/themes/colorMath.d.ts.map +1 -0
- package/dist/themes/colorMath.js +99 -0
- package/dist/themes/colorMath.js.map +1 -0
- package/dist/themes/data/atom-one-dark.d.ts +4 -0
- package/dist/themes/data/atom-one-dark.d.ts.map +1 -0
- package/dist/themes/data/atom-one-dark.js +159 -0
- package/dist/themes/data/atom-one-dark.js.map +1 -0
- package/dist/themes/data/atom-one-light.d.ts +4 -0
- package/dist/themes/data/atom-one-light.d.ts.map +1 -0
- package/dist/themes/data/atom-one-light.js +159 -0
- package/dist/themes/data/atom-one-light.js.map +1 -0
- package/dist/themes/data/catppuccin-latte.d.ts +4 -0
- package/dist/themes/data/catppuccin-latte.d.ts.map +1 -0
- package/dist/themes/data/catppuccin-latte.js +159 -0
- package/dist/themes/data/catppuccin-latte.js.map +1 -0
- package/dist/themes/data/catppuccin-mocha.d.ts +4 -0
- package/dist/themes/data/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/data/catppuccin-mocha.js +159 -0
- package/dist/themes/data/catppuccin-mocha.js.map +1 -0
- package/dist/themes/data/dracula.d.ts +4 -0
- package/dist/themes/data/dracula.d.ts.map +1 -0
- package/dist/themes/data/dracula.js +159 -0
- package/dist/themes/data/dracula.js.map +1 -0
- package/dist/themes/data/flexoki.d.ts +4 -0
- package/dist/themes/data/flexoki.d.ts.map +1 -0
- package/dist/themes/data/flexoki.js +159 -0
- package/dist/themes/data/flexoki.js.map +1 -0
- package/dist/themes/data/gruvbox.d.ts +4 -0
- package/dist/themes/data/gruvbox.d.ts.map +1 -0
- package/dist/themes/data/gruvbox.js +159 -0
- package/dist/themes/data/gruvbox.js.map +1 -0
- package/dist/themes/data/index.d.ts +29 -0
- package/dist/themes/data/index.d.ts.map +1 -0
- package/dist/themes/data/index.js +48 -0
- package/dist/themes/data/index.js.map +1 -0
- package/dist/themes/data/monokai.d.ts +4 -0
- package/dist/themes/data/monokai.d.ts.map +1 -0
- package/dist/themes/data/monokai.js +159 -0
- package/dist/themes/data/monokai.js.map +1 -0
- package/dist/themes/data/nord.d.ts +4 -0
- package/dist/themes/data/nord.d.ts.map +1 -0
- package/dist/themes/data/nord.js +159 -0
- package/dist/themes/data/nord.js.map +1 -0
- package/dist/themes/data/rose-pine-dawn.d.ts +4 -0
- package/dist/themes/data/rose-pine-dawn.d.ts.map +1 -0
- package/dist/themes/data/rose-pine-dawn.js +159 -0
- package/dist/themes/data/rose-pine-dawn.js.map +1 -0
- package/dist/themes/data/rose-pine-moon.d.ts +4 -0
- package/dist/themes/data/rose-pine-moon.d.ts.map +1 -0
- package/dist/themes/data/rose-pine-moon.js +159 -0
- package/dist/themes/data/rose-pine-moon.js.map +1 -0
- package/dist/themes/data/rose-pine.d.ts +4 -0
- package/dist/themes/data/rose-pine.d.ts.map +1 -0
- package/dist/themes/data/rose-pine.js +159 -0
- package/dist/themes/data/rose-pine.js.map +1 -0
- package/dist/themes/data/solarized-dark.d.ts +4 -0
- package/dist/themes/data/solarized-dark.d.ts.map +1 -0
- package/dist/themes/data/solarized-dark.js +159 -0
- package/dist/themes/data/solarized-dark.js.map +1 -0
- package/dist/themes/data/solarized-light.d.ts +4 -0
- package/dist/themes/data/solarized-light.d.ts.map +1 -0
- package/dist/themes/data/solarized-light.js +159 -0
- package/dist/themes/data/solarized-light.js.map +1 -0
- package/dist/themes/data/textual-ansi.d.ts +4 -0
- package/dist/themes/data/textual-ansi.d.ts.map +1 -0
- package/dist/themes/data/textual-ansi.js +159 -0
- package/dist/themes/data/textual-ansi.js.map +1 -0
- package/dist/themes/data/textual-dark.d.ts +4 -0
- package/dist/themes/data/textual-dark.d.ts.map +1 -0
- package/dist/themes/data/textual-dark.js +159 -0
- package/dist/themes/data/textual-dark.js.map +1 -0
- package/dist/themes/data/textual-light.d.ts +4 -0
- package/dist/themes/data/textual-light.d.ts.map +1 -0
- package/dist/themes/data/textual-light.js +159 -0
- package/dist/themes/data/textual-light.js.map +1 -0
- package/dist/themes/data/tokyo-night.d.ts +4 -0
- package/dist/themes/data/tokyo-night.d.ts.map +1 -0
- package/dist/themes/data/tokyo-night.js +159 -0
- package/dist/themes/data/tokyo-night.js.map +1 -0
- package/dist/themes/data/types.d.ts +15 -0
- package/dist/themes/data/types.d.ts.map +1 -0
- package/dist/themes/data/types.js +2 -0
- package/dist/themes/data/types.js.map +1 -0
- package/dist/themes/palette.d.ts +20 -0
- package/dist/themes/palette.d.ts.map +1 -0
- package/dist/themes/palette.js +27 -0
- package/dist/themes/palette.js.map +1 -0
- package/dist/themes/paletteResolver.d.ts +35 -0
- package/dist/themes/paletteResolver.d.ts.map +1 -0
- package/dist/themes/paletteResolver.js +88 -0
- package/dist/themes/paletteResolver.js.map +1 -0
- package/dist/themes/registry.d.ts +17 -0
- package/dist/themes/registry.d.ts.map +1 -0
- package/dist/themes/registry.js +33 -0
- package/dist/themes/registry.js.map +1 -0
- package/dist/themes/terminalThemes.d.ts +46 -0
- package/dist/themes/terminalThemes.d.ts.map +1 -0
- package/dist/themes/terminalThemes.js +268 -0
- package/dist/themes/terminalThemes.js.map +1 -0
- package/dist/widgets/button.d.ts +47 -0
- package/dist/widgets/button.d.ts.map +1 -0
- package/dist/widgets/button.js +183 -0
- package/dist/widgets/button.js.map +1 -0
- package/dist/widgets/checkbox.d.ts +43 -0
- package/dist/widgets/checkbox.d.ts.map +1 -0
- package/dist/widgets/checkbox.js +144 -0
- package/dist/widgets/checkbox.js.map +1 -0
- package/dist/widgets/dropdown.d.ts +67 -0
- package/dist/widgets/dropdown.d.ts.map +1 -0
- package/dist/widgets/dropdown.js +373 -0
- package/dist/widgets/dropdown.js.map +1 -0
- package/dist/widgets/event-router.d.ts +73 -0
- package/dist/widgets/event-router.d.ts.map +1 -0
- package/dist/widgets/event-router.js +479 -0
- package/dist/widgets/event-router.js.map +1 -0
- package/dist/widgets/focus-manager.d.ts +26 -0
- package/dist/widgets/focus-manager.d.ts.map +1 -0
- package/dist/widgets/focus-manager.js +179 -0
- package/dist/widgets/focus-manager.js.map +1 -0
- package/dist/widgets/index.d.ts +23 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +13 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/screen.d.ts +90 -0
- package/dist/widgets/screen.d.ts.map +1 -0
- package/dist/widgets/screen.js +440 -0
- package/dist/widgets/screen.js.map +1 -0
- package/dist/widgets/slider.d.ts +55 -0
- package/dist/widgets/slider.d.ts.map +1 -0
- package/dist/widgets/slider.js +248 -0
- package/dist/widgets/slider.js.map +1 -0
- package/dist/widgets/static-item.d.ts +41 -0
- package/dist/widgets/static-item.d.ts.map +1 -0
- package/dist/widgets/static-item.js +62 -0
- package/dist/widgets/static-item.js.map +1 -0
- package/dist/widgets/text-input.d.ts +50 -0
- package/dist/widgets/text-input.d.ts.map +1 -0
- package/dist/widgets/text-input.js +242 -0
- package/dist/widgets/text-input.js.map +1 -0
- package/dist/widgets/toggle.d.ts +46 -0
- package/dist/widgets/toggle.d.ts.map +1 -0
- package/dist/widgets/toggle.js +169 -0
- package/dist/widgets/toggle.js.map +1 -0
- package/dist/widgets/types.d.ts +92 -0
- package/dist/widgets/types.d.ts.map +1 -0
- package/dist/widgets/types.js +13 -0
- package/dist/widgets/types.js.map +1 -0
- package/dist/widgets/widget-base.d.ts +41 -0
- package/dist/widgets/widget-base.d.ts.map +1 -0
- package/dist/widgets/widget-base.js +159 -0
- package/dist/widgets/widget-base.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,183 @@
|
|
|
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 color (brighter than muted)
|
|
9
|
+
* focus — brackets [ label ] surrounding the button
|
|
10
|
+
* active — color reversal (pressed)
|
|
11
|
+
*
|
|
12
|
+
* States compose: active > focus > hover > normal.
|
|
13
|
+
*/
|
|
14
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
15
|
+
var useValue = arguments.length > 2;
|
|
16
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
17
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
18
|
+
}
|
|
19
|
+
return useValue ? value : void 0;
|
|
20
|
+
};
|
|
21
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
22
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
23
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
24
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
25
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
26
|
+
var _, done = false;
|
|
27
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
28
|
+
var context = {};
|
|
29
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
30
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
31
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
32
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
33
|
+
if (kind === "accessor") {
|
|
34
|
+
if (result === void 0) continue;
|
|
35
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
36
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
37
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
38
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
39
|
+
}
|
|
40
|
+
else if (_ = accept(result)) {
|
|
41
|
+
if (kind === "field") initializers.unshift(_);
|
|
42
|
+
else descriptor[key] = _;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
46
|
+
done = true;
|
|
47
|
+
};
|
|
48
|
+
import { observable, action } from "mobx";
|
|
49
|
+
import { Segment } from "../core/segment.js";
|
|
50
|
+
import { Style } from "../core/style.js";
|
|
51
|
+
import { ColorSpec } from "../core/color.js";
|
|
52
|
+
import { DEFAULT_TERMINAL_THEME } from "../themes/terminalThemes.js";
|
|
53
|
+
import { WidgetBase } from "./widget-base.js";
|
|
54
|
+
// Variant → palette key mapping. Per variant:
|
|
55
|
+
// bg / fg — normal state. Muted accent bg + mostly-accent fg → readable.
|
|
56
|
+
// hover — full accent bg; pair with hoverFg, NOT with `fg`. The
|
|
57
|
+
// text-* keys are mostly-accent and would clash on a full
|
|
58
|
+
// accent bg.
|
|
59
|
+
// hoverFg — WCAG-correct contrast colour (on-${accent}) for full bg.
|
|
60
|
+
const VARIANT_KEYS = {
|
|
61
|
+
default: { bg: "surface", fg: "foreground", hover: "primary", hoverFg: "on-primary" },
|
|
62
|
+
primary: { bg: "primary-muted", fg: "text-primary", hover: "primary", hoverFg: "on-primary" },
|
|
63
|
+
success: { bg: "success-muted", fg: "text-success", hover: "success", hoverFg: "on-success" },
|
|
64
|
+
warning: { bg: "warning-muted", fg: "text-warning", hover: "warning", hoverFg: "on-warning" },
|
|
65
|
+
danger: { bg: "error-muted", fg: "text-error", hover: "error", hoverFg: "on-error" },
|
|
66
|
+
};
|
|
67
|
+
let Button = (() => {
|
|
68
|
+
var _a;
|
|
69
|
+
let _classSuper = WidgetBase;
|
|
70
|
+
let _instanceExtraInitializers = [];
|
|
71
|
+
let _label_decorators;
|
|
72
|
+
let _label_initializers = [];
|
|
73
|
+
let _label_extraInitializers = [];
|
|
74
|
+
let _variant_decorators;
|
|
75
|
+
let _variant_initializers = [];
|
|
76
|
+
let _variant_extraInitializers = [];
|
|
77
|
+
let _handleKey_decorators;
|
|
78
|
+
let _handleMouse_decorators;
|
|
79
|
+
let _setHovered_decorators;
|
|
80
|
+
let _setActive_decorators;
|
|
81
|
+
return class Button 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
|
+
_variant_decorators = [(_a = observable).ref.bind(_a)];
|
|
86
|
+
_handleKey_decorators = [action];
|
|
87
|
+
_handleMouse_decorators = [action];
|
|
88
|
+
_setHovered_decorators = [action];
|
|
89
|
+
_setActive_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, _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);
|
|
92
|
+
__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);
|
|
93
|
+
__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);
|
|
94
|
+
__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);
|
|
95
|
+
__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);
|
|
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
|
+
#variant_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _variant_initializers, void 0));
|
|
104
|
+
get variant() { return this.#variant_accessor_storage; }
|
|
105
|
+
set variant(value) { this.#variant_accessor_storage = value; }
|
|
106
|
+
_theme = __runInitializers(this, _variant_extraInitializers);
|
|
107
|
+
constructor(options) {
|
|
108
|
+
super();
|
|
109
|
+
this.id = options.id ?? `button-${options.label.toLowerCase().replace(/\s+/g, "-")}`;
|
|
110
|
+
this.label = options.label;
|
|
111
|
+
this.variant = options.variant ?? "default";
|
|
112
|
+
this.disabled = options.disabled ?? false;
|
|
113
|
+
this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
|
|
114
|
+
}
|
|
115
|
+
setTheme(theme) { this._theme = theme; }
|
|
116
|
+
// --- Event handlers ---
|
|
117
|
+
handleKey(event) {
|
|
118
|
+
if (this.disabled)
|
|
119
|
+
return;
|
|
120
|
+
if (event.key === "enter" || event.key === "space") {
|
|
121
|
+
this.active = true;
|
|
122
|
+
this.emitSubmit();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
handleMouse(event) {
|
|
126
|
+
if (this.disabled)
|
|
127
|
+
return;
|
|
128
|
+
if (event.type === "mouse_down") {
|
|
129
|
+
this.active = true;
|
|
130
|
+
}
|
|
131
|
+
if (event.type === "mouse_up") {
|
|
132
|
+
if (this.active) {
|
|
133
|
+
this.active = false;
|
|
134
|
+
this.emitSubmit();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// --- Hover/active mutators (router fast-path uses setHovered) ---
|
|
139
|
+
setHovered(value) { this.hovered = value; }
|
|
140
|
+
setActive(value) { this.active = value; }
|
|
141
|
+
// --- Rendering ---
|
|
142
|
+
render(_options) {
|
|
143
|
+
// [LAW:dataflow-not-control-flow] same segment count and width every state
|
|
144
|
+
const focused = this.focused;
|
|
145
|
+
const left = focused ? "[" : " ";
|
|
146
|
+
const right = focused ? "]" : " ";
|
|
147
|
+
const text = `${left} ${this.label} ${right}`;
|
|
148
|
+
if (this.disabled) {
|
|
149
|
+
return [new Segment(text, new Style({ color: "#666666", bgcolor: "#333333", dim: true }))];
|
|
150
|
+
}
|
|
151
|
+
// Active and hover share the same colour pair (full accent bg + on-accent fg).
|
|
152
|
+
// Active is differentiated by bold, not by inverting fg/bg — inversion gives
|
|
153
|
+
// mostly-accent text on mostly-bg-tinted background, which is unreadable for
|
|
154
|
+
// accents whose contrast partner depends on luminance.
|
|
155
|
+
if (this.active || this.hovered) {
|
|
156
|
+
const fg = this.resolvePalette(VARIANT_KEYS[this.variant].hoverFg);
|
|
157
|
+
const bg = this.resolvePalette(VARIANT_KEYS[this.variant].hover);
|
|
158
|
+
return [new Segment(text, new Style({ color: fg, bgcolor: bg, bold: this.active }))];
|
|
159
|
+
}
|
|
160
|
+
const { fg, bg } = this.resolveColors("bg");
|
|
161
|
+
return [new Segment(text, new Style({ color: fg, bgcolor: bg }))];
|
|
162
|
+
}
|
|
163
|
+
measure(_options) {
|
|
164
|
+
const width = this.label.length + 4;
|
|
165
|
+
return { minimum: width, maximum: width };
|
|
166
|
+
}
|
|
167
|
+
// --- Palette resolution ---
|
|
168
|
+
resolveColors(bgKey) {
|
|
169
|
+
const keys = VARIANT_KEYS[this.variant];
|
|
170
|
+
return {
|
|
171
|
+
fg: this.resolvePalette(keys.fg),
|
|
172
|
+
bg: this.resolvePalette(bgKey === "hover" ? keys.hover : keys.bg),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
resolvePalette(key) {
|
|
176
|
+
const rgba = this._theme.palette.get(key);
|
|
177
|
+
// [LAW:no-defensive-null-guards] palette is required and must contain all keys.
|
|
178
|
+
return ColorSpec.fromRgba(rgba);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
})();
|
|
182
|
+
export { Button };
|
|
183
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/widgets/button.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 _theme;
|
|
31
|
+
constructor(options: CheckboxOptions);
|
|
32
|
+
setTheme(theme: TerminalTheme): void;
|
|
33
|
+
handleKey(event: KeyEvent): void;
|
|
34
|
+
handleMouse(event: WidgetMouseEvent): void;
|
|
35
|
+
setHovered(value: boolean): void;
|
|
36
|
+
render(options: RenderOptions): Iterable<Segment>;
|
|
37
|
+
measure(_options: RenderOptions): {
|
|
38
|
+
minimum: number;
|
|
39
|
+
maximum: number;
|
|
40
|
+
};
|
|
41
|
+
private resolvePalette;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/widgets/checkbox.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,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,qBAAa,QAAS,SAAQ,UAAU;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,QAAQ;IAEd,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAEtC,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,eAAe;IASpC,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,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;IAYjD,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,144 @@
|
|
|
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 } 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
|
+
let Checkbox = (() => {
|
|
54
|
+
let _classSuper = WidgetBase;
|
|
55
|
+
let _instanceExtraInitializers = [];
|
|
56
|
+
let _label_decorators;
|
|
57
|
+
let _label_initializers = [];
|
|
58
|
+
let _label_extraInitializers = [];
|
|
59
|
+
let _checked_decorators;
|
|
60
|
+
let _checked_initializers = [];
|
|
61
|
+
let _checked_extraInitializers = [];
|
|
62
|
+
let _handleKey_decorators;
|
|
63
|
+
let _handleMouse_decorators;
|
|
64
|
+
let _setHovered_decorators;
|
|
65
|
+
return class Checkbox extends _classSuper {
|
|
66
|
+
static {
|
|
67
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
68
|
+
_label_decorators = [observable];
|
|
69
|
+
_checked_decorators = [observable];
|
|
70
|
+
_handleKey_decorators = [action];
|
|
71
|
+
_handleMouse_decorators = [action];
|
|
72
|
+
_setHovered_decorators = [action];
|
|
73
|
+
__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);
|
|
74
|
+
__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);
|
|
75
|
+
__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);
|
|
76
|
+
__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);
|
|
77
|
+
__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);
|
|
78
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
79
|
+
}
|
|
80
|
+
id = __runInitializers(this, _instanceExtraInitializers);
|
|
81
|
+
focusable = true;
|
|
82
|
+
#label_accessor_storage = __runInitializers(this, _label_initializers, void 0);
|
|
83
|
+
get label() { return this.#label_accessor_storage; }
|
|
84
|
+
set label(value) { this.#label_accessor_storage = value; }
|
|
85
|
+
#checked_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _checked_initializers, void 0));
|
|
86
|
+
get checked() { return this.#checked_accessor_storage; }
|
|
87
|
+
set checked(value) { this.#checked_accessor_storage = value; }
|
|
88
|
+
_theme = __runInitializers(this, _checked_extraInitializers);
|
|
89
|
+
constructor(options) {
|
|
90
|
+
super();
|
|
91
|
+
this.id = options.id ?? `checkbox-${options.label.toLowerCase().replace(/\s+/g, "-")}`;
|
|
92
|
+
this.label = options.label;
|
|
93
|
+
this.checked = options.checked ?? false;
|
|
94
|
+
this.disabled = options.disabled ?? false;
|
|
95
|
+
this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
|
|
96
|
+
}
|
|
97
|
+
setTheme(theme) { this._theme = theme; }
|
|
98
|
+
// --- Event handlers ---
|
|
99
|
+
handleKey(event) {
|
|
100
|
+
if (this.disabled)
|
|
101
|
+
return;
|
|
102
|
+
if (event.key === "space") {
|
|
103
|
+
this.checked = !this.checked;
|
|
104
|
+
this.emitChange();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (event.key === "enter") {
|
|
108
|
+
this.emitSubmit();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
handleMouse(event) {
|
|
112
|
+
if (this.disabled)
|
|
113
|
+
return;
|
|
114
|
+
if (event.type === "mouse_up") {
|
|
115
|
+
this.checked = !this.checked;
|
|
116
|
+
this.emitChange();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// --- Hover/active mutators (router fast-path uses setHovered) ---
|
|
120
|
+
setHovered(value) { this.hovered = value; }
|
|
121
|
+
// --- Rendering ---
|
|
122
|
+
render(options) {
|
|
123
|
+
const indicator = this.checked ? (options.asciiOnly ? "x" : "✓") : " ";
|
|
124
|
+
const text = `[${indicator}] ${this.label}`;
|
|
125
|
+
if (this.disabled) {
|
|
126
|
+
return [new Segment(text, new Style({ color: "#666666", bgcolor: "#333333", dim: true }))];
|
|
127
|
+
}
|
|
128
|
+
const fg = this.checked ? this.resolvePalette("primary") : this.resolvePalette("foreground");
|
|
129
|
+
return [new Segment(text, new Style({ color: fg, underline: this.focused }))];
|
|
130
|
+
}
|
|
131
|
+
measure(_options) {
|
|
132
|
+
const width = this.label.length + 4;
|
|
133
|
+
return { minimum: width, maximum: width };
|
|
134
|
+
}
|
|
135
|
+
// --- Palette resolution ---
|
|
136
|
+
resolvePalette(key) {
|
|
137
|
+
const rgba = this._theme.palette.get(key);
|
|
138
|
+
// [LAW:no-defensive-null-guards] palette must contain all keys; missing is a construction bug.
|
|
139
|
+
return ColorSpec.fromRgba(rgba);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
})();
|
|
143
|
+
export { Checkbox };
|
|
144
|
+
//# sourceMappingURL=checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../src/widgets/checkbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 spec/widgets.md → Dropdown → Filtering.
|
|
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, 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 _theme;
|
|
50
|
+
constructor(options: DropdownOptions);
|
|
51
|
+
setTheme(theme: TerminalTheme): void;
|
|
52
|
+
handleKey(event: KeyEvent): void;
|
|
53
|
+
handleMouse(event: WidgetMouseEvent): void;
|
|
54
|
+
setHovered(value: boolean): void;
|
|
55
|
+
render(options: RenderOptions): Iterable<Segment>;
|
|
56
|
+
private headerText;
|
|
57
|
+
renderOverlay(_options: RenderOptions): Iterable<Segment> | null;
|
|
58
|
+
private renderNoMatchRow;
|
|
59
|
+
private renderOptionRow;
|
|
60
|
+
private maxLabelLen;
|
|
61
|
+
measure(_options: RenderOptions): {
|
|
62
|
+
minimum: number;
|
|
63
|
+
maximum: number;
|
|
64
|
+
};
|
|
65
|
+
private resolvePalette;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../../src/widgets/dropdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;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,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,qBAAa,QAAS,SAAQ,UAAW,YAAW,iBAAiB;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,QAAQ;IAEN,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAS;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAM;IAKzC,IAAI,eAAe,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAQtD;IAED,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,eAAe;IAUpC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKpC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAmEvB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAgDnD,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIhC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;IA0BjD,OAAO,CAAC,UAAU;IAUlB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;IAchE,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAOtE,OAAO,CAAC,cAAc;CAKvB"}
|