@mnmal-ai/surface-core 0.15.0 → 0.17.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/keys.d.ts CHANGED
@@ -10,6 +10,8 @@ export interface KeyState {
10
10
  readonly draftEmpty: boolean;
11
11
  /** The focused panel's armed confirm key, set only while the draft is exactly it. */
12
12
  readonly armed?: string | null;
13
+ /** Full-screen's transcript viewport: following the bottom, or held. Absent inline. */
14
+ readonly viewport?: 'following' | 'held';
13
15
  }
14
16
  export type Route = {
15
17
  readonly kind: 'exit-chord';
@@ -38,8 +40,20 @@ export type Route = {
38
40
  readonly kind: 'global';
39
41
  readonly module: string;
40
42
  readonly key: KeySpec;
43
+ }
44
+ /** Typed text for a focused panel's `text` hook: a key its keymap does not bind, or a chunk. */
45
+ | {
46
+ readonly kind: 'panel-text';
47
+ readonly module: string;
48
+ readonly panel: string;
49
+ readonly text: string;
41
50
  } | {
42
51
  readonly kind: 'cancel-turn';
52
+ }
53
+ /** Full-screen: move the transcript viewport. */
54
+ | {
55
+ readonly kind: 'scroll';
56
+ readonly act: 'page-up' | 'page-down' | 'bottom';
43
57
  } | {
44
58
  readonly kind: 'history';
45
59
  readonly dir: 'up' | 'down';
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,GAAG,IAAI,CAiBhD;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7E,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,KAAK,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAA;CAAE,GACnE;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE;AAClC,sEAAsE;GACpE;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CA8D/E"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { type ListRow, type ListSpec } from '@mnmal-ai/surface-kit/list';
2
+ /** One row in full, as an app's `open` hook describes it. */
3
+ export interface ListDetail {
4
+ readonly title: string;
5
+ /** A dim line under the title: status, area, when. */
6
+ readonly meta?: string;
7
+ /** Wrapped to the panel's width and scrolled with ↑↓. */
8
+ readonly body?: string;
9
+ }
10
+ /** What the app does with a row. Either may be left out, and its key then does nothing. */
11
+ export interface ListHooks {
12
+ readonly open?: (row: ListRow) => ListDetail | Promise<ListDetail>;
13
+ readonly related?: (row: ListRow) => ListSpec | Promise<ListSpec>;
14
+ }
15
+ export interface ListStep {
16
+ readonly kind: 'list';
17
+ readonly list: ListSpec;
18
+ readonly hooks: ListHooks;
19
+ readonly page: number;
20
+ readonly cursor: number;
21
+ readonly filter: string;
22
+ readonly filtering: boolean;
23
+ /** The page size it was last moved with: `page` and `cursor` are measured in it. */
24
+ readonly size: number;
25
+ }
26
+ export interface DetailStep {
27
+ readonly kind: 'detail';
28
+ readonly row: ListRow;
29
+ readonly hooks: ListHooks;
30
+ readonly detail: ListDetail | 'loading' | {
31
+ readonly error: string;
32
+ };
33
+ readonly scroll: number;
34
+ }
35
+ export interface RelatedLoadingStep {
36
+ readonly kind: 'loading-related';
37
+ readonly row: ListRow;
38
+ /** Set when the related list could not be found. */
39
+ readonly error?: string;
40
+ }
41
+ export type Step = ListStep | DetailStep | RelatedLoadingStep;
42
+ export interface PagerState {
43
+ readonly steps: readonly Step[];
44
+ /** Bumped on every push and pop, so an async result can tell the step it was for is gone. */
45
+ readonly token: number;
46
+ }
47
+ export declare const listStep: (list: ListSpec, hooks: ListHooks) => ListStep;
48
+ export declare const pagerAt: (list: ListSpec, hooks: ListHooks) => PagerState;
49
+ export declare const push: (s: PagerState, step: Step) => PagerState;
50
+ /** Where the cursor's row falls at page size `per`, whatever size it was last moved with. */
51
+ export declare function placement(l: ListStep, per: number): {
52
+ page: number;
53
+ cursor: number;
54
+ };
55
+ /** The list's rows as the filter leaves them. */
56
+ export declare const visibleRows: (l: ListStep) => ListRow[];
57
+ /** The highlighted row, or the open detail's row; undefined when the filter matches nothing. */
58
+ export declare function cursorRow(s: PagerState): ListRow | undefined;
59
+ /** ↑↓: one row, walking onto the next or previous page at an edge; stops at either end. */
60
+ export declare function move(s: PagerState, delta: -1 | 1, pageSize: number): PagerState;
61
+ /** ←→: a page, the cursor on its first row; stays on the first or last page. */
62
+ export declare function turn(s: PagerState, delta: -1 | 1, pageSize: number): PagerState;
63
+ export declare const startFilter: (s: PagerState) => PagerState;
64
+ /** While filtering: the character joins the filter, and the list starts again from its top. */
65
+ export declare const typeChar: (s: PagerState, ch: string) => PagerState;
66
+ export declare const backspace: (s: PagerState) => PagerState;
67
+ /** Enter while filtering: keep the filter, stop typing into it. */
68
+ export declare const endFilter: (s: PagerState) => PagerState;
69
+ /**
70
+ * Esc: filtering → the filter cleared; a detail or a related list → the step before it, where it
71
+ * was left; the first list with a filter kept → the filter cleared; otherwise undefined (close).
72
+ */
73
+ export declare function back(s: PagerState): PagerState | undefined;
74
+ /** ↑↓ on a detail: scroll between 0 and `maxScroll`. */
75
+ export declare function scrollDetail(s: PagerState, delta: -1 | 1, maxScroll: number): PagerState;
76
+ //# sourceMappingURL=list-pager-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-pager-state.d.ts","sourceRoot":"","sources":["../src/list-pager-state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAErF,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,2FAA2F;AAC3F,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,kBAAkB,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,QAAQ,SAAU,QAAQ,SAAS,SAAS,KAAG,QAS1D,CAAC;AAUH,eAAO,MAAM,OAAO,SAAU,QAAQ,SAAS,SAAS,KAAG,UAGzD,CAAC;AAYH,eAAO,MAAM,IAAI,MAAO,UAAU,QAAQ,IAAI,KAAG,UAG/C,CAAC;AAEH,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAGpF;AAED,iDAAiD;AACjD,eAAO,MAAM,WAAW,MAAO,QAAQ,KAAG,OAAO,EAAuC,CAAC;AAEzF,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAK5D;AAED,2FAA2F;AAC3F,wBAAgB,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQ/E;AAED,gFAAgF;AAChF,wBAAgB,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAW/E;AAED,eAAO,MAAM,WAAW,MAAO,UAAU,KAAG,UACG,CAAC;AAEhD,+FAA+F;AAC/F,eAAO,MAAM,QAAQ,MAAO,UAAU,MAAM,MAAM,KAAG,UACsC,CAAC;AAE5F,eAAO,MAAM,SAAS,MAAO,UAAU,KAAG,UAGvC,CAAC;AAEJ,mEAAmE;AACnE,eAAO,MAAM,SAAS,MAAO,UAAU,KAAG,UACM,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAQ1D;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAOxF"}
@@ -0,0 +1,24 @@
1
+ import { type ListSpec } from '@mnmal-ai/surface-kit/list';
2
+ import { type ListHooks, type PagerState } from './list-pager-state.js';
3
+ import { type Reply, type TuiModule } from './module.js';
4
+ /** A list longer than this is paged rather than printed. */
5
+ export declare const INLINE_LIST_ROWS = 10;
6
+ export declare const LIST_REPLY_KIND = "surface.list";
7
+ type Panels = {
8
+ pager: PagerState;
9
+ };
10
+ /** Rows a page holds in a panel `rows` tall: the heading, filter and hint lines take the rest. */
11
+ export declare const pageSizeFor: (rows: number) => number;
12
+ /**
13
+ * The pager module and `present`, which a turn handler yields as its reply:
14
+ * `yield { phase: 'final', reply: pager.present(list, { open, related }) }`. A list of up to
15
+ * `INLINE_LIST_ROWS` prints inline. A longer one opens the pager when no panel is open, and the
16
+ * transcript then carries only its heading and a pointer; otherwise its first rows print inline.
17
+ * `/list` reopens the last long list where it was left.
18
+ */
19
+ export declare function listPager(): {
20
+ module: TuiModule<Panels>;
21
+ present(list: ListSpec, hooks?: ListHooks): Reply;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=list-pager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-pager.d.ts","sourceRoot":"","sources":["../src/list-pager.tsx"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,QAAQ,EAGd,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAOL,KAAK,SAAS,EAId,KAAK,UAAU,EAUhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAgC,KAAK,KAAK,EAAa,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAGlG,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,KAAK,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAMpC,kGAAkG;AAClG,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,MAA+B,CAAC;AAmN3E;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI;IAC3B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;CACnD,CAqKA"}
package/dist/module.d.ts CHANGED
@@ -99,6 +99,8 @@ export interface ModuleCtx<P> {
99
99
  open<K extends keyof P & string>(panel: K, state: P[K], opts?: {
100
100
  readonly ifNoneOpen?: boolean;
101
101
  }): void;
102
+ /** Whether any panel is open now, this module's or another's: what `ifNoneOpen` checks. */
103
+ panelOpen(): boolean;
102
104
  update<K extends keyof P & string>(panel: K, fn: (state: P[K]) => P[K]): void;
103
105
  close(): void;
104
106
  print(text: string, tone?: Tone): void;
@@ -170,6 +172,14 @@ export interface PanelDef<S, P = unknown> {
170
172
  /** The room the panel has: the columns left beside the rail, and `AppOptions.panelRows`. */
171
173
  readonly size: Size;
172
174
  }) => ReactNode;
175
+ /** Columns each side and rows top and bottom between the panel's edge and its view. Defaults
176
+ * to 4 and 1; the insets come out of the `size` the view is handed. */
177
+ readonly inset?: {
178
+ readonly x: number;
179
+ readonly y: number;
180
+ };
181
+ /** The panel's background colour. Defaults to `theme.color.raised`; `''` paints none. */
182
+ readonly ground?: string;
173
183
  readonly keymap?: readonly {
174
184
  readonly key: KeySpec;
175
185
  readonly act: string;
@@ -189,9 +199,9 @@ export interface PanelDef<S, P = unknown> {
189
199
  */
190
200
  readonly submit?: (state: S, line: string, ctx: ModuleCtx<P>) => S | undefined;
191
201
  /**
192
- * Escape on a panel with `submit`: return a state to stay open with it (abandoning an edit in
193
- * progress), or undefined to close as usual. A different panel opened here with `ctx.open`
194
- * replaces this one rather than being closed with it. Only for a panel with `submit`.
202
+ * Escape: return a state to stay open with it (abandoning an edit, or stepping back), or
203
+ * undefined to close as usual. A different panel opened here with `ctx.open` replaces this one
204
+ * rather than being closed with it.
195
205
  */
196
206
  readonly escape?: (state: S, ctx: ModuleCtx<P>) => S | undefined;
197
207
  /**
@@ -204,6 +214,12 @@ export interface PanelDef<S, P = unknown> {
204
214
  * printable single-character key in `keymap`.
205
215
  */
206
216
  readonly mask?: boolean;
217
+ /**
218
+ * Typed text the keymap does not bind: a printable key, or a pasted chunk whole. Without it such
219
+ * keys are ignored. Not for a panel that keeps the draft live (`confirm`, `submit`), where they
220
+ * edit the line. Return the next state, or undefined to keep it.
221
+ */
222
+ readonly text?: (state: S, text: string, ctx: ModuleCtx<P>) => S | undefined;
207
223
  /** act -> handler. Returning a state replaces the panel's state. */
208
224
  readonly on?: Readonly<Record<string, (state: S, ctx: ModuleCtx<P>) => S | undefined>>;
209
225
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { DEFAULT_GROUND } from "@mnmal-ai/surface-theme";
2
+ import { filterRows } from "@mnmal-ai/surface-kit/list";
2
3
 
3
4
  //#region src/complete.ts
4
5
  const TIMEOUT_MS = 150;
@@ -179,7 +180,6 @@ function composeModules(modules) {
179
180
  confirmed.add(c.key);
180
181
  if (def.on?.[c.act] === void 0) problems.push(`${key} confirms '${c.key}' with act '${c.act}', which it has no handler for`);
181
182
  }
182
- if (def.escape !== void 0 && def.submit === void 0) problems.push(`${key} handles escape without submit, which only an input panel may`);
183
183
  if (def.mask === true && def.submit === void 0) problems.push(`${key} masks its input without submit, which only an input panel may`);
184
184
  if (def.mask === true && (def.confirm?.length ?? 0) > 0) problems.push(`${key} masks its input but declares confirm keys, which would arm on a secret's characters`);
185
185
  if (def.mask === true) {
@@ -448,6 +448,47 @@ function ctrlC(armedAt, now, windowMs = CTRL_C_WINDOW_MS) {
448
448
  return armedAt !== null && now - armedAt <= windowMs ? "exit" : "arm";
449
449
  }
450
450
 
451
+ //#endregion
452
+ //#region src/fullscreen.ts
453
+ /** Whether full-screen is on: `SURFACE_FULLSCREEN` (`on` / `off`) over the app's option over on. */
454
+ function resolveFullscreen(option, env) {
455
+ const fallback = option ?? true;
456
+ const v = env?.trim().toLowerCase() ?? "";
457
+ if (v === "on") return {
458
+ on: true,
459
+ invalid: null
460
+ };
461
+ if (v === "off") return {
462
+ on: false,
463
+ invalid: null
464
+ };
465
+ return {
466
+ on: fallback,
467
+ invalid: v === "" ? null : env ?? null
468
+ };
469
+ }
470
+ const FOLLOWING = { held: null };
471
+ const bottomTop = (content, viewport) => Math.max(0, content - viewport);
472
+ /** The first content row shown. A held top past the end (the terminal grew) is clamped. */
473
+ function viewTop(s, content, viewport) {
474
+ const bottom = bottomTop(content, viewport);
475
+ return s.held === null ? bottom : Math.min(Math.max(0, s.held), bottom);
476
+ }
477
+ /** Content rows below the viewport. */
478
+ function linesBelow(s, content, viewport) {
479
+ return bottomTop(content, viewport) - viewTop(s, content, viewport);
480
+ }
481
+ /** Scrolls by `delta` rows (negative is up). Reaching the bottom follows again. */
482
+ function scrollBy(s, delta, content, viewport) {
483
+ const bottom = bottomTop(content, viewport);
484
+ const top = Math.min(Math.max(0, viewTop(s, content, viewport) + delta), bottom);
485
+ return top >= bottom ? FOLLOWING : { held: top };
486
+ }
487
+ /** A PgUp/PgDn step: a viewport less one row of overlap, never under one. */
488
+ function pageStep(viewport) {
489
+ return Math.max(1, viewport - 1);
490
+ }
491
+
451
492
  //#endregion
452
493
  //#region src/history.ts
453
494
  /**
@@ -564,7 +605,16 @@ function resolveKey(state, key, registry) {
564
605
  const spec = keySpecOf(key);
565
606
  const focused = state.overlay === null ? void 0 : registry.panels.get(`${state.overlay.module}/${state.overlay.panel}`);
566
607
  const live = (focused?.def.confirm?.length ?? 0) > 0 || focused?.def.submit !== void 0;
567
- if (spec === null) return state.menu === null && state.overlay !== null && !live ? { kind: "ignore" } : { kind: "edit" };
608
+ const takesText = (text) => state.overlay !== null && !live && focused?.def.text !== void 0 ? {
609
+ kind: "panel-text",
610
+ module: state.overlay.module,
611
+ panel: state.overlay.panel,
612
+ text
613
+ } : null;
614
+ if (spec === null) {
615
+ if (state.menu !== null || state.overlay === null || live) return { kind: "edit" };
616
+ return takesText(key.input) ?? { kind: "ignore" };
617
+ }
568
618
  if (spec === "ctrl+c") return { kind: "exit-chord" };
569
619
  if (state.menu !== null) {
570
620
  if (spec === "up") return {
@@ -606,7 +656,7 @@ function resolveKey(state, key, registry) {
606
656
  module: g.module,
607
657
  key: spec
608
658
  };
609
- if (!live) return { kind: "ignore" };
659
+ if (!live) return ([...spec].length === 1 ? takesText(key.input) : null) ?? { kind: "ignore" };
610
660
  if (spec === "enter") {
611
661
  const armed = focused?.def.confirm?.find((c) => c.key === state.armed);
612
662
  return armed === void 0 ? { kind: "submit" } : {
@@ -623,6 +673,20 @@ function resolveKey(state, key, registry) {
623
673
  module: global.module,
624
674
  key: spec
625
675
  };
676
+ if (state.viewport !== void 0 && state.overlay === null) {
677
+ if (spec === "pageup") return {
678
+ kind: "scroll",
679
+ act: "page-up"
680
+ };
681
+ if (spec === "pagedown") return {
682
+ kind: "scroll",
683
+ act: "page-down"
684
+ };
685
+ if (spec === "end" && state.viewport === "held") return {
686
+ kind: "scroll",
687
+ act: "bottom"
688
+ };
689
+ }
626
690
  if (spec === "escape") return state.draftEmpty ? { kind: "cancel-turn" } : { kind: "ignore" };
627
691
  if (spec === "up") return {
628
692
  kind: "history",
@@ -862,13 +926,23 @@ function reprintStart(heights, budget) {
862
926
  }
863
927
  return 0;
864
928
  }
929
+ /**
930
+ * DEC private mode 1007 ("alternate scroll"): off, a terminal stops turning the mouse wheel into
931
+ * Up/Down in the alternate screen, which would walk input history. No mouse reporting is enabled,
932
+ * so drag-select stays the terminal's.
933
+ */
934
+ const WHEEL_ARROWS_OFF = "\x1B[?1007l";
935
+ /** Restores 1007. shortcut: assumes it was on (most terminals' default; xterm's is off); query it with DECRQM if that bites. */
936
+ const WHEEL_ARROWS_ON = "\x1B[?1007h";
865
937
  /** The bytes {@link prepareTerminal} writes, in order. */
866
938
  function prepareSequence(rows, opts = {}) {
867
- return (groundSequence(opts.ground) ?? "") + (opts.clear === false ? "" : CLEAR_PANE) + (opts.anchor === false ? "" : anchorPadding(rows));
939
+ const ground = groundSequence(opts.ground) ?? "";
940
+ if (opts.fullscreen === true) return ground + WHEEL_ARROWS_OFF;
941
+ return ground + (opts.clear === false ? "" : CLEAR_PANE) + (opts.anchor === false ? "" : anchorPadding(rows));
868
942
  }
869
943
  /**
870
- * Ground, clear and anchor the terminal before `render`. Returns a restore function that puts the
871
- * terminal's background back. It is also registered on `exit`, and SIGHUP / SIGTERM / SIGINT exit
944
+ * Ground, clear and anchor the terminal before `render` (in full-screen: ground and the wheel).
945
+ * Returns a restore function that puts the terminal's background and wheel back. It is also registered on `exit`, and SIGHUP / SIGTERM / SIGINT exit
872
946
  * through it, since their default action kills the process with no `exit` event (under Ink's raw
873
947
  * mode ctrl+c is input, so SIGINT only arrives from outside: `kill -INT`, a supervisor, tmux).
874
948
  * A terminal left black is worse than any rendering bug. A no-op off a TTY.
@@ -876,12 +950,13 @@ function prepareSequence(rows, opts = {}) {
876
950
  function prepareTerminal(out, opts = {}, proc = process) {
877
951
  if (out.isTTY !== true) return () => {};
878
952
  out.write(prepareSequence(out.rows, opts));
879
- if (groundSequence(opts.ground) === null) return () => {};
953
+ const back = (groundSequence(opts.ground) === null ? "" : RESET_GROUND) + (opts.fullscreen === true ? WHEEL_ARROWS_ON : "");
954
+ if (back === "") return () => {};
880
955
  let restored = false;
881
956
  const restore = () => {
882
957
  if (restored) return;
883
958
  restored = true;
884
- out.write(RESET_GROUND);
959
+ out.write(back);
885
960
  };
886
961
  proc.once("exit", restore);
887
962
  proc.once("SIGHUP", () => proc.exit(129));
@@ -994,6 +1069,138 @@ function dropGaps(t) {
994
1069
  };
995
1070
  }
996
1071
 
1072
+ //#endregion
1073
+ //#region src/list-pager-state.ts
1074
+ const listStep = (list, hooks) => ({
1075
+ kind: "list",
1076
+ list,
1077
+ hooks,
1078
+ page: 0,
1079
+ cursor: 0,
1080
+ filter: "",
1081
+ filtering: false,
1082
+ size: 1
1083
+ });
1084
+ let tokens = 0;
1085
+ const fresh = () => {
1086
+ tokens += 1;
1087
+ return tokens;
1088
+ };
1089
+ const pagerAt = (list, hooks) => ({
1090
+ steps: [listStep(list, hooks)],
1091
+ token: fresh()
1092
+ });
1093
+ const top = (s) => s.steps[s.steps.length - 1];
1094
+ const withTop = (s, step) => ({
1095
+ ...s,
1096
+ steps: [...s.steps.slice(0, -1), step]
1097
+ });
1098
+ const onList = (s, fn) => {
1099
+ const t = top(s);
1100
+ return t?.kind === "list" ? withTop(s, fn(t)) : s;
1101
+ };
1102
+ const push = (s, step) => ({
1103
+ steps: [...s.steps, step],
1104
+ token: fresh()
1105
+ });
1106
+ /** Where the cursor's row falls at page size `per`, whatever size it was last moved with. */
1107
+ function placement(l, per) {
1108
+ const at = l.page * l.size + l.cursor;
1109
+ return {
1110
+ page: Math.floor(at / per),
1111
+ cursor: at % per
1112
+ };
1113
+ }
1114
+ /** The list's rows as the filter leaves them. */
1115
+ const visibleRows = (l) => filterRows(l.list.rows, l.filter);
1116
+ /** The highlighted row, or the open detail's row; undefined when the filter matches nothing. */
1117
+ function cursorRow(s) {
1118
+ const t = top(s);
1119
+ if (t === void 0) return void 0;
1120
+ if (t.kind !== "list") return t.row;
1121
+ return visibleRows(t)[t.page * t.size + t.cursor];
1122
+ }
1123
+ /** ↑↓: one row, walking onto the next or previous page at an edge; stops at either end. */
1124
+ function move(s, delta, pageSize) {
1125
+ return onList(s, (l) => {
1126
+ const n = visibleRows(l).length;
1127
+ if (n === 0) return {
1128
+ ...l,
1129
+ size: pageSize
1130
+ };
1131
+ const at = Math.min(Math.max(0, l.page * l.size + l.cursor + delta), n - 1);
1132
+ return {
1133
+ ...l,
1134
+ page: Math.floor(at / pageSize),
1135
+ cursor: at % pageSize,
1136
+ size: pageSize
1137
+ };
1138
+ });
1139
+ }
1140
+ /** ←→: a page, the cursor on its first row; stays on the first or last page. */
1141
+ function turn(s, delta, pageSize) {
1142
+ return onList(s, (l) => {
1143
+ const pages = Math.max(1, Math.ceil(visibleRows(l).length / pageSize));
1144
+ const { page } = placement(l, pageSize);
1145
+ return {
1146
+ ...l,
1147
+ page: Math.min(Math.max(0, page + delta), pages - 1),
1148
+ cursor: 0,
1149
+ size: pageSize
1150
+ };
1151
+ });
1152
+ }
1153
+ const startFilter = (s) => onList(s, (l) => ({
1154
+ ...l,
1155
+ filtering: true
1156
+ }));
1157
+ /** While filtering: the character joins the filter, and the list starts again from its top. */
1158
+ const typeChar = (s, ch) => onList(s, (l) => l.filtering ? {
1159
+ ...l,
1160
+ filter: l.filter + ch,
1161
+ page: 0,
1162
+ cursor: 0
1163
+ } : l);
1164
+ const backspace = (s) => onList(s, (l) => l.filtering ? {
1165
+ ...l,
1166
+ filter: [...l.filter].slice(0, -1).join(""),
1167
+ page: 0,
1168
+ cursor: 0
1169
+ } : l);
1170
+ /** Enter while filtering: keep the filter, stop typing into it. */
1171
+ const endFilter = (s) => onList(s, (l) => ({
1172
+ ...l,
1173
+ filtering: false
1174
+ }));
1175
+ /**
1176
+ * Esc: filtering → the filter cleared; a detail or a related list → the step before it, where it
1177
+ * was left; the first list with a filter kept → the filter cleared; otherwise undefined (close).
1178
+ */
1179
+ function back(s) {
1180
+ const t = top(s);
1181
+ if (t === void 0) return void 0;
1182
+ if (t.kind === "list" && (t.filtering || t.filter !== "")) return withTop(s, {
1183
+ ...t,
1184
+ filter: "",
1185
+ filtering: false,
1186
+ page: 0,
1187
+ cursor: 0
1188
+ });
1189
+ if (s.steps.length > 1) return {
1190
+ steps: s.steps.slice(0, -1),
1191
+ token: fresh()
1192
+ };
1193
+ }
1194
+ /** ↑↓ on a detail: scroll between 0 and `maxScroll`. */
1195
+ function scrollDetail(s, delta, maxScroll) {
1196
+ const t = top(s);
1197
+ if (t?.kind !== "detail") return s;
1198
+ return withTop(s, {
1199
+ ...t,
1200
+ scroll: Math.min(Math.max(0, t.scroll + delta), Math.max(0, maxScroll))
1201
+ });
1202
+ }
1203
+
997
1204
  //#endregion
998
1205
  //#region src/module.ts
999
1206
  const MODULE_ID = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)*$/;
@@ -1033,4 +1240,4 @@ function setPanel(o, kind, next) {
1033
1240
  }
1034
1241
 
1035
1242
  //#endregion
1036
- export { maskDraft as $, completeDraft as A, EMPTY_HISTORY as B, reprintStart as C, MENU_NAME_WIDTH as D, unavailableReason as E, paletteQuery as F, walk as G, mayWalk as H, paletteRows as I, EMPTY_DRAFT as J, CTRL_C_WINDOW_MS as K, parseCommandLine as L, menuWindow as M, moveSelection as N, clampSelection as O, paletteMatches as P, insertChunk as Q, keySpecOf as R, reflowSequence as S, routeInput as T, remember as U, HISTORY_MAX as V, settle as W, editKey as X, atEnd as Y, graphemeAt as Z, anchorPadding as _, answerEntry as a, RESERVED_GLOBAL_KEYS as at, prepareSequence as b, dropGaps as c, normaliseKeySpec as ct, markedFlights as d, pasteToLine as et, sendTurn as f, RESET_GROUND as g, REPRINT_LINES as h, addGap as i, CompositionError as it, enterRuns as j, commandUsage as k, emptyTranscript as l, applySuggestion as lt, DEFAULT_GROUND as m, setPanel as n, wordRight as nt, arriveTurn as o, assertComposes as ot, CLEAR_PANE as p, ctrlC as q, defineModule as r, applyInput as rt, commitEntry as s, composeModules as st, panelOf as t, wordLeft as tt, heldAsks as u, mergeCompletions as ut, groundSequence as v, sanitise as w, prepareTerminal as x, liveShrink as y, resolveKey as z };
1243
+ export { parseCommandLine as $, RESET_GROUND as A, normaliseKeySpec as At, sanitise as B, emptyTranscript as C, wordLeft as Ct, CLEAR_PANE as D, RESERVED_GLOBAL_KEYS as Dt, sendTurn as E, CompositionError as Et, liveShrink as F, commandUsage as G, unavailableReason as H, prepareSequence as I, menuWindow as J, completeDraft as K, prepareTerminal as L, WHEEL_ARROWS_ON as M, mergeCompletions as Mt, anchorPadding as N, DEFAULT_GROUND as O, assertComposes as Ot, groundSequence as P, paletteRows as Q, reflowSequence as R, dropGaps as S, pasteToLine as St, markedFlights as T, applyInput as Tt, MENU_NAME_WIDTH as U, routeInput as V, clampSelection as W, paletteMatches as X, moveSelection as Y, paletteQuery as Z, visibleRows as _, atEnd as _t, backspace as a, remember as at, arriveTurn as b, insertChunk as bt, listStep as c, FOLLOWING as ct, placement as d, resolveFullscreen as dt, keySpecOf as et, push as f, scrollBy as ft, typeChar as g, EMPTY_DRAFT as gt, turn as h, ctrlC as ht, back as i, mayWalk as it, WHEEL_ARROWS_OFF as j, applySuggestion as jt, REPRINT_LINES as k, composeModules as kt, move as l, linesBelow as lt, startFilter as m, CTRL_C_WINDOW_MS as mt, setPanel as n, EMPTY_HISTORY as nt, cursorRow as o, settle as ot, scrollDetail as p, viewTop as pt, enterRuns as q, defineModule as r, HISTORY_MAX as rt, endFilter as s, walk as st, panelOf as t, resolveKey as tt, pagerAt as u, pageStep as ut, addGap as v, editKey as vt, heldAsks as w, wordRight as wt, commitEntry as x, maskDraft as xt, answerEntry as y, graphemeAt as yt, reprintStart as z };
package/dist/pure.d.ts CHANGED
@@ -3,14 +3,16 @@ export { applySuggestion, mergeCompletions } from './complete.js';
3
3
  export { assertComposes, CompositionError, composeModules, RESERVED_GLOBAL_KEYS, type Registry } from './compose.js';
4
4
  export { atEnd, type Draft, type EditKeys, EMPTY_DRAFT, editKey, insertChunk, maskDraft, pasteToLine, wordLeft, wordRight } from './editor.js';
5
5
  export { CTRL_C_WINDOW_MS, ctrlC } from './exit-chord.js';
6
+ export { FOLLOWING, linesBelow, pageStep, resolveFullscreen, type Scroll, scrollBy, viewTop } from './fullscreen.js';
6
7
  export { EMPTY_HISTORY, HISTORY_MAX, type HistoryState, mayWalk, remember, settle, walk } from './history.js';
7
8
  export { normaliseKeySpec } from './key-spec.js';
8
9
  export { type KeyState, keySpecOf, type Route, resolveKey } from './keys.js';
10
+ export { back, backspace, cursorRow, type DetailStep, endFilter, type ListDetail, type ListHooks, type ListStep, listStep, move, type PagerState, pagerAt, placement, push, type RelatedLoadingStep, type Step, scrollDetail, startFilter, turn, typeChar, visibleRows } from './list-pager-state.js';
9
11
  export { type ArgSpec, type Armed, type Chip, type CommandSpec, type Completer, type ConfirmBinding, defineModule, type GlobalBinding, type Key, type KeySpec, type ModuleCtx, type ModuleSpec, type PanelDef, type PresenceSpec, type RailItem, type Renderer, type Reply, type Size, type SubmitOptions, type Suggestion, type TuiEvents, type TuiModule, type TurnContext, type TurnHandler, type TurnPhase, type TurnUpdate } from './module.js';
10
12
  export { type Overlay, panelOf, setPanel } from './overlay.js';
11
13
  export { clampSelection, commandUsage, completeDraft, enterRuns, MENU_NAME_WIDTH, menuWindow, moveSelection, type PaletteRow, paletteMatches, paletteQuery, paletteRows, parseCommandLine } from './palette.js';
12
14
  export { type InputRoute, routeInput } from './route-input.js';
13
15
  export { sanitise } from './sanitise.js';
14
- export { anchorPadding, CLEAR_PANE, DEFAULT_GROUND, groundSequence, type LiveMeasure, liveShrink, type PrepareTerminalOptions, prepareSequence, prepareTerminal, RESET_GROUND, reflowSequence, type TerminalOut, type TerminalProcess } from './terminal.js';
16
+ export { anchorPadding, CLEAR_PANE, DEFAULT_GROUND, groundSequence, type LiveMeasure, liveShrink, type PrepareTerminalOptions, prepareSequence, prepareTerminal, RESET_GROUND, reflowSequence, type TerminalOut, type TerminalProcess, WHEEL_ARROWS_OFF, WHEEL_ARROWS_ON } from './terminal.js';
15
17
  export { type AnswerEntry, type AppEntry, type AskEntry, addGap, answerEntry, arriveTurn, commitEntry, type Entry, emptyTranscript, type Flight, type GapEntry, heldAsks, markedFlights, type NoteEntry, sendTurn, type Transcript } from './transcript.js';
16
18
  //# sourceMappingURL=pure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pure.d.ts","sourceRoot":"","sources":["../src/pure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,EACL,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,WAAW,EACX,OAAO,EACP,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,WAAW,EACX,KAAK,YAAY,EACjB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,IAAI,EACL,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,KAAK,QAAQ,EAAE,SAAS,EAAE,KAAK,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,aAAa,EACb,KAAK,UAAU,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,cAAc,EACd,KAAK,WAAW,EAChB,UAAU,EACV,KAAK,sBAAsB,EAC3B,eAAe,EACf,eAAe,EACf,YAAY,EACZ,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,MAAM,EACN,WAAW,EACX,UAAU,EACV,WAAW,EACX,KAAK,KAAK,EACV,eAAe,EACf,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,QAAQ,EACR,aAAa,EACb,KAAK,SAAS,EACd,QAAQ,EACR,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"pure.d.ts","sourceRoot":"","sources":["../src/pure.ts"],"names":[],"mappings":"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"}
package/dist/pure.js CHANGED
@@ -1,3 +1,3 @@
1
- import { $ as maskDraft, A as completeDraft, B as EMPTY_HISTORY, D as MENU_NAME_WIDTH, F as paletteQuery, G as walk, H as mayWalk, I as paletteRows, J as EMPTY_DRAFT, K as CTRL_C_WINDOW_MS, L as parseCommandLine, M as menuWindow, N as moveSelection, O as clampSelection, P as paletteMatches, Q as insertChunk, R as keySpecOf, S as reflowSequence, T as routeInput, U as remember, V as HISTORY_MAX, W as settle, X as editKey, Y as atEnd, _ as anchorPadding, a as answerEntry, at as RESERVED_GLOBAL_KEYS, b as prepareSequence, ct as normaliseKeySpec, d as markedFlights, et as pasteToLine, f as sendTurn, g as RESET_GROUND, i as addGap, it as CompositionError, j as enterRuns, k as commandUsage, l as emptyTranscript, lt as applySuggestion, m as DEFAULT_GROUND, n as setPanel, nt as wordRight, o as arriveTurn, ot as assertComposes, p as CLEAR_PANE, q as ctrlC, r as defineModule, rt as applyInput, s as commitEntry, st as composeModules, t as panelOf, tt as wordLeft, u as heldAsks, ut as mergeCompletions, v as groundSequence, w as sanitise, x as prepareTerminal, y as liveShrink, z as resolveKey } from "./overlay-DMjCbsaC.js";
1
+ import { $ as parseCommandLine, A as RESET_GROUND, At as normaliseKeySpec, B as sanitise, C as emptyTranscript, Ct as wordLeft, D as CLEAR_PANE, Dt as RESERVED_GLOBAL_KEYS, E as sendTurn, Et as CompositionError, F as liveShrink, G as commandUsage, I as prepareSequence, J as menuWindow, K as completeDraft, L as prepareTerminal, M as WHEEL_ARROWS_ON, Mt as mergeCompletions, N as anchorPadding, O as DEFAULT_GROUND, Ot as assertComposes, P as groundSequence, Q as paletteRows, R as reflowSequence, St as pasteToLine, T as markedFlights, Tt as applyInput, U as MENU_NAME_WIDTH, V as routeInput, W as clampSelection, X as paletteMatches, Y as moveSelection, Z as paletteQuery, _ as visibleRows, _t as atEnd, a as backspace, at as remember, b as arriveTurn, bt as insertChunk, c as listStep, ct as FOLLOWING, d as placement, dt as resolveFullscreen, et as keySpecOf, f as push, ft as scrollBy, g as typeChar, gt as EMPTY_DRAFT, h as turn, ht as ctrlC, i as back, it as mayWalk, j as WHEEL_ARROWS_OFF, jt as applySuggestion, kt as composeModules, l as move, lt as linesBelow, m as startFilter, mt as CTRL_C_WINDOW_MS, n as setPanel, nt as EMPTY_HISTORY, o as cursorRow, ot as settle, p as scrollDetail, pt as viewTop, q as enterRuns, r as defineModule, rt as HISTORY_MAX, s as endFilter, st as walk, t as panelOf, tt as resolveKey, u as pagerAt, ut as pageStep, v as addGap, vt as editKey, w as heldAsks, wt as wordRight, x as commitEntry, xt as maskDraft, y as answerEntry } from "./overlay-5s8slC38.js";
2
2
 
3
- export { CLEAR_PANE, CTRL_C_WINDOW_MS, CompositionError, DEFAULT_GROUND, EMPTY_DRAFT, EMPTY_HISTORY, HISTORY_MAX, MENU_NAME_WIDTH, RESERVED_GLOBAL_KEYS, RESET_GROUND, addGap, anchorPadding, answerEntry, applyInput, applySuggestion, arriveTurn, assertComposes, atEnd, clampSelection, commandUsage, commitEntry, completeDraft, composeModules, ctrlC, defineModule, editKey, emptyTranscript, enterRuns, groundSequence, heldAsks, insertChunk, keySpecOf, liveShrink, markedFlights, maskDraft, mayWalk, menuWindow, mergeCompletions, moveSelection, normaliseKeySpec, paletteMatches, paletteQuery, paletteRows, panelOf, parseCommandLine, pasteToLine, prepareSequence, prepareTerminal, reflowSequence, remember, resolveKey, routeInput, sanitise, sendTurn, setPanel, settle, walk, wordLeft, wordRight };
3
+ export { CLEAR_PANE, CTRL_C_WINDOW_MS, CompositionError, DEFAULT_GROUND, EMPTY_DRAFT, EMPTY_HISTORY, FOLLOWING, HISTORY_MAX, MENU_NAME_WIDTH, RESERVED_GLOBAL_KEYS, RESET_GROUND, WHEEL_ARROWS_OFF, WHEEL_ARROWS_ON, addGap, anchorPadding, answerEntry, applyInput, applySuggestion, arriveTurn, assertComposes, atEnd, back, backspace, clampSelection, commandUsage, commitEntry, completeDraft, composeModules, ctrlC, cursorRow, defineModule, editKey, emptyTranscript, endFilter, enterRuns, groundSequence, heldAsks, insertChunk, keySpecOf, linesBelow, listStep, liveShrink, markedFlights, maskDraft, mayWalk, menuWindow, mergeCompletions, move, moveSelection, normaliseKeySpec, pageStep, pagerAt, paletteMatches, paletteQuery, paletteRows, panelOf, parseCommandLine, pasteToLine, placement, prepareSequence, prepareTerminal, push, reflowSequence, remember, resolveFullscreen, resolveKey, routeInput, sanitise, scrollBy, scrollDetail, sendTurn, setPanel, settle, startFilter, turn, typeChar, viewTop, visibleRows, walk, wordLeft, wordRight };
@@ -48,6 +48,14 @@ export declare const REPRINT_LINES = 1000;
48
48
  * fit `budget` lines, and always the newest one, however tall.
49
49
  */
50
50
  export declare function reprintStart(heights: readonly number[], budget: number): number;
51
+ /**
52
+ * DEC private mode 1007 ("alternate scroll"): off, a terminal stops turning the mouse wheel into
53
+ * Up/Down in the alternate screen, which would walk input history. No mouse reporting is enabled,
54
+ * so drag-select stays the terminal's.
55
+ */
56
+ export declare const WHEEL_ARROWS_OFF = "\u001B[?1007l";
57
+ /** Restores 1007. shortcut: assumes it was on (most terminals' default; xterm's is off); query it with DECRQM if that bites. */
58
+ export declare const WHEEL_ARROWS_ON = "\u001B[?1007h";
51
59
  export interface PrepareTerminalOptions {
52
60
  /** `#rrggbb`, or `none` to leave the background alone. Default {@link DEFAULT_GROUND}. */
53
61
  readonly ground?: string | undefined;
@@ -55,6 +63,8 @@ export interface PrepareTerminalOptions {
55
63
  readonly clear?: boolean;
56
64
  /** Bottom-anchor the input. Default true. */
57
65
  readonly anchor?: boolean;
66
+ /** Full-screen: turn the wheel's arrow keys off (restored on exit), and never clear or anchor. */
67
+ readonly fullscreen?: boolean;
58
68
  }
59
69
  export interface TerminalOut {
60
70
  readonly isTTY?: boolean;
@@ -70,8 +80,8 @@ export interface TerminalProcess {
70
80
  exit(code: number): never;
71
81
  }
72
82
  /**
73
- * Ground, clear and anchor the terminal before `render`. Returns a restore function that puts the
74
- * terminal's background back. It is also registered on `exit`, and SIGHUP / SIGTERM / SIGINT exit
83
+ * Ground, clear and anchor the terminal before `render` (in full-screen: ground and the wheel).
84
+ * Returns a restore function that puts the terminal's background and wheel back. It is also registered on `exit`, and SIGHUP / SIGTERM / SIGINT exit
75
85
  * through it, since their default action kills the process with no `exit` event (under Ink's raw
76
86
  * mode ctrl+c is input, so SIGINT only arrives from outside: `kill -INT`, a supervisor, tmux).
77
87
  * A terminal left black is worse than any rendering bug. A no-op off a TTY.