@flyingrobots/bijou 1.6.0 → 1.8.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/dist/adapters/test/index.d.ts +2 -0
- package/dist/adapters/test/index.d.ts.map +1 -1
- package/dist/adapters/test/index.js +2 -0
- package/dist/adapters/test/index.js.map +1 -1
- package/dist/core/ansi.d.ts +15 -0
- package/dist/core/ansi.d.ts.map +1 -0
- package/dist/core/ansi.js +15 -0
- package/dist/core/ansi.js.map +1 -0
- package/dist/core/components/box.d.ts +6 -0
- package/dist/core/components/box.d.ts.map +1 -1
- package/dist/core/components/box.js +20 -5
- package/dist/core/components/box.js.map +1 -1
- package/dist/core/components/constrain.d.ts +28 -0
- package/dist/core/components/constrain.d.ts.map +1 -0
- package/dist/core/components/constrain.js +66 -0
- package/dist/core/components/constrain.js.map +1 -0
- package/dist/core/components/cursor-guard.d.ts +46 -0
- package/dist/core/components/cursor-guard.d.ts.map +1 -0
- package/dist/core/components/cursor-guard.js +88 -0
- package/dist/core/components/cursor-guard.js.map +1 -0
- package/dist/core/components/dag-render.js +2 -2
- package/dist/core/components/dag-render.js.map +1 -1
- package/dist/core/components/index.d.ts +6 -0
- package/dist/core/components/index.d.ts.map +1 -1
- package/dist/core/components/index.js +3 -0
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/progress.d.ts.map +1 -1
- package/dist/core/components/progress.js +20 -8
- package/dist/core/components/progress.js.map +1 -1
- package/dist/core/components/spinner.d.ts.map +1 -1
- package/dist/core/components/spinner.js +11 -4
- package/dist/core/components/spinner.js.map +1 -1
- package/dist/core/components/table.d.ts.map +1 -1
- package/dist/core/components/table.js +1 -10
- package/dist/core/components/table.js.map +1 -1
- package/dist/core/components/timer.d.ts +74 -0
- package/dist/core/components/timer.d.ts.map +1 -0
- package/dist/core/components/timer.js +219 -0
- package/dist/core/components/timer.js.map +1 -0
- package/dist/core/detect/tty.d.ts +10 -0
- package/dist/core/detect/tty.d.ts.map +1 -1
- package/dist/core/detect/tty.js +14 -12
- package/dist/core/detect/tty.js.map +1 -1
- package/dist/core/forms/form-utils.d.ts +22 -0
- package/dist/core/forms/form-utils.d.ts.map +1 -1
- package/dist/core/forms/form-utils.js +50 -3
- package/dist/core/forms/form-utils.js.map +1 -1
- package/dist/core/forms/index.d.ts +2 -0
- package/dist/core/forms/index.d.ts.map +1 -1
- package/dist/core/forms/index.js +1 -0
- package/dist/core/forms/index.js.map +1 -1
- package/dist/core/forms/multiselect.d.ts +2 -0
- package/dist/core/forms/multiselect.d.ts.map +1 -1
- package/dist/core/forms/multiselect.js +12 -18
- package/dist/core/forms/multiselect.js.map +1 -1
- package/dist/core/forms/note.d.ts +27 -0
- package/dist/core/forms/note.d.ts.map +1 -0
- package/dist/core/forms/note.js +55 -0
- package/dist/core/forms/note.js.map +1 -0
- package/dist/core/forms/select.js +5 -20
- package/dist/core/forms/select.js.map +1 -1
- package/dist/core/forms/wizard.d.ts +11 -0
- package/dist/core/forms/wizard.d.ts.map +1 -1
- package/dist/core/forms/wizard.js +30 -2
- package/dist/core/forms/wizard.js.map +1 -1
- package/dist/core/text/clip.d.ts.map +1 -1
- package/dist/core/text/clip.js +2 -8
- package/dist/core/text/clip.js.map +1 -1
- package/dist/core/text/grapheme.d.ts +14 -0
- package/dist/core/text/grapheme.d.ts.map +1 -1
- package/dist/core/text/grapheme.js +21 -1
- package/dist/core/text/grapheme.js.map +1 -1
- package/dist/core/text/index.d.ts +1 -1
- package/dist/core/text/index.d.ts.map +1 -1
- package/dist/core/text/index.js +1 -1
- package/dist/core/text/index.js.map +1 -1
- package/dist/core/theme/resolve.d.ts +16 -0
- package/dist/core/theme/resolve.d.ts.map +1 -1
- package/dist/core/theme/resolve.js +21 -7
- package/dist/core/theme/resolve.js.map +1 -1
- package/dist/core/theme/styled.d.ts +9 -0
- package/dist/core/theme/styled.d.ts.map +1 -1
- package/dist/core/theme/styled.js +9 -0
- package/dist/core/theme/styled.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/ports/env.d.ts +31 -0
- package/dist/ports/env.d.ts.map +1 -0
- package/dist/ports/env.js +36 -0
- package/dist/ports/env.js.map +1 -0
- package/dist/ports/index.d.ts +1 -0
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/io.d.ts +1 -1
- package/dist/ports/io.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -90,6 +90,28 @@ export declare function createStyledFn(ctx: BijouContext): (token: TokenValue, t
|
|
|
90
90
|
* @returns A function `(text) => string`.
|
|
91
91
|
*/
|
|
92
92
|
export declare function createBoldFn(ctx: BijouContext): (text: string) => string;
|
|
93
|
+
/**
|
|
94
|
+
* Keep a scroll offset so the cursor stays within a visible window.
|
|
95
|
+
*
|
|
96
|
+
* First adjusts the offset relative to the cursor position, then
|
|
97
|
+
* clamps to the absolute bounds `[0, max(0, itemCount - maxVisible)]`.
|
|
98
|
+
*
|
|
99
|
+
* @param cursor - Current cursor index.
|
|
100
|
+
* @param scrollOffset - Current scroll offset.
|
|
101
|
+
* @param maxVisible - Maximum number of items visible at once.
|
|
102
|
+
* @param itemCount - Total number of items.
|
|
103
|
+
* @returns The updated scroll offset.
|
|
104
|
+
*/
|
|
105
|
+
export declare function clampScroll(cursor: number, scrollOffset: number, maxVisible: number, itemCount: number): number;
|
|
106
|
+
/**
|
|
107
|
+
* Handle up/down (arrow key or j/k) navigation in a wrapping list.
|
|
108
|
+
*
|
|
109
|
+
* @param key - The keypress string.
|
|
110
|
+
* @param cursor - Current cursor index.
|
|
111
|
+
* @param length - Total number of items.
|
|
112
|
+
* @returns The new cursor index, or `null` if the key was not a vertical nav key.
|
|
113
|
+
*/
|
|
114
|
+
export declare function handleVerticalNav(key: string, cursor: number, length: number): number | null;
|
|
93
115
|
/**
|
|
94
116
|
* Route a form to its interactive or fallback handler based on
|
|
95
117
|
* output mode and TTY state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-utils.d.ts","sourceRoot":"","sources":["../../../src/core/forms/form-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"form-utils.d.ts","sourceRoot":"","sources":["../../../src/core/forms/form-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAKxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAM7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/D,GAAG,EAAE,YAAY,GAChB,IAAI,CAMN;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,UAAU,IAAI,IAAI,CAAC;IACnB,gCAAgC;IAChC,UAAU,IAAI,IAAI,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uDAAuD;IACvD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,8EAA8E;IAC9E,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,gBAAgB,CA2BpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAG7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAGxE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ/G;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9C,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1C,OAAO,CAAC,CAAC,CAAC,CAKZ"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module core/forms/form-utils
|
|
8
8
|
*/
|
|
9
|
+
import { cursorGuard } from '../components/cursor-guard.js';
|
|
10
|
+
import { CLEAR_LINE_RETURN } from '../ansi.js';
|
|
9
11
|
/**
|
|
10
12
|
* Format a form title with the `?` prefix and theme-aware styling.
|
|
11
13
|
*
|
|
@@ -64,15 +66,21 @@ export function renderNumberedOptions(options, ctx) {
|
|
|
64
66
|
* @returns A renderer with cursor control methods.
|
|
65
67
|
*/
|
|
66
68
|
export function terminalRenderer(ctx) {
|
|
69
|
+
let cursorHandle = null;
|
|
67
70
|
return {
|
|
68
71
|
hideCursor() {
|
|
69
|
-
|
|
72
|
+
if (cursorHandle === null) {
|
|
73
|
+
cursorHandle = cursorGuard(ctx.io).hide();
|
|
74
|
+
}
|
|
70
75
|
},
|
|
71
76
|
showCursor() {
|
|
72
|
-
|
|
77
|
+
if (cursorHandle !== null) {
|
|
78
|
+
cursorHandle.dispose();
|
|
79
|
+
cursorHandle = null;
|
|
80
|
+
}
|
|
73
81
|
},
|
|
74
82
|
writeLine(text) {
|
|
75
|
-
ctx.io.write(
|
|
83
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${text}\n`);
|
|
76
84
|
},
|
|
77
85
|
moveUp(lines) {
|
|
78
86
|
if (lines <= 0)
|
|
@@ -117,6 +125,45 @@ export function createBoldFn(ctx) {
|
|
|
117
125
|
return (text) => text;
|
|
118
126
|
return (text) => ctx.style.bold(text);
|
|
119
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Keep a scroll offset so the cursor stays within a visible window.
|
|
130
|
+
*
|
|
131
|
+
* First adjusts the offset relative to the cursor position, then
|
|
132
|
+
* clamps to the absolute bounds `[0, max(0, itemCount - maxVisible)]`.
|
|
133
|
+
*
|
|
134
|
+
* @param cursor - Current cursor index.
|
|
135
|
+
* @param scrollOffset - Current scroll offset.
|
|
136
|
+
* @param maxVisible - Maximum number of items visible at once.
|
|
137
|
+
* @param itemCount - Total number of items.
|
|
138
|
+
* @returns The updated scroll offset.
|
|
139
|
+
*/
|
|
140
|
+
export function clampScroll(cursor, scrollOffset, maxVisible, itemCount) {
|
|
141
|
+
let offset = scrollOffset;
|
|
142
|
+
if (cursor < offset) {
|
|
143
|
+
offset = cursor;
|
|
144
|
+
}
|
|
145
|
+
else if (cursor >= offset + maxVisible) {
|
|
146
|
+
offset = cursor - maxVisible + 1;
|
|
147
|
+
}
|
|
148
|
+
return Math.max(0, Math.min(offset, Math.max(0, itemCount - maxVisible)));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Handle up/down (arrow key or j/k) navigation in a wrapping list.
|
|
152
|
+
*
|
|
153
|
+
* @param key - The keypress string.
|
|
154
|
+
* @param cursor - Current cursor index.
|
|
155
|
+
* @param length - Total number of items.
|
|
156
|
+
* @returns The new cursor index, or `null` if the key was not a vertical nav key.
|
|
157
|
+
*/
|
|
158
|
+
export function handleVerticalNav(key, cursor, length) {
|
|
159
|
+
if (key === '\x1b[A' || key === 'k') {
|
|
160
|
+
return (cursor - 1 + length) % length;
|
|
161
|
+
}
|
|
162
|
+
if (key === '\x1b[B' || key === 'j') {
|
|
163
|
+
return (cursor + 1) % length;
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
120
167
|
/**
|
|
121
168
|
* Route a form to its interactive or fallback handler based on
|
|
122
169
|
* output mode and TTY state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-utils.js","sourceRoot":"","sources":["../../../src/core/forms/form-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"form-utils.js","sourceRoot":"","sources":["../../../src/core/forms/form-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,4 +17,6 @@ export { filter } from './filter.js';
|
|
|
17
17
|
export type { FilterOption, FilterOptions } from './filter.js';
|
|
18
18
|
export { wizard } from './wizard.js';
|
|
19
19
|
export type { WizardStep, WizardOptions } from './wizard.js';
|
|
20
|
+
export { note } from './note.js';
|
|
21
|
+
export type { NoteOptions } from './note.js';
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/core/forms/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -8,6 +8,8 @@ import type { BijouContext } from '../../ports/context.js';
|
|
|
8
8
|
export interface MultiselectOptions<T = string> extends SelectFieldOptions<T> {
|
|
9
9
|
/** Bijou context for IO, styling, and mode detection. */
|
|
10
10
|
ctx?: BijouContext;
|
|
11
|
+
/** Values to pre-select when the multiselect first renders in interactive mode. */
|
|
12
|
+
defaultValues?: T[];
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Prompt the user to choose zero or more items from a list.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiselect.d.ts","sourceRoot":"","sources":["../../../src/core/forms/multiselect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;IAC3E,yDAAyD;IACzD,GAAG,CAAC,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"multiselect.d.ts","sourceRoot":"","sources":["../../../src/core/forms/multiselect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;IAC3E,yDAAyD;IACzD,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,mFAAmF;IACnF,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAU1F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveCtx } from '../resolve-ctx.js';
|
|
2
|
-
import { formatFormTitle, renderNumberedOptions, terminalRenderer, formDispatch, createStyledFn, createBoldFn } from './form-utils.js';
|
|
2
|
+
import { formatFormTitle, renderNumberedOptions, terminalRenderer, formDispatch, createStyledFn, createBoldFn, clampScroll, handleVerticalNav } from './form-utils.js';
|
|
3
3
|
/**
|
|
4
4
|
* Prompt the user to choose zero or more items from a list.
|
|
5
5
|
*
|
|
@@ -59,15 +59,13 @@ async function interactiveMultiselect(options, ctx) {
|
|
|
59
59
|
let cursor = 0;
|
|
60
60
|
let scrollOffset = 0;
|
|
61
61
|
const selected = new Set();
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
scrollOffset = cursor - maxVisible + 1;
|
|
62
|
+
// Pre-select items matching defaultValues (if provided)
|
|
63
|
+
if (options.defaultValues !== undefined) {
|
|
64
|
+
for (let i = 0; i < options.options.length; i++) {
|
|
65
|
+
if (options.defaultValues.some((dv) => Object.is(dv, options.options[i].value))) {
|
|
66
|
+
selected.add(i);
|
|
67
|
+
}
|
|
69
68
|
}
|
|
70
|
-
scrollOffset = Math.max(0, Math.min(scrollOffset, Math.max(0, options.options.length - maxVisible)));
|
|
71
69
|
}
|
|
72
70
|
/** Return the slice of options currently visible on screen. */
|
|
73
71
|
function visibleOptions() {
|
|
@@ -123,15 +121,10 @@ async function interactiveMultiselect(options, ctx) {
|
|
|
123
121
|
render();
|
|
124
122
|
return new Promise((resolve) => {
|
|
125
123
|
const handle = ctx.io.rawInput((key) => {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
render();
|
|
131
|
-
}
|
|
132
|
-
else if (key === '\x1b[B' || key === 'j') {
|
|
133
|
-
cursor = (cursor + 1) % options.options.length;
|
|
134
|
-
clampScroll();
|
|
124
|
+
const next = handleVerticalNav(key, cursor, options.options.length);
|
|
125
|
+
if (next !== null) {
|
|
126
|
+
cursor = next;
|
|
127
|
+
scrollOffset = clampScroll(cursor, scrollOffset, maxVisible, options.options.length);
|
|
135
128
|
clearRender();
|
|
136
129
|
render();
|
|
137
130
|
}
|
|
@@ -152,6 +145,7 @@ async function interactiveMultiselect(options, ctx) {
|
|
|
152
145
|
// Note: bare \x1b may false-trigger on slow connections where escape
|
|
153
146
|
// sequences arrive as separate bytes. Timer-based disambiguation is a
|
|
154
147
|
// separate future improvement.
|
|
148
|
+
selected.clear();
|
|
155
149
|
handle.dispose();
|
|
156
150
|
cleanup();
|
|
157
151
|
resolve([]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiselect.js","sourceRoot":"","sources":["../../../src/core/forms/multiselect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"multiselect.js","sourceRoot":"","sources":["../../../src/core/forms/multiselect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BijouContext } from '../../ports/context.js';
|
|
2
|
+
/** Configuration for a display-only note within a form flow. */
|
|
3
|
+
export interface NoteOptions {
|
|
4
|
+
/** Message body text. */
|
|
5
|
+
message: string;
|
|
6
|
+
/** Optional bold title displayed above the message. */
|
|
7
|
+
title?: string;
|
|
8
|
+
/** Bijou context for I/O, styling, and mode detection. */
|
|
9
|
+
ctx?: BijouContext;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Display a read-only note in a form flow.
|
|
13
|
+
*
|
|
14
|
+
* The note is written to the output and resolves immediately — it does not
|
|
15
|
+
* collect any value. This makes it compatible with `group()` and `wizard()`
|
|
16
|
+
* as a step whose value is `undefined`.
|
|
17
|
+
*
|
|
18
|
+
* Output adapts to the current output mode:
|
|
19
|
+
* - `interactive` — info icon + bold title + muted message with left accent line.
|
|
20
|
+
* - `static` — same as interactive without accent styling.
|
|
21
|
+
* - `pipe` / `accessible` — plain text `"Note: {message}"` or `"Note ({title}): {message}"`.
|
|
22
|
+
*
|
|
23
|
+
* @param options - Note configuration.
|
|
24
|
+
* @returns A promise that resolves to `undefined` after writing the note.
|
|
25
|
+
*/
|
|
26
|
+
export declare function note(options: NoteOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=note.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../../src/core/forms/note.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { resolveCtx } from '../resolve-ctx.js';
|
|
2
|
+
import { renderByMode } from '../mode-render.js';
|
|
3
|
+
/**
|
|
4
|
+
* Display a read-only note in a form flow.
|
|
5
|
+
*
|
|
6
|
+
* The note is written to the output and resolves immediately — it does not
|
|
7
|
+
* collect any value. This makes it compatible with `group()` and `wizard()`
|
|
8
|
+
* as a step whose value is `undefined`.
|
|
9
|
+
*
|
|
10
|
+
* Output adapts to the current output mode:
|
|
11
|
+
* - `interactive` — info icon + bold title + muted message with left accent line.
|
|
12
|
+
* - `static` — same as interactive without accent styling.
|
|
13
|
+
* - `pipe` / `accessible` — plain text `"Note: {message}"` or `"Note ({title}): {message}"`.
|
|
14
|
+
*
|
|
15
|
+
* @param options - Note configuration.
|
|
16
|
+
* @returns A promise that resolves to `undefined` after writing the note.
|
|
17
|
+
*/
|
|
18
|
+
export async function note(options) {
|
|
19
|
+
const ctx = resolveCtx(options.ctx);
|
|
20
|
+
const { message, title } = options;
|
|
21
|
+
const output = renderByMode(ctx.mode, {
|
|
22
|
+
pipe: () => formatPlain(title, message),
|
|
23
|
+
accessible: () => formatPlain(title, message),
|
|
24
|
+
interactive: () => formatVisual(title, message, ctx),
|
|
25
|
+
}, options);
|
|
26
|
+
ctx.io.write(output + '\n');
|
|
27
|
+
}
|
|
28
|
+
/** Format a plain-text note for pipe/accessible modes. */
|
|
29
|
+
function formatPlain(title, message) {
|
|
30
|
+
if (title) {
|
|
31
|
+
return `Note (${title}): ${message}`;
|
|
32
|
+
}
|
|
33
|
+
return `Note: ${message}`;
|
|
34
|
+
}
|
|
35
|
+
/** Format a styled note for interactive/static modes. */
|
|
36
|
+
function formatVisual(title, message, ctx) {
|
|
37
|
+
const infoIcon = 'ℹ';
|
|
38
|
+
const accentToken = ctx.semantic('info');
|
|
39
|
+
const mutedToken = ctx.semantic('muted');
|
|
40
|
+
const lines = [];
|
|
41
|
+
if (title) {
|
|
42
|
+
lines.push(ctx.style.styled(accentToken, `${infoIcon} `) + ctx.style.bold(title));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
lines.push(ctx.style.styled(accentToken, infoIcon));
|
|
46
|
+
}
|
|
47
|
+
for (const line of message.split('\n')) {
|
|
48
|
+
lines.push(ctx.style.styled(mutedToken, ` ${line}`));
|
|
49
|
+
}
|
|
50
|
+
// Left accent line
|
|
51
|
+
return lines
|
|
52
|
+
.map((line) => ctx.style.styled(accentToken, '│') + ' ' + line)
|
|
53
|
+
.join('\n');
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note.js","sourceRoot":"","sources":["../../../src/core/forms/note.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE;QACpC,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;QACvC,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC;KACrD,EAAE,OAAO,CAAC,CAAC;IAEZ,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,0DAA0D;AAC1D,SAAS,WAAW,CAAC,KAAyB,EAAE,OAAe;IAC7D,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,SAAS,KAAK,MAAM,OAAO,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,SAAS,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,yDAAyD;AACzD,SAAS,YAAY,CAAC,KAAyB,EAAE,OAAe,EAAE,GAAiB;IACjF,MAAM,QAAQ,GAAG,GAAG,CAAC;IACrB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CACtE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,mBAAmB;IACnB,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;SAC9D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveCtx } from '../resolve-ctx.js';
|
|
2
|
-
import { formatFormTitle, renderNumberedOptions, terminalRenderer, formDispatch, createStyledFn, createBoldFn } from './form-utils.js';
|
|
2
|
+
import { formatFormTitle, renderNumberedOptions, terminalRenderer, formDispatch, createStyledFn, createBoldFn, clampScroll, handleVerticalNav } from './form-utils.js';
|
|
3
3
|
/**
|
|
4
4
|
* Prompt the user to choose one item from a list.
|
|
5
5
|
*
|
|
@@ -62,16 +62,6 @@ async function interactiveSelect(options, ctx) {
|
|
|
62
62
|
: 7;
|
|
63
63
|
let cursor = 0;
|
|
64
64
|
let scrollOffset = 0;
|
|
65
|
-
/** Keep the scroll offset so the cursor stays within the visible window. */
|
|
66
|
-
function clampScroll() {
|
|
67
|
-
if (cursor < scrollOffset) {
|
|
68
|
-
scrollOffset = cursor;
|
|
69
|
-
}
|
|
70
|
-
else if (cursor >= scrollOffset + maxVisible) {
|
|
71
|
-
scrollOffset = cursor - maxVisible + 1;
|
|
72
|
-
}
|
|
73
|
-
scrollOffset = Math.max(0, Math.min(scrollOffset, Math.max(0, options.options.length - maxVisible)));
|
|
74
|
-
}
|
|
75
65
|
/** Return the slice of options currently visible on screen. */
|
|
76
66
|
function visibleOptions() {
|
|
77
67
|
return options.options.slice(scrollOffset, scrollOffset + maxVisible);
|
|
@@ -118,15 +108,10 @@ async function interactiveSelect(options, ctx) {
|
|
|
118
108
|
render();
|
|
119
109
|
return new Promise((resolve) => {
|
|
120
110
|
const handle = ctx.io.rawInput((key) => {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
render();
|
|
126
|
-
}
|
|
127
|
-
else if (key === '\x1b[B' || key === 'j') {
|
|
128
|
-
cursor = (cursor + 1) % options.options.length;
|
|
129
|
-
clampScroll();
|
|
111
|
+
const next = handleVerticalNav(key, cursor, options.options.length);
|
|
112
|
+
if (next !== null) {
|
|
113
|
+
cursor = next;
|
|
114
|
+
scrollOffset = clampScroll(cursor, scrollOffset, maxVisible, options.options.length);
|
|
130
115
|
clearRender();
|
|
131
116
|
render();
|
|
132
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/core/forms/select.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/core/forms/select.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,17 @@ export interface WizardStep<T, K extends keyof T = keyof T> {
|
|
|
12
12
|
field: (values: Partial<T>) => Promise<T[K]>;
|
|
13
13
|
/** Predicate that, when returning `true`, causes this step to be skipped. */
|
|
14
14
|
skip?: (values: Partial<T>) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Called before `field()`. May return a replacement field function
|
|
17
|
+
* (which will be called instead of the original `field`), or void
|
|
18
|
+
* to keep the original.
|
|
19
|
+
*/
|
|
20
|
+
transform?: (values: Partial<T>) => ((values: Partial<T>) => Promise<T[K]>) | void;
|
|
21
|
+
/**
|
|
22
|
+
* Called after value collection. Returns additional steps to splice
|
|
23
|
+
* in immediately after the current step.
|
|
24
|
+
*/
|
|
25
|
+
branch?: (values: Partial<T>) => WizardStep<T>[];
|
|
15
26
|
}
|
|
16
27
|
/**
|
|
17
28
|
* Configuration for a multi-step wizard form.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/core/forms/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/core/forms/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC;IACxD,kEAAkE;IAClE,GAAG,EAAE,CAAC,CAAC;IACP,oGAAoG;IACpG,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,6EAA6E;IAC7E,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACnF;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;CAClD;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,+CAA+C;IAC/C,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CA2C9B"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** Maximum number of wizard steps before throwing to prevent infinite loops. */
|
|
2
|
+
const MAX_WIZARD_STEPS = 1000;
|
|
1
3
|
/**
|
|
2
4
|
* Multi-step form wizard that runs steps sequentially, passing accumulated
|
|
3
5
|
* values to each step's `field` function. Steps can be conditionally skipped
|
|
@@ -23,12 +25,38 @@
|
|
|
23
25
|
*/
|
|
24
26
|
export async function wizard(options) {
|
|
25
27
|
const values = {};
|
|
26
|
-
|
|
28
|
+
const steps = [...options.steps];
|
|
29
|
+
let i = 0;
|
|
30
|
+
let iterations = 0;
|
|
31
|
+
while (i < steps.length) {
|
|
32
|
+
if (++iterations > MAX_WIZARD_STEPS) {
|
|
33
|
+
throw new Error(`Wizard exceeded ${MAX_WIZARD_STEPS} steps — possible infinite loop`);
|
|
34
|
+
}
|
|
35
|
+
const step = steps[i];
|
|
36
|
+
// Skip check
|
|
27
37
|
if (step.skip?.(values)) {
|
|
38
|
+
i++;
|
|
28
39
|
continue;
|
|
29
40
|
}
|
|
30
|
-
|
|
41
|
+
// Transform: may replace the field function
|
|
42
|
+
let fieldFn = step.field;
|
|
43
|
+
if (step.transform) {
|
|
44
|
+
const replacement = step.transform(values);
|
|
45
|
+
if (replacement) {
|
|
46
|
+
fieldFn = replacement;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Collect value
|
|
50
|
+
const result = await fieldFn(values);
|
|
31
51
|
values[step.key] = result;
|
|
52
|
+
// Branch: splice in additional steps after current position
|
|
53
|
+
if (step.branch) {
|
|
54
|
+
const branchSteps = step.branch(values);
|
|
55
|
+
if (branchSteps.length > 0) {
|
|
56
|
+
steps.splice(i + 1, 0, ...branchSteps);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
i++;
|
|
32
60
|
}
|
|
33
61
|
return { values, cancelled: false };
|
|
34
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/core/forms/wizard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/core/forms/wizard.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAsC9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAyB;IAEzB,MAAM,MAAM,GAAG,EAAO,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAEjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,gBAAgB,iCAAiC,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QAEvB,aAAa;QACb,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,GAAG,WAAW,CAAC;YACxB,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,MAAkC,CAAC,IAAI,CAAC,GAAa,CAAC,GAAG,MAAM,CAAC;QAEjE,4DAA4D;QAC5D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clip.d.ts","sourceRoot":"","sources":["../../../src/core/text/clip.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"clip.d.ts","sourceRoot":"","sources":["../../../src/core/text/clip.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAsDjE"}
|
package/dist/core/text/clip.js
CHANGED
|
@@ -4,13 +4,7 @@
|
|
|
4
4
|
* Clips a string to a maximum visible width, preserving ANSI escapes.
|
|
5
5
|
* Won't split multi-codepoint grapheme clusters (emoji, CJK, ZWJ sequences).
|
|
6
6
|
*/
|
|
7
|
-
import { segmentGraphemes, graphemeClusterWidth } from './grapheme.js';
|
|
8
|
-
/**
|
|
9
|
-
* Pattern matching ANSI SGR escape sequences (e.g. `\x1b[31m`).
|
|
10
|
-
*
|
|
11
|
-
* Used to strip style escapes before measuring visible width.
|
|
12
|
-
*/
|
|
13
|
-
const ANSI_RE = new RegExp('\x1b\\[[0-9;]*m', 'g');
|
|
7
|
+
import { segmentGraphemes, graphemeClusterWidth, ANSI_SGR_RE } from './grapheme.js';
|
|
14
8
|
/**
|
|
15
9
|
* Clip a string to a maximum visible width, preserving ANSI escapes.
|
|
16
10
|
*
|
|
@@ -27,7 +21,7 @@ const ANSI_RE = new RegExp('\x1b\\[[0-9;]*m', 'g');
|
|
|
27
21
|
export function clipToWidth(str, maxWidth) {
|
|
28
22
|
if (maxWidth <= 0)
|
|
29
23
|
return '';
|
|
30
|
-
const stripped = str.replace(
|
|
24
|
+
const stripped = str.replace(new RegExp(ANSI_SGR_RE, 'g'), '');
|
|
31
25
|
const graphemes = segmentGraphemes(stripped);
|
|
32
26
|
let result = '';
|
|
33
27
|
let visible = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clip.js","sourceRoot":"","sources":["../../../src/core/text/clip.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"clip.js","sourceRoot":"","sources":["../../../src/core/text/clip.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEpF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,QAAgB;IACvD,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QAEnB,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YAClB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,GAAG,EAAE,CAAC;YACZ,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,EAAE,CAAC;YACb,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM,IAAI,MAAM,CAAC;gBACjB,MAAM,GAAG,EAAE,CAAC;gBACZ,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,0DAA0D;QAC1D,IAAI,EAAE,IAAI,SAAS,CAAC,MAAM;YAAE,MAAM;QAElC,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAE,CAAC;QAChC,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,OAAO,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;YAChC,IAAI,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC;YAClC,MAAM;QACR,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC;QACnB,OAAO,IAAI,MAAM,CAAC;QAClB,EAAE,EAAE,CAAC;QACL,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -34,6 +34,20 @@ export declare function isWideChar(cp: number): boolean;
|
|
|
34
34
|
* @returns Array of grapheme cluster strings.
|
|
35
35
|
*/
|
|
36
36
|
export declare function segmentGraphemes(str: string): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Pattern matching ANSI SGR escape sequences (e.g. `\x1b[31m`).
|
|
39
|
+
*
|
|
40
|
+
* Exported for reuse by text utilities that need to strip terminal
|
|
41
|
+
* style escapes before measuring or clipping visible content.
|
|
42
|
+
*/
|
|
43
|
+
export declare const ANSI_SGR_RE: RegExp;
|
|
44
|
+
/**
|
|
45
|
+
* Strip all ANSI SGR escape sequences from a string.
|
|
46
|
+
*
|
|
47
|
+
* @param str - Input string potentially containing ANSI codes.
|
|
48
|
+
* @returns The string with all ANSI SGR sequences removed.
|
|
49
|
+
*/
|
|
50
|
+
export declare function stripAnsi(str: string): string;
|
|
37
51
|
/**
|
|
38
52
|
* Compute the terminal display width of a single grapheme cluster.
|
|
39
53
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grapheme.d.ts","sourceRoot":"","sources":["../../../src/core/text/grapheme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAgD9C;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOtD;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUjD"}
|
|
1
|
+
{"version":3,"file":"grapheme.d.ts","sourceRoot":"","sources":["../../../src/core/text/grapheme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAgD9C;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOtD;AAMD;;;;;GAKG;AAEH,eAAO,MAAM,WAAW,QAAmB,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUjD"}
|
|
@@ -120,6 +120,26 @@ export function segmentGraphemes(str) {
|
|
|
120
120
|
return result;
|
|
121
121
|
}
|
|
122
122
|
// ---------------------------------------------------------------------------
|
|
123
|
+
// ANSI stripping
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
/**
|
|
126
|
+
* Pattern matching ANSI SGR escape sequences (e.g. `\x1b[31m`).
|
|
127
|
+
*
|
|
128
|
+
* Exported for reuse by text utilities that need to strip terminal
|
|
129
|
+
* style escapes before measuring or clipping visible content.
|
|
130
|
+
*/
|
|
131
|
+
// eslint-disable-next-line no-control-regex
|
|
132
|
+
export const ANSI_SGR_RE = /\x1b\[[0-9;]*m/;
|
|
133
|
+
/**
|
|
134
|
+
* Strip all ANSI SGR escape sequences from a string.
|
|
135
|
+
*
|
|
136
|
+
* @param str - Input string potentially containing ANSI codes.
|
|
137
|
+
* @returns The string with all ANSI SGR sequences removed.
|
|
138
|
+
*/
|
|
139
|
+
export function stripAnsi(str) {
|
|
140
|
+
return str.replace(new RegExp(ANSI_SGR_RE, 'g'), '');
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
123
143
|
// Display width
|
|
124
144
|
// ---------------------------------------------------------------------------
|
|
125
145
|
/**
|
|
@@ -166,7 +186,7 @@ export function graphemeClusterWidth(grapheme) {
|
|
|
166
186
|
*/
|
|
167
187
|
export function graphemeWidth(str) {
|
|
168
188
|
// Strip ANSI escapes first
|
|
169
|
-
const clean = str
|
|
189
|
+
const clean = stripAnsi(str);
|
|
170
190
|
if (clean.length === 0)
|
|
171
191
|
return 0;
|
|
172
192
|
let width = 0;
|