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.
Files changed (44) hide show
  1. package/dist/{client-BrupjhG0.mjs → client-CEJQ4fit.mjs} +3 -3
  2. package/dist/{client-BrupjhG0.mjs.map → client-CEJQ4fit.mjs.map} +1 -1
  3. package/dist/{document-DsiJO2jG.mjs → document-Cbz4084O.mjs} +2 -2
  4. package/dist/{document-XKyAs62C.mjs → document-Cfdhi7vG.mjs} +2 -2
  5. package/dist/{document-XKyAs62C.mjs.map → document-Cfdhi7vG.mjs.map} +1 -1
  6. package/dist/dom/index.mjs +2 -2
  7. package/dist/dom/jsx-dev-runtime.mjs +1 -1
  8. package/dist/dom/jsx-runtime.mjs +1 -1
  9. package/dist/index.d.mts +11 -0
  10. package/dist/index.d.mts.map +1 -1
  11. package/dist/index.mjs +1 -1
  12. package/dist/{jsx-runtime-Dc77fsnM.d.mts → jsx-runtime-tdaY-P9K.d.mts} +2 -2
  13. package/dist/{jsx-runtime-Dc77fsnM.d.mts.map → jsx-runtime-tdaY-P9K.d.mts.map} +1 -1
  14. package/dist/{lucide-Ddt_N9dJ.mjs → lucide-DWk3itzO.mjs} +3 -3
  15. package/dist/{lucide-Ddt_N9dJ.mjs.map → lucide-DWk3itzO.mjs.map} +1 -1
  16. package/dist/{resource-pm7qP-jV.mjs → resource-BU0Po0ez.mjs} +2 -2
  17. package/dist/{resource-pm7qP-jV.mjs.map → resource-BU0Po0ez.mjs.map} +1 -1
  18. package/dist/{src-Cv4rRVzv.mjs → src--YS4EvMz.mjs} +9 -6
  19. package/dist/src--YS4EvMz.mjs.map +1 -0
  20. package/dist/{src-CXY-7FC3.mjs → src-77V1Plyd.mjs} +665 -129
  21. package/dist/src-77V1Plyd.mjs.map +1 -0
  22. package/dist/{src-SqJ6k7Xv.mjs → src-BTG08Qnh.mjs} +4 -4
  23. package/dist/{src-SqJ6k7Xv.mjs.map → src-BTG08Qnh.mjs.map} +1 -1
  24. package/dist/{src-C_aFsFJ3.mjs → src-Cm12Y2XV.mjs} +2 -2
  25. package/dist/{src-C_aFsFJ3.mjs.map → src-Cm12Y2XV.mjs.map} +1 -1
  26. package/dist/{src-CAyv9Uf9.mjs → src-Mucdq4zw.mjs} +6 -6
  27. package/dist/{src-CAyv9Uf9.mjs.map → src-Mucdq4zw.mjs.map} +1 -1
  28. package/dist/ssg/index.mjs +6 -6
  29. package/dist/ssg/plugins/docs-theme.mjs +9 -9
  30. package/dist/ssg/plugins/lucide.mjs +3 -3
  31. package/dist/ssr/client.mjs +4 -4
  32. package/dist/ssr/index.mjs +5 -5
  33. package/dist/terminal/index.d.mts +248 -4
  34. package/dist/terminal/index.d.mts.map +1 -1
  35. package/dist/terminal/index.mjs +3 -3
  36. package/dist/terminal/jsx-dev-runtime.d.mts +2 -2
  37. package/dist/terminal/jsx-dev-runtime.mjs +1 -1
  38. package/dist/terminal/jsx-runtime.d.mts +2 -2
  39. package/dist/terminal/jsx-runtime.mjs +1 -1
  40. package/dist/{types-Bj5q5x2Q.d.mts → types-Bm8rZGKW.d.mts} +2 -2
  41. package/dist/{types-Bj5q5x2Q.d.mts.map → types-Bm8rZGKW.d.mts.map} +1 -1
  42. package/package.json +1 -1
  43. package/dist/src-CXY-7FC3.mjs.map +0 -1
  44. package/dist/src-Cv4rRVzv.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
- import "../src-Cv4rRVzv.mjs";
1
+ import "../src--YS4EvMz.mjs";
2
2
  import "../src-DV9uwtE5.mjs";
3
3
  import "../jsx-runtime-BFs1c0xz.mjs";
4
- import "../src-CXY-7FC3.mjs";
4
+ import "../src-77V1Plyd.mjs";
5
5
  import "../jsx-runtime-kv_6vBiR.mjs";
