@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,373 @@
|
|
|
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
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
26
|
+
var useValue = arguments.length > 2;
|
|
27
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
28
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
29
|
+
}
|
|
30
|
+
return useValue ? value : void 0;
|
|
31
|
+
};
|
|
32
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
33
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
34
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
35
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
36
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
37
|
+
var _, done = false;
|
|
38
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
39
|
+
var context = {};
|
|
40
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
41
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
42
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
43
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
44
|
+
if (kind === "accessor") {
|
|
45
|
+
if (result === void 0) continue;
|
|
46
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
47
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
48
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
49
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
50
|
+
}
|
|
51
|
+
else if (_ = accept(result)) {
|
|
52
|
+
if (kind === "field") initializers.unshift(_);
|
|
53
|
+
else descriptor[key] = _;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
57
|
+
done = true;
|
|
58
|
+
};
|
|
59
|
+
import { observable, action } from "mobx";
|
|
60
|
+
import { Segment } from "../core/segment.js";
|
|
61
|
+
import { Style } from "../core/style.js";
|
|
62
|
+
import { ColorSpec } from "../core/color.js";
|
|
63
|
+
import { DEFAULT_TERMINAL_THEME } from "../themes/terminalThemes.js";
|
|
64
|
+
import { WidgetBase } from "./widget-base.js";
|
|
65
|
+
let Dropdown = (() => {
|
|
66
|
+
var _a;
|
|
67
|
+
let _classSuper = WidgetBase;
|
|
68
|
+
let _instanceExtraInitializers = [];
|
|
69
|
+
let _options_decorators;
|
|
70
|
+
let _options_initializers = [];
|
|
71
|
+
let _options_extraInitializers = [];
|
|
72
|
+
let _selectedIndex_decorators;
|
|
73
|
+
let _selectedIndex_initializers = [];
|
|
74
|
+
let _selectedIndex_extraInitializers = [];
|
|
75
|
+
let _expanded_decorators;
|
|
76
|
+
let _expanded_initializers = [];
|
|
77
|
+
let _expanded_extraInitializers = [];
|
|
78
|
+
let _highlightedIndex_decorators;
|
|
79
|
+
let _highlightedIndex_initializers = [];
|
|
80
|
+
let _highlightedIndex_extraInitializers = [];
|
|
81
|
+
let _filter_decorators;
|
|
82
|
+
let _filter_initializers = [];
|
|
83
|
+
let _filter_extraInitializers = [];
|
|
84
|
+
let _handleKey_decorators;
|
|
85
|
+
let _handleMouse_decorators;
|
|
86
|
+
let _setHovered_decorators;
|
|
87
|
+
return class Dropdown extends _classSuper {
|
|
88
|
+
static {
|
|
89
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
90
|
+
_options_decorators = [(_a = observable).shallow.bind(_a)];
|
|
91
|
+
_selectedIndex_decorators = [observable];
|
|
92
|
+
_expanded_decorators = [observable];
|
|
93
|
+
_highlightedIndex_decorators = [observable];
|
|
94
|
+
_filter_decorators = [observable];
|
|
95
|
+
_handleKey_decorators = [action];
|
|
96
|
+
_handleMouse_decorators = [action];
|
|
97
|
+
_setHovered_decorators = [action];
|
|
98
|
+
__esDecorate(this, null, _options_decorators, { kind: "accessor", name: "options", static: false, private: false, access: { has: obj => "options" in obj, get: obj => obj.options, set: (obj, value) => { obj.options = value; } }, metadata: _metadata }, _options_initializers, _options_extraInitializers);
|
|
99
|
+
__esDecorate(this, null, _selectedIndex_decorators, { kind: "accessor", name: "selectedIndex", static: false, private: false, access: { has: obj => "selectedIndex" in obj, get: obj => obj.selectedIndex, set: (obj, value) => { obj.selectedIndex = value; } }, metadata: _metadata }, _selectedIndex_initializers, _selectedIndex_extraInitializers);
|
|
100
|
+
__esDecorate(this, null, _expanded_decorators, { kind: "accessor", name: "expanded", static: false, private: false, access: { has: obj => "expanded" in obj, get: obj => obj.expanded, set: (obj, value) => { obj.expanded = value; } }, metadata: _metadata }, _expanded_initializers, _expanded_extraInitializers);
|
|
101
|
+
__esDecorate(this, null, _highlightedIndex_decorators, { kind: "accessor", name: "highlightedIndex", static: false, private: false, access: { has: obj => "highlightedIndex" in obj, get: obj => obj.highlightedIndex, set: (obj, value) => { obj.highlightedIndex = value; } }, metadata: _metadata }, _highlightedIndex_initializers, _highlightedIndex_extraInitializers);
|
|
102
|
+
__esDecorate(this, null, _filter_decorators, { kind: "accessor", name: "filter", static: false, private: false, access: { has: obj => "filter" in obj, get: obj => obj.filter, set: (obj, value) => { obj.filter = value; } }, metadata: _metadata }, _filter_initializers, _filter_extraInitializers);
|
|
103
|
+
__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);
|
|
104
|
+
__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);
|
|
105
|
+
__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);
|
|
106
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
107
|
+
}
|
|
108
|
+
id = __runInitializers(this, _instanceExtraInitializers);
|
|
109
|
+
focusable = true;
|
|
110
|
+
#options_accessor_storage = __runInitializers(this, _options_initializers, void 0);
|
|
111
|
+
get options() { return this.#options_accessor_storage; }
|
|
112
|
+
set options(value) { this.#options_accessor_storage = value; }
|
|
113
|
+
#selectedIndex_accessor_storage = (__runInitializers(this, _options_extraInitializers), __runInitializers(this, _selectedIndex_initializers, void 0));
|
|
114
|
+
get selectedIndex() { return this.#selectedIndex_accessor_storage; }
|
|
115
|
+
set selectedIndex(value) { this.#selectedIndex_accessor_storage = value; }
|
|
116
|
+
#expanded_accessor_storage = (__runInitializers(this, _selectedIndex_extraInitializers), __runInitializers(this, _expanded_initializers, false));
|
|
117
|
+
get expanded() { return this.#expanded_accessor_storage; }
|
|
118
|
+
set expanded(value) { this.#expanded_accessor_storage = value; }
|
|
119
|
+
#highlightedIndex_accessor_storage = (__runInitializers(this, _expanded_extraInitializers), __runInitializers(this, _highlightedIndex_initializers, void 0));
|
|
120
|
+
get highlightedIndex() { return this.#highlightedIndex_accessor_storage; }
|
|
121
|
+
set highlightedIndex(value) { this.#highlightedIndex_accessor_storage = value; }
|
|
122
|
+
#filter_accessor_storage = (__runInitializers(this, _highlightedIndex_extraInitializers), __runInitializers(this, _filter_initializers, ""));
|
|
123
|
+
get filter() { return this.#filter_accessor_storage; }
|
|
124
|
+
set filter(value) { this.#filter_accessor_storage = value; }
|
|
125
|
+
// [LAW:dataflow-not-control-flow] Derived view; empty filter falls out
|
|
126
|
+
// naturally because "".includes("") is true for every label — no
|
|
127
|
+
// special-case branch.
|
|
128
|
+
get filteredOptions() {
|
|
129
|
+
const f = this.filter.toLowerCase();
|
|
130
|
+
const result = [];
|
|
131
|
+
for (let i = 0; i < this.options.length; i++) {
|
|
132
|
+
const label = this.options[i];
|
|
133
|
+
if (label.toLowerCase().includes(f))
|
|
134
|
+
result.push({ label, idx: i });
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
_theme = __runInitializers(this, _filter_extraInitializers);
|
|
139
|
+
constructor(options) {
|
|
140
|
+
super();
|
|
141
|
+
this.id = options.id ?? `dropdown-${Math.random().toString(36).slice(2, 8)}`;
|
|
142
|
+
this.options = [...options.options];
|
|
143
|
+
this.selectedIndex = options.selectedIndex ?? 0;
|
|
144
|
+
this.highlightedIndex = this.selectedIndex;
|
|
145
|
+
this.disabled = options.disabled ?? false;
|
|
146
|
+
this._theme = options.theme ?? DEFAULT_TERMINAL_THEME;
|
|
147
|
+
}
|
|
148
|
+
setTheme(theme) { this._theme = theme; }
|
|
149
|
+
// --- Event handlers ---
|
|
150
|
+
handleKey(event) {
|
|
151
|
+
if (this.disabled)
|
|
152
|
+
return;
|
|
153
|
+
const isPrintable = event.character.length === 1 &&
|
|
154
|
+
!event.ctrl &&
|
|
155
|
+
!event.meta &&
|
|
156
|
+
event.character >= " " &&
|
|
157
|
+
event.character !== "\x7f";
|
|
158
|
+
if (!this.expanded) {
|
|
159
|
+
// enter/space remain the explicit "open with selection seeded" gesture.
|
|
160
|
+
if (event.key === "enter" || event.key === "space") {
|
|
161
|
+
this.expanded = true;
|
|
162
|
+
this.highlightedIndex = this.selectedIndex;
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// Any other printable char auto-expands and starts filtering.
|
|
166
|
+
if (isPrintable) {
|
|
167
|
+
this.expanded = true;
|
|
168
|
+
this.filter = this.filter + event.character;
|
|
169
|
+
this.highlightedIndex = 0;
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// expanded
|
|
174
|
+
switch (event.key) {
|
|
175
|
+
case "up":
|
|
176
|
+
this.highlightedIndex = Math.max(0, this.highlightedIndex - 1);
|
|
177
|
+
return;
|
|
178
|
+
case "down": {
|
|
179
|
+
const max = Math.max(0, this.filteredOptions.length - 1);
|
|
180
|
+
this.highlightedIndex = Math.min(max, this.highlightedIndex + 1);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
case "enter": {
|
|
184
|
+
// [LAW:one-source-of-truth] Map filtered position → canonical idx.
|
|
185
|
+
// No-op when filteredOptions is empty (highlighted is undefined).
|
|
186
|
+
const picked = this.filteredOptions[this.highlightedIndex];
|
|
187
|
+
if (picked === undefined)
|
|
188
|
+
return;
|
|
189
|
+
this.selectedIndex = picked.idx;
|
|
190
|
+
this.filter = "";
|
|
191
|
+
this.expanded = false;
|
|
192
|
+
this.emitChange();
|
|
193
|
+
this.emitSubmit();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
case "escape":
|
|
197
|
+
// Single-step: clear filter + collapse.
|
|
198
|
+
this.filter = "";
|
|
199
|
+
this.expanded = false;
|
|
200
|
+
return;
|
|
201
|
+
case "backspace":
|
|
202
|
+
// [LAW:dataflow-not-control-flow] slice(0,-1) on "" is "" — no guard.
|
|
203
|
+
this.filter = this.filter.slice(0, -1);
|
|
204
|
+
this.highlightedIndex = 0;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (isPrintable) {
|
|
208
|
+
this.filter = this.filter + event.character;
|
|
209
|
+
this.highlightedIndex = 0;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
handleMouse(event) {
|
|
213
|
+
if (this.disabled)
|
|
214
|
+
return;
|
|
215
|
+
if (event.type !== "mouse_up")
|
|
216
|
+
return;
|
|
217
|
+
const b = this.bounds;
|
|
218
|
+
if (!b)
|
|
219
|
+
return;
|
|
220
|
+
const inside = event.x >= b.x &&
|
|
221
|
+
event.x < b.x + b.width &&
|
|
222
|
+
event.y >= b.y &&
|
|
223
|
+
event.y < b.y + b.height;
|
|
224
|
+
if (!this.expanded) {
|
|
225
|
+
if (inside) {
|
|
226
|
+
this.expanded = true;
|
|
227
|
+
this.highlightedIndex = this.selectedIndex;
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// expanded: row 0 is the header; rows 1..M are filtered options.
|
|
232
|
+
if (!inside) {
|
|
233
|
+
// Click outside cancels — clear filter + collapse.
|
|
234
|
+
this.filter = "";
|
|
235
|
+
this.expanded = false;
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const rowOffset = event.y - b.y;
|
|
239
|
+
if (rowOffset === 0) {
|
|
240
|
+
// Click the header → collapse + clear filter, no selection change.
|
|
241
|
+
this.filter = "";
|
|
242
|
+
this.expanded = false;
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// [LAW:one-source-of-truth] Filtered position → canonical idx.
|
|
246
|
+
const picked = this.filteredOptions[rowOffset - 1];
|
|
247
|
+
if (picked === undefined)
|
|
248
|
+
return;
|
|
249
|
+
this.selectedIndex = picked.idx;
|
|
250
|
+
this.filter = "";
|
|
251
|
+
this.expanded = false;
|
|
252
|
+
this.emitChange();
|
|
253
|
+
this.emitSubmit();
|
|
254
|
+
}
|
|
255
|
+
// --- Hover mutator (router fast-path) ---
|
|
256
|
+
setHovered(value) { this.hovered = value; }
|
|
257
|
+
// --- Rendering ---
|
|
258
|
+
render(options) {
|
|
259
|
+
// Header only — the inline footprint that flow layout sees. Always
|
|
260
|
+
// 1 row regardless of `expanded`/`filter`. Option rows live in
|
|
261
|
+
// renderOverlay. Width invariant: maxLabelLen + 4.
|
|
262
|
+
const arrowChar = options.asciiOnly ? "v" : "▾";
|
|
263
|
+
const maxLabelLen = this.maxLabelLen();
|
|
264
|
+
const baseStyle = this.disabled
|
|
265
|
+
? new Style({ color: "#666666", bgcolor: "#333333", dim: true })
|
|
266
|
+
: new Style({
|
|
267
|
+
color: this.resolvePalette("foreground"),
|
|
268
|
+
bgcolor: this.resolvePalette("surface"),
|
|
269
|
+
underline: this.focused,
|
|
270
|
+
});
|
|
271
|
+
const headerLabel = this.headerText(maxLabelLen);
|
|
272
|
+
return [
|
|
273
|
+
new Segment("[", baseStyle),
|
|
274
|
+
new Segment(`${headerLabel} ${arrowChar}`, baseStyle),
|
|
275
|
+
new Segment("]", baseStyle),
|
|
276
|
+
];
|
|
277
|
+
}
|
|
278
|
+
// [LAW:dataflow-not-control-flow] One header text function; the data
|
|
279
|
+
// (filter empty vs not) chooses between selected-label and query+cursor.
|
|
280
|
+
// Both branches yield exactly maxLabelLen cells — width invariant.
|
|
281
|
+
headerText(maxLabelLen) {
|
|
282
|
+
if (this.filter === "") {
|
|
283
|
+
return (this.options[this.selectedIndex] ?? "").padEnd(maxLabelLen, " ");
|
|
284
|
+
}
|
|
285
|
+
const cursor = this.focused ? "│" : "";
|
|
286
|
+
const filterRoom = Math.max(0, maxLabelLen - cursor.length);
|
|
287
|
+
const filterText = this.filter.slice(0, filterRoom);
|
|
288
|
+
return (filterText + cursor).padEnd(maxLabelLen, " ");
|
|
289
|
+
}
|
|
290
|
+
renderOverlay(_options) {
|
|
291
|
+
if (!this.expanded)
|
|
292
|
+
return null;
|
|
293
|
+
const maxLabelLen = this.maxLabelLen();
|
|
294
|
+
const fopts = this.filteredOptions;
|
|
295
|
+
if (fopts.length === 0)
|
|
296
|
+
return this.renderNoMatchRow(maxLabelLen);
|
|
297
|
+
const segments = [];
|
|
298
|
+
for (let i = 0; i < fopts.length; i++) {
|
|
299
|
+
if (i > 0)
|
|
300
|
+
segments.push(new Segment("\n"));
|
|
301
|
+
segments.push(...this.renderOptionRow(fopts[i], i, maxLabelLen));
|
|
302
|
+
}
|
|
303
|
+
return segments;
|
|
304
|
+
}
|
|
305
|
+
renderNoMatchRow(maxLabelLen) {
|
|
306
|
+
// Right-clipped + padded so width matches a normal option row.
|
|
307
|
+
const text = "(no matches)".slice(0, maxLabelLen).padEnd(maxLabelLen, " ");
|
|
308
|
+
const inner = ` ${text} `;
|
|
309
|
+
const style = this.disabled
|
|
310
|
+
? new Style({ color: "#666666", bgcolor: "#333333", dim: true })
|
|
311
|
+
: new Style({
|
|
312
|
+
color: this.resolvePalette("foreground"),
|
|
313
|
+
bgcolor: this.resolvePalette("surface"),
|
|
314
|
+
dim: true,
|
|
315
|
+
});
|
|
316
|
+
return [
|
|
317
|
+
new Segment("[", style),
|
|
318
|
+
new Segment(inner, style),
|
|
319
|
+
new Segment("]", style),
|
|
320
|
+
];
|
|
321
|
+
}
|
|
322
|
+
renderOptionRow(entry, fpos, maxLabelLen) {
|
|
323
|
+
// Row: "[ " + label.padEnd(maxLabelLen) + " ]"
|
|
324
|
+
// Width = 1 + 1 + maxLabelLen + 1 + 1 = maxLabelLen + 4.
|
|
325
|
+
const label = entry.label.padEnd(maxLabelLen, " ");
|
|
326
|
+
const inner = ` ${label} `;
|
|
327
|
+
const isSelected = entry.idx === this.selectedIndex;
|
|
328
|
+
const isHighlighted = fpos === this.highlightedIndex;
|
|
329
|
+
// Highlighted: muted bg → text-primary (mostly-accent fg) is readable.
|
|
330
|
+
// Selected: full primary bg → on-primary (WCAG contrast) for fg.
|
|
331
|
+
const rowStyle = this.disabled
|
|
332
|
+
? new Style({ color: "#666666", bgcolor: "#333333", dim: true })
|
|
333
|
+
: isHighlighted
|
|
334
|
+
? new Style({
|
|
335
|
+
color: this.resolvePalette("text-primary"),
|
|
336
|
+
bgcolor: this.resolvePalette("primary-muted"),
|
|
337
|
+
})
|
|
338
|
+
: isSelected
|
|
339
|
+
? new Style({
|
|
340
|
+
color: this.resolvePalette("on-primary"),
|
|
341
|
+
bgcolor: this.resolvePalette("primary"),
|
|
342
|
+
})
|
|
343
|
+
: new Style({
|
|
344
|
+
color: this.resolvePalette("foreground"),
|
|
345
|
+
bgcolor: this.resolvePalette("surface"),
|
|
346
|
+
});
|
|
347
|
+
return [
|
|
348
|
+
new Segment("[", rowStyle),
|
|
349
|
+
new Segment(inner, rowStyle),
|
|
350
|
+
new Segment("]", rowStyle),
|
|
351
|
+
];
|
|
352
|
+
}
|
|
353
|
+
maxLabelLen() {
|
|
354
|
+
let m = 0;
|
|
355
|
+
for (const label of this.options)
|
|
356
|
+
if (label.length > m)
|
|
357
|
+
m = label.length;
|
|
358
|
+
return m;
|
|
359
|
+
}
|
|
360
|
+
measure(_options) {
|
|
361
|
+
const width = this.maxLabelLen() + 4;
|
|
362
|
+
return { minimum: width, maximum: width };
|
|
363
|
+
}
|
|
364
|
+
// --- Palette resolution ---
|
|
365
|
+
resolvePalette(key) {
|
|
366
|
+
const rgba = this._theme.palette.get(key);
|
|
367
|
+
// [LAW:no-defensive-null-guards] palette must contain all keys.
|
|
368
|
+
return ColorSpec.fromRgba(rgba);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
})();
|
|
372
|
+
export { Dropdown };
|
|
373
|
+
//# sourceMappingURL=dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../../src/widgets/dropdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;IAWjC,QAAQ;;sBAAS,UAAU;;;;;;;;;;;;;;;;;;;;iBAA3B,QAAS,SAAQ,WAAU;;;mCAIrC,CAAA,KAAA,UAAU,CAAA,CAAC,OAAO;yCAClB,UAAU;oCACV,UAAU;4CACV,UAAU;kCACV,UAAU;qCA+BV,MAAM;uCAmEN,MAAM;sCAgDN,MAAM;YAtJa,0KAAS,OAAO,6BAAP,OAAO,yFAAW;YACnC,4LAAS,aAAa,6BAAb,aAAa,qGAAS;YAC/B,6KAAS,QAAQ,6BAAR,QAAQ,2FAAkB;YACnC,qMAAS,gBAAgB,6BAAhB,gBAAgB,2GAAS;YAClC,uKAAS,MAAM,6BAAN,MAAM,uFAAc;YAgCzC,8KAAA,SAAS,6DAgER;YAGD,oLAAS,WAAW,6DA2CnB;YAKD,iLAAA,UAAU,6DAAgD;;;QA1JjD,EAAE,GADA,mDAAQ,CACC;QACX,SAAS,GAAG,IAAI,CAAC;QAEN,mFAA2B;QAA3B,IAAS,OAAO,6CAAW;QAA3B,IAAS,OAAO,mDAAW;QACnC,sJAA+B;QAA/B,IAAS,aAAa,mDAAS;QAA/B,IAAS,aAAa,yDAAS;QAC/B,yIAA6B,KAAK,GAAC;QAAnC,IAAS,QAAQ,8CAAkB;QAAnC,IAAS,QAAQ,oDAAkB;QACnC,6JAAkC;QAAlC,IAAS,gBAAgB,sDAAS;QAAlC,IAAS,gBAAgB,4DAAS;QAClC,wIAA0B,EAAE,GAAC;QAA7B,IAAS,MAAM,4CAAc;QAA7B,IAAS,MAAM,kDAAc;QAEzC,uEAAuE;QACvE,iEAAiE;QACjE,uBAAuB;QACvB,IAAI,eAAe;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,MAAM,GAAqC,EAAE,CAAC;YACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAEO,MAAM,sDAAgB;QAE9B,YAAY,OAAwB;YAClC,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;YAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,sBAAsB,CAAC;QACxD,CAAC;QAED,QAAQ,CAAC,KAAoB,IAAU,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAE7D,yBAAyB;QAGzB,SAAS,CAAC,KAAe;YACvB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAE1B,MAAM,WAAW,GACf,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC5B,CAAC,KAAK,CAAC,IAAI;gBACX,CAAC,KAAK,CAAC,IAAI;gBACX,KAAK,CAAC,SAAS,IAAI,GAAG;gBACtB,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC;YAE7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,wEAAwE;gBACxE,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oBACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBACD,8DAA8D;gBAC9D,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;oBAC5C,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBAC5B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,WAAW;YACX,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;gBAClB,KAAK,IAAI;oBACP,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;oBAC/D,OAAO;gBACT,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACzD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;oBACjE,OAAO;gBACT,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,mEAAmE;oBACnE,kEAAkE;oBAClE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBAC3D,IAAI,MAAM,KAAK,SAAS;wBAAE,OAAO;oBACjC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC;oBAChC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;oBACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;oBACtB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO;gBACT,CAAC;gBACD,KAAK,QAAQ;oBACX,wCAAwC;oBACxC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;oBACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;oBACtB,OAAO;gBACT,KAAK,WAAW;oBACd,sEAAsE;oBACtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;oBAC1B,OAAO;YACX,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAGQ,WAAW,CAAC,KAAuB;YAC1C,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;gBAAE,OAAO;YAEtC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACtB,IAAI,CAAC,CAAC;gBAAE,OAAO;YAEf,MAAM,MAAM,GACV,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACd,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK;gBACvB,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACd,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YAE3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC7C,CAAC;gBACD,OAAO;YACT,CAAC;YAED,iEAAiE;YACjE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,mDAAmD;gBACnD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,mEAAmE;gBACnE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,+DAA+D;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO;YACjC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAED,2CAA2C;QAG3C,UAAU,CAAC,KAAc,IAAU,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;QAE1D,oBAAoB;QAEpB,MAAM,CAAC,OAAsB;YAC3B,mEAAmE;YACnE,+DAA+D;YAC/D,mDAAmD;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ;gBAC7B,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChE,CAAC,CAAC,IAAI,KAAK,CAAC;oBACR,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;oBACxC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;oBACvC,SAAS,EAAE,IAAI,CAAC,OAAO;iBACxB,CAAC,CAAC;YAEP,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACjD,OAAO;gBACL,IAAI,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;gBAC3B,IAAI,OAAO,CAAC,GAAG,WAAW,IAAI,SAAS,EAAE,EAAE,SAAS,CAAC;gBACrD,IAAI,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;aAC5B,CAAC;QACJ,CAAC;QAED,qEAAqE;QACrE,yEAAyE;QACzE,mEAAmE;QAC3D,UAAU,CAAC,WAAmB;YACpC,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACpD,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QAED,aAAa,CAAC,QAAuB;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAElE,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAEO,gBAAgB,CAAC,WAAmB;YAC1C,+DAA+D;YAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC3E,MAAM,KAAK,GAAG,IAAI,IAAI,GAAG,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ;gBACzB,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChE,CAAC,CAAC,IAAI,KAAK,CAAC;oBACR,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;oBACxC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;oBACvC,GAAG,EAAE,IAAI;iBACV,CAAC,CAAC;YACP,OAAO;gBACL,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;gBACvB,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;gBACzB,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;aACxB,CAAC;QACJ,CAAC;QAEO,eAAe,CACrB,KAAqC,EACrC,IAAY,EACZ,WAAmB;YAEnB,+CAA+C;YAC/C,yDAAyD;YACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC;YAE3B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC;YACpD,MAAM,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC;YAErD,uEAAuE;YACvE,oEAAoE;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;gBAC5B,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChE,CAAC,CAAC,aAAa;oBACb,CAAC,CAAC,IAAI,KAAK,CAAC;wBACR,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;wBAC1C,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;qBAC9C,CAAC;oBACJ,CAAC,CAAC,UAAU;wBACV,CAAC,CAAC,IAAI,KAAK,CAAC;4BACR,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;4BACxC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;yBACxC,CAAC;wBACJ,CAAC,CAAC,IAAI,KAAK,CAAC;4BACR,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;4BACxC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;yBACxC,CAAC,CAAC;YAEX,OAAO;gBACL,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;gBAC1B,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAC5B,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;aAC3B,CAAC;QACJ,CAAC;QAEO,WAAW;YACjB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YACzE,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,QAAuB;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,6BAA6B;QAErB,cAAc,CAAC,GAAW;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,gEAAgE;YAChE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAK,CAAC,CAAC;QACnC,CAAC;;;SA3RU,QAAQ"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventRouter — parses raw stdin into KeyEvent / WidgetMouseEvent values
|
|
3
|
+
* and dispatches them to widgets via the Screen's FocusManager and bounds.
|
|
4
|
+
*
|
|
5
|
+
* [LAW:single-enforcer] ANSI escape parsing lives only here — widgets never
|
|
6
|
+
* see raw bytes. One parser, one dispatch surface.
|
|
7
|
+
*
|
|
8
|
+
* [LAW:dataflow-not-control-flow] The same parse pipeline runs for every
|
|
9
|
+
* input chunk: append → consume one event at a time until the buffer can't
|
|
10
|
+
* yield more. The byte's value, not a side-mode, decides which event is
|
|
11
|
+
* emitted. There is no "are we mid-sequence" mode flag — the buffer head
|
|
12
|
+
* carries all the state we need.
|
|
13
|
+
*
|
|
14
|
+
* Lone-ESC handling: a bare `\x1b` is ambiguous (escape key vs. start of a
|
|
15
|
+
* CSI sequence). When the buffer is drained but ends with a lone ESC, the
|
|
16
|
+
* router defers emission via setImmediate. The next chunk cancels the timer
|
|
17
|
+
* if it extends the sequence. Tests can call `flush()` to drain synchronously.
|
|
18
|
+
*/
|
|
19
|
+
import type { Screen, FocusManager, InteractiveWidget, KeyEvent, WidgetMouseEvent, Unsubscribe } from "./types.js";
|
|
20
|
+
type WidgetSource = {
|
|
21
|
+
focusManager: FocusManager;
|
|
22
|
+
getWidgets: () => readonly InteractiveWidget[];
|
|
23
|
+
};
|
|
24
|
+
export interface EventRouterOptions {
|
|
25
|
+
screen: Screen | WidgetSource;
|
|
26
|
+
input?: NodeJS.ReadableStream & {
|
|
27
|
+
setRawMode?: (raw: boolean) => unknown;
|
|
28
|
+
isTTY?: boolean;
|
|
29
|
+
};
|
|
30
|
+
output?: NodeJS.WritableStream;
|
|
31
|
+
/**
|
|
32
|
+
* When true (default when output is a TTY), enable mouse tracking on
|
|
33
|
+
* start() and disable on stop(). Disable in tests / non-TTY environments.
|
|
34
|
+
*/
|
|
35
|
+
manageMouse?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* When true (default when input is a TTY), put stdin into raw mode on
|
|
38
|
+
* start() and restore on stop().
|
|
39
|
+
*/
|
|
40
|
+
manageRawMode?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare class EventRouter {
|
|
43
|
+
private readonly source;
|
|
44
|
+
private readonly input;
|
|
45
|
+
private readonly output;
|
|
46
|
+
private readonly manageMouse;
|
|
47
|
+
private readonly manageRawMode;
|
|
48
|
+
private buffer;
|
|
49
|
+
private running;
|
|
50
|
+
private dataListener;
|
|
51
|
+
private escTimer;
|
|
52
|
+
private readonly keyHandlers;
|
|
53
|
+
private readonly mouseHandlers;
|
|
54
|
+
constructor(options: EventRouterOptions);
|
|
55
|
+
start(): void;
|
|
56
|
+
stop(): void;
|
|
57
|
+
onKey(handler: (event: KeyEvent) => void): Unsubscribe;
|
|
58
|
+
onMouse(handler: (event: WidgetMouseEvent) => void): Unsubscribe;
|
|
59
|
+
/** Feed a chunk of bytes (or a string of bytes) into the parser. */
|
|
60
|
+
feed(chunk: Buffer | string): void;
|
|
61
|
+
/** Force any pending lone ESC out of the buffer. */
|
|
62
|
+
flush(): void;
|
|
63
|
+
private drain;
|
|
64
|
+
private consumeOne;
|
|
65
|
+
private consumePrintable;
|
|
66
|
+
private consumeEscape;
|
|
67
|
+
private consumeSS3;
|
|
68
|
+
private consumeCSI;
|
|
69
|
+
private dispatchKey;
|
|
70
|
+
private dispatchMouse;
|
|
71
|
+
}
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=event-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-router.d.ts","sourceRoot":"","sources":["../../src/widgets/event-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,GAAG;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG;QAC9B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;QACvC,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA+ED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IAExC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAiD;IACrE,OAAO,CAAC,QAAQ,CAA8C;IAE9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IACpE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgD;gBAElE,OAAO,EAAE,kBAAkB;IAiBvC,KAAK,IAAI,IAAI;IAsBb,IAAI,IAAI,IAAI;IAqBZ,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,WAAW;IAKtD,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,WAAW;IAOhE,oEAAoE;IACpE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkBlC,oDAAoD;IACpD,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,UAAU;IA6ClB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,UAAU;IAuDlB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;CAyBtB"}
|