semajsx 0.8.0 → 0.9.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/{client-BrupjhG0.mjs → client-CEJQ4fit.mjs} +3 -3
- package/dist/{client-BrupjhG0.mjs.map → client-CEJQ4fit.mjs.map} +1 -1
- package/dist/{document-DsiJO2jG.mjs → document-Cbz4084O.mjs} +2 -2
- package/dist/{document-XKyAs62C.mjs → document-Cfdhi7vG.mjs} +2 -2
- package/dist/{document-XKyAs62C.mjs.map → document-Cfdhi7vG.mjs.map} +1 -1
- package/dist/dom/index.mjs +2 -2
- package/dist/dom/jsx-dev-runtime.mjs +1 -1
- package/dist/dom/jsx-runtime.mjs +1 -1
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{jsx-runtime-Dc77fsnM.d.mts → jsx-runtime-tdaY-P9K.d.mts} +2 -2
- package/dist/{jsx-runtime-Dc77fsnM.d.mts.map → jsx-runtime-tdaY-P9K.d.mts.map} +1 -1
- package/dist/{lucide-Ddt_N9dJ.mjs → lucide-DWk3itzO.mjs} +3 -3
- package/dist/{lucide-Ddt_N9dJ.mjs.map → lucide-DWk3itzO.mjs.map} +1 -1
- package/dist/{resource-pm7qP-jV.mjs → resource-BU0Po0ez.mjs} +2 -2
- package/dist/{resource-pm7qP-jV.mjs.map → resource-BU0Po0ez.mjs.map} +1 -1
- package/dist/{src-Cv4rRVzv.mjs → src--YS4EvMz.mjs} +9 -6
- package/dist/src--YS4EvMz.mjs.map +1 -0
- package/dist/{src-CXY-7FC3.mjs → src-77V1Plyd.mjs} +665 -129
- package/dist/src-77V1Plyd.mjs.map +1 -0
- package/dist/{src-SqJ6k7Xv.mjs → src-BTG08Qnh.mjs} +4 -4
- package/dist/{src-SqJ6k7Xv.mjs.map → src-BTG08Qnh.mjs.map} +1 -1
- package/dist/{src-C_aFsFJ3.mjs → src-Cm12Y2XV.mjs} +2 -2
- package/dist/{src-C_aFsFJ3.mjs.map → src-Cm12Y2XV.mjs.map} +1 -1
- package/dist/{src-CAyv9Uf9.mjs → src-Mucdq4zw.mjs} +6 -6
- package/dist/{src-CAyv9Uf9.mjs.map → src-Mucdq4zw.mjs.map} +1 -1
- package/dist/ssg/index.mjs +6 -6
- package/dist/ssg/plugins/docs-theme.mjs +9 -9
- package/dist/ssg/plugins/lucide.mjs +3 -3
- package/dist/ssr/client.mjs +4 -4
- package/dist/ssr/index.mjs +5 -5
- package/dist/terminal/index.d.mts +248 -4
- package/dist/terminal/index.d.mts.map +1 -1
- package/dist/terminal/index.mjs +3 -3
- package/dist/terminal/jsx-dev-runtime.d.mts +2 -2
- package/dist/terminal/jsx-dev-runtime.mjs +1 -1
- package/dist/terminal/jsx-runtime.d.mts +2 -2
- package/dist/terminal/jsx-runtime.mjs +1 -1
- package/dist/{types-Bj5q5x2Q.d.mts → types-Bm8rZGKW.d.mts} +2 -2
- package/dist/{types-Bj5q5x2Q.d.mts.map → types-Bm8rZGKW.d.mts.map} +1 -1
- package/package.json +1 -1
- package/dist/src-CXY-7FC3.mjs.map +0 -1
- package/dist/src-Cv4rRVzv.mjs.map +0 -1
package/dist/ssg/index.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import "../src
|
|
1
|
+
import "../src--YS4EvMz.mjs";
|
|
2
2
|
import "../src-DV9uwtE5.mjs";
|
|
3
3
|
import "../jsx-runtime-BFs1c0xz.mjs";
|
|
4
|
-
import "../src-
|
|
4
|
+
import "../src-77V1Plyd.mjs";
|
|
5
5
|
import "../jsx-runtime-kv_6vBiR.mjs";
|
|
6
|
-
import "../resource-
|
|
7
|
-
import "../src-
|
|
8
|
-
import "../document-
|
|
9
|
-
import { _ as DefaultDocument, a as remoteSource, c as FileSource, d as defineCollection, f as SSG, g as RawHTML, h as createMDXProcessor, i as RemoteSource, l as fileSource, m as MDXProcessor, n as CustomSource, o as GitSource, p as createSSG, r as createSource, s as gitSource, t as z, u as BaseSource } from "../src-
|
|
6
|
+
import "../resource-BU0Po0ez.mjs";
|
|
7
|
+
import "../src-Mucdq4zw.mjs";
|
|
8
|
+
import "../document-Cfdhi7vG.mjs";
|
|
9
|
+
import { _ as DefaultDocument, a as remoteSource, c as FileSource, d as defineCollection, f as SSG, g as RawHTML, h as createMDXProcessor, i as RemoteSource, l as fileSource, m as MDXProcessor, n as CustomSource, o as GitSource, p as createSSG, r as createSource, s as gitSource, t as z, u as BaseSource } from "../src-BTG08Qnh.mjs";
|
|
10
10
|
import { createRequire } from "node:module";
|
|
11
11
|
|
|
12
12
|
//#region rolldown:runtime
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { t as signal } from "../../signal-4PgGfydw.mjs";
|
|
2
2
|
import { n as unwrap } from "../../utils-BrGmTgfG.mjs";
|
|
3
|
-
import { a as jsxs, i as jsx, u as context, v as Fragment } from "../../src
|
|
4
|
-
import "../../src-
|
|
3
|
+
import { a as jsxs, i as jsx, u as context, v as Fragment } from "../../src--YS4EvMz.mjs";
|
|
4
|
+
import "../../src-Cm12Y2XV.mjs";
|
|
5
5
|
import { G as rules, K as classes, M as createTheme, N as defineTokens, W as rule } from "../../src-DV9uwtE5.mjs";
|
|
6
6
|
import "../../jsx-runtime-BFs1c0xz.mjs";
|
|
7
|
-
import "../../src-
|
|
7
|
+
import "../../src-77V1Plyd.mjs";
|
|
8
8
|
import "../../jsx-runtime-kv_6vBiR.mjs";
|
|
9
|
-
import { d as island } from "../../resource-
|
|
10
|
-
import "../../src-
|
|
11
|
-
import "../../document-
|
|
12
|
-
import "../../client-
|
|
13
|
-
import { d as defineCollection } from "../../src-
|
|
14
|
-
import { n as Icon, t as lucide } from "../../lucide-
|
|
9
|
+
import { d as island } from "../../resource-BU0Po0ez.mjs";
|
|
10
|
+
import "../../src-Mucdq4zw.mjs";
|
|
11
|
+
import "../../document-Cfdhi7vG.mjs";
|
|
12
|
+
import "../../client-CEJQ4fit.mjs";
|
|
13
|
+
import { d as defineCollection } from "../../src-BTG08Qnh.mjs";
|
|
14
|
+
import { n as Icon, t as lucide } from "../../lucide-DWk3itzO.mjs";
|
|
15
15
|
import { dirname, join } from "path";
|
|
16
16
|
import { mkdir, writeFile } from "fs/promises";
|
|
17
17
|
import { z } from "zod";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../../src
|
|
2
|
-
import "../../src-
|
|
1
|
+
import "../../src--YS4EvMz.mjs";
|
|
2
|
+
import "../../src-Cm12Y2XV.mjs";
|
|
3
3
|
import "../../src-DV9uwtE5.mjs";
|
|
4
4
|
import "../../jsx-runtime-BFs1c0xz.mjs";
|
|
5
|
-
import { n as Icon, t as lucide } from "../../lucide-
|
|
5
|
+
import { n as Icon, t as lucide } from "../../lucide-DWk3itzO.mjs";
|
|
6
6
|
|
|
7
7
|
export { Icon, lucide };
|
package/dist/ssr/client.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../src
|
|
2
|
-
import "../src-
|
|
1
|
+
import "../src--YS4EvMz.mjs";
|
|
2
|
+
import "../src-Cm12Y2XV.mjs";
|
|
3
3
|
import "../src-DV9uwtE5.mjs";
|
|
4
|
-
import { a as isLinkVNode, c as getIslandMetadata, d as island, i as isAssetVNode, l as isIslandComponent, n as LINK_MARKER, o as isStyleVNode, r as STYLE_MARKER, s as resource, t as ASSET_MARKER, u as isIslandVNode } from "../resource-
|
|
5
|
-
import { a as resolveCSS, c as getIslandInfo, d as hydrateAllIslands, f as hydrateIsland, h as markIslandHydrated, i as resolveAsset, l as hasIslands, m as hydrateIslands, n as getManifest, o as setManifest, p as hydrateIslandById, r as loadStylesheet, s as getIslandIds, t as clientResource, u as hydrate } from "../client-
|
|
4
|
+
import { a as isLinkVNode, c as getIslandMetadata, d as island, i as isAssetVNode, l as isIslandComponent, n as LINK_MARKER, o as isStyleVNode, r as STYLE_MARKER, s as resource, t as ASSET_MARKER, u as isIslandVNode } from "../resource-BU0Po0ez.mjs";
|
|
5
|
+
import { a as resolveCSS, c as getIslandInfo, d as hydrateAllIslands, f as hydrateIsland, h as markIslandHydrated, i as resolveAsset, l as hasIslands, m as hydrateIslands, n as getManifest, o as setManifest, p as hydrateIslandById, r as loadStylesheet, s as getIslandIds, t as clientResource, u as hydrate } from "../client-CEJQ4fit.mjs";
|
|
6
6
|
|
|
7
7
|
export { ASSET_MARKER, LINK_MARKER, STYLE_MARKER, clientResource, getIslandIds, getIslandInfo, getIslandMetadata, getManifest, hasIslands, hydrate, hydrateAllIslands, hydrateIsland, hydrateIslandById, hydrateIslands, isAssetVNode, isIslandComponent, isIslandVNode, isLinkVNode, isStyleVNode, island, loadStylesheet, markIslandHydrated, resolveAsset, resolveCSS, resource, setManifest };
|
package/dist/ssr/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import "../src
|
|
1
|
+
import "../src--YS4EvMz.mjs";
|
|
2
2
|
import "../src-DV9uwtE5.mjs";
|
|
3
3
|
import "../jsx-runtime-BFs1c0xz.mjs";
|
|
4
|
-
import "../src-
|
|
4
|
+
import "../src-77V1Plyd.mjs";
|
|
5
5
|
import "../jsx-runtime-kv_6vBiR.mjs";
|
|
6
|
-
import { n as LINK_MARKER, r as STYLE_MARKER, s as resource, t as ASSET_MARKER } from "../resource-
|
|
7
|
-
import { a as ViteIslandBuilder, c as renderToString, i as createViteRouter, n as createIslandCollector, o as createViteIslandBuilder, r as ViteRouter, s as createApp, t as IslandCollector } from "../src-
|
|
8
|
-
import { n as renderDocument, t as DefaultDocument } from "../document-
|
|
6
|
+
import { n as LINK_MARKER, r as STYLE_MARKER, s as resource, t as ASSET_MARKER } from "../resource-BU0Po0ez.mjs";
|
|
7
|
+
import { a as ViteIslandBuilder, c as renderToString, i as createViteRouter, n as createIslandCollector, o as createViteIslandBuilder, r as ViteRouter, s as createApp, t as IslandCollector } from "../src-Mucdq4zw.mjs";
|
|
8
|
+
import { n as renderDocument, t as DefaultDocument } from "../document-Cfdhi7vG.mjs";
|
|
9
9
|
|
|
10
10
|
export { ASSET_MARKER, DefaultDocument, IslandCollector, LINK_MARKER, STYLE_MARKER, ViteIslandBuilder, ViteRouter, createApp, createIslandCollector, createViteIslandBuilder, createViteRouter, renderDocument, renderToString, resource };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c as JSXNode, d as VNode } from "../types-C83YtOen.mjs";
|
|
2
2
|
import { n as stream, r as when, t as resource } from "../helpers-C8GKdDrJ.mjs";
|
|
3
|
-
import { r as Signal } from "../types-CVPg8ByY.mjs";
|
|
4
|
-
import { a as TerminalText, i as TerminalStyle, n as TerminalNode, r as TerminalRoot, t as TerminalElement } from "../types-
|
|
3
|
+
import { n as ReadableSignal, r as Signal } from "../types-CVPg8ByY.mjs";
|
|
4
|
+
import { a as TerminalText, i as TerminalStyle, n as TerminalNode, r as TerminalRoot, t as TerminalElement } from "../types-Bm8rZGKW.mjs";
|
|
5
5
|
import { ChalkInstance } from "chalk";
|
|
6
6
|
|
|
7
7
|
//#region ../terminal/src/renderer.d.ts
|
|
@@ -13,9 +13,14 @@ declare class TerminalRenderer {
|
|
|
13
13
|
private buffer;
|
|
14
14
|
private previousOutput;
|
|
15
15
|
private lastOutputHeight;
|
|
16
|
-
private
|
|
16
|
+
private resizeHandler;
|
|
17
|
+
private resizeCallback;
|
|
17
18
|
constructor(stream?: NodeJS.WriteStream);
|
|
18
19
|
/**
|
|
20
|
+
* Set a callback to be called on terminal resize (triggers re-render).
|
|
21
|
+
*/
|
|
22
|
+
setResizeCallback(callback: (() => void) | null): void;
|
|
23
|
+
/**
|
|
19
24
|
* Get the root node
|
|
20
25
|
*/
|
|
21
26
|
getRoot(): TerminalRoot;
|
|
@@ -324,6 +329,131 @@ declare function BlankLine({
|
|
|
324
329
|
count
|
|
325
330
|
}: BlankLineProps): JSXNode;
|
|
326
331
|
//#endregion
|
|
332
|
+
//#region ../terminal/src/components/Spinner.d.ts
|
|
333
|
+
/**
|
|
334
|
+
* Built-in spinner frame sets
|
|
335
|
+
*/
|
|
336
|
+
declare const spinnerFrames: {
|
|
337
|
+
readonly dots: {
|
|
338
|
+
readonly frames: readonly ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
339
|
+
readonly interval: 80;
|
|
340
|
+
};
|
|
341
|
+
readonly line: {
|
|
342
|
+
readonly frames: readonly ["-", "\\", "|", "/"];
|
|
343
|
+
readonly interval: 130;
|
|
344
|
+
};
|
|
345
|
+
readonly arc: {
|
|
346
|
+
readonly frames: readonly ["◜", "◠", "◝", "◞", "◡", "◟"];
|
|
347
|
+
readonly interval: 100;
|
|
348
|
+
};
|
|
349
|
+
readonly bouncingBar: {
|
|
350
|
+
readonly frames: readonly ["[ ]", "[= ]", "[== ]", "[=== ]", "[ ===]", "[ ==]", "[ =]", "[ ]"];
|
|
351
|
+
readonly interval: 80;
|
|
352
|
+
};
|
|
353
|
+
};
|
|
354
|
+
type SpinnerType = keyof typeof spinnerFrames;
|
|
355
|
+
interface SpinnerProps {
|
|
356
|
+
/**
|
|
357
|
+
* Spinner type or custom frames array
|
|
358
|
+
* @default "dots"
|
|
359
|
+
*/
|
|
360
|
+
type?: SpinnerType;
|
|
361
|
+
/**
|
|
362
|
+
* Custom frames (overrides type)
|
|
363
|
+
*/
|
|
364
|
+
frames?: string[];
|
|
365
|
+
/**
|
|
366
|
+
* Interval in ms between frames
|
|
367
|
+
* @default depends on type
|
|
368
|
+
*/
|
|
369
|
+
interval?: number;
|
|
370
|
+
/**
|
|
371
|
+
* Label to display after the spinner
|
|
372
|
+
*/
|
|
373
|
+
label?: string;
|
|
374
|
+
/**
|
|
375
|
+
* Color of the spinner
|
|
376
|
+
*/
|
|
377
|
+
color?: string;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Spinner component - animated loading indicator for terminal UIs.
|
|
381
|
+
*
|
|
382
|
+
* @example
|
|
383
|
+
* ```tsx
|
|
384
|
+
* <Spinner />
|
|
385
|
+
* <Spinner type="line" label="Loading..." />
|
|
386
|
+
* <Spinner frames={["🌑", "🌒", "🌓", "🌔", "🌕"]} interval={150} />
|
|
387
|
+
* ```
|
|
388
|
+
*/
|
|
389
|
+
declare function Spinner({
|
|
390
|
+
type,
|
|
391
|
+
frames: customFrames,
|
|
392
|
+
interval: customInterval,
|
|
393
|
+
label,
|
|
394
|
+
color
|
|
395
|
+
}: SpinnerProps): JSXNode;
|
|
396
|
+
//#endregion
|
|
397
|
+
//#region ../terminal/src/components/MultiSelect.d.ts
|
|
398
|
+
/**
|
|
399
|
+
* An option in the MultiSelect component
|
|
400
|
+
*/
|
|
401
|
+
interface MultiSelectOption {
|
|
402
|
+
/** Display label */
|
|
403
|
+
label: string;
|
|
404
|
+
/** Value returned on selection */
|
|
405
|
+
value: string;
|
|
406
|
+
}
|
|
407
|
+
interface MultiSelectProps {
|
|
408
|
+
/** Available options */
|
|
409
|
+
options: MultiSelectOption[];
|
|
410
|
+
/** Callback when user confirms selection (Enter) */
|
|
411
|
+
onConfirm: (selected: string[]) => void;
|
|
412
|
+
/** Callback when user cancels (Escape) */
|
|
413
|
+
onCancel?: () => void;
|
|
414
|
+
/** Optional title */
|
|
415
|
+
title?: string;
|
|
416
|
+
/** Indicator for focused item */
|
|
417
|
+
indicator?: string;
|
|
418
|
+
/** Indicator for selected item */
|
|
419
|
+
selectedIndicator?: string;
|
|
420
|
+
/** Indicator for unselected item */
|
|
421
|
+
unselectedIndicator?: string;
|
|
422
|
+
/** Color for the focused item */
|
|
423
|
+
focusColor?: string;
|
|
424
|
+
/** Color for selected items */
|
|
425
|
+
selectedColor?: string;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* MultiSelect component - interactive multi-selection menu.
|
|
429
|
+
*
|
|
430
|
+
* Navigate with arrow keys, toggle with Space, confirm with Enter, cancel with Escape.
|
|
431
|
+
*
|
|
432
|
+
* @example
|
|
433
|
+
* ```tsx
|
|
434
|
+
* <MultiSelect
|
|
435
|
+
* title="Select frameworks:"
|
|
436
|
+
* options={[
|
|
437
|
+
* { label: "React", value: "react" },
|
|
438
|
+
* { label: "Vue", value: "vue" },
|
|
439
|
+
* { label: "Svelte", value: "svelte" },
|
|
440
|
+
* ]}
|
|
441
|
+
* onConfirm={(selected) => console.log("Selected:", selected)}
|
|
442
|
+
* />
|
|
443
|
+
* ```
|
|
444
|
+
*/
|
|
445
|
+
declare function MultiSelect({
|
|
446
|
+
options,
|
|
447
|
+
onConfirm,
|
|
448
|
+
onCancel,
|
|
449
|
+
title,
|
|
450
|
+
indicator,
|
|
451
|
+
selectedIndicator,
|
|
452
|
+
unselectedIndicator,
|
|
453
|
+
focusColor,
|
|
454
|
+
selectedColor
|
|
455
|
+
}: MultiSelectProps): JSXNode;
|
|
456
|
+
//#endregion
|
|
327
457
|
//#region ../terminal/src/utils/colors.d.ts
|
|
328
458
|
/**
|
|
329
459
|
* Get a chalk color function by name
|
|
@@ -334,5 +464,119 @@ declare function getChalkColor(colorName: string): ChalkInstance;
|
|
|
334
464
|
*/
|
|
335
465
|
declare function getChalkBgColor(colorName: string): ChalkInstance;
|
|
336
466
|
//#endregion
|
|
337
|
-
|
|
467
|
+
//#region ../terminal/src/keyboard.d.ts
|
|
468
|
+
/**
|
|
469
|
+
* Represents a parsed keyboard event
|
|
470
|
+
*/
|
|
471
|
+
interface KeyEvent {
|
|
472
|
+
/** The raw character or key name */
|
|
473
|
+
key: string;
|
|
474
|
+
/** Whether Ctrl was held */
|
|
475
|
+
ctrl: boolean;
|
|
476
|
+
/** Whether Shift was held (inferred from uppercase for letters) */
|
|
477
|
+
shift: boolean;
|
|
478
|
+
/** Whether Meta/Alt was held */
|
|
479
|
+
meta: boolean;
|
|
480
|
+
/** The raw input string from stdin */
|
|
481
|
+
raw: string;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Keyboard handler callback
|
|
485
|
+
*/
|
|
486
|
+
type KeyHandler = (event: KeyEvent) => void;
|
|
487
|
+
/**
|
|
488
|
+
* Parse raw stdin data into a KeyEvent
|
|
489
|
+
*/
|
|
490
|
+
declare function parseKeyEvent(data: Buffer): KeyEvent;
|
|
491
|
+
/**
|
|
492
|
+
* Subscribe to keyboard events with a callback.
|
|
493
|
+
* Returns an unsubscribe function.
|
|
494
|
+
*
|
|
495
|
+
* @example
|
|
496
|
+
* ```tsx
|
|
497
|
+
* const unsub = onKeypress((event) => {
|
|
498
|
+
* if (event.key === "up") moveUp();
|
|
499
|
+
* if (event.key === "down") moveDown();
|
|
500
|
+
* if (event.key === "return") confirm();
|
|
501
|
+
* });
|
|
502
|
+
*
|
|
503
|
+
* // Later: unsub();
|
|
504
|
+
* ```
|
|
505
|
+
*/
|
|
506
|
+
declare function onKeypress(handler: KeyHandler): () => void;
|
|
507
|
+
/**
|
|
508
|
+
* Get a readonly signal of the last keypress event.
|
|
509
|
+
* Useful for reactive UIs that need to respond to any key.
|
|
510
|
+
*
|
|
511
|
+
* @example
|
|
512
|
+
* ```tsx
|
|
513
|
+
* const lastKey = useKeypress();
|
|
514
|
+
* // lastKey.value is null initially, then updated on each keypress
|
|
515
|
+
* ```
|
|
516
|
+
*/
|
|
517
|
+
declare function useKeypress(): ReadableSignal<KeyEvent | null>;
|
|
518
|
+
//#endregion
|
|
519
|
+
//#region ../terminal/src/hooks.d.ts
|
|
520
|
+
/**
|
|
521
|
+
* Programmatic exit hook - allows components to trigger unmount.
|
|
522
|
+
*
|
|
523
|
+
* Returns a function that, when called, unmounts the terminal app
|
|
524
|
+
* (equivalent to pressing Ctrl+C).
|
|
525
|
+
*
|
|
526
|
+
* @example
|
|
527
|
+
* ```tsx
|
|
528
|
+
* function App() {
|
|
529
|
+
* const exit = useExit();
|
|
530
|
+
*
|
|
531
|
+
* onKeypress((event) => {
|
|
532
|
+
* if (event.key === "q") exit();
|
|
533
|
+
* });
|
|
534
|
+
*
|
|
535
|
+
* return <text>Press q to quit</text>;
|
|
536
|
+
* }
|
|
537
|
+
* ```
|
|
538
|
+
*/
|
|
539
|
+
declare function useExit(): () => void;
|
|
540
|
+
/**
|
|
541
|
+
* Check whether stdin raw mode is supported and/or active.
|
|
542
|
+
*
|
|
543
|
+
* Useful for graceful degradation in non-TTY environments (CI, pipes).
|
|
544
|
+
*
|
|
545
|
+
* @example
|
|
546
|
+
* ```tsx
|
|
547
|
+
* const { supported, active } = isRawModeSupported();
|
|
548
|
+
* if (!supported) {
|
|
549
|
+
* print(<text>Interactive mode not available</text>);
|
|
550
|
+
* }
|
|
551
|
+
* ```
|
|
552
|
+
*/
|
|
553
|
+
declare function isRawModeSupported(): {
|
|
554
|
+
supported: boolean;
|
|
555
|
+
active: boolean;
|
|
556
|
+
};
|
|
557
|
+
//#endregion
|
|
558
|
+
//#region ../terminal/src/lifecycle.d.ts
|
|
559
|
+
/**
|
|
560
|
+
* Register a cleanup callback that will run when the component unmounts.
|
|
561
|
+
*
|
|
562
|
+
* When called during component rendering, the callback is attached to
|
|
563
|
+
* the component's RenderedNode and runs when that component is unmounted
|
|
564
|
+
* (including via conditional rendering with when()/signal).
|
|
565
|
+
*
|
|
566
|
+
* When called outside component rendering (e.g., in render setup code),
|
|
567
|
+
* falls back to the global session cleanup list.
|
|
568
|
+
*
|
|
569
|
+
* @example
|
|
570
|
+
* ```tsx
|
|
571
|
+
* function Timer() {
|
|
572
|
+
* const elapsed = signal(0);
|
|
573
|
+
* const timer = setInterval(() => { elapsed.value++ }, 1000);
|
|
574
|
+
* onCleanup(() => clearInterval(timer));
|
|
575
|
+
* return <text>Elapsed: {elapsed}s</text>;
|
|
576
|
+
* }
|
|
577
|
+
* ```
|
|
578
|
+
*/
|
|
579
|
+
declare function onCleanup(fn: () => void): void;
|
|
580
|
+
//#endregion
|
|
581
|
+
export { BlankLine, BlankLineProps, ExitHint, ExitHintProps, type KeyEvent, type KeyHandler, MultiSelect, MultiSelectOption, MultiSelectProps, type PrintOptions, type RenderOptions, type RenderResult, Spinner, SpinnerProps, SpinnerType, type TerminalElement, type TerminalNode, TerminalRenderer, type TerminalStyle, type TerminalText, appendChild, applyStyle, collectText, createComment, createElement, createTextNode, getChalkBgColor, getChalkColor, getNextSibling, getParent, insertBefore, isRawModeSupported, markNodeAsDirty, onCleanup, onKeypress, parseKeyEvent, print, removeChild, render, renderBackground, renderBorder, renderTextElement, renderTextNode, replaceNode, resource, setProperty, setSignalProperty, setText, spinnerFrames, stream, useExit, useKeypress, when };
|
|
338
582
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../terminal/src/renderer.ts","../../../terminal/src/render.ts","../../../terminal/src/operations.ts","../../../terminal/src/properties.ts","../../../terminal/src/rendering/box.ts","../../../terminal/src/rendering/text.ts","../../../terminal/src/components/ExitHint.tsx","../../../terminal/src/components/BlankLine.tsx","../../../terminal/src/utils/colors.ts"],"mappings":";;;;;;;;;;cAUa,gBAAA;EAAA,QACH,IAAA;EAAA,QACA,MAAA;EAAA,QACA,cAAA;EAAA,QACA,gBAAA;EAAA,QACA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../terminal/src/renderer.ts","../../../terminal/src/render.ts","../../../terminal/src/operations.ts","../../../terminal/src/properties.ts","../../../terminal/src/rendering/box.ts","../../../terminal/src/rendering/text.ts","../../../terminal/src/components/ExitHint.tsx","../../../terminal/src/components/BlankLine.tsx","../../../terminal/src/components/Spinner.tsx","../../../terminal/src/components/MultiSelect.tsx","../../../terminal/src/utils/colors.ts","../../../terminal/src/keyboard.ts","../../../terminal/src/hooks.ts","../../../terminal/src/lifecycle.ts"],"mappings":"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"}
|
package/dist/terminal/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as when, o as resource, s as stream } from "../src
|
|
2
|
-
import { C as
|
|
1
|
+
import { c as when, o as resource, s as stream } from "../src--YS4EvMz.mjs";
|
|
2
|
+
import { A as replaceNode, C as createElement, D as insertBefore, E as getParent, F as getChalkColor, M as renderBackground, N as renderBorder, O as markNodeAsDirty, P as getChalkBgColor, S as createComment, T as getNextSibling, _ as renderTextElement, a as ExitHint, b as applyStyle, c as onCleanup, d as onKeypress, f as parseKeyEvent, g as TerminalRenderer, h as setSignalProperty, i as BlankLine, j as setText, k as removeChild, l as isRawModeSupported, m as setProperty, n as Spinner, o as print, p as useKeypress, r as spinnerFrames, s as render, t as MultiSelect, u as useExit, v as renderTextNode, w as createTextNode, x as collectText, y as appendChild } from "../src-77V1Plyd.mjs";
|
|
3
3
|
import "../jsx-runtime-kv_6vBiR.mjs";
|
|
4
4
|
|
|
5
|
-
export { BlankLine, ExitHint, TerminalRenderer, appendChild, applyStyle, collectText, createComment, createElement, createTextNode, getChalkBgColor, getChalkColor, getNextSibling, getParent, insertBefore, markNodeAsDirty, print, removeChild, render, renderBackground, renderBorder, renderTextElement, renderTextNode, replaceNode, resource, setProperty, setSignalProperty, setText, stream, when };
|
|
5
|
+
export { BlankLine, ExitHint, MultiSelect, Spinner, TerminalRenderer, appendChild, applyStyle, collectText, createComment, createElement, createTextNode, getChalkBgColor, getChalkColor, getNextSibling, getParent, insertBefore, isRawModeSupported, markNodeAsDirty, onCleanup, onKeypress, parseKeyEvent, print, removeChild, render, renderBackground, renderBorder, renderTextElement, renderTextNode, replaceNode, resource, setProperty, setSignalProperty, setText, spinnerFrames, stream, useExit, useKeypress, when };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { s as Fragment } from "../types-C83YtOen.mjs";
|
|
2
2
|
import { n as jsxs, t as jsx } from "../jsx-CFnuxPMI.mjs";
|
|
3
|
-
import "../types-
|
|
4
|
-
import { i as TextAttributes, n as JSX, r as TerminalAttributes, t as BoxAttributes } from "../jsx-runtime-
|
|
3
|
+
import "../types-Bm8rZGKW.mjs";
|
|
4
|
+
import { i as TextAttributes, n as JSX, r as TerminalAttributes, t as BoxAttributes } from "../jsx-runtime-tdaY-P9K.mjs";
|
|
5
5
|
|
|
6
6
|
//#region ../terminal/src/jsx-dev-runtime.d.ts
|
|
7
7
|
declare function jsxDEV(type: any, props: any, key?: any, _isStaticChildren?: boolean, _source?: any, _self?: any): any;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { s as Fragment } from "../types-C83YtOen.mjs";
|
|
2
2
|
import { n as jsxs, t as jsx } from "../jsx-CFnuxPMI.mjs";
|
|
3
|
-
import "../types-
|
|
4
|
-
import { i as TextAttributes, n as JSX, r as TerminalAttributes, t as BoxAttributes } from "../jsx-runtime-
|
|
3
|
+
import "../types-Bm8rZGKW.mjs";
|
|
4
|
+
import { i as TextAttributes, n as JSX, r as TerminalAttributes, t as BoxAttributes } from "../jsx-runtime-tdaY-P9K.mjs";
|
|
5
5
|
export { BoxAttributes, Fragment, JSX, TerminalAttributes, TextAttributes, jsx, jsxs };
|
|
@@ -66,7 +66,7 @@ interface TerminalElement extends TerminalNodeBase {
|
|
|
66
66
|
type: "element";
|
|
67
67
|
tagName: string;
|
|
68
68
|
style: TerminalStyle;
|
|
69
|
-
props: Record<string,
|
|
69
|
+
props: Record<string, unknown>;
|
|
70
70
|
}
|
|
71
71
|
/**
|
|
72
72
|
* Terminal text node
|
|
@@ -88,4 +88,4 @@ interface TerminalRoot extends TerminalNodeBase {
|
|
|
88
88
|
type TerminalNode = TerminalElement | TerminalText | TerminalRoot;
|
|
89
89
|
//#endregion
|
|
90
90
|
export { TerminalText as a, TerminalStyle as i, TerminalNode as n, TerminalRoot as r, TerminalElement as t };
|
|
91
|
-
//# sourceMappingURL=types-
|
|
91
|
+
//# sourceMappingURL=types-Bm8rZGKW.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-Bm8rZGKW.d.mts","names":[],"sources":["../../terminal/src/types.ts"],"mappings":";;;KAEY,YAAA,GAAe,UAAA,QAAkB,IAAA,CAAK,IAAA,CAAK,MAAA;;AAAvD;;KAKY,gBAAA;;;;UAKK,aAAA;EACf,aAAA;EACA,cAAA;EACA,UAAA;EACA,QAAA;EACA,UAAA;EACA,SAAA;EACA,KAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA;EACA,SAAA;EACA,MAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,YAAA;EACA,YAAA;EACA,WAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,aAAA;EACA,aAAA;EACA,YAAA;EACA,MAAA;EACA,WAAA;EACA,KAAA;EACA,eAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,aAAA;EACA,GAAA;AAAA;;;;UAMe,gBAAA;EACf,IAAA,EAAM,gBAAA;EACN,QAAA,GAAW,YAAA;EACX,MAAA,EAAQ,YAAA;EACR,QAAA,EAAU,YAAA;EACV,CAAA;EACA,CAAA;EACA,KAAA;EACA,MAAA;AAAA;AARF;;;AAAA,UAciB,eAAA,SAAwB,gBAAA;EACvC,IAAA;EACA,OAAA;EACA,KAAA,EAAO,aAAA;EACP,KAAA,EAAO,MAAA;AAAA;;;;UAMQ,YAAA,SAAqB,gBAAA;EACpC,IAAA;EACA,OAAA;AAAA;;;;UAMe,YAAA,SAAqB,gBAAA;EACpC,IAAA;EACA,MAAA,EAAQ,MAAA,CAAO,WAAA;AAAA;AApBjB;;;AAAA,KA0BY,YAAA,GAAe,eAAA,GAAkB,YAAA,GAAe,YAAA"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"src-CXY-7FC3.mjs","names":[],"sources":["../../terminal/src/utils/colors.ts","../../terminal/src/rendering/box.ts","../../terminal/src/operations.ts","../../terminal/src/rendering/text.ts","../../terminal/src/renderer.ts","../../terminal/src/properties.ts","../../terminal/src/components/ExitHint.tsx","../../terminal/src/render.ts","../../terminal/src/components/BlankLine.tsx"],"sourcesContent":["import chalk, { type ChalkInstance } from \"chalk\";\n\n/**\n * Get a chalk color function by name\n */\nexport function getChalkColor(colorName: string): ChalkInstance {\n const colors: Record<string, ChalkInstance> = {\n black: chalk.black,\n red: chalk.red,\n green: chalk.green,\n yellow: chalk.yellow,\n blue: chalk.blue,\n magenta: chalk.magenta,\n cyan: chalk.cyan,\n white: chalk.white,\n gray: chalk.gray,\n grey: chalk.grey,\n blackBright: chalk.blackBright,\n redBright: chalk.redBright,\n greenBright: chalk.greenBright,\n yellowBright: chalk.yellowBright,\n blueBright: chalk.blueBright,\n magentaBright: chalk.magentaBright,\n cyanBright: chalk.cyanBright,\n whiteBright: chalk.whiteBright,\n };\n return colors[colorName] || chalk;\n}\n\n/**\n * Get a chalk background color function by name\n */\nexport function getChalkBgColor(colorName: string): ChalkInstance {\n const bgColors: Record<string, ChalkInstance> = {\n black: chalk.bgBlack,\n red: chalk.bgRed,\n green: chalk.bgGreen,\n yellow: chalk.bgYellow,\n blue: chalk.bgBlue,\n magenta: chalk.bgMagenta,\n cyan: chalk.bgCyan,\n white: chalk.bgWhite,\n gray: chalk.bgGray,\n grey: chalk.bgGrey,\n blackBright: chalk.bgBlackBright,\n redBright: chalk.bgRedBright,\n greenBright: chalk.bgGreenBright,\n yellowBright: chalk.bgYellowBright,\n blueBright: chalk.bgBlueBright,\n magentaBright: chalk.bgMagentaBright,\n cyanBright: chalk.bgCyanBright,\n whiteBright: chalk.bgWhiteBright,\n };\n return bgColors[colorName] || chalk;\n}\n","import chalk from \"chalk\";\nimport cliBoxes from \"cli-boxes\";\nimport type { TerminalElement } from \"../types\";\nimport { getChalkColor, getChalkBgColor } from \"../utils/colors\";\n\n/**\n * Render a border around an element\n */\nexport function renderBorder(\n node: TerminalElement,\n writeAt: (x: number, y: number, text: string) => void,\n): void {\n const { style, x = 0, y = 0, width = 0, height = 0 } = node;\n const boxStyle = style.border || \"single\";\n\n if (boxStyle === \"none\") return;\n\n const box = cliBoxes[boxStyle] || cliBoxes.single;\n let borderChar = chalk;\n\n if (style.borderColor) {\n borderChar = getChalkColor(style.borderColor);\n }\n\n // Top border\n const topLine = borderChar(box.topLeft + box.top.repeat(Math.max(0, width - 2)) + box.topRight);\n writeAt(x, y, topLine);\n\n // Side borders with spacing\n for (let i = 1; i < height - 1; i++) {\n // Render left border, middle spaces, and right border as a single line\n const middleSpaces = \" \".repeat(Math.max(0, width - 2));\n const sideLine = borderChar(box.left) + middleSpaces + borderChar(box.right);\n writeAt(x, y + i, sideLine);\n }\n\n // Bottom border\n if (height > 1) {\n const bottomLine = borderChar(\n box.bottomLeft + box.bottom.repeat(Math.max(0, width - 2)) + box.bottomRight,\n );\n writeAt(x, y + height - 1, bottomLine);\n }\n}\n\n/**\n * Render background color\n */\nexport function renderBackground(\n node: TerminalElement,\n writeAt: (x: number, y: number, text: string) => void,\n): void {\n const { style, x = 0, y = 0, width = 0, height = 0 } = node;\n\n if (!style.backgroundColor) return;\n\n const bg = getChalkBgColor(style.backgroundColor);\n\n for (let i = 0; i < height; i++) {\n const line = bg(\" \".repeat(width));\n writeAt(x, y + i, line);\n }\n}\n","import Yoga from \"yoga-layout-prebuilt\";\nimport stringWidth from \"string-width\";\nimport wrapAnsi from \"wrap-ansi\";\nimport type { TerminalNode, TerminalElement, TerminalText, TerminalStyle } from \"./types\";\n\n/**\n * Create a terminal element\n */\nexport function createElement(tagName: string): TerminalElement {\n const yogaNode = Yoga.Node.create();\n\n const element: TerminalElement = {\n type: \"element\",\n tagName,\n style: {},\n props: {},\n yogaNode,\n parent: null,\n children: [],\n };\n\n // Set measure function for text containers\n // Text elements need to measure their text content\n if (tagName === \"text\") {\n yogaNode.setMeasureFunc(measureTextNode.bind(null, element));\n }\n\n return element;\n}\n\n/**\n * Create a terminal text node\n * Text nodes don't have yoga nodes - they are pure data containers\n */\nexport function createTextNode(text: string): TerminalText {\n return {\n type: \"text\",\n content: text,\n yogaNode: undefined,\n parent: null,\n children: [],\n };\n}\n\n/**\n * Create a comment (no-op in terminal, returns text node)\n */\nexport function createComment(_text: string): TerminalText {\n return createTextNode(\"\");\n}\n\n/**\n * Append a child to a parent node\n */\nexport function appendChild(parent: TerminalNode, child: TerminalNode): void {\n if (child.parent) {\n removeChild(child);\n }\n\n child.parent = parent;\n parent.children.push(child);\n\n if (parent.yogaNode && child.yogaNode) {\n parent.yogaNode.insertChild(child.yogaNode, parent.yogaNode.getChildCount());\n }\n}\n\n/**\n * Remove a child from its parent\n */\nexport function removeChild(node: TerminalNode): void {\n if (!node.parent) return;\n\n const parent = node.parent;\n const index = parent.children.indexOf(node);\n\n if (index !== -1) {\n parent.children.splice(index, 1);\n\n if (parent.yogaNode && node.yogaNode) {\n parent.yogaNode.removeChild(node.yogaNode);\n }\n }\n\n node.parent = null;\n}\n\n/**\n * Insert a node before another node\n */\nexport function insertBefore(\n parent: TerminalNode,\n newNode: TerminalNode,\n refNode: TerminalNode | null,\n): void {\n if (newNode.parent) {\n removeChild(newNode);\n }\n\n newNode.parent = parent;\n\n if (!refNode) {\n appendChild(parent, newNode);\n return;\n }\n\n const index = parent.children.indexOf(refNode);\n if (index !== -1) {\n parent.children.splice(index, 0, newNode);\n\n if (parent.yogaNode && newNode.yogaNode) {\n parent.yogaNode.insertChild(newNode.yogaNode, index);\n }\n }\n}\n\n/**\n * Replace a node with another node\n */\nexport function replaceNode(oldNode: TerminalNode, newNode: TerminalNode): void {\n const parent = oldNode.parent;\n if (!parent) return;\n\n insertBefore(parent, newNode, oldNode);\n removeChild(oldNode);\n}\n\n/**\n * Set text content of a text node\n */\nexport function setText(node: TerminalNode, text: string): void {\n if (node.type === \"text\") {\n if (node.content === text) {\n return;\n }\n\n node.content = text;\n\n // Text nodes don't have yoga nodes, mark parent as dirty\n if (node.parent) {\n markNodeAsDirty(node.parent);\n }\n }\n}\n\n/**\n * Apply yoga layout styles\n */\nexport function applyStyle(element: TerminalElement, style: Partial<TerminalStyle>): void {\n const { yogaNode } = element;\n if (!yogaNode) return;\n\n element.style = { ...element.style, ...style };\n\n // Flexbox\n if (style.flexDirection) {\n const direction = {\n row: Yoga.FLEX_DIRECTION_ROW,\n column: Yoga.FLEX_DIRECTION_COLUMN,\n \"row-reverse\": Yoga.FLEX_DIRECTION_ROW_REVERSE,\n \"column-reverse\": Yoga.FLEX_DIRECTION_COLUMN_REVERSE,\n }[style.flexDirection];\n yogaNode.setFlexDirection(direction);\n }\n\n if (style.justifyContent) {\n const justify = {\n \"flex-start\": Yoga.JUSTIFY_FLEX_START,\n center: Yoga.JUSTIFY_CENTER,\n \"flex-end\": Yoga.JUSTIFY_FLEX_END,\n \"space-between\": Yoga.JUSTIFY_SPACE_BETWEEN,\n \"space-around\": Yoga.JUSTIFY_SPACE_AROUND,\n }[style.justifyContent];\n yogaNode.setJustifyContent(justify);\n }\n\n if (style.alignItems) {\n const align = {\n \"flex-start\": Yoga.ALIGN_FLEX_START,\n center: Yoga.ALIGN_CENTER,\n \"flex-end\": Yoga.ALIGN_FLEX_END,\n stretch: Yoga.ALIGN_STRETCH,\n }[style.alignItems];\n yogaNode.setAlignItems(align);\n }\n\n // Flex grow/shrink\n if (style.flexGrow !== undefined) {\n yogaNode.setFlexGrow(style.flexGrow);\n }\n if (style.flexShrink !== undefined) {\n yogaNode.setFlexShrink(style.flexShrink);\n }\n\n // Dimensions\n if (style.width !== undefined) {\n if (typeof style.width === \"number\") {\n yogaNode.setWidth(style.width);\n } else if (style.width === \"auto\") {\n yogaNode.setWidthAuto();\n } else if (style.width.endsWith(\"%\")) {\n yogaNode.setWidthPercent(parseFloat(style.width));\n }\n }\n\n if (style.height !== undefined) {\n if (typeof style.height === \"number\") {\n yogaNode.setHeight(style.height);\n } else if (style.height === \"auto\") {\n yogaNode.setHeightAuto();\n } else if (style.height.endsWith(\"%\")) {\n yogaNode.setHeightPercent(parseFloat(style.height));\n }\n }\n\n // Min/Max dimensions\n if (style.minWidth !== undefined) yogaNode.setMinWidth(style.minWidth);\n if (style.minHeight !== undefined) yogaNode.setMinHeight(style.minHeight);\n if (style.maxWidth !== undefined) yogaNode.setMaxWidth(style.maxWidth);\n if (style.maxHeight !== undefined) yogaNode.setMaxHeight(style.maxHeight);\n\n // Margin\n if (style.margin !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_ALL, style.margin);\n }\n // Logical properties (applied before specific edges so they can be overridden)\n if (style.marginInline !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_LEFT, style.marginInline);\n yogaNode.setMargin(Yoga.EDGE_RIGHT, style.marginInline);\n }\n if (style.marginBlock !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_TOP, style.marginBlock);\n yogaNode.setMargin(Yoga.EDGE_BOTTOM, style.marginBlock);\n }\n // Specific edges (override logical properties)\n if (style.marginLeft !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_LEFT, style.marginLeft);\n }\n if (style.marginRight !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_RIGHT, style.marginRight);\n }\n if (style.marginTop !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_TOP, style.marginTop);\n }\n if (style.marginBottom !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_BOTTOM, style.marginBottom);\n }\n\n // Padding\n if (style.padding !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_ALL, style.padding);\n }\n // Logical properties (applied before specific edges so they can be overridden)\n if (style.paddingInline !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_LEFT, style.paddingInline);\n yogaNode.setPadding(Yoga.EDGE_RIGHT, style.paddingInline);\n }\n if (style.paddingBlock !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_TOP, style.paddingBlock);\n yogaNode.setPadding(Yoga.EDGE_BOTTOM, style.paddingBlock);\n }\n // Specific edges (override logical properties)\n if (style.paddingLeft !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_LEFT, style.paddingLeft);\n }\n if (style.paddingRight !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_RIGHT, style.paddingRight);\n }\n if (style.paddingTop !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_TOP, style.paddingTop);\n }\n if (style.paddingBottom !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_BOTTOM, style.paddingBottom);\n }\n}\n\n/**\n * Recursively collect all text content from a node's children\n * Similar to Ink's squashTextNodes\n */\nexport function collectText(node: TerminalNode): string {\n if (node.type === \"text\") {\n return node.content;\n }\n\n let text = \"\";\n for (const child of node.children) {\n text += collectText(child);\n }\n\n return text;\n}\n\n/**\n * Measure text node for Yoga layout\n * This is called by Yoga when calculating layout\n */\nfunction measureTextNode(node: TerminalElement, width: number): { width: number; height: number } {\n // Collect all text from children\n const text = collectText(node);\n\n if (text.length === 0) {\n return { width: 0, height: 0 };\n }\n\n const textWidth = stringWidth(text);\n const lines = text.split(\"\\n\");\n const height = lines.length;\n\n // Text fits within width, no wrapping needed\n if (textWidth <= width) {\n return { width: textWidth, height };\n }\n\n // Edge case: Yoga asking if we can fit in <1px\n if (textWidth >= 1 && width > 0 && width < 1) {\n return { width: textWidth, height };\n }\n\n // Wrap text if it exceeds width\n const wrappedText = wrapAnsi(text, Math.floor(width), {\n hard: true,\n trim: false,\n });\n const wrappedLines = wrappedText.split(\"\\n\");\n const wrappedWidth = Math.max(...wrappedLines.map((line) => stringWidth(line)));\n\n return { width: wrappedWidth, height: wrappedLines.length };\n}\n\n/**\n * Mark a node and its ancestors as dirty for relayout\n */\nexport function markNodeAsDirty(node: TerminalNode): void {\n if (node.yogaNode) {\n node.yogaNode.markDirty();\n return;\n }\n\n // Walk up to find a yoga node\n if (node.parent) {\n markNodeAsDirty(node.parent);\n }\n}\n\n/**\n * Get the parent node of a node\n */\nexport function getParent(node: TerminalNode): TerminalNode | null {\n return node.parent;\n}\n\n/**\n * Get the next sibling of a node\n */\nexport function getNextSibling(node: TerminalNode): TerminalNode | null {\n const parent = node.parent;\n if (!parent) return null;\n\n const index = parent.children.indexOf(node);\n if (index === -1 || index === parent.children.length - 1) {\n return null;\n }\n\n return parent.children[index + 1] || null;\n}\n","import chalk from \"chalk\";\nimport stringWidth from \"string-width\";\nimport sliceAnsi from \"slice-ansi\";\nimport type { TerminalElement, TerminalText } from \"../types\";\nimport { collectText } from \"../operations\";\nimport { getChalkColor } from \"../utils/colors\";\n\n/**\n * Render a text node\n */\nexport function renderTextNode(\n node: TerminalText,\n writeAt: (x: number, y: number, text: string) => void,\n terminalWidth: number,\n): void {\n const { content, x = 0, y = 0, width = 0 } = node;\n\n let text = content;\n const maxWidth = width || terminalWidth - x;\n\n // Truncate if needed\n if (stringWidth(text) > maxWidth) {\n text = sliceAnsi(text, 0, maxWidth);\n }\n\n // Write to buffer at position\n writeAt(x, y, text);\n}\n\n/**\n * Render a text element (collects and styles all text content)\n */\nexport function renderTextElement(\n node: TerminalElement,\n writeAt: (x: number, y: number, text: string) => void,\n): void {\n const { style, x = 0, y = 0 } = node;\n\n const text = collectText(node);\n if (!text) return;\n\n // Apply text styling\n let styledText = text;\n if (style.color) {\n styledText = getChalkColor(style.color)(styledText);\n }\n if (style.bold) {\n styledText = chalk.bold(styledText);\n }\n if (style.italic) {\n styledText = chalk.italic(styledText);\n }\n if (style.underline) {\n styledText = chalk.underline(styledText);\n }\n if (style.strikethrough) {\n styledText = chalk.strikethrough(styledText);\n }\n if (style.dim) {\n styledText = chalk.dim(styledText);\n }\n\n writeAt(x, y, styledText);\n}\n","import Yoga from \"yoga-layout-prebuilt\";\nimport ansiEscapes from \"ansi-escapes\";\nimport stringWidth from \"string-width\";\nimport sliceAnsi from \"slice-ansi\";\nimport type { TerminalNode, TerminalElement, TerminalText, TerminalRoot } from \"./types\";\nimport { renderBorder, renderBackground, renderTextNode, renderTextElement } from \"./rendering\";\n\n/**\n * Terminal renderer instance\n */\nexport class TerminalRenderer {\n private root: TerminalRoot;\n private buffer: string[] = [];\n private previousOutput: string = \"\";\n private lastOutputHeight: number = 0;\n private wasRawMode: boolean = false;\n\n constructor(stream: NodeJS.WriteStream = process.stdout) {\n this.root = {\n type: \"root\",\n stream,\n parent: null,\n children: [],\n yogaNode: Yoga.Node.create(),\n };\n\n // Set root dimensions to terminal size\n const { columns, rows } = stream;\n if (this.root.yogaNode) {\n this.root.yogaNode.setWidth(columns || 80);\n this.root.yogaNode.setHeight(rows || 24);\n // Set default flexbox properties to prevent children from stretching\n this.root.yogaNode.setFlexDirection(Yoga.FLEX_DIRECTION_COLUMN);\n this.root.yogaNode.setAlignItems(Yoga.ALIGN_FLEX_START);\n }\n\n // Enable raw mode to prevent ^C from being displayed\n // Save the previous state so we can restore it\n if (process.stdin.isTTY && process.stdin.setRawMode) {\n this.wasRawMode = process.stdin.isRaw || false;\n if (!this.wasRawMode) {\n process.stdin.setRawMode(true);\n }\n }\n\n // Hide cursor for cleaner rendering\n this.root.stream.write(ansiEscapes.cursorHide);\n }\n\n /**\n * Get the root node\n */\n getRoot(): TerminalRoot {\n return this.root;\n }\n\n /**\n * Render the tree to terminal\n */\n render(): void {\n // Calculate layout\n if (this.root.yogaNode) {\n this.root.yogaNode.calculateLayout(\n this.root.stream.columns || 80,\n this.root.stream.rows || 24,\n Yoga.DIRECTION_LTR,\n );\n }\n\n // Update positions\n this.updatePositions(this.root, 0, 0);\n\n // Render to buffer\n this.buffer = [];\n const height = this.root.stream.rows || 24;\n for (let i = 0; i < height; i++) {\n this.buffer[i] = \"\";\n }\n\n // Render children\n for (const child of this.root.children) {\n this.renderNode(child);\n }\n\n // Output to terminal\n this.output();\n }\n\n /**\n * Update positions of nodes based on yoga layout\n */\n private updatePositions(node: TerminalNode, parentX: number, parentY: number): void {\n if (node.yogaNode) {\n node.x = Math.round(parentX + node.yogaNode.getComputedLeft());\n node.y = Math.round(parentY + node.yogaNode.getComputedTop());\n node.width = Math.round(node.yogaNode.getComputedWidth());\n node.height = Math.round(node.yogaNode.getComputedHeight());\n\n // If this element has a border, add border size to width/height\n // and offset children by 1 to account for border thickness\n let childOffsetX = node.x || 0;\n let childOffsetY = node.y || 0;\n\n if (node.type === \"element\" && node.style.border && node.style.border !== \"none\") {\n // Expand width and height to include border (1 char on each side)\n node.width += 2;\n node.height += 2;\n // Offset children by 1 to leave room for border\n childOffsetX += 1;\n childOffsetY += 1;\n }\n\n for (const child of node.children) {\n this.updatePositions(child, childOffsetX, childOffsetY);\n }\n } else {\n // Text nodes don't have yoga nodes - inherit parent position\n node.x = parentX;\n node.y = parentY;\n\n for (const child of node.children) {\n this.updatePositions(child, parentX, parentY);\n }\n }\n }\n\n /**\n * Render a single node\n */\n private renderNode(node: TerminalNode): void {\n if (node.type === \"text\") {\n this.renderText(node);\n } else if (node.type === \"element\") {\n this.renderElement(node);\n }\n }\n\n /**\n * Render a text node\n */\n private renderText(node: TerminalText): void {\n const { y = 0, x = 0 } = node;\n\n if (y >= this.buffer.length || x < 0) return;\n\n renderTextNode(node, this.writeAt.bind(this), this.root.stream.columns || 80);\n }\n\n /**\n * Render an element node\n */\n private renderElement(node: TerminalElement): void {\n const { style, tagName } = node;\n\n // Render border if specified\n if (style.border && style.border !== \"none\") {\n renderBorder(node, this.writeAt.bind(this));\n }\n\n // Render background\n if (style.backgroundColor) {\n renderBackground(node, this.writeAt.bind(this));\n }\n\n // For text elements, collect and render all text content at once\n if (tagName === \"text\") {\n renderTextElement(node, this.writeAt.bind(this));\n } else {\n // For other elements, render children normally\n for (const child of node.children) {\n this.renderNode(child);\n }\n }\n }\n\n /**\n * Write text at a specific position in the buffer\n */\n private writeAt(x: number, y: number, text: string): void {\n if (y < 0 || y >= this.buffer.length) return;\n\n const row = this.buffer[y] || \"\";\n const width = stringWidth(text);\n const rowWidth = stringWidth(row);\n\n // Pad row if needed\n if (rowWidth < x) {\n this.buffer[y] = row + \" \".repeat(x - rowWidth) + text;\n } else {\n // Replace characters at position\n this.buffer[y] = sliceAnsi(row, 0, x) + text + sliceAnsi(row, x + width);\n }\n }\n\n /**\n * Output the buffer to terminal\n */\n private output(): void {\n // Remove trailing empty lines from buffer (only output actual content)\n let lastNonEmptyIndex = -1;\n for (let i = this.buffer.length - 1; i >= 0; i--) {\n const line = this.buffer[i];\n if (line && line.trim() !== \"\") {\n lastNonEmptyIndex = i;\n break;\n }\n }\n\n // Get only the lines with content\n const contentLines = lastNonEmptyIndex >= 0 ? this.buffer.slice(0, lastNonEmptyIndex + 1) : [];\n const output = contentLines.join(\"\\n\");\n\n // Only update if changed\n if (output !== this.previousOutput) {\n // Erase previous output if there was any\n // eraseLines moves cursor up and erases, so we're ready to write at the start position\n if (this.lastOutputHeight > 0) {\n this.root.stream.write(ansiEscapes.eraseLines(this.lastOutputHeight));\n }\n\n // Write new output (cursor is already at the right position after eraseLines)\n this.root.stream.write(output);\n\n // Calculate and store output height (number of actual lines rendered)\n this.lastOutputHeight = contentLines.length;\n this.previousOutput = output;\n }\n }\n\n /**\n * Clear the rendered output\n */\n clear(): void {\n if (this.lastOutputHeight > 0) {\n this.root.stream.write(ansiEscapes.eraseLines(this.lastOutputHeight));\n this.lastOutputHeight = 0;\n }\n this.previousOutput = \"\";\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n // Final render to ensure latest state is shown\n this.render();\n\n // Move cursor to line after output\n this.root.stream.write(\"\\n\");\n\n // Show cursor again on cleanup\n this.root.stream.write(ansiEscapes.cursorShow);\n\n // Restore raw mode to previous state\n if (process.stdin.isTTY && process.stdin.setRawMode && !this.wasRawMode) {\n process.stdin.setRawMode(false);\n }\n\n // Free yoga layout\n if (this.root.yogaNode) {\n this.root.yogaNode.freeRecursive();\n }\n }\n}\n","import type { Signal } from \"@semajsx/signal\";\nimport type { TerminalNode, TerminalStyle } from \"./types\";\nimport { applyStyle } from \"./operations\";\n\n/**\n * Set a property on a terminal node\n */\nexport function setProperty(node: TerminalNode, key: string, value: unknown): void {\n if (node.type !== \"element\") return;\n\n // Handle style properties\n if (isStyleProperty(key)) {\n const styleUpdate: Partial<TerminalStyle> = { [key]: value };\n applyStyle(node, styleUpdate);\n return;\n }\n\n // Store other props\n node.props[key] = value;\n}\n\n/**\n * Set a signal property on a terminal node\n */\nexport function setSignalProperty<T = unknown>(\n node: TerminalNode,\n key: string,\n signal: Signal<T>,\n): () => void {\n // Set initial value\n setProperty(node, key, signal.value);\n\n // Subscribe to changes\n return signal.subscribe((value: T) => {\n setProperty(node, key, value);\n });\n}\n\n/**\n * Check if a property is a style property\n */\nfunction isStyleProperty(key: string): boolean {\n const styleProps = new Set([\n \"flexDirection\",\n \"justifyContent\",\n \"alignItems\",\n \"flexGrow\",\n \"flexShrink\",\n \"flexBasis\",\n \"width\",\n \"height\",\n \"minWidth\",\n \"minHeight\",\n \"maxWidth\",\n \"maxHeight\",\n \"margin\",\n \"marginLeft\",\n \"marginRight\",\n \"marginTop\",\n \"marginBottom\",\n \"marginInline\",\n \"marginBlock\",\n \"padding\",\n \"paddingLeft\",\n \"paddingRight\",\n \"paddingTop\",\n \"paddingBottom\",\n \"paddingInline\",\n \"paddingBlock\",\n \"border\",\n \"borderColor\",\n \"color\",\n \"backgroundColor\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"dim\",\n ]);\n\n return styleProps.has(key);\n}\n","/** @jsxImportSource @semajsx/terminal */\nimport { computed, signal, type WritableSignal } from \"@semajsx/signal\";\nimport { when, type JSXNode } from \"@semajsx/core\";\n\n/**\n * Global exiting signal for terminal rendering\n * Set to true during unmount to hide exit hints in final render\n */\nconst globalExitingSignal = signal(false);\n\n/**\n * Get the global exiting signal\n * Used internally by render() to coordinate with ExitHint component\n */\nexport function getExitingSignal(): WritableSignal<boolean> {\n return globalExitingSignal;\n}\n\n/**\n * Reset the exiting signal (useful for testing or multiple render cycles)\n */\nexport function resetExitingSignal(): void {\n globalExitingSignal.value = false;\n}\n\nexport interface ExitHintProps {\n /**\n * Content to show during normal rendering, hidden during exit\n * After normalization: single VNode, array of VNodes, or undefined\n */\n children?: JSXNode;\n}\n\n/**\n * ExitHint component - hides its children during the final render before exit\n *\n * This is useful for hiding \"Press Ctrl+C to exit\" messages in the final\n * terminal output, keeping only the actual content visible.\n *\n * The component automatically detects when unmount() is called and reactively\n * hides its children during the final render using signal-based reactivity.\n *\n * @example\n * ```tsx\n * render(\n * <box flexDirection=\"column\" padding={1}>\n * <text bold>Counter: {count}</text>\n *\n * <ExitHint>\n * <text dim marginTop={1} color=\"yellow\">\n * Press Ctrl+C or ESC to exit\n * </text>\n * </ExitHint>\n * </box>\n * );\n * ```\n *\n * Result after exit:\n * - The counter remains visible\n * - The exit hint is hidden from final output\n */\nexport function ExitHint({ children }: ExitHintProps): JSXNode {\n // Create inverted signal: show when NOT exiting\n const shouldShow = computed(globalExitingSignal, (isExiting) => !isExiting);\n\n // Return signal directly - renderComponent now handles Signal<VNode>\n return when(shouldShow, children);\n}\n","import type { VNode } from \"@semajsx/core\";\nimport { setProperty, setSignalProperty } from \"./properties\";\nimport {\n appendChild,\n createElement,\n createTextNode,\n createComment,\n removeChild,\n replaceNode,\n insertBefore,\n getParent,\n getNextSibling,\n} from \"./operations\";\nimport { TerminalRenderer } from \"./renderer\";\nimport type { TerminalNode } from \"./types\";\nimport { getExitingSignal, resetExitingSignal } from \"./components/ExitHint\";\nimport { type ContextMap } from \"@semajsx/core\";\nimport { createRenderer, type RenderStrategy } from \"@semajsx/core\";\n\n/**\n * Terminal-specific render strategy (no reuse optimization needed)\n */\nconst terminalStrategy: RenderStrategy<TerminalNode> = {\n createTextNode,\n createComment,\n createElement,\n getParent,\n getNextSibling,\n insertBefore,\n appendChild,\n removeChild,\n replaceNode,\n setProperty,\n setSignalProperty,\n // Terminal doesn't need tryReuseNode optimization\n};\n\n// Create terminal renderer\nconst { renderNode, cleanupSubscriptions } = createRenderer(terminalStrategy);\n\n/**\n * Options for terminal rendering\n */\nexport interface RenderOptions {\n /**\n * Custom renderer instance. If not provided, one will be created automatically.\n */\n renderer?: TerminalRenderer;\n /**\n * Whether to automatically re-render on signal changes.\n * @default true\n */\n autoRender?: boolean;\n /**\n * Target frames per second for auto-rendering.\n * @default 60\n */\n fps?: number;\n /**\n * Output stream to render to. Only used if renderer is not provided.\n * @default process.stdout\n */\n stream?: NodeJS.WriteStream;\n}\n\n/**\n * Return type for render function\n */\nexport interface RenderResult {\n /**\n * Re-render the tree (useful for manual updates)\n */\n rerender: () => void;\n /**\n * Unmount and cleanup\n */\n unmount: () => void;\n /**\n * Wait for all pending async operations\n */\n waitUntilExit: () => Promise<void>;\n}\n\n/**\n * Options for print function\n */\nexport interface PrintOptions {\n /**\n * Output stream to print to.\n * @default process.stdout\n */\n stream?: NodeJS.WriteStream;\n}\n\n/**\n * Render a VNode tree to the terminal\n * Supports sync VNodes, async VNodes (Promise), and streaming VNodes (AsyncIterableIterator)\n *\n * @example\n * // Simple usage (ink-style)\n * const { unmount } = render(<App />);\n *\n * @example\n * // With custom stream\n * render(<App />, { stream: process.stderr });\n *\n * @example\n * // Disable auto-rendering\n * const { rerender } = render(<App />, { autoRender: false });\n * setInterval(rerender, 100);\n *\n * @example\n * // With custom renderer\n * const renderer = new TerminalRenderer(process.stderr);\n * render(<App />, { renderer });\n *\n * @example\n * // Custom FPS\n * render(<App />, { fps: 30 });\n */\nexport function render(element: VNode, options: RenderOptions = {}): RenderResult {\n const { renderer, autoRender = true, fps = 60, stream: outputStream = process.stdout } = options;\n\n // Reset exiting signal for new render\n resetExitingSignal();\n\n // Auto-create renderer if not provided (ink-style API)\n const autoCreated = !renderer;\n const actualRenderer = renderer || new TerminalRenderer(outputStream);\n\n const root = actualRenderer.getRoot();\n\n // Initialize empty context map for root render\n const initialContext: ContextMap = new Map();\n\n const rendered = renderNode(element, initialContext);\n\n if (rendered.node) {\n appendChild(root, rendered.node);\n } else if (rendered.children.length > 0) {\n // Fragment case - append all fragment children\n for (const child of rendered.children) {\n if (child.node) {\n appendChild(root, child.node);\n }\n }\n }\n\n // Initial render\n actualRenderer.render();\n\n // Rendering lock to prevent overlapping renders (race condition fix)\n let isRendering = false;\n const safeRender = () => {\n if (isRendering) return;\n isRendering = true;\n try {\n actualRenderer.render();\n } finally {\n isRendering = false;\n }\n };\n\n // Auto re-render on signal changes (like ink)\n let renderInterval: NodeJS.Timeout | null = null;\n if (autoRender) {\n const interval = Math.floor(1000 / fps);\n renderInterval = setInterval(() => {\n safeRender();\n }, interval);\n }\n\n // Promise that resolves on exit\n let exitResolver: (() => void) | null = null;\n const exitPromise = new Promise<void>((resolve) => {\n exitResolver = resolve;\n });\n\n // Track original terminal state for cleanup\n const originalRawMode = process.stdin.isTTY && process.stdin.isRaw;\n let handleExit: (() => void) | null = null;\n let handleKeypress: ((data: Buffer) => void) | null = null;\n\n // Cleanup function to restore terminal state\n const cleanup = () => {\n // Stop auto-rendering\n if (renderInterval) {\n clearInterval(renderInterval);\n renderInterval = null;\n }\n\n // Remove event listeners\n if (handleExit) {\n process.removeListener(\"SIGINT\", handleExit);\n process.removeListener(\"SIGTERM\", handleExit);\n }\n if (handleKeypress) {\n process.stdin.removeListener(\"data\", handleKeypress);\n }\n\n // Restore original terminal state\n if (process.stdin.isTTY && process.stdin.setRawMode) {\n try {\n process.stdin.setRawMode(originalRawMode || false);\n } catch {\n // Terminal may already be closed, ignore error\n }\n }\n\n // Clean up subscriptions only (preserve output on exit)\n cleanupSubscriptions(rendered);\n actualRenderer.destroy();\n\n if (exitResolver) {\n exitResolver();\n }\n };\n\n // Unmount function\n const unmount = () => {\n // Mark as exiting to hide ExitHint components\n getExitingSignal().value = true;\n\n // Trigger one final render to apply ExitHint changes\n // This removes exit prompts from the final output\n actualRenderer.render();\n\n cleanup();\n };\n\n // Handle Ctrl+C if auto-created\n if (autoCreated) {\n handleExit = () => {\n unmount();\n process.exit(0);\n };\n\n // Install signal handlers with error recovery\n try {\n process.on(\"SIGINT\", handleExit);\n process.on(\"SIGTERM\", handleExit);\n\n // Enable stdin for keyboard input\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n\n handleKeypress = (data: Buffer) => {\n const key = data.toString();\n // Ctrl+C or ESC to exit\n if (key === \"\\u0003\" || key === \"\\u001b\") {\n if (handleExit) {\n handleExit();\n }\n }\n };\n\n process.stdin.on(\"data\", handleKeypress);\n }\n } catch (err) {\n // If setup fails, clean up and rethrow\n cleanup();\n throw err;\n }\n }\n\n return {\n rerender: safeRender,\n unmount,\n waitUntilExit: () => exitPromise,\n };\n}\n\n/**\n * Print a VNode tree to the terminal once (no auto-rendering).\n * Supports sync VNodes, async VNodes (Promise), and streaming VNodes (AsyncIterableIterator)\n *\n * This is a convenience function for one-time rendering scenarios like:\n * - Server startup messages\n * - CLI output\n * - Static terminal displays\n *\n * Unlike `render()`, this function:\n * - Does not subscribe to signal changes\n * - Does not auto-render on updates\n * - Immediately outputs and cleans up\n * - Does not capture keyboard input\n *\n * @example\n * // Simple server output\n * print(\n * <box border=\"round\" borderColor=\"green\" padding={1}>\n * <text bold color=\"green\">Server started!</text>\n * <text>URL: http://localhost:3000</text>\n * </box>\n * );\n *\n * @example\n * // Print to stderr\n * print(<text color=\"red\">Error occurred</text>, { stream: process.stderr });\n *\n * @example\n * // Print a blank line\n * print();\n */\nexport function print(element?: VNode, options: PrintOptions = {}): void {\n const { stream: outputStream = process.stdout } = options;\n\n // If no element provided, just print a blank line\n if (element === undefined) {\n outputStream.write(\"\\n\");\n return;\n }\n\n // Save raw mode state\n const wasRawMode = process.stdin.isTTY && process.stdin.isRaw;\n\n // Create renderer\n const renderer = new TerminalRenderer(outputStream);\n const root = renderer.getRoot();\n\n // Initialize empty context map for root render\n const initialContext: ContextMap = new Map();\n\n // Render the element\n const rendered = renderNode(element, initialContext);\n\n if (rendered.node) {\n appendChild(root, rendered.node);\n } else if (rendered.children.length > 0) {\n // Fragment case - append all fragment children\n for (const child of rendered.children) {\n if (child.node) {\n appendChild(root, child.node);\n }\n }\n }\n\n // Render once\n renderer.render();\n\n // Clean up subscriptions only (don't remove nodes from tree)\n // This keeps the output visible after destroy\n cleanupSubscriptions(rendered);\n\n // Destroy renderer (outputs final result and shows cursor)\n renderer.destroy();\n\n // Restore raw mode if it was enabled\n if (process.stdin.isTTY && process.stdin.setRawMode && wasRawMode) {\n process.stdin.setRawMode(true);\n }\n}\n","/** @jsxImportSource @semajsx/terminal */\nimport type { JSXNode } from \"@semajsx/core\";\n\nexport interface BlankLineProps {\n /**\n * Number of blank lines to render\n * @default 1\n */\n count?: number;\n}\n\n/**\n * BlankLine component - renders one or more empty lines\n *\n * Useful for adding vertical spacing between terminal UI elements.\n *\n * @example\n * ```tsx\n * <box flexDirection=\"column\">\n * <text>First line</text>\n * <BlankLine />\n * <text>After one blank line</text>\n * <BlankLine count={2} />\n * <text>After two blank lines</text>\n * </box>\n * ```\n */\nexport function BlankLine({ count = 1 }: BlankLineProps): JSXNode {\n const lines = Array.from({ length: count }, (_, i) => <text key={i}> </text>);\n\n return <>{lines}</>;\n}\n"],"mappings":"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"}
|