6
- import "../resource-pm7qP-jV.mjs";
7
- import "../src-CAyv9Uf9.mjs";
8
- import "../document-XKyAs62C.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-SqJ6k7Xv.mjs";
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-Cv4rRVzv.mjs";
4
- import "../../src-C_aFsFJ3.mjs";
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-CXY-7FC3.mjs";
7
+ import "../../src-77V1Plyd.mjs";
8
8
  import "../../jsx-runtime-kv_6vBiR.mjs";
9
- import { d as island } from "../../resource-pm7qP-jV.mjs";
10
- import "../../src-CAyv9Uf9.mjs";
11
- import "../../document-XKyAs62C.mjs";
12
- import "../../client-BrupjhG0.mjs";
13
- import { d as defineCollection } from "../../src-SqJ6k7Xv.mjs";
14
- import { n as Icon, t as lucide } from "../../lucide-Ddt_N9dJ.mjs";
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-Cv4rRVzv.mjs";
2
- import "../../src-C_aFsFJ3.mjs";
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-Ddt_N9dJ.mjs";
5
+ import { n as Icon, t as lucide } from "../../lucide-DWk3itzO.mjs";
6
6
 
7
7
  export { Icon, lucide };
@@ -1,7 +1,7 @@
1
- import "../src-Cv4rRVzv.mjs";
2
- import "../src-C_aFsFJ3.mjs";
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-pm7qP-jV.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-BrupjhG0.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-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 };
@@ -1,10 +1,10 @@
1
- import "../src-Cv4rRVzv.mjs";
1
+ import "../src--YS4EvMz.mjs";
2
2
  import "../src-DV9uwtE5.mjs";
3
3
  import "../jsx-runtime-BFs1c0xz.mjs";
4
- import "../src-CXY-7FC3.mjs";
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-pm7qP-jV.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-CAyv9Uf9.mjs";
8
- import { n as renderDocument, t as DefaultDocument } from "../document-XKyAs62C.mjs";
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-Bj5q5x2Q.mjs";
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 wasRawMode;
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
- export { BlankLine, BlankLineProps, ExitHint, ExitHintProps, type PrintOptions, type RenderOptions, type RenderResult, type TerminalElement, type TerminalNode, TerminalRenderer, type TerminalStyle, type TerminalText, 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 };
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":"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"}
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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"}
@@ -1,5 +1,5 @@
1
- import { c as when, o as resource, s as stream } from "../src-Cv4rRVzv.mjs";
2
- import { C as renderBackground, E as getChalkColor, S as setText, T as getChalkBgColor, _ as getParent, a as setProperty, b as removeChild, c as renderTextElement, d as applyStyle, f as collectText, g as getNextSibling, h as createTextNode, i as ExitHint, l as renderTextNode, m as createElement, n as print, o as setSignalProperty, p as createComment, r as render, s as TerminalRenderer, t as BlankLine, u as appendChild, v as insertBefore, w as renderBorder, x as replaceNode, y as markNodeAsDirty } from "../src-CXY-7FC3.mjs";
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-Bj5q5x2Q.mjs";
4
- import { i as TextAttributes, n as JSX, r as TerminalAttributes, t as BoxAttributes } from "../jsx-runtime-Dc77fsnM.mjs";
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,4 +1,4 @@
1
- import { h, v as Fragment } from "../src-Cv4rRVzv.mjs";
1
+ import { h, v as Fragment } from "../src--YS4EvMz.mjs";
2
2
  import "../jsx-runtime-kv_6vBiR.mjs";
3
3
 
4
4
  //#region ../terminal/src/jsx-dev-runtime.ts
@@ -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-Bj5q5x2Q.mjs";
4
- import { i as TextAttributes, n as JSX, r as TerminalAttributes, t as BoxAttributes } from "../jsx-runtime-Dc77fsnM.mjs";
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 };
@@ -1,4 +1,4 @@
1
- import { a as jsxs, i as jsx, v as Fragment } from "../src-Cv4rRVzv.mjs";
1
+ import { a as jsxs, i as jsx, v as Fragment } from "../src--YS4EvMz.mjs";
2
2
  import "../jsx-runtime-kv_6vBiR.mjs";
3
3
 
4
4
  export { Fragment, 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, any>;
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-Bj5q5x2Q.d.mts.map
91
+ //# sourceMappingURL=types-Bm8rZGKW.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-Bj5q5x2Q.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"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "semajsx",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "A signal-based reactive JSX runtime for building modern web applications",
5
5
  "keywords": [
6
6
  "framework",
@@ -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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"}