@suds-cli/textinput 0.0.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 ADDED
@@ -0,0 +1,85 @@
1
+ # @suds-cli/textinput
2
+
3
+ Single-line text input component for Suds terminal UIs. Port of Charmbracelet Bubbles textinput.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @suds-cli/textinput
9
+ ```
10
+
11
+ ## Quickstart
12
+
13
+ ```ts
14
+ import { TextInputModel, EchoMode } from "@suds-cli/textinput";
15
+ import type { Cmd, Msg } from "@suds-cli/tea";
16
+
17
+ let input = TextInputModel.new({
18
+ placeholder: "Type your name…",
19
+ width: 40,
20
+ echoMode: EchoMode.Normal,
21
+ });
22
+
23
+ function init(): Cmd<Msg> {
24
+ const [focused, cmd] = input.focus();
25
+ input = focused;
26
+ return cmd;
27
+ }
28
+
29
+ function update(msg: Msg): [typeof model, Cmd<Msg>] {
30
+ const [nextInput, cmd] = input.update(msg);
31
+ input = nextInput;
32
+ return [model, cmd];
33
+ }
34
+
35
+ function view(): string {
36
+ return [
37
+ "Name:",
38
+ input.view(),
39
+ ].join("\n");
40
+ }
41
+ ```
42
+
43
+ ## Features
44
+
45
+ - Grapheme-aware cursor movement and editing
46
+ - Placeholder text when empty
47
+ - Password/hidden echo modes and custom echo character
48
+ - Character limit enforcement
49
+ - Width-constrained rendering with horizontal scrolling
50
+ - Clipboard paste (uses `clipboardy`)
51
+ - Validation callback
52
+
53
+ ## Key bindings (defaults)
54
+
55
+ - Move: `left/right`, `ctrl+b/ctrl+f`
56
+ - Word move: `alt+left/right`, `ctrl+left/right`, `alt+b/alt+f`
57
+ - Delete char: `backspace`, `delete`, `ctrl+h`, `ctrl+d`
58
+ - Delete word: `alt+backspace`, `alt+delete`, `ctrl+w`, `alt+d`
59
+ - Delete to start/end: `ctrl+u`, `ctrl+k`
60
+ - Home/end: `home`, `end`, `ctrl+a`, `ctrl+e`
61
+ - Paste: `ctrl+v`
62
+
63
+ ## API
64
+
65
+ - `TextInputModel.new(options)` – create a model
66
+ - `model.focus()/blur()` – toggle focus (returns new model, plus optional command)
67
+ - `model.update(msg)` – handle Tea messages, returns `[model, cmd]`
68
+ - `model.view()` – render with prompt and cursor
69
+ - Editing helpers: `insertRunes`, `deleteLeft/Right`, `wordLeft/Right`, `deleteWordLeft/Right`, `deleteToStart/End`, `reset`
70
+ - Validation: `setValidateFunc(fn)`, `validate()`
71
+ - Clipboard: `paste()` (returns `[model, cmd]`) or use `pasteCommand`
72
+
73
+ ## Scripts
74
+
75
+ - `pnpm -C packages/textinput build`
76
+ - `pnpm -C packages/textinput test`
77
+ - `pnpm -C packages/textinput lint`
78
+ - `pnpm -C packages/textinput generate:api-report`
79
+
80
+ ## License
81
+
82
+ MIT
83
+
84
+
85
+
@@ -0,0 +1,4 @@
1
+ export { TextInputModel, } from "./model.js";
2
+ export { EchoMode, CursorMode, type TextInputOptions, type KeyMap, type ValidateFunc, defaultKeyMap, } from "./types.js";
3
+ export { PasteMsg, PasteErrorMsg, pasteCommand } from "./messages.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { TextInputModel, } from "./model.js";
2
+ export { EchoMode, CursorMode, defaultKeyMap, } from "./types.js";
3
+ export { PasteMsg, PasteErrorMsg, pasteCommand } from "./messages.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,QAAQ,EACR,UAAU,EAIV,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Cmd, Msg } from "@suds-cli/tea";
2
+ /**
3
+ * Clipboard paste content.
4
+ * @public
5
+ */
6
+ export declare class PasteMsg implements Msg {
7
+ readonly text: string;
8
+ readonly _tag = "textinput/paste";
9
+ constructor(text: string);
10
+ }
11
+ /**
12
+ * Clipboard read failed.
13
+ * @public
14
+ */
15
+ export declare class PasteErrorMsg implements Msg {
16
+ readonly error: unknown;
17
+ readonly _tag = "textinput/paste-error";
18
+ constructor(error: unknown);
19
+ }
20
+ /**
21
+ * Command to read from the system clipboard.
22
+ * Resolves to a PasteMsg on success or PasteErrorMsg on failure.
23
+ * @public
24
+ */
25
+ export declare function pasteCommand(): Cmd<PasteMsg | PasteErrorMsg>;
26
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAE9C;;;GAGG;AACH,qBAAa,QAAS,YAAW,GAAG;aAEN,IAAI,EAAE,MAAM;IADxC,QAAQ,CAAC,IAAI,qBAAqB;gBACN,IAAI,EAAE,MAAM;CACzC;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,GAAG;aAEX,KAAK,EAAE,OAAO;IAD1C,QAAQ,CAAC,IAAI,2BAA2B;gBACZ,KAAK,EAAE,OAAO;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC,CAS5D"}
@@ -0,0 +1,40 @@
1
+ import clipboard from "clipboardy";
2
+ /**
3
+ * Clipboard paste content.
4
+ * @public
5
+ */
6
+ export class PasteMsg {
7
+ text;
8
+ _tag = "textinput/paste";
9
+ constructor(text) {
10
+ this.text = text;
11
+ }
12
+ }
13
+ /**
14
+ * Clipboard read failed.
15
+ * @public
16
+ */
17
+ export class PasteErrorMsg {
18
+ error;
19
+ _tag = "textinput/paste-error";
20
+ constructor(error) {
21
+ this.error = error;
22
+ }
23
+ }
24
+ /**
25
+ * Command to read from the system clipboard.
26
+ * Resolves to a PasteMsg on success or PasteErrorMsg on failure.
27
+ * @public
28
+ */
29
+ export function pasteCommand() {
30
+ return async () => {
31
+ try {
32
+ const text = await clipboard.read();
33
+ return new PasteMsg(text ?? "");
34
+ }
35
+ catch (error) {
36
+ return new PasteErrorMsg(error);
37
+ }
38
+ };
39
+ }
40
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC;;;GAGG;AACH,MAAM,OAAO,QAAQ;IAES;IADnB,IAAI,GAAG,iBAAiB,CAAC;IAClC,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IAEI;IADnB,IAAI,GAAG,uBAAuB,CAAC;IACxC,YAA4B,KAAc;QAAd,UAAK,GAAL,KAAK,CAAS;IAAG,CAAC;CAC/C;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { Style } from "@suds-cli/chapstick";
2
+ import { CursorModel } from "@suds-cli/cursor";
3
+ import { type Cmd, type Msg } from "@suds-cli/tea";
4
+ import { EchoMode, type KeyMap, type TextInputOptions, type ValidateFunc } from "./types.js";
5
+ /**
6
+ * Single-line text input model with cursor control and clipboard support.
7
+ * @public
8
+ */
9
+ export declare class TextInputModel {
10
+ #private;
11
+ readonly value: string;
12
+ readonly position: number;
13
+ readonly focused: boolean;
14
+ readonly placeholder: string;
15
+ readonly echoMode: EchoMode;
16
+ readonly echoCharacter: string;
17
+ readonly charLimit: number;
18
+ readonly width: number;
19
+ readonly prompt: string;
20
+ readonly promptStyle: Style;
21
+ readonly textStyle: Style;
22
+ readonly placeholderStyle: Style;
23
+ readonly cursorStyle: Style;
24
+ readonly validateFn?: ValidateFunc;
25
+ readonly keyMap: KeyMap;
26
+ readonly cursor: CursorModel;
27
+ readonly error: Error | null;
28
+ private constructor();
29
+ /** Create a new text input model. */
30
+ static new(options?: TextInputOptions): TextInputModel;
31
+ /** Initial command (none needed by default). */
32
+ init(): Cmd<Msg>;
33
+ /** Current value. */
34
+ valueOf(): string;
35
+ /** Length in graphemes. */
36
+ length(): number;
37
+ /** True if no content. */
38
+ isEmpty(): boolean;
39
+ /** Cursor position in graphemes. */
40
+ cursorPosition(): number;
41
+ /** Focus the input (shows cursor, enables key handling). */
42
+ focus(): [TextInputModel, Cmd<Msg>];
43
+ /** Blur the input (hides cursor, ignores key handling). */
44
+ blur(): TextInputModel;
45
+ /** Move cursor to start. */
46
+ cursorStart(): TextInputModel;
47
+ /** Move cursor to end. */
48
+ cursorEnd(): TextInputModel;
49
+ /** Move cursor left by n (default 1). */
50
+ cursorLeft(n?: number): TextInputModel;
51
+ /** Move cursor right by n (default 1). */
52
+ cursorRight(n?: number): TextInputModel;
53
+ /** Move cursor one word to the left. */
54
+ wordLeft(): TextInputModel;
55
+ /** Move cursor one word to the right. */
56
+ wordRight(): TextInputModel;
57
+ /** Insert runes at the cursor position. */
58
+ insertRunes(runes: string): TextInputModel;
59
+ /** Delete up to n runes to the left of the cursor. */
60
+ deleteLeft(n?: number): TextInputModel;
61
+ /** Delete up to n runes to the right of the cursor. */
62
+ deleteRight(n?: number): TextInputModel;
63
+ /** Delete the word to the left of the cursor. */
64
+ deleteWordLeft(): TextInputModel;
65
+ /** Delete the word to the right of the cursor. */
66
+ deleteWordRight(): TextInputModel;
67
+ /** Delete everything before the cursor. */
68
+ deleteToStart(): TextInputModel;
69
+ /** Delete everything after the cursor. */
70
+ deleteToEnd(): TextInputModel;
71
+ /** Reset to empty value and cursor at start. */
72
+ reset(): TextInputModel;
73
+ /** Replace the value and re-run validation. */
74
+ setValue(value: string): TextInputModel;
75
+ /** Run validation and return the error (if any). */
76
+ validate(): Error | null;
77
+ /** Set a new validation function (re-validates current value). */
78
+ setValidateFunc(fn: ValidateFunc): TextInputModel;
79
+ /** Command to paste from the clipboard. */
80
+ paste(): [TextInputModel, Cmd<Msg>];
81
+ /** Handle Tea messages (keys, cursor, paste). */
82
+ update(msg: Msg): [TextInputModel, Cmd<Msg>];
83
+ /** Render the input with prompt, text, and cursor. */
84
+ view(): string;
85
+ }
86
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1,619 @@
1
+ var _a;
2
+ import { Style, width as stringWidth, clampWidth } from "@suds-cli/chapstick";
3
+ import { CursorModel, CursorMode } from "@suds-cli/cursor";
4
+ import { matches } from "@suds-cli/key";
5
+ import { batch, KeyMsg, KeyType } from "@suds-cli/tea";
6
+ import { newSanitizer } from "@suds-cli/runeutil";
7
+ import GraphemeSplitter from "grapheme-splitter";
8
+ import { PasteErrorMsg, PasteMsg, pasteCommand } from "./messages.js";
9
+ import { EchoMode, defaultKeyMap, } from "./types.js";
10
+ const splitter = new GraphemeSplitter();
11
+ const sanitizer = newSanitizer({ replaceNewLine: " ", replaceTab: " " });
12
+ /**
13
+ * Single-line text input model with cursor control and clipboard support.
14
+ * @public
15
+ */
16
+ export class TextInputModel {
17
+ value;
18
+ position;
19
+ focused;
20
+ placeholder;
21
+ echoMode;
22
+ echoCharacter;
23
+ charLimit;
24
+ width;
25
+ prompt;
26
+ promptStyle;
27
+ textStyle;
28
+ placeholderStyle;
29
+ cursorStyle;
30
+ validateFn;
31
+ keyMap;
32
+ cursor;
33
+ error;
34
+ constructor(state) {
35
+ this.value = state.value;
36
+ this.position = state.position;
37
+ this.focused = state.focused;
38
+ this.placeholder = state.placeholder;
39
+ this.echoMode = state.echoMode;
40
+ this.echoCharacter = state.echoCharacter;
41
+ this.charLimit = state.charLimit;
42
+ this.width = state.width;
43
+ this.prompt = state.prompt;
44
+ this.promptStyle = state.promptStyle;
45
+ this.textStyle = state.textStyle;
46
+ this.placeholderStyle = state.placeholderStyle;
47
+ this.cursorStyle = state.cursorStyle;
48
+ this.validateFn = state.validateFn;
49
+ this.keyMap = state.keyMap;
50
+ this.cursor = state.cursor;
51
+ this.error = state.error;
52
+ }
53
+ /** Create a new text input model. */
54
+ static new(options = {}) {
55
+ const sanitized = clampToLimit(sanitizeValue(options.value ?? ""), options.charLimit ?? 0);
56
+ const baseTextStyle = options.textStyle ?? new Style();
57
+ const cursorMode = options.cursorMode ?? CursorMode.Blink;
58
+ const cursor = new CursorModel({
59
+ style: options.cursorStyle ?? new Style(),
60
+ textStyle: baseTextStyle,
61
+ mode: cursorMode,
62
+ focused: false,
63
+ char: " ",
64
+ });
65
+ const model = new _a({
66
+ value: sanitized,
67
+ position: runeCount(sanitized),
68
+ focused: false,
69
+ placeholder: options.placeholder ?? "",
70
+ echoMode: options.echoMode ?? EchoMode.Normal,
71
+ echoCharacter: options.echoCharacter ?? "•",
72
+ charLimit: options.charLimit ?? 0,
73
+ width: options.width ?? 0,
74
+ prompt: options.prompt ?? "> ",
75
+ promptStyle: options.promptStyle ?? new Style(),
76
+ textStyle: baseTextStyle,
77
+ placeholderStyle: options.placeholderStyle ?? new Style(),
78
+ cursorStyle: options.cursorStyle ?? new Style(),
79
+ validateFn: options.validate,
80
+ keyMap: options.keyMap ?? defaultKeyMap,
81
+ cursor,
82
+ error: null,
83
+ });
84
+ return model.#withError(model.#runValidation(sanitized));
85
+ }
86
+ /** Initial command (none needed by default). */
87
+ init() {
88
+ return null;
89
+ }
90
+ /** Current value. */
91
+ valueOf() {
92
+ return this.value;
93
+ }
94
+ /** Length in graphemes. */
95
+ length() {
96
+ return runeCount(this.value);
97
+ }
98
+ /** True if no content. */
99
+ isEmpty() {
100
+ return this.length() === 0;
101
+ }
102
+ /** Cursor position in graphemes. */
103
+ cursorPosition() {
104
+ return this.position;
105
+ }
106
+ /** Focus the input (shows cursor, enables key handling). */
107
+ focus() {
108
+ if (this.focused) {
109
+ return [this, null];
110
+ }
111
+ const [cursor, cmd] = this.cursor.focus();
112
+ const next = this.#with({ focused: true, cursor });
113
+ return [next, cmd];
114
+ }
115
+ /** Blur the input (hides cursor, ignores key handling). */
116
+ blur() {
117
+ if (!this.focused) {
118
+ return this;
119
+ }
120
+ return this.#with({ focused: false, cursor: this.cursor.blur() });
121
+ }
122
+ /** Move cursor to start. */
123
+ cursorStart() {
124
+ return this.#withPosition(0);
125
+ }
126
+ /** Move cursor to end. */
127
+ cursorEnd() {
128
+ return this.#withPosition(this.length());
129
+ }
130
+ /** Move cursor left by n (default 1). */
131
+ cursorLeft(n = 1) {
132
+ return this.#withPosition(Math.max(0, this.position - Math.max(1, n)));
133
+ }
134
+ /** Move cursor right by n (default 1). */
135
+ cursorRight(n = 1) {
136
+ return this.#withPosition(Math.min(this.length(), this.position + Math.max(1, n)));
137
+ }
138
+ /** Move cursor one word to the left. */
139
+ wordLeft() {
140
+ if (this.position === 0 || this.isEmpty()) {
141
+ return this;
142
+ }
143
+ if (this.echoMode !== EchoMode.Normal) {
144
+ return this.cursorStart();
145
+ }
146
+ const graphemes = splitGraphemes(this.value);
147
+ let i = this.position - 1;
148
+ while (i >= 0) {
149
+ const g = graphemes[i];
150
+ if (g && isWhitespace(g)) {
151
+ i--;
152
+ continue;
153
+ }
154
+ break;
155
+ }
156
+ while (i >= 0) {
157
+ const g = graphemes[i];
158
+ if (g && !isWhitespace(g)) {
159
+ i--;
160
+ continue;
161
+ }
162
+ break;
163
+ }
164
+ return this.#withPosition(Math.max(0, i + 1));
165
+ }
166
+ /** Move cursor one word to the right. */
167
+ wordRight() {
168
+ if (this.position >= this.length() || this.isEmpty()) {
169
+ return this;
170
+ }
171
+ if (this.echoMode !== EchoMode.Normal) {
172
+ return this.cursorEnd();
173
+ }
174
+ const graphemes = splitGraphemes(this.value);
175
+ let i = this.position;
176
+ while (i < graphemes.length) {
177
+ const g = graphemes[i];
178
+ if (g && isWhitespace(g)) {
179
+ i++;
180
+ continue;
181
+ }
182
+ break;
183
+ }
184
+ while (i < graphemes.length) {
185
+ const g = graphemes[i];
186
+ if (g && !isWhitespace(g)) {
187
+ i++;
188
+ continue;
189
+ }
190
+ break;
191
+ }
192
+ return this.#withPosition(Math.min(this.length(), i));
193
+ }
194
+ /** Insert runes at the cursor position. */
195
+ insertRunes(runes) {
196
+ if (!runes) {
197
+ return this;
198
+ }
199
+ const sanitized = sanitizeValue(runes);
200
+ if (!sanitized) {
201
+ return this;
202
+ }
203
+ const before = sliceGraphemes(this.value, 0, this.position);
204
+ const after = sliceGraphemes(this.value, this.position);
205
+ const insertion = clampGraphemes(sanitized, this.#remainingCapacity(before + after));
206
+ const nextValue = before + insertion + after;
207
+ const nextPos = this.position + runeCount(insertion);
208
+ return this.#withValue(nextValue, nextPos);
209
+ }
210
+ /** Delete up to n runes to the left of the cursor. */
211
+ deleteLeft(n = 1) {
212
+ if (this.position === 0 || n <= 0) {
213
+ return this;
214
+ }
215
+ const remove = Math.min(n, this.position);
216
+ const before = sliceGraphemes(this.value, 0, this.position - remove);
217
+ const after = sliceGraphemes(this.value, this.position);
218
+ return this.#withValue(before + after, this.position - remove);
219
+ }
220
+ /** Delete up to n runes to the right of the cursor. */
221
+ deleteRight(n = 1) {
222
+ if (this.position >= this.length() || n <= 0) {
223
+ return this;
224
+ }
225
+ const before = sliceGraphemes(this.value, 0, this.position);
226
+ const after = sliceGraphemes(this.value, this.position + Math.max(1, n));
227
+ return this.#withValue(before + after, this.position);
228
+ }
229
+ /** Delete the word to the left of the cursor. */
230
+ deleteWordLeft() {
231
+ if (this.position === 0 || this.isEmpty()) {
232
+ return this;
233
+ }
234
+ if (this.echoMode !== EchoMode.Normal) {
235
+ return this.deleteToStart();
236
+ }
237
+ const graphemes = splitGraphemes(this.value);
238
+ let start = this.position;
239
+ // Walk left over whitespace
240
+ while (start > 0) {
241
+ const g = graphemes[start - 1];
242
+ if (g && isWhitespace(g)) {
243
+ start--;
244
+ continue;
245
+ }
246
+ break;
247
+ }
248
+ // Walk left over word
249
+ while (start > 0) {
250
+ const g = graphemes[start - 1];
251
+ if (g && !isWhitespace(g)) {
252
+ start--;
253
+ continue;
254
+ }
255
+ break;
256
+ }
257
+ const before = graphemes.slice(0, start).join("");
258
+ const after = graphemes.slice(this.position).join("");
259
+ return this.#withValue(before + after, start);
260
+ }
261
+ /** Delete the word to the right of the cursor. */
262
+ deleteWordRight() {
263
+ if (this.position >= this.length() || this.isEmpty()) {
264
+ return this;
265
+ }
266
+ if (this.echoMode !== EchoMode.Normal) {
267
+ return this.deleteToEnd();
268
+ }
269
+ const graphemes = splitGraphemes(this.value);
270
+ let end = this.position;
271
+ while (end < graphemes.length) {
272
+ const g = graphemes[end];
273
+ if (g && isWhitespace(g)) {
274
+ end++;
275
+ continue;
276
+ }
277
+ break;
278
+ }
279
+ while (end < graphemes.length) {
280
+ const g = graphemes[end];
281
+ if (g && !isWhitespace(g)) {
282
+ end++;
283
+ continue;
284
+ }
285
+ break;
286
+ }
287
+ const before = graphemes.slice(0, this.position).join("");
288
+ const after = graphemes.slice(end).join("");
289
+ return this.#withValue(before + after, this.position);
290
+ }
291
+ /** Delete everything before the cursor. */
292
+ deleteToStart() {
293
+ const after = sliceGraphemes(this.value, this.position);
294
+ return this.#withValue(after, 0);
295
+ }
296
+ /** Delete everything after the cursor. */
297
+ deleteToEnd() {
298
+ const before = sliceGraphemes(this.value, 0, this.position);
299
+ return this.#withValue(before, before.length === 0 ? 0 : runeCount(before));
300
+ }
301
+ /** Reset to empty value and cursor at start. */
302
+ reset() {
303
+ return this.#withValue("", 0);
304
+ }
305
+ /** Replace the value and re-run validation. */
306
+ setValue(value) {
307
+ const sanitized = clampToLimit(sanitizeValue(value), this.charLimit);
308
+ return this.#withValue(sanitized, Math.min(this.position, runeCount(sanitized)));
309
+ }
310
+ /** Run validation and return the error (if any). */
311
+ validate() {
312
+ return this.#runValidation(this.value);
313
+ }
314
+ /** Set a new validation function (re-validates current value). */
315
+ setValidateFunc(fn) {
316
+ const next = this.#with({ validateFn: fn });
317
+ return next.#withError(next.#runValidation(next.value));
318
+ }
319
+ /** Command to paste from the clipboard. */
320
+ paste() {
321
+ return [this, pasteCommand()];
322
+ }
323
+ /** Handle Tea messages (keys, cursor, paste). */
324
+ update(msg) {
325
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
326
+ let model = this;
327
+ const cmds = [];
328
+ if (msg instanceof KeyMsg) {
329
+ if (model.focused) {
330
+ const [nextModel, keyCmd] = model.#handleKey(msg);
331
+ model = nextModel;
332
+ if (keyCmd) {
333
+ cmds.push(keyCmd);
334
+ }
335
+ }
336
+ }
337
+ else if (msg instanceof PasteMsg) {
338
+ model = model.insertRunes(msg.text);
339
+ }
340
+ else if (msg instanceof PasteErrorMsg) {
341
+ model = model.#withError(asError(msg.error));
342
+ }
343
+ const [cursor, cursorCmd] = model.cursor.update(msg);
344
+ model = model.#with({ cursor });
345
+ if (cursorCmd) {
346
+ cmds.push(cursorCmd);
347
+ }
348
+ return [model, batch(...cmds)];
349
+ }
350
+ /** Render the input with prompt, text, and cursor. */
351
+ view() {
352
+ const promptRendered = this.promptStyle.inline(true).render(this.prompt);
353
+ const availableWidth = this.width > 0
354
+ ? Math.max(0, this.width - stringWidth(promptRendered))
355
+ : Number.POSITIVE_INFINITY;
356
+ if (this.isEmpty() && this.placeholder) {
357
+ const placeholder = this.#placeholderView(availableWidth);
358
+ return promptRendered + placeholder;
359
+ }
360
+ const rendered = this.#valueView(availableWidth);
361
+ return promptRendered + rendered;
362
+ }
363
+ #handleKey(msg) {
364
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
365
+ let next = this;
366
+ let cmd = null;
367
+ const keyMap = this.keyMap;
368
+ switch (true) {
369
+ case matches(msg, keyMap.deleteWordBackward):
370
+ next = next.deleteWordLeft();
371
+ break;
372
+ case matches(msg, keyMap.deleteCharacterBackward):
373
+ next = next.deleteLeft();
374
+ break;
375
+ case matches(msg, keyMap.wordBackward):
376
+ next = next.wordLeft();
377
+ break;
378
+ case matches(msg, keyMap.characterBackward):
379
+ next = next.cursorLeft();
380
+ break;
381
+ case matches(msg, keyMap.wordForward):
382
+ next = next.wordRight();
383
+ break;
384
+ case matches(msg, keyMap.characterForward):
385
+ next = next.cursorRight();
386
+ break;
387
+ case matches(msg, keyMap.lineStart):
388
+ next = next.cursorStart();
389
+ break;
390
+ case matches(msg, keyMap.deleteCharacterForward):
391
+ next = next.deleteRight();
392
+ break;
393
+ case matches(msg, keyMap.lineEnd):
394
+ next = next.cursorEnd();
395
+ break;
396
+ case matches(msg, keyMap.deleteAfterCursor):
397
+ next = next.deleteToEnd();
398
+ break;
399
+ case matches(msg, keyMap.deleteBeforeCursor):
400
+ next = next.deleteToStart();
401
+ break;
402
+ case matches(msg, keyMap.paste):
403
+ cmd = pasteCommand();
404
+ break;
405
+ case matches(msg, keyMap.deleteWordForward):
406
+ next = next.deleteWordRight();
407
+ break;
408
+ default:
409
+ if ((msg.key.type === KeyType.Runes || msg.key.type === KeyType.Space) &&
410
+ !msg.key.alt) {
411
+ next = next.insertRunes(msg.key.runes);
412
+ }
413
+ break;
414
+ }
415
+ return [next, cmd];
416
+ }
417
+ #placeholderView(availableWidth) {
418
+ const graphemes = splitGraphemes(this.placeholder);
419
+ const cursorChar = graphemes[0] ?? " ";
420
+ const rest = graphemes.slice(1).join("");
421
+ const budget = Number.isFinite(availableWidth)
422
+ ? Math.max(0, availableWidth - stringWidth(cursorChar))
423
+ : undefined;
424
+ const visibleRest = budget === undefined ? rest : clampWidth(rest, budget);
425
+ const cursorView = this.cursor.withChar(cursorChar || " ").view();
426
+ const styledRest = this.placeholderStyle.inline(true).render(visibleRest);
427
+ const usedWidth = stringWidth(cursorChar + visibleRest);
428
+ const padding = Number.isFinite(availableWidth) && availableWidth > 0
429
+ ? Math.max(0, availableWidth - usedWidth)
430
+ : 0;
431
+ return cursorView + styledRest + " ".repeat(padding);
432
+ }
433
+ #valueView(availableWidth) {
434
+ const graphemes = splitGraphemes(this.value);
435
+ const displayGraphemes = graphemes.map((g) => this.#echoTransform(g));
436
+ const widths = displayGraphemes.map((g) => stringWidth(g));
437
+ const [start, end] = visibleRange(widths, this.position, availableWidth);
438
+ const slice = displayGraphemes.slice(start, end);
439
+ const cursorOffset = clamp(this.position - start, 0, slice.length);
440
+ const before = slice.slice(0, cursorOffset).join("");
441
+ const after = cursorOffset < slice.length
442
+ ? slice.slice(cursorOffset + 1).join("")
443
+ : "";
444
+ const cursorChar = cursorOffset < slice.length
445
+ ? slice[cursorOffset] ?? " "
446
+ : " ";
447
+ const beforeStyled = this.textStyle.inline(true).render(before);
448
+ const afterStyled = this.textStyle.inline(true).render(after);
449
+ const cursorView = this.cursor.withChar(cursorChar || " ").view();
450
+ const usedWidth = stringWidth(before) +
451
+ stringWidth(cursorChar || " ") +
452
+ stringWidth(after);
453
+ const padding = Number.isFinite(availableWidth) && availableWidth > 0
454
+ ? Math.max(0, availableWidth - usedWidth)
455
+ : 0;
456
+ return beforeStyled + cursorView + afterStyled + " ".repeat(padding);
457
+ }
458
+ #echoTransform(s) {
459
+ switch (this.echoMode) {
460
+ case EchoMode.Password:
461
+ return this.echoCharacter.repeat(Math.max(0, runeCount(s)));
462
+ case EchoMode.None:
463
+ return "";
464
+ case EchoMode.Normal:
465
+ default:
466
+ return s;
467
+ }
468
+ }
469
+ #withPosition(position) {
470
+ const clamped = clamp(position, 0, this.length());
471
+ if (clamped === this.position) {
472
+ return this;
473
+ }
474
+ return this.#with({ position: clamped });
475
+ }
476
+ #withValue(value, position) {
477
+ const clamped = clampToLimit(value, this.charLimit);
478
+ const pos = clamp(position ?? this.position, 0, runeCount(clamped));
479
+ const next = this.#with({ value: clamped, position: pos });
480
+ return next.#withError(next.#runValidation(clamped));
481
+ }
482
+ #withError(error) {
483
+ if (error === this.error) {
484
+ return this;
485
+ }
486
+ return this.#with({ error });
487
+ }
488
+ #with(patch) {
489
+ return new _a({
490
+ value: this.value,
491
+ position: this.position,
492
+ focused: this.focused,
493
+ placeholder: this.placeholder,
494
+ echoMode: this.echoMode,
495
+ echoCharacter: this.echoCharacter,
496
+ charLimit: this.charLimit,
497
+ width: this.width,
498
+ prompt: this.prompt,
499
+ promptStyle: this.promptStyle,
500
+ textStyle: this.textStyle,
501
+ placeholderStyle: this.placeholderStyle,
502
+ cursorStyle: this.cursorStyle,
503
+ validateFn: this.validateFn,
504
+ keyMap: this.keyMap,
505
+ cursor: this.cursor,
506
+ error: this.error,
507
+ ...patch,
508
+ });
509
+ }
510
+ #runValidation(value) {
511
+ return this.validateFn ? this.validateFn(value) : null;
512
+ }
513
+ #remainingCapacity(current) {
514
+ if (this.charLimit <= 0) {
515
+ return Number.POSITIVE_INFINITY;
516
+ }
517
+ const remaining = this.charLimit - runeCount(current);
518
+ return Math.max(0, remaining);
519
+ }
520
+ }
521
+ _a = TextInputModel;
522
+ function sanitizeValue(value) {
523
+ return sanitizer.sanitize(value ?? "");
524
+ }
525
+ function clampToLimit(value, charLimit) {
526
+ if (charLimit <= 0) {
527
+ return value;
528
+ }
529
+ return clampGraphemes(value, charLimit);
530
+ }
531
+ function clampGraphemes(value, limit) {
532
+ if (limit <= 0) {
533
+ return "";
534
+ }
535
+ const graphemes = splitGraphemes(value);
536
+ if (graphemes.length <= limit) {
537
+ return graphemes.join("");
538
+ }
539
+ return graphemes.slice(0, limit).join("");
540
+ }
541
+ function splitGraphemes(value) {
542
+ return splitter.splitGraphemes(value ?? "");
543
+ }
544
+ function sliceGraphemes(value, start, end) {
545
+ const graphemes = splitGraphemes(value);
546
+ return graphemes.slice(start, end).join("");
547
+ }
548
+ function runeCount(value) {
549
+ return splitter.countGraphemes(value ?? "");
550
+ }
551
+ function clamp(value, min, max) {
552
+ const lower = Math.min(min, max);
553
+ const upper = Math.max(min, max);
554
+ return Math.min(upper, Math.max(lower, value));
555
+ }
556
+ function isWhitespace(grapheme) {
557
+ return /^\s+$/.test(grapheme);
558
+ }
559
+ function visibleRange(widths, position, maxWidth) {
560
+ const len = widths.length;
561
+ if (!Number.isFinite(maxWidth) || maxWidth <= 0) {
562
+ return [0, len];
563
+ }
564
+ if (len === 0) {
565
+ return [0, 0];
566
+ }
567
+ const widthAt = (i) => (i >= 0 && i < len ? widths[i] ?? 0 : 0);
568
+ const budget = maxWidth;
569
+ let start = Math.min(position, len);
570
+ let end = start;
571
+ let current = 0;
572
+ if (position < len) {
573
+ current = widthAt(position);
574
+ start = position;
575
+ end = position + 1;
576
+ }
577
+ else {
578
+ // Cursor is at the end - reserve 1 cell for the cursor space character
579
+ current = 1;
580
+ }
581
+ while (start > 0) {
582
+ const w = widthAt(start - 1);
583
+ if (current > 0 && current + w > budget) {
584
+ break;
585
+ }
586
+ start--;
587
+ current += w;
588
+ if (current >= budget) {
589
+ break;
590
+ }
591
+ }
592
+ while (end < len) {
593
+ const w = widthAt(end);
594
+ if (current > 0 && current + w > budget) {
595
+ break;
596
+ }
597
+ end++;
598
+ current += w;
599
+ if (current >= budget) {
600
+ break;
601
+ }
602
+ }
603
+ while (current > budget && start < end) {
604
+ current -= widthAt(start);
605
+ start++;
606
+ }
607
+ return [start, end];
608
+ }
609
+ function asError(err) {
610
+ if (err instanceof Error) {
611
+ return err;
612
+ }
613
+ if (typeof err === "string")
614
+ return new Error(err);
615
+ if (typeof err === "number" || typeof err === "boolean")
616
+ return new Error(String(err));
617
+ return new Error("clipboard error");
618
+ }
619
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,EAAsB,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,gBAAgB,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,QAAQ,EAIR,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;AACxC,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;AAsBzE;;;GAGG;AACH,MAAM,OAAO,cAAc;IAChB,KAAK,CAAS;IACd,QAAQ,CAAS;IACjB,OAAO,CAAU;IACjB,WAAW,CAAS;IACpB,QAAQ,CAAW;IACnB,aAAa,CAAS;IACtB,SAAS,CAAS;IAClB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,WAAW,CAAQ;IACnB,SAAS,CAAQ;IACjB,gBAAgB,CAAQ;IACxB,WAAW,CAAQ;IACnB,UAAU,CAAgB;IAC1B,MAAM,CAAS;IACf,MAAM,CAAc;IACpB,KAAK,CAAe;IAE7B,YAAoB,KAAqB;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,qCAAqC;IACrC,MAAM,CAAC,GAAG,CAAC,UAA4B,EAAE;QACvC,MAAM,SAAS,GAAG,YAAY,CAC5B,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAClC,OAAO,CAAC,SAAS,IAAI,CAAC,CACvB,CAAC;QACF,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,KAAK,EAAE;YACzC,SAAS,EAAE,aAAa;YACxB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,EAAc,CAAC;YAC/B,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC;YAC9B,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM;YAC7C,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG;YAC3C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;YACzB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,KAAK,EAAE;YAC/C,SAAS,EAAE,aAAa;YACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI,KAAK,EAAE;YACzD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,KAAK,EAAE;YAC/C,UAAU,EAAE,OAAO,CAAC,QAAQ;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,aAAa;YACvC,MAAM;YACN,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,gDAAgD;IAChD,IAAI;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,2BAA2B;IAC3B,MAAM;QACJ,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,0BAA0B;IAC1B,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,oCAAoC;IACpC,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,4DAA4D;IAC5D,KAAK;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,2DAA2D;IAC3D,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,4BAA4B;IAC5B,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,0BAA0B;IAC1B,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,yCAAyC;IACzC,UAAU,CAAC,CAAC,GAAG,CAAC;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,0CAA0C;IAC1C,WAAW,CAAC,CAAC,GAAG,CAAC;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,wCAAwC;IACxC,QAAQ;QACN,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,yCAAyC;IACzC,SAAS;QACP,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACtB,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,2CAA2C;IAC3C,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAErF,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,sDAAsD;IACtD,UAAU,CAAC,CAAC,GAAG,CAAC;QACd,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,uDAAuD;IACvD,WAAW,CAAC,CAAC,GAAG,CAAC;QACf,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,iDAAiD;IACjD,cAAc;QACZ,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,4BAA4B;QAC5B,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,KAAK,EAAE,CAAC;gBACR,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,sBAAsB;QACtB,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,KAAK,EAAE,CAAC;gBACR,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,kDAAkD;IAClD,eAAe;QACb,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,OAAO,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,2CAA2C;IAC3C,aAAa;QACX,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,0CAA0C;IAC1C,WAAW;QACT,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,+CAA+C;IAC/C,QAAQ,CAAC,KAAa;QACpB,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,oDAAoD;IACpD,QAAQ;QACN,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,kEAAkE;IAClE,eAAe,CAAC,EAAgB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,YAAY,EAAc,CAAC,CAAC;IAC5C,CAAC;IAED,iDAAiD;IACjD,MAAM,CAAC,GAAQ;QACb,4DAA4D;QAC5D,IAAI,KAAK,GAAmB,IAAI,CAAC;QACjC,MAAM,IAAI,GAAe,EAAE,CAAC;QAE5B,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAClD,KAAK,GAAG,SAAS,CAAC;gBAClB,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YACnC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACxC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAChC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,SAAqB,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,sDAAsD;IACtD,IAAI;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,cAAc,GAClB,IAAI,CAAC,KAAK,GAAG,CAAC;YACZ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;YACvD,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAE/B,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAC1D,OAAO,cAAc,GAAG,WAAW,CAAC;QACtC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACjD,OAAO,cAAc,GAAG,QAAQ,CAAC;IACnC,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,4DAA4D;QAC5D,IAAI,IAAI,GAAmB,IAAI,CAAC;QAChC,IAAI,GAAG,GAAoB,IAAI,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE3B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC;gBAC1C,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC7B,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,uBAAuB,CAAC;gBAC/C,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC;gBACpC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC;gBACzC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC;gBACnC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBACxC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC;gBACjC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,sBAAsB,CAAC;gBAC9C,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC;gBAC/B,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC;gBACzC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC;gBAC1C,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC5B,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;gBAC7B,GAAG,GAAG,YAAY,EAAc,CAAC;gBACjC,MAAM;YACR,KAAK,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC;gBACzC,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC9B,MAAM;YACR;gBACE,IACE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC;oBAClE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EACZ,CAAC;oBACD,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC;gBACD,MAAM;QACV,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,cAAsB;QACrC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QACvC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YACvD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,WAAW,GACf,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE1E,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;QACxD,MAAM,OAAO,GACX,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;QAER,OAAO,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,cAAsB;QAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,KAAK,GACT,YAAY,GAAG,KAAK,CAAC,MAAM;YACzB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,UAAU,GACd,YAAY,GAAG,KAAK,CAAC,MAAM;YACzB,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG;YAC5B,CAAC,CAAC,GAAG,CAAC;QAEV,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAElE,MAAM,SAAS,GACb,WAAW,CAAC,MAAM,CAAC;YACnB,WAAW,CAAC,UAAU,IAAI,GAAG,CAAC;YAC9B,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,OAAO,GACX,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;QAER,OAAO,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,cAAc,CAAC,CAAS;QACtB,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,QAAQ,CAAC,QAAQ;gBACpB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC,MAAM,CAAC;YACrB;gBACE,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,QAAiB;QACzC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,KAAmB;QAC5B,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAA8B;QAClC,OAAO,IAAI,EAAc,CAAC;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,KAAK;SACT,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAED,kBAAkB,CAAC,OAAe;QAChC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,iBAAiB,CAAC;QAClC,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;CACF;;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,SAAiB;IACpD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa,EAAE,GAAY;IAChE,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB,EAAE,QAAgB,EAAE,QAAgB;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC;IAExB,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;QACnB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5B,KAAK,GAAG,QAAQ,CAAC;QACjB,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,uEAAuE;QACvE,OAAO,GAAG,CAAC,CAAC;IACd,CAAC;IAED,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;YACxC,MAAM;QACR,CAAC;QACD,KAAK,EAAE,CAAC;QACR,OAAO,IAAI,CAAC,CAAC;QACb,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;YACxC,MAAM;QACR,CAAC;QACD,GAAG,EAAE,CAAC;QACN,OAAO,IAAI,CAAC,CAAC;QACb,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,OAAO,GAAG,MAAM,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QACvC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,EAAE,CAAC;IACV,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,GAAY;IAC3B,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,OAAO,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { Style } from "@suds-cli/chapstick";
2
+ import { CursorMode } from "@suds-cli/cursor";
3
+ import { Binding } from "@suds-cli/key";
4
+ /**
5
+ * Echo rendering mode for text input.
6
+ * @public
7
+ */
8
+ export declare enum EchoMode {
9
+ Normal = "normal",
10
+ Password = "password",
11
+ None = "none"
12
+ }
13
+ /**
14
+ * Validation callback. Return an Error to indicate invalid input.
15
+ * @public
16
+ */
17
+ export type ValidateFunc = (value: string) => Error | null;
18
+ /**
19
+ * Key bindings for editing/navigation.
20
+ * @public
21
+ */
22
+ export interface KeyMap {
23
+ characterForward: Binding;
24
+ characterBackward: Binding;
25
+ wordForward: Binding;
26
+ wordBackward: Binding;
27
+ deleteWordBackward: Binding;
28
+ deleteWordForward: Binding;
29
+ deleteAfterCursor: Binding;
30
+ deleteBeforeCursor: Binding;
31
+ deleteCharacterBackward: Binding;
32
+ deleteCharacterForward: Binding;
33
+ lineStart: Binding;
34
+ lineEnd: Binding;
35
+ paste: Binding;
36
+ }
37
+ /**
38
+ * Default key bindings (mirrors Bubbles textinput defaults).
39
+ * @public
40
+ */
41
+ export declare const defaultKeyMap: KeyMap;
42
+ /**
43
+ * Configuration for creating a text input model.
44
+ * @public
45
+ */
46
+ export interface TextInputOptions {
47
+ value?: string;
48
+ placeholder?: string;
49
+ echoMode?: EchoMode;
50
+ echoCharacter?: string;
51
+ charLimit?: number;
52
+ width?: number;
53
+ prompt?: string;
54
+ cursorMode?: CursorMode;
55
+ promptStyle?: Style;
56
+ textStyle?: Style;
57
+ placeholderStyle?: Style;
58
+ cursorStyle?: Style;
59
+ validate?: ValidateFunc;
60
+ keyMap?: KeyMap;
61
+ }
62
+ export { CursorMode };
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAc,MAAM,eAAe,CAAC;AAEpD;;;GAGG;AACH,oBAAY,QAAQ;IAClB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uBAAuB,EAAE,OAAO,CAAC;IACjC,sBAAsB,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAc3B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,33 @@
1
+ import { CursorMode } from "@suds-cli/cursor";
2
+ import { newBinding } from "@suds-cli/key";
3
+ /**
4
+ * Echo rendering mode for text input.
5
+ * @public
6
+ */
7
+ export var EchoMode;
8
+ (function (EchoMode) {
9
+ EchoMode["Normal"] = "normal";
10
+ EchoMode["Password"] = "password";
11
+ EchoMode["None"] = "none";
12
+ })(EchoMode || (EchoMode = {}));
13
+ /**
14
+ * Default key bindings (mirrors Bubbles textinput defaults).
15
+ * @public
16
+ */
17
+ export const defaultKeyMap = {
18
+ characterForward: newBinding({ keys: ["right", "ctrl+f"] }),
19
+ characterBackward: newBinding({ keys: ["left", "ctrl+b"] }),
20
+ wordForward: newBinding({ keys: ["alt+right", "ctrl+right", "alt+f"] }),
21
+ wordBackward: newBinding({ keys: ["alt+left", "ctrl+left", "alt+b"] }),
22
+ deleteWordBackward: newBinding({ keys: ["alt+backspace", "ctrl+w"] }),
23
+ deleteWordForward: newBinding({ keys: ["alt+delete", "alt+d"] }),
24
+ deleteAfterCursor: newBinding({ keys: ["ctrl+k"] }),
25
+ deleteBeforeCursor: newBinding({ keys: ["ctrl+u"] }),
26
+ deleteCharacterBackward: newBinding({ keys: ["backspace", "ctrl+h"] }),
27
+ deleteCharacterForward: newBinding({ keys: ["delete", "ctrl+d"] }),
28
+ lineStart: newBinding({ keys: ["home", "ctrl+a"] }),
29
+ lineEnd: newBinding({ keys: ["end", "ctrl+e"] }),
30
+ paste: newBinding({ keys: ["ctrl+v"] }),
31
+ };
32
+ export { CursorMode };
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAW,UAAU,EAAE,MAAM,eAAe,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAN,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,iCAAqB,CAAA;IACrB,yBAAa,CAAA;AACf,CAAC,EAJW,QAAQ,KAAR,QAAQ,QAInB;AA4BD;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,gBAAgB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;IAC3D,iBAAiB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;IAC3D,WAAW,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;IACvE,YAAY,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;IACtE,kBAAkB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC;IACrE,iBAAiB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;IAChE,iBAAiB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IACnD,kBAAkB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpD,uBAAuB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;IACtE,sBAAsB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;IAClE,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;IACnD,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;IAChD,KAAK,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;CACxC,CAAC;AAuBF,OAAO,EAAE,UAAU,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@suds-cli/textinput",
3
+ "version": "0.0.0",
4
+ "description": "Single-line text input component for Suds terminal UIs",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "dependencies": {
12
+ "clipboardy": "^4.0.0",
13
+ "grapheme-splitter": "^1.0.4",
14
+ "@suds-cli/chapstick": "0.0.0",
15
+ "@suds-cli/cursor": "0.0.0",
16
+ "@suds-cli/key": "0.0.0",
17
+ "@suds-cli/runeutil": "0.0.0",
18
+ "@suds-cli/tea": "0.0.0"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "5.8.2",
22
+ "vitest": "^4.0.15"
23
+ },
24
+ "engines": {
25
+ "node": ">=20.0.0"
26
+ },
27
+ "scripts": {
28
+ "clean": "rm -rf dist",
29
+ "build": "pnpm run clean && tsc -p ./tsconfig.json",
30
+ "test": "vitest run",
31
+ "generate:api-report": "api-extractor run --local",
32
+ "check:api-report": "pnpm run generate:api-report",
33
+ "check:eslint": "pnpm run lint",
34
+ "lint": "eslint \"{src,test}/**/*.{ts,tsx}\""
35
+ }
36
+ }