silvery 0.19.2 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/dist/Text-Lq0dmj8-.mjs +239 -0
- package/dist/Text-Lq0dmj8-.mjs.map +1 -0
- package/dist/UPNG-Bo33r8rA.mjs +3 -0
- package/dist/UPNG-DosRPdF4.mjs +5075 -0
- package/dist/UPNG-DosRPdF4.mjs.map +1 -0
- package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs +6 -0
- package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs.map +1 -0
- package/dist/{animation-Cn64yepo.mjs → animation-ZMN2_XKv.mjs} +2 -2
- package/dist/animation-ZMN2_XKv.mjs.map +1 -0
- package/dist/{ansi-Cc33mW54.d.mts → ansi-2Xn0yatP.d.mts} +1 -1
- package/dist/{ansi-Cc33mW54.d.mts.map → ansi-2Xn0yatP.d.mts.map} +1 -1
- package/dist/{ansi-CLOitHKx.mjs → ansi-D1KQMAbf.mjs} +1 -1
- package/dist/{ansi-CLOitHKx.mjs.map → ansi-D1KQMAbf.mjs.map} +1 -1
- package/dist/ansi-yC4RyBNY.mjs +22441 -0
- package/dist/ansi-yC4RyBNY.mjs.map +1 -0
- package/dist/apng-CR08rIaH.mjs +58 -0
- package/dist/apng-CR08rIaH.mjs.map +1 -0
- package/dist/apng-DaHfVaVI.mjs +3 -0
- package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
- package/dist/assets/skia.darwin-arm64-DQs5sT6N.node +0 -0
- package/dist/backend-B-WYLUib.mjs +13396 -0
- package/dist/backend-B-WYLUib.mjs.map +1 -0
- package/dist/backends-CUtan80W.mjs +3 -0
- package/dist/backends-DIVYzKqd.mjs +1083 -0
- package/dist/backends-DIVYzKqd.mjs.map +1 -0
- package/dist/bound-term-0sPrrzH1.d.mts +4640 -0
- package/dist/bound-term-0sPrrzH1.d.mts.map +1 -0
- package/dist/canvas-1v7dPT-_.mjs +3 -0
- package/dist/canvas-CSuPOMNt.mjs +1442 -0
- package/dist/canvas-CSuPOMNt.mjs.map +1 -0
- package/dist/{chunk-Vs_PY4HZ.mjs → chunk-BSw8zbkd.mjs} +1 -1
- package/dist/cli-dvo0r2fs.mjs +4 -0
- package/dist/compare-CQodSH4G.mjs +376 -0
- package/dist/compare-CQodSH4G.mjs.map +1 -0
- package/dist/compare-DHlcxEYA.mjs +3 -0
- package/dist/context-BU5LkkIy.mjs.map +1 -1
- package/dist/devtools-CJdt5H0X.mjs +2 -0
- package/dist/{devtools-DxkSLXDA.mjs → devtools-DcQjgyjL.mjs} +5 -4
- package/dist/{devtools-DxkSLXDA.mjs.map → devtools-DcQjgyjL.mjs.map} +1 -1
- package/dist/easing-BI-ASGMO.d.mts +24 -0
- package/dist/easing-BI-ASGMO.d.mts.map +1 -0
- package/dist/{eta-Bb3RH3wh.mjs → eta-CJlGH06n.mjs} +1 -1
- package/dist/{eta-Bb3RH3wh.mjs.map → eta-CJlGH06n.mjs.map} +1 -1
- package/dist/flexily-zero-adapter-C3Vj0fPt.mjs +306 -0
- package/dist/flexily-zero-adapter-C3Vj0fPt.mjs.map +1 -0
- package/dist/{flexily-zero-adapter-CMxXhdOL.mjs → flexily-zero-adapter-C4lW_Ov5.mjs} +1 -1
- package/dist/fonts-BFmhXDv7.mjs +88 -0
- package/dist/fonts-BFmhXDv7.mjs.map +1 -0
- package/dist/gif-C_AjaT9d.mjs +188 -0
- package/dist/gif-C_AjaT9d.mjs.map +1 -0
- package/dist/gif-DaC4XrxA.mjs +3 -0
- package/dist/gifenc-BOUT-KFB.mjs +730 -0
- package/dist/gifenc-BOUT-KFB.mjs.map +1 -0
- package/dist/image-C2Birh2x.mjs +1252 -0
- package/dist/image-C2Birh2x.mjs.map +1 -0
- package/dist/index-BUMxS65f.d.mts +453 -0
- package/dist/index-BUMxS65f.d.mts.map +1 -0
- package/dist/{index-D3saHouR.d.mts → index-CSQf13CI.d.mts} +1057 -1133
- package/dist/index-CSQf13CI.d.mts.map +1 -0
- package/dist/{index-BXslOebb.d.mts → index-Cl9KKjQ_.d.mts} +4919 -3921
- package/dist/index-Cl9KKjQ_.d.mts.map +1 -0
- package/dist/index-XbNrPhWl.d.mts +336 -0
- package/dist/index-XbNrPhWl.d.mts.map +1 -0
- package/dist/index.d.mts +8 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +14 -12
- package/dist/index.mjs.map +1 -1
- package/dist/key-mapping-CS-YD_cD.mjs +132 -0
- package/dist/key-mapping-CS-YD_cD.mjs.map +1 -0
- package/dist/key-mapping-Yn-Jgrij.mjs +3 -0
- package/dist/{layout-engine-B6Cdz1yZ.mjs → layout-engine-C07LEXWT.mjs} +1 -1
- package/dist/layout-engine-C2px0RJE.mjs +67 -0
- package/dist/layout-engine-C2px0RJE.mjs.map +1 -0
- package/dist/layout-signals-Cnw6xk8Q.mjs +988 -0
- package/dist/layout-signals-Cnw6xk8Q.mjs.map +1 -0
- package/dist/mouse-events-Dki3ISIp.mjs +1044 -0
- package/dist/mouse-events-Dki3ISIp.mjs.map +1 -0
- package/dist/{multi-progress-Bq9Oi_WI.mjs → multi-progress-CIRjrzma.mjs} +3 -3
- package/dist/{multi-progress-Bq9Oi_WI.mjs.map → multi-progress-CIRjrzma.mjs.map} +1 -1
- package/dist/{multi-progress-DAQC7eap.d.mts → multi-progress-DHZ2xUT2.d.mts} +2 -2
- package/dist/{multi-progress-DAQC7eap.d.mts.map → multi-progress-DHZ2xUT2.d.mts.map} +1 -1
- package/dist/{node-BeWlnCPY.mjs → node-CjM5Rt-M.mjs} +4 -4
- package/dist/node-CjM5Rt-M.mjs.map +1 -0
- package/dist/playwright-D5YiZcNS.mjs +76397 -0
- package/dist/playwright-D5YiZcNS.mjs.map +1 -0
- package/dist/png-codec-Dp84742B.mjs +36 -0
- package/dist/png-codec-Dp84742B.mjs.map +1 -0
- package/dist/png-codec-QwOtJ8Zs.mjs +3 -0
- package/dist/progress-DB_Xo071.mjs +675 -0
- package/dist/progress-DB_Xo071.mjs.map +1 -0
- package/dist/{progress-bar-CXE5Qfkd.mjs → progress-bar-oJwq22CR.mjs} +4 -4
- package/dist/{progress-bar-CXE5Qfkd.mjs.map → progress-bar-oJwq22CR.mjs.map} +1 -1
- package/dist/rasterizer-BRXrDdWx.mjs +3 -0
- package/dist/rasterizer-CpEhJvdR.mjs +296 -0
- package/dist/rasterizer-CpEhJvdR.mjs.map +1 -0
- package/dist/reconciler-DldIJB93.mjs +2083 -0
- package/dist/reconciler-DldIJB93.mjs.map +1 -0
- package/dist/{render-string-CDCeYkS3.mjs → render-string-BcoCpjCB.mjs} +1 -1
- package/dist/{render-string-Darrg7ku.mjs → render-string-DkQacASz.mjs} +2707 -549
- package/dist/render-string-DkQacASz.mjs.map +1 -0
- package/dist/resvg-js-DkOndZI3.mjs +203 -0
- package/dist/resvg-js-DkOndZI3.mjs.map +1 -0
- package/dist/runtime.d.mts +3 -2
- package/dist/runtime.mjs +3 -3
- package/dist/schemes-JjNp4aSl.mjs +2611 -0
- package/dist/schemes-JjNp4aSl.mjs.map +1 -0
- package/dist/{spinner-CGo34vyR.d.mts → spinner-CZINHpkV.d.mts} +2 -2
- package/dist/{spinner-CGo34vyR.d.mts.map → spinner-CZINHpkV.d.mts.map} +1 -1
- package/dist/{spinner-CeOmcuw_.mjs → spinner-D9lrHr8s.mjs} +7 -7
- package/dist/spinner-D9lrHr8s.mjs.map +1 -0
- package/dist/src-5w9QR6_8.mjs +1071 -0
- package/dist/src-5w9QR6_8.mjs.map +1 -0
- package/dist/src-BNTToU7l.mjs +4387 -0
- package/dist/src-BNTToU7l.mjs.map +1 -0
- package/dist/{src-CF-6UN01.mjs → src-BR4xNwdG.mjs} +10436 -2622
- package/dist/src-BR4xNwdG.mjs.map +1 -0
- package/dist/{types-Bk2yw9Qj.mjs → src-DKp-_OFG.mjs} +34 -94
- package/dist/src-DKp-_OFG.mjs.map +1 -0
- package/dist/src-bt8wSrfJ.mjs +258 -0
- package/dist/src-bt8wSrfJ.mjs.map +1 -0
- package/dist/src-e33Y6kNJ.mjs +3 -0
- package/dist/src-iDwu25UD.mjs +1814 -0
- package/dist/src-iDwu25UD.mjs.map +1 -0
- package/dist/steps-Bp2uNqnn.d.mts +202 -0
- package/dist/steps-Bp2uNqnn.d.mts.map +1 -0
- package/dist/svg-15lZZzxq.mjs +486 -0
- package/dist/svg-15lZZzxq.mjs.map +1 -0
- package/dist/svg-Cz0UXcDj.mjs +255 -0
- package/dist/svg-Cz0UXcDj.mjs.map +1 -0
- package/dist/svg-DY72a4HK.mjs +3 -0
- package/dist/svg-g1D6ErwR.d.mts +82 -0
- package/dist/svg-g1D6ErwR.d.mts.map +1 -0
- package/dist/term.d.mts +3 -0
- package/dist/term.mjs +9 -0
- package/dist/term.mjs.map +1 -0
- package/dist/theme.d.mts +95 -2
- package/dist/theme.d.mts.map +1 -0
- package/dist/theme.mjs +9 -3
- package/dist/theme.mjs.map +1 -0
- package/dist/{types-BH_v3iMT.d.mts → types-kt_fKR37.d.mts} +2 -15
- package/dist/types-kt_fKR37.d.mts.map +1 -0
- package/dist/ui/animation.d.mts +2 -1
- package/dist/ui/animation.mjs +1 -1
- package/dist/ui/ansi.d.mts +1 -1
- package/dist/ui/ansi.mjs +1 -1
- package/dist/ui/cli.d.mts +3 -3
- package/dist/ui/cli.mjs +5 -5
- package/dist/ui/display.d.mts +1 -1
- package/dist/ui/image.d.mts +2 -2
- package/dist/ui/image.mjs +2 -2
- package/dist/ui/input.d.mts +1 -1
- package/dist/ui/input.mjs +4 -2
- package/dist/ui/input.mjs.map +1 -1
- package/dist/ui/progress.d.mts +5 -249
- package/dist/ui/progress.mjs +5 -858
- package/dist/ui/react.d.mts +1 -1
- package/dist/ui/react.mjs +2 -2
- package/dist/ui/recording-chrome-react.d.mts +21 -0
- package/dist/ui/recording-chrome-react.d.mts.map +1 -0
- package/dist/ui/recording-chrome-react.mjs +105 -0
- package/dist/ui/recording-chrome-react.mjs.map +1 -0
- package/dist/ui/recording-chrome.d.mts +2 -0
- package/dist/ui/recording-chrome.mjs +2 -0
- package/dist/ui/utils.mjs +1 -1
- package/dist/ui/wrappers.d.mts +3 -3
- package/dist/ui/wrappers.mjs +2 -2
- package/dist/ui.d.mts +7 -6
- package/dist/ui.mjs +8 -7
- package/dist/{useLatest-Bg2x4bfP.d.mts → useLatest-DRDDVwjh.d.mts} +5 -25
- package/dist/useLatest-DRDDVwjh.d.mts.map +1 -0
- package/dist/{with-text-input-CRfoiFFG.d.mts → with-text-input-YeohVLeo.d.mts} +4 -55
- package/dist/with-text-input-YeohVLeo.d.mts.map +1 -0
- package/dist/wrapper-C70ATkVv.mjs +3527 -0
- package/dist/wrapper-C70ATkVv.mjs.map +1 -0
- package/dist/{wrappers-UTADQkSY.mjs → wrappers-BCUYITrY.mjs} +5 -157
- package/dist/wrappers-BCUYITrY.mjs.map +1 -0
- package/dist/{yoga-adapter-8oRGRw8V.mjs → yoga-adapter-BnZX1PAY.mjs} +28 -2
- package/dist/yoga-adapter-BnZX1PAY.mjs.map +1 -0
- package/dist/yoga-adapter-DxgsQ_gg.mjs +2 -0
- package/dist/zipBundle-3nqeDRtm.mjs +3 -0
- package/dist/zipBundle-VNAYFmqJ.mjs +2003 -0
- package/dist/zipBundle-VNAYFmqJ.mjs.map +1 -0
- package/package.json +20 -9
- package/dist/animation-Cn64yepo.mjs.map +0 -1
- package/dist/cli-BKp0YtBD.mjs +0 -4
- package/dist/devtools-9QY4teqI.mjs +0 -2
- package/dist/flexily-zero-adapter-BlQa46nr.mjs +0 -3385
- package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +0 -1
- package/dist/image-CTII5QWI.mjs +0 -477
- package/dist/image-CTII5QWI.mjs.map +0 -1
- package/dist/index-BXslOebb.d.mts.map +0 -1
- package/dist/index-BnA7mNpo.d.mts +0 -175
- package/dist/index-BnA7mNpo.d.mts.map +0 -1
- package/dist/index-D3saHouR.d.mts.map +0 -1
- package/dist/layout-engine-ClUgv6jB.mjs +0 -50
- package/dist/layout-engine-ClUgv6jB.mjs.map +0 -1
- package/dist/node-BeWlnCPY.mjs.map +0 -1
- package/dist/reconciler-Cwgm8hRR.mjs +0 -8459
- package/dist/reconciler-Cwgm8hRR.mjs.map +0 -1
- package/dist/render-string-Darrg7ku.mjs.map +0 -1
- package/dist/spinner-CeOmcuw_.mjs.map +0 -1
- package/dist/src-B5GjfG7g.mjs +0 -4305
- package/dist/src-B5GjfG7g.mjs.map +0 -1
- package/dist/src-CChwjk0Z.mjs +0 -738
- package/dist/src-CChwjk0Z.mjs.map +0 -1
- package/dist/src-CF-6UN01.mjs.map +0 -1
- package/dist/src-NCKb8kE5.mjs +0 -2660
- package/dist/src-NCKb8kE5.mjs.map +0 -1
- package/dist/types-BH_v3iMT.d.mts.map +0 -1
- package/dist/types-Bk2yw9Qj.mjs.map +0 -1
- package/dist/ui/progress.d.mts.map +0 -1
- package/dist/ui/progress.mjs.map +0 -1
- package/dist/useLatest-Bg2x4bfP.d.mts.map +0 -1
- package/dist/with-text-input-CRfoiFFG.d.mts.map +0 -1
- package/dist/wrappers-UTADQkSY.mjs.map +0 -1
- package/dist/yoga-adapter-8oRGRw8V.mjs.map +0 -1
- package/dist/yoga-adapter-D_CcxSt5.mjs +0 -2
package/dist/ui/cli.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as createSpinner, n as SPINNER_FRAMES, r as Spinner, t as CallableSpinner } from "../spinner-
|
|
2
|
-
import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-
|
|
3
|
-
import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-
|
|
1
|
+
import { i as createSpinner, n as SPINNER_FRAMES, r as Spinner, t as CallableSpinner } from "../spinner-CZINHpkV.mjs";
|
|
2
|
+
import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-DHZ2xUT2.mjs";
|
|
3
|
+
import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-2Xn0yatP.mjs";
|
|
4
4
|
import { ColorizeHelpOptions, colorizeHelp } from "@silvery/commander";
|
|
5
5
|
export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, CallableSpinner, type ColorizeHelpOptions, MultiProgress, ProgressBar, SPINNER_FRAMES, Spinner, TaskHandle, colorizeHelp, createSpinner, cursorDown, cursorUp, getTerminalWidth, isTTY, withCursor, write, writeLine };
|
package/dist/ui/cli.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { i as createSpinner, r as Spinner, t as SPINNER_FRAMES } from "../spinner-
|
|
2
|
-
import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-
|
|
3
|
-
import { t as ProgressBar } from "../progress-bar-
|
|
4
|
-
import { t as MultiProgress } from "../multi-progress-
|
|
5
|
-
import "../cli-
|
|
1
|
+
import { i as createSpinner, r as Spinner, t as SPINNER_FRAMES } from "../spinner-D9lrHr8s.mjs";
|
|
2
|
+
import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-D1KQMAbf.mjs";
|
|
3
|
+
import { t as ProgressBar } from "../progress-bar-oJwq22CR.mjs";
|
|
4
|
+
import { t as MultiProgress } from "../multi-progress-CIRjrzma.mjs";
|
|
5
|
+
import "../cli-dvo0r2fs.mjs";
|
|
6
6
|
import { colorizeHelp } from "@silvery/commander";
|
|
7
7
|
export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, MultiProgress, ProgressBar, SPINNER_FRAMES, Spinner, colorizeHelp, createSpinner, cursorDown, cursorUp, getTerminalWidth, isTTY, withCursor, write, writeLine };
|
package/dist/ui/display.d.mts
CHANGED
package/dist/ui/image.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { Image, ImageProps, KittyImageOptions, SixelImageData, deleteKittyImage, encodeKittyImage, encodeSixel, isKittyGraphicsSupported, isSixelSupported };
|
|
1
|
+
import { a as encodeSixel, c as KittyPlaceOptions, d as encodeKittyImage, f as isKittyGraphicsSupported, i as decodePngToRgba, l as deleteKittyImage, n as ImageProps, o as isSixelSupported, p as placeKittyImage, r as SixelImageData, s as KittyImageOptions, t as Image, u as deleteKittyPlacement } from "../index-XbNrPhWl.mjs";
|
|
2
|
+
export { Image, ImageProps, KittyImageOptions, KittyPlaceOptions, SixelImageData, decodePngToRgba, deleteKittyImage, deleteKittyPlacement, encodeKittyImage, encodeSixel, isKittyGraphicsSupported, isSixelSupported, placeKittyImage };
|
package/dist/ui/image.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { Image, deleteKittyImage, encodeKittyImage, encodeSixel, isKittyGraphicsSupported, isSixelSupported };
|
|
1
|
+
import { a as deleteKittyImage, c as isKittyGraphicsSupported, i as isSixelSupported, l as placeKittyImage, n as decodePngToRgba, o as deleteKittyPlacement, r as encodeSixel, s as encodeKittyImage, t as Image } from "../image-C2Birh2x.mjs";
|
|
2
|
+
export { Image, decodePngToRgba, deleteKittyImage, deleteKittyPlacement, encodeKittyImage, encodeSixel, isKittyGraphicsSupported, isSixelSupported, placeKittyImage };
|
package/dist/ui/input.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as TextInputOptions, o as SelectOption, s as SelectProps, v as TextInputProps } from "../types-
|
|
1
|
+
import { _ as TextInputOptions, o as SelectOption, s as SelectProps, v as TextInputProps } from "../types-kt_fKR37.mjs";
|
|
2
2
|
import React from "react";
|
|
3
3
|
|
|
4
4
|
//#region packages/ag-react/src/ui/input/TextInput.d.ts
|
package/dist/ui/input.mjs
CHANGED
|
@@ -48,10 +48,11 @@ function TextInput({ value, onChange, placeholder, mask, autocomplete, onAutocom
|
|
|
48
48
|
const beforeCursor = displayValue.slice(0, cursor);
|
|
49
49
|
const afterCursor = displayValue.slice(cursor);
|
|
50
50
|
const suggestionSuffix = suggestion ? suggestion.slice(value.length) : "";
|
|
51
|
+
const showPlaceholder = !value && placeholder;
|
|
51
52
|
return /* @__PURE__ */ jsx("span", {
|
|
52
53
|
"data-silvery-ui-text-input": true,
|
|
53
54
|
"data-focused": focused,
|
|
54
|
-
children:
|
|
55
|
+
children: showPlaceholder ? /* @__PURE__ */ jsx("span", {
|
|
55
56
|
"data-color": "dim",
|
|
56
57
|
children: placeholder
|
|
57
58
|
}) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -204,10 +205,11 @@ function Select({ options, value, onChange, maxVisible = 10, highlightIndex: con
|
|
|
204
205
|
visibleOptions.map((option, visibleIdx) => {
|
|
205
206
|
const actualIndex = scrollOffset + visibleIdx;
|
|
206
207
|
const isSelected = option.value === value;
|
|
208
|
+
const isHighlighted = actualIndex === highlightIndex;
|
|
207
209
|
return /* @__PURE__ */ jsxs("div", {
|
|
208
210
|
"data-silvery-select-option": true,
|
|
209
211
|
"data-selected": isSelected,
|
|
210
|
-
"data-highlighted":
|
|
212
|
+
"data-highlighted": isHighlighted,
|
|
211
213
|
children: [/* @__PURE__ */ jsx("span", {
|
|
212
214
|
"data-silvery-select-indicator": true,
|
|
213
215
|
children: isSelected ? ">" : " "
|
package/dist/ui/input.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.mjs","names":[],"sources":["../../packages/ag-react/src/ui/input/TextInput.tsx","../../packages/ag-react/src/ui/input/Select.tsx"],"sourcesContent":["/**\n * React TextInput component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useCallback } from \"react\"\nimport type { TextInputProps } from \"../types.js\"\n\n/**\n * Single-line text input component for React TUI apps\n *\n * This is a controlled component that renders the current input state.\n * It does NOT handle keyboard input directly - that's the caller's responsibility\n * (via useInput hook in Ink, or similar).\n *\n * @example\n * ```tsx\n * import { TextInput } from \"./index\";\n * import { useInput } from \"ink\";\n *\n * function MyForm() {\n * const [value, setValue] = useState(\"\");\n *\n * useInput((input, key) => {\n * if (key.backspace || key.delete) {\n * setValue(v => v.slice(0, -1));\n * } else if (!key.ctrl && !key.meta && input) {\n * setValue(v => v + input);\n * }\n * });\n *\n * return <TextInput value={value} onChange={setValue} placeholder=\"Type here...\" />;\n * }\n *\n * // With password masking\n * <TextInput value={password} onChange={setPassword} mask=\"*\" />\n *\n * // With autocomplete\n * <TextInput\n * value={query}\n * onChange={setQuery}\n * autocomplete={[\"apple\", \"apricot\", \"avocado\"]}\n * />\n * ```\n */\nexport function TextInput({\n value,\n onChange,\n placeholder,\n mask,\n autocomplete,\n onAutocomplete,\n onSubmit,\n cursorPosition,\n focused = true,\n}: TextInputProps): React.ReactElement {\n // Calculate display value (masked or plain)\n const displayValue = mask ? mask.repeat(value.length) : value\n\n // Find matching autocomplete suggestion\n const suggestion = getAutocompleteSuggestion(value, autocomplete)\n\n // Cursor position defaults to end of input\n const cursor = cursorPosition ?? value.length\n\n // Build the display: value + cursor + suggestion suffix\n const beforeCursor = displayValue.slice(0, cursor)\n const afterCursor = displayValue.slice(cursor)\n const suggestionSuffix = suggestion ? suggestion.slice(value.length) : \"\"\n\n // Show placeholder if empty and not focused or no value\n const showPlaceholder = !value && placeholder\n\n return (\n <span data-silvery-ui-text-input data-focused={focused}>\n {showPlaceholder ? (\n <span data-color=\"dim\">{placeholder}</span>\n ) : (\n <>\n <span>{beforeCursor}</span>\n {focused && (\n <span data-cursor data-inverse>\n {afterCursor[0] || \" \"}\n </span>\n )}\n <span>{afterCursor.slice(1)}</span>\n {suggestionSuffix && <span data-color=\"dim\">{suggestionSuffix}</span>}\n </>\n )}\n </span>\n )\n}\n\n/**\n * Hook for managing text input state with autocomplete support\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const { value, displayValue, suggestion, handleInput, acceptSuggestion, clear } =\n * useTextInput({ autocomplete: [\"apple\", \"banana\", \"cherry\"] });\n *\n * useInput((input, key) => {\n * if (key.tab && suggestion) {\n * acceptSuggestion();\n * } else {\n * handleInput(input, key);\n * }\n * });\n *\n * return <Text>{displayValue}</Text>;\n * }\n * ```\n */\nexport function useTextInput(\n options: {\n initialValue?: string\n mask?: string\n autocomplete?: string[]\n onSubmit?: (value: string) => void\n } = {},\n): {\n value: string\n setValue: (value: string) => void\n displayValue: string\n suggestion: string | undefined\n cursorPosition: number\n setCursorPosition: (pos: number) => void\n handleInput: (input: string, key: InputKey) => void\n acceptSuggestion: () => void\n clear: () => void\n} {\n const [value, setValue] = useState(options.initialValue ?? \"\")\n const [cursorPosition, setCursorPosition] = useState(value.length)\n\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n\n const handleInput = useCallback(\n (input: string, key: InputKey) => {\n if (key.return) {\n options.onSubmit?.(value)\n return\n }\n\n if (key.backspace || key.delete) {\n if (cursorPosition > 0) {\n setValue((v) => v.slice(0, cursorPosition - 1) + v.slice(cursorPosition))\n setCursorPosition((p) => Math.max(0, p - 1))\n }\n return\n }\n\n if (key.leftArrow) {\n setCursorPosition((p) => Math.max(0, p - 1))\n return\n }\n\n if (key.rightArrow) {\n setCursorPosition((p) => Math.min(value.length, p + 1))\n return\n }\n\n // Ignore control characters (but allow opt+key composed chars via key.text)\n if (key.ctrl || !input) {\n return\n }\n\n // Insert the actual typed character (pre-normalization), not the keybinding key.\n // E.g., Shift+3 should insert '#', not '3'.\n const char = key.text ?? input\n if (key.meta && !char) return // opt+key with no text output\n setValue((v) => v.slice(0, cursorPosition) + char + v.slice(cursorPosition))\n setCursorPosition((p) => p + char.length)\n },\n [value, cursorPosition, options.onSubmit],\n )\n\n const acceptSuggestion = useCallback(() => {\n if (suggestion) {\n setValue(suggestion)\n setCursorPosition(suggestion.length)\n }\n }, [suggestion])\n\n const clear = useCallback(() => {\n setValue(\"\")\n setCursorPosition(0)\n }, [])\n\n return {\n value,\n setValue,\n displayValue,\n suggestion,\n cursorPosition,\n setCursorPosition,\n handleInput,\n acceptSuggestion,\n clear,\n }\n}\n\n/** Key object type (matches Ink's Key interface) */\ninterface InputKey {\n return?: boolean\n backspace?: boolean\n delete?: boolean\n leftArrow?: boolean\n rightArrow?: boolean\n upArrow?: boolean\n downArrow?: boolean\n tab?: boolean\n escape?: boolean\n ctrl?: boolean\n meta?: boolean\n shift?: boolean\n text?: string\n}\n\n/**\n * Find a matching autocomplete suggestion for the current input\n */\nfunction getAutocompleteSuggestion(value: string, autocomplete?: string[]): string | undefined {\n if (!value || !autocomplete?.length) {\n return undefined\n }\n\n const lowerValue = value.toLowerCase()\n return autocomplete.find(\n (item) => item.toLowerCase().startsWith(lowerValue) && item.length > value.length,\n )\n}\n","/**\n * React Select component for silvery/Ink TUI apps\n *\n * Single-choice selection list with keyboard navigation.\n */\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport type { SelectProps, SelectOption } from \"../types.js\"\n\n/**\n * Scrollable single-choice selection list\n *\n * @example\n * ```tsx\n * import { Select } from \"./index\";\n *\n * function SettingsView() {\n * const [theme, setTheme] = useState(\"light\");\n *\n * return (\n * <Select\n * options={[\n * { label: \"Light\", value: \"light\" },\n * { label: \"Dark\", value: \"dark\" },\n * { label: \"System\", value: \"system\" },\n * ]}\n * value={theme}\n * onChange={setTheme}\n * />\n * );\n * }\n * ```\n */\nexport function Select<T>({\n options,\n value,\n onChange,\n maxVisible = 10,\n highlightIndex: controlledHighlightIndex,\n onHighlightChange,\n}: SelectProps<T>): React.ReactElement {\n // Find the index of the currently selected value\n const selectedIndex = options.findIndex((opt) => opt.value === value)\n\n // Internal highlight state (for uncontrolled mode)\n const [internalHighlightIndex, setInternalHighlightIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : 0,\n )\n\n // Use controlled or internal highlight index\n const highlightIndex = controlledHighlightIndex ?? internalHighlightIndex\n\n // Calculate scroll window\n const scrollOffset = Math.max(\n 0,\n Math.min(highlightIndex - Math.floor(maxVisible / 2), options.length - maxVisible),\n )\n const visibleOptions = options.slice(scrollOffset, scrollOffset + maxVisible)\n const hasMoreAbove = scrollOffset > 0\n const hasMoreBelow = scrollOffset + maxVisible < options.length\n\n // Sync internal highlight when value changes externally\n useEffect(() => {\n if (controlledHighlightIndex === undefined && selectedIndex >= 0) {\n setInternalHighlightIndex(selectedIndex)\n }\n }, [selectedIndex, controlledHighlightIndex])\n\n return (\n <div data-silvery-select>\n {hasMoreAbove && <div data-silvery-select-scroll-indicator=\"up\">...</div>}\n {visibleOptions.map((option, visibleIdx) => {\n const actualIndex = scrollOffset + visibleIdx\n const isSelected = option.value === value\n const isHighlighted = actualIndex === highlightIndex\n\n return (\n <div\n key={actualIndex}\n data-silvery-select-option\n data-selected={isSelected}\n data-highlighted={isHighlighted}\n >\n <span data-silvery-select-indicator>{isSelected ? \">\" : \" \"}</span>\n <span data-silvery-select-label>{option.label}</span>\n </div>\n )\n })}\n {hasMoreBelow && <div data-silvery-select-scroll-indicator=\"down\">...</div>}\n </div>\n )\n}\n\n/**\n * Hook for managing select state with keyboard navigation\n *\n * @example\n * ```tsx\n * function MySelect() {\n * const options = [\n * { label: \"Option A\", value: \"a\" },\n * { label: \"Option B\", value: \"b\" },\n * ];\n *\n * const { highlightIndex, moveUp, moveDown, select, value } = useSelect({\n * options,\n * initialValue: \"a\",\n * });\n *\n * useInput((input, key) => {\n * if (key.upArrow) moveUp();\n * if (key.downArrow) moveDown();\n * if (key.return) select();\n * });\n *\n * return <Select options={options} value={value} highlightIndex={highlightIndex} />;\n * }\n * ```\n */\nexport function useSelect<T>({\n options,\n initialValue,\n onChange,\n}: {\n options: SelectOption<T>[]\n initialValue?: T\n onChange?: (value: T) => void\n}): {\n value: T | undefined\n highlightIndex: number\n moveUp: () => void\n moveDown: () => void\n select: () => void\n setHighlightIndex: (index: number) => void\n} {\n const initialIndex =\n initialValue !== undefined ? options.findIndex((opt) => opt.value === initialValue) : 0\n\n const [highlightIndex, setHighlightIndex] = useState(Math.max(0, initialIndex))\n const [value, setValue] = useState<T | undefined>(initialValue)\n\n const moveUp = useCallback(() => {\n setHighlightIndex((i) => Math.max(0, i - 1))\n }, [])\n\n const moveDown = useCallback(() => {\n setHighlightIndex((i) => Math.min(options.length - 1, i + 1))\n }, [options.length])\n\n const select = useCallback(() => {\n const option = options[highlightIndex]\n if (option) {\n setValue(option.value)\n onChange?.(option.value)\n }\n }, [highlightIndex, options, onChange])\n\n return {\n value,\n highlightIndex,\n moveUp,\n moveDown,\n select,\n setHighlightIndex,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,SAAgB,UAAU,EACxB,OACA,UACA,aACA,MACA,cACA,gBACA,UACA,gBACA,UAAU,QAC2B;CAErC,MAAM,eAAe,OAAO,KAAK,OAAO,MAAM,OAAO,GAAG;CAGxD,MAAM,aAAa,0BAA0B,OAAO,aAAa;CAGjE,MAAM,SAAS,kBAAkB,MAAM;CAGvC,MAAM,eAAe,aAAa,MAAM,GAAG,OAAO;CAClD,MAAM,cAAc,aAAa,MAAM,OAAO;CAC9C,MAAM,mBAAmB,aAAa,WAAW,MAAM,MAAM,OAAO,GAAG;AAKvE,QACE,oBAAC,QAAD;EAAM,8BAAA;EAA2B,gBAAc;YAHzB,CAAC,SAAS,cAK5B,oBAAC,QAAD;GAAM,cAAW;aAAO;GAAmB,CAAA,GAE3C,qBAAA,UAAA,EAAA,UAAA;GACE,oBAAC,QAAD,EAAA,UAAO,cAAoB,CAAA;GAC1B,WACC,oBAAC,QAAD;IAAM,eAAA;IAAY,gBAAA;cACf,YAAY,MAAM;IACd,CAAA;GAET,oBAAC,QAAD,EAAA,UAAO,YAAY,MAAM,EAAE,EAAQ,CAAA;GAClC,oBAAoB,oBAAC,QAAD;IAAM,cAAW;cAAO;IAAwB,CAAA;GACpE,EAAA,CAAA;EAEA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAyBX,SAAgB,aACd,UAKI,EAAE,EAWN;CACA,MAAM,CAAC,OAAO,YAAY,SAAS,QAAQ,gBAAgB,GAAG;CAC9D,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,MAAM,OAAO;CAElE,MAAM,eAAe,QAAQ,OAAO,QAAQ,KAAK,OAAO,MAAM,OAAO,GAAG;CAExE,MAAM,aAAa,0BAA0B,OAAO,QAAQ,aAAa;AAsDzE,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aA3DkB,aACjB,OAAe,QAAkB;AAChC,OAAI,IAAI,QAAQ;AACd,YAAQ,WAAW,MAAM;AACzB;;AAGF,OAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,QAAI,iBAAiB,GAAG;AACtB,eAAU,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzE,wBAAmB,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;;AAE9C;;AAGF,OAAI,IAAI,WAAW;AACjB,uBAAmB,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;AAC5C;;AAGF,OAAI,IAAI,YAAY;AAClB,uBAAmB,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI,EAAE,CAAC;AACvD;;AAIF,OAAI,IAAI,QAAQ,CAAC,MACf;GAKF,MAAM,OAAO,IAAI,QAAQ;AACzB,OAAI,IAAI,QAAQ,CAAC,KAAM;AACvB,aAAU,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5E,sBAAmB,MAAM,IAAI,KAAK,OAAO;KAE3C;GAAC;GAAO;GAAgB,QAAQ;GAAS,CAC1C;EAsBC,kBApBuB,kBAAkB;AACzC,OAAI,YAAY;AACd,aAAS,WAAW;AACpB,sBAAkB,WAAW,OAAO;;KAErC,CAAC,WAAW,CAAC;EAgBd,OAdY,kBAAkB;AAC9B,YAAS,GAAG;AACZ,qBAAkB,EAAE;KACnB,EAAE,CAAC;EAYL;;;;;AAuBH,SAAS,0BAA0B,OAAe,cAA6C;AAC7F,KAAI,CAAC,SAAS,CAAC,cAAc,OAC3B;CAGF,MAAM,aAAa,MAAM,aAAa;AACtC,QAAO,aAAa,MACjB,SAAS,KAAK,aAAa,CAAC,WAAW,WAAW,IAAI,KAAK,SAAS,MAAM,OAC5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtMH,SAAgB,OAAU,EACxB,SACA,OACA,UACA,aAAa,IACb,gBAAgB,0BAChB,qBACqC;CAErC,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,IAAI,UAAU,MAAM;CAGrE,MAAM,CAAC,wBAAwB,6BAA6B,SAC1D,iBAAiB,IAAI,gBAAgB,EACtC;CAGD,MAAM,iBAAiB,4BAA4B;CAGnD,MAAM,eAAe,KAAK,IACxB,GACA,KAAK,IAAI,iBAAiB,KAAK,MAAM,aAAa,EAAE,EAAE,QAAQ,SAAS,WAAW,CACnF;CACD,MAAM,iBAAiB,QAAQ,MAAM,cAAc,eAAe,WAAW;CAC7E,MAAM,eAAe,eAAe;CACpC,MAAM,eAAe,eAAe,aAAa,QAAQ;AAGzD,iBAAgB;AACd,MAAI,6BAA6B,KAAA,KAAa,iBAAiB,EAC7D,2BAA0B,cAAc;IAEzC,CAAC,eAAe,yBAAyB,CAAC;AAE7C,QACE,qBAAC,OAAD;EAAK,uBAAA;YAAL;GACG,gBAAgB,oBAAC,OAAD;IAAK,wCAAqC;cAAK;IAAS,CAAA;GACxE,eAAe,KAAK,QAAQ,eAAe;IAC1C,MAAM,cAAc,eAAe;IACnC,MAAM,aAAa,OAAO,UAAU;AAGpC,WACE,qBAAC,OAAD;KAEE,8BAAA;KACA,iBAAe;KACf,oBAPkB,gBAAgB;eAGpC,CAME,oBAAC,QAAD;MAAM,iCAAA;gBAA+B,aAAa,MAAM;MAAW,CAAA,EACnE,oBAAC,QAAD;MAAM,6BAAA;gBAA2B,OAAO;MAAa,CAAA,CACjD;OAPC,YAOD;KAER;GACD,gBAAgB,oBAAC,OAAD;IAAK,wCAAqC;cAAO;IAAS,CAAA;GACvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BV,SAAgB,UAAa,EAC3B,SACA,cACA,YAYA;CACA,MAAM,eACJ,iBAAiB,KAAA,IAAY,QAAQ,WAAW,QAAQ,IAAI,UAAU,aAAa,GAAG;CAExF,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK,IAAI,GAAG,aAAa,CAAC;CAC/E,MAAM,CAAC,OAAO,YAAY,SAAwB,aAAa;AAkB/D,QAAO;EACL;EACA;EACA,QAnBa,kBAAkB;AAC/B,sBAAmB,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;KAC3C,EAAE,CAAC;EAkBJ,UAhBe,kBAAkB;AACjC,sBAAmB,MAAM,KAAK,IAAI,QAAQ,SAAS,GAAG,IAAI,EAAE,CAAC;KAC5D,CAAC,QAAQ,OAAO,CAAC;EAelB,QAba,kBAAkB;GAC/B,MAAM,SAAS,QAAQ;AACvB,OAAI,QAAQ;AACV,aAAS,OAAO,MAAM;AACtB,eAAW,OAAO,MAAM;;KAEzB;GAAC;GAAgB;GAAS;GAAS,CAAC;EAQrC;EACD"}
|
|
1
|
+
{"version":3,"file":"input.mjs","names":[],"sources":["../../packages/ag-react/src/ui/input/TextInput.tsx","../../packages/ag-react/src/ui/input/Select.tsx"],"sourcesContent":["/**\n * React TextInput component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useCallback } from \"react\"\nimport type { TextInputProps } from \"../types.js\"\n\n/**\n * Single-line text input component for React TUI apps\n *\n * This is a controlled component that renders the current input state.\n * It does NOT handle keyboard input directly - that's the caller's responsibility\n * (via useInput hook in Ink, or similar).\n *\n * @example\n * ```tsx\n * import { TextInput } from \"./index\";\n * import { useInput } from \"ink\";\n *\n * function MyForm() {\n * const [value, setValue] = useState(\"\");\n *\n * useInput((input, key) => {\n * if (key.backspace || key.delete) {\n * setValue(v => v.slice(0, -1));\n * } else if (!key.ctrl && !key.meta && input) {\n * setValue(v => v + input);\n * }\n * });\n *\n * return <TextInput value={value} onChange={setValue} placeholder=\"Type here...\" />;\n * }\n *\n * // With password masking\n * <TextInput value={password} onChange={setPassword} mask=\"*\" />\n *\n * // With autocomplete\n * <TextInput\n * value={query}\n * onChange={setQuery}\n * autocomplete={[\"apple\", \"apricot\", \"avocado\"]}\n * />\n * ```\n */\nexport function TextInput({\n value,\n onChange,\n placeholder,\n mask,\n autocomplete,\n onAutocomplete,\n onSubmit,\n cursorPosition,\n focused = true,\n}: TextInputProps): React.ReactElement {\n // Calculate display value (masked or plain)\n const displayValue = mask ? mask.repeat(value.length) : value\n\n // Find matching autocomplete suggestion\n const suggestion = getAutocompleteSuggestion(value, autocomplete)\n\n // Cursor position defaults to end of input\n const cursor = cursorPosition ?? value.length\n\n // Build the display: value + cursor + suggestion suffix\n const beforeCursor = displayValue.slice(0, cursor)\n const afterCursor = displayValue.slice(cursor)\n const suggestionSuffix = suggestion ? suggestion.slice(value.length) : \"\"\n\n // Show placeholder if empty and not focused or no value\n const showPlaceholder = !value && placeholder\n\n return (\n <span data-silvery-ui-text-input data-focused={focused}>\n {showPlaceholder ? (\n <span data-color=\"dim\">{placeholder}</span>\n ) : (\n <>\n <span>{beforeCursor}</span>\n {focused && (\n <span data-cursor data-inverse>\n {afterCursor[0] || \" \"}\n </span>\n )}\n <span>{afterCursor.slice(1)}</span>\n {suggestionSuffix && <span data-color=\"dim\">{suggestionSuffix}</span>}\n </>\n )}\n </span>\n )\n}\n\n/**\n * Hook for managing text input state with autocomplete support\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const { value, displayValue, suggestion, handleInput, acceptSuggestion, clear } =\n * useTextInput({ autocomplete: [\"apple\", \"banana\", \"cherry\"] });\n *\n * useInput((input, key) => {\n * if (key.tab && suggestion) {\n * acceptSuggestion();\n * } else {\n * handleInput(input, key);\n * }\n * });\n *\n * return <Text>{displayValue}</Text>;\n * }\n * ```\n */\nexport function useTextInput(\n options: {\n initialValue?: string\n mask?: string\n autocomplete?: string[]\n onSubmit?: (value: string) => void\n } = {},\n): {\n value: string\n setValue: (value: string) => void\n displayValue: string\n suggestion: string | undefined\n cursorPosition: number\n setCursorPosition: (pos: number) => void\n handleInput: (input: string, key: InputKey) => void\n acceptSuggestion: () => void\n clear: () => void\n} {\n const [value, setValue] = useState(options.initialValue ?? \"\")\n const [cursorPosition, setCursorPosition] = useState(value.length)\n\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n\n const handleInput = useCallback(\n (input: string, key: InputKey) => {\n if (key.return) {\n options.onSubmit?.(value)\n return\n }\n\n if (key.backspace || key.delete) {\n if (cursorPosition > 0) {\n setValue((v) => v.slice(0, cursorPosition - 1) + v.slice(cursorPosition))\n setCursorPosition((p) => Math.max(0, p - 1))\n }\n return\n }\n\n if (key.leftArrow) {\n setCursorPosition((p) => Math.max(0, p - 1))\n return\n }\n\n if (key.rightArrow) {\n setCursorPosition((p) => Math.min(value.length, p + 1))\n return\n }\n\n // Ignore control characters (but allow opt+key composed chars via key.text)\n if (key.ctrl || !input) {\n return\n }\n\n // Insert the actual typed character (pre-normalization), not the keybinding key.\n // E.g., Shift+3 should insert '#', not '3'.\n const char = key.text ?? input\n if (key.meta && !char) return // opt+key with no text output\n setValue((v) => v.slice(0, cursorPosition) + char + v.slice(cursorPosition))\n setCursorPosition((p) => p + char.length)\n },\n [value, cursorPosition, options.onSubmit],\n )\n\n const acceptSuggestion = useCallback(() => {\n if (suggestion) {\n setValue(suggestion)\n setCursorPosition(suggestion.length)\n }\n }, [suggestion])\n\n const clear = useCallback(() => {\n setValue(\"\")\n setCursorPosition(0)\n }, [])\n\n return {\n value,\n setValue,\n displayValue,\n suggestion,\n cursorPosition,\n setCursorPosition,\n handleInput,\n acceptSuggestion,\n clear,\n }\n}\n\n/** Key object type (matches Ink's Key interface) */\ninterface InputKey {\n return?: boolean\n backspace?: boolean\n delete?: boolean\n leftArrow?: boolean\n rightArrow?: boolean\n upArrow?: boolean\n downArrow?: boolean\n tab?: boolean\n escape?: boolean\n ctrl?: boolean\n meta?: boolean\n shift?: boolean\n text?: string\n}\n\n/**\n * Find a matching autocomplete suggestion for the current input\n */\nfunction getAutocompleteSuggestion(value: string, autocomplete?: string[]): string | undefined {\n if (!value || !autocomplete?.length) {\n return undefined\n }\n\n const lowerValue = value.toLowerCase()\n return autocomplete.find(\n (item) => item.toLowerCase().startsWith(lowerValue) && item.length > value.length,\n )\n}\n","/**\n * React Select component for silvery/Ink TUI apps\n *\n * Single-choice selection list with keyboard navigation.\n */\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport type { SelectProps, SelectOption } from \"../types.js\"\n\n/**\n * Scrollable single-choice selection list\n *\n * @example\n * ```tsx\n * import { Select } from \"./index\";\n *\n * function SettingsView() {\n * const [theme, setTheme] = useState(\"light\");\n *\n * return (\n * <Select\n * options={[\n * { label: \"Light\", value: \"light\" },\n * { label: \"Dark\", value: \"dark\" },\n * { label: \"System\", value: \"system\" },\n * ]}\n * value={theme}\n * onChange={setTheme}\n * />\n * );\n * }\n * ```\n */\nexport function Select<T>({\n options,\n value,\n onChange,\n maxVisible = 10,\n highlightIndex: controlledHighlightIndex,\n onHighlightChange,\n}: SelectProps<T>): React.ReactElement {\n // Find the index of the currently selected value\n const selectedIndex = options.findIndex((opt) => opt.value === value)\n\n // Internal highlight state (for uncontrolled mode)\n const [internalHighlightIndex, setInternalHighlightIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : 0,\n )\n\n // Use controlled or internal highlight index\n const highlightIndex = controlledHighlightIndex ?? internalHighlightIndex\n\n // Calculate scroll window\n const scrollOffset = Math.max(\n 0,\n Math.min(highlightIndex - Math.floor(maxVisible / 2), options.length - maxVisible),\n )\n const visibleOptions = options.slice(scrollOffset, scrollOffset + maxVisible)\n const hasMoreAbove = scrollOffset > 0\n const hasMoreBelow = scrollOffset + maxVisible < options.length\n\n // Sync internal highlight when value changes externally\n useEffect(() => {\n if (controlledHighlightIndex === undefined && selectedIndex >= 0) {\n setInternalHighlightIndex(selectedIndex)\n }\n }, [selectedIndex, controlledHighlightIndex])\n\n return (\n <div data-silvery-select>\n {hasMoreAbove && <div data-silvery-select-scroll-indicator=\"up\">...</div>}\n {visibleOptions.map((option, visibleIdx) => {\n const actualIndex = scrollOffset + visibleIdx\n const isSelected = option.value === value\n const isHighlighted = actualIndex === highlightIndex\n\n return (\n <div\n key={actualIndex}\n data-silvery-select-option\n data-selected={isSelected}\n data-highlighted={isHighlighted}\n >\n <span data-silvery-select-indicator>{isSelected ? \">\" : \" \"}</span>\n <span data-silvery-select-label>{option.label}</span>\n </div>\n )\n })}\n {hasMoreBelow && <div data-silvery-select-scroll-indicator=\"down\">...</div>}\n </div>\n )\n}\n\n/**\n * Hook for managing select state with keyboard navigation\n *\n * @example\n * ```tsx\n * function MySelect() {\n * const options = [\n * { label: \"Option A\", value: \"a\" },\n * { label: \"Option B\", value: \"b\" },\n * ];\n *\n * const { highlightIndex, moveUp, moveDown, select, value } = useSelect({\n * options,\n * initialValue: \"a\",\n * });\n *\n * useInput((input, key) => {\n * if (key.upArrow) moveUp();\n * if (key.downArrow) moveDown();\n * if (key.return) select();\n * });\n *\n * return <Select options={options} value={value} highlightIndex={highlightIndex} />;\n * }\n * ```\n */\nexport function useSelect<T>({\n options,\n initialValue,\n onChange,\n}: {\n options: SelectOption<T>[]\n initialValue?: T\n onChange?: (value: T) => void\n}): {\n value: T | undefined\n highlightIndex: number\n moveUp: () => void\n moveDown: () => void\n select: () => void\n setHighlightIndex: (index: number) => void\n} {\n const initialIndex =\n initialValue !== undefined ? options.findIndex((opt) => opt.value === initialValue) : 0\n\n const [highlightIndex, setHighlightIndex] = useState(Math.max(0, initialIndex))\n const [value, setValue] = useState<T | undefined>(initialValue)\n\n const moveUp = useCallback(() => {\n setHighlightIndex((i) => Math.max(0, i - 1))\n }, [])\n\n const moveDown = useCallback(() => {\n setHighlightIndex((i) => Math.min(options.length - 1, i + 1))\n }, [options.length])\n\n const select = useCallback(() => {\n const option = options[highlightIndex]\n if (option) {\n setValue(option.value)\n onChange?.(option.value)\n }\n }, [highlightIndex, options, onChange])\n\n return {\n value,\n highlightIndex,\n moveUp,\n moveDown,\n select,\n setHighlightIndex,\n }\n}\n"],"mappings":"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"}
|
package/dist/ui/progress.d.mts
CHANGED
|
@@ -1,249 +1,5 @@
|
|
|
1
|
-
import { a as ProgressInfo, d as StepProgress } from "../types-
|
|
2
|
-
import { i as createSpinner, r as Spinner, t as CallableSpinner } from "../spinner-
|
|
3
|
-
import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Step node tree structure for declarative steps
|
|
8
|
-
*
|
|
9
|
-
* Parses the user's declarative object structure into an internal tree
|
|
10
|
-
* that can be rendered and executed.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* A single step in the tree
|
|
14
|
-
*/
|
|
15
|
-
interface StepNode {
|
|
16
|
-
/** Display label (auto-generated or custom) */
|
|
17
|
-
label: string;
|
|
18
|
-
/** Object key from the declaration */
|
|
19
|
-
key: string;
|
|
20
|
-
/** Work function (if leaf node) */
|
|
21
|
-
work?: (...args: unknown[]) => unknown;
|
|
22
|
-
/** Child steps (if group node) */
|
|
23
|
-
children?: StepNode[];
|
|
24
|
-
/** Indentation level for display */
|
|
25
|
-
indent: number;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* What users can declare as a step value
|
|
29
|
-
*/
|
|
30
|
-
type StepValue = ((...args: unknown[]) => unknown) | [string, (...args: unknown[]) => unknown] | StepsDef;
|
|
31
|
-
/**
|
|
32
|
-
* The declarative structure users provide
|
|
33
|
-
*/
|
|
34
|
-
type StepsDef = {
|
|
35
|
-
[key: string]: StepValue;
|
|
36
|
-
};
|
|
37
|
-
//#endregion
|
|
38
|
-
//#region packages/ag-react/src/ui/progress/als-context.d.ts
|
|
39
|
-
/**
|
|
40
|
-
* Context available to work functions during step execution
|
|
41
|
-
*/
|
|
42
|
-
interface StepContext {
|
|
43
|
-
/** Update progress on current step */
|
|
44
|
-
progress(current: number, total: number): void;
|
|
45
|
-
/** Create a sub-step (auto-completes previous sub-step) */
|
|
46
|
-
sub(label: string): void;
|
|
47
|
-
/** Get current step label (for debugging) */
|
|
48
|
-
readonly label: string;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get the current step context
|
|
52
|
-
*
|
|
53
|
-
* Safe to call anywhere - returns a no-op context when called outside
|
|
54
|
-
* of a steps() execution context.
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* ```typescript
|
|
58
|
-
* async function processFiles(files: string[]) {
|
|
59
|
-
* for (let i = 0; i < files.length; i++) {
|
|
60
|
-
* step().progress(i + 1, files.length);
|
|
61
|
-
* await process(files[i]);
|
|
62
|
-
* }
|
|
63
|
-
* }
|
|
64
|
-
*
|
|
65
|
-
* // In tests (no steps context)
|
|
66
|
-
* await processFiles(["a.md", "b.md"]); // step() returns no-op, no errors
|
|
67
|
-
*
|
|
68
|
-
* // In production (with steps context)
|
|
69
|
-
* await steps({ process: processFiles }).run(); // Shows progress
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
declare function step(): StepContext;
|
|
73
|
-
//#endregion
|
|
74
|
-
//#region packages/ag-react/src/ui/progress/declarative.d.ts
|
|
75
|
-
/**
|
|
76
|
-
* Options for run() and pipe() execution
|
|
77
|
-
*/
|
|
78
|
-
interface ExecuteOptions$1 {
|
|
79
|
-
/** Clear progress display after completion (default: false) */
|
|
80
|
-
clear?: boolean;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Extract the return type from a generator or async generator
|
|
84
|
-
*/
|
|
85
|
-
type GeneratorReturn<T> = T extends Generator<unknown, infer R, unknown> ? R : T extends AsyncGenerator<unknown, infer R, unknown> ? R : T;
|
|
86
|
-
/**
|
|
87
|
-
* Unwrap the result type, handling generators specially
|
|
88
|
-
*/
|
|
89
|
-
type UnwrapResult<T> = Awaited<GeneratorReturn<Awaited<T>>>;
|
|
90
|
-
/**
|
|
91
|
-
* Result type: maps step keys to their return values
|
|
92
|
-
*/
|
|
93
|
-
type StepResults<T extends StepsDef> = { [K in keyof T]: T[K] extends ((...args: unknown[]) => infer R) ? UnwrapResult<R> : T[K] extends [string, (...args: unknown[]) => infer R] ? UnwrapResult<R> : T[K] extends StepsDef ? StepResults<T[K]> : unknown };
|
|
94
|
-
/**
|
|
95
|
-
* The runner object returned by steps()
|
|
96
|
-
*/
|
|
97
|
-
interface StepsRunner<T extends StepsDef> {
|
|
98
|
-
/** Internal: the parsed step nodes (for testing) */
|
|
99
|
-
readonly _steps: StepNode[];
|
|
100
|
-
/**
|
|
101
|
-
* Execute all steps sequentially
|
|
102
|
-
* @returns Results keyed by step name
|
|
103
|
-
*/
|
|
104
|
-
run(options?: ExecuteOptions$1): Promise<StepResults<T>>;
|
|
105
|
-
/**
|
|
106
|
-
* Execute all steps in a pipeline (each receives previous result)
|
|
107
|
-
* @returns Final step's result
|
|
108
|
-
*/
|
|
109
|
-
pipe(options?: ExecuteOptions$1): Promise<unknown>;
|
|
110
|
-
/**
|
|
111
|
-
* Manually signal completion (for manual execution mode)
|
|
112
|
-
*/
|
|
113
|
-
done(options?: {
|
|
114
|
-
clear?: boolean;
|
|
115
|
-
}): void;
|
|
116
|
-
}
|
|
117
|
-
//#endregion
|
|
118
|
-
//#region packages/ag-react/src/ui/progress/steps.d.ts
|
|
119
|
-
/** Progress update (object form) */
|
|
120
|
-
interface ProgressUpdate {
|
|
121
|
-
current?: number;
|
|
122
|
-
total?: number;
|
|
123
|
-
}
|
|
124
|
-
/** Declare all sub-steps upfront (optional, yield as first value) */
|
|
125
|
-
interface DeclareSteps {
|
|
126
|
-
declare: string[];
|
|
127
|
-
}
|
|
128
|
-
/** What generators can yield */
|
|
129
|
-
type StepYield = string | ProgressUpdate | DeclareSteps;
|
|
130
|
-
/**
|
|
131
|
-
* Controller for creating and updating sub-steps
|
|
132
|
-
*
|
|
133
|
-
* Passed to work functions that need to report sub-step progress.
|
|
134
|
-
*/
|
|
135
|
-
interface StepController {
|
|
136
|
-
/** Create a new sub-step (auto-completes previous sub-step) */
|
|
137
|
-
new (label: string): void;
|
|
138
|
-
/** Update progress on current sub-step */
|
|
139
|
-
progress(current: number, total: number): void;
|
|
140
|
-
/** Explicitly complete current sub-step (optional - new() auto-completes) */
|
|
141
|
-
done(): void;
|
|
142
|
-
}
|
|
143
|
-
/** Work function types */
|
|
144
|
-
type SyncWork<T> = () => T;
|
|
145
|
-
type AsyncWork<T> = () => PromiseLike<T>;
|
|
146
|
-
type SyncGeneratorWork<T> = () => Generator<StepYield, T, unknown>;
|
|
147
|
-
type AsyncGeneratorWork<T> = () => AsyncGenerator<StepYield, T, unknown>;
|
|
148
|
-
/** Work function with step controller for sub-step progress */
|
|
149
|
-
type WorkWithStep<T> = (step: StepController) => T | PromiseLike<T>;
|
|
150
|
-
type WorkFn<T> = SyncWork<T> | AsyncWork<T> | SyncGeneratorWork<T> | AsyncGeneratorWork<T> | WorkWithStep<T>;
|
|
151
|
-
/** Options for execute() */
|
|
152
|
-
interface ExecuteOptions {
|
|
153
|
-
/** Clear progress display after completion (default: false) */
|
|
154
|
-
clear?: boolean;
|
|
155
|
-
}
|
|
156
|
-
interface StepBuilder {
|
|
157
|
-
/**
|
|
158
|
-
* Add a step to run
|
|
159
|
-
*
|
|
160
|
-
* @param title - Display title for this step
|
|
161
|
-
* @param work - Function to execute. Can be:
|
|
162
|
-
* - Sync function: `() => result`
|
|
163
|
-
* - Async function: `async () => result`
|
|
164
|
-
* - Sync generator: `function* () { yield "sub-step"; return result; }`
|
|
165
|
-
* - Async generator: `async function* () { yield "sub-step"; return result; }`
|
|
166
|
-
*
|
|
167
|
-
* Generators can yield:
|
|
168
|
-
* - `"string"` - Creates a new sub-step with that label
|
|
169
|
-
* - `{ current: N, total: M }` - Updates progress on current sub-step
|
|
170
|
-
*/
|
|
171
|
-
run<T>(title: string, work: WorkFn<T>): StepBuilder;
|
|
172
|
-
/**
|
|
173
|
-
* Execute all steps in sequence
|
|
174
|
-
* @param options - Execution options
|
|
175
|
-
* @returns Results keyed by step title
|
|
176
|
-
*/
|
|
177
|
-
execute(options?: ExecuteOptions): Promise<Record<string, unknown>>;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Create a step runner
|
|
181
|
-
*
|
|
182
|
-
* @overload Declarative mode - pass an object to declare steps upfront
|
|
183
|
-
* @overload Fluent mode - chain steps with .run() and execute with .execute()
|
|
184
|
-
*
|
|
185
|
-
* @example Declarative mode (recommended)
|
|
186
|
-
* ```typescript
|
|
187
|
-
* const loader = steps({
|
|
188
|
-
* loadModules,
|
|
189
|
-
* loadRepo: { discover, parse },
|
|
190
|
-
* });
|
|
191
|
-
* const results = await loader.run({ clear: true });
|
|
192
|
-
* ```
|
|
193
|
-
*
|
|
194
|
-
* @example Fluent mode
|
|
195
|
-
* ```typescript
|
|
196
|
-
* await steps()
|
|
197
|
-
* .run("Step 1", doStep1)
|
|
198
|
-
* .run("Step 2", doStep2)
|
|
199
|
-
* .execute();
|
|
200
|
-
* ```
|
|
201
|
-
*/
|
|
202
|
-
declare function steps<T extends StepsDef>(def: T): StepsRunner<T>;
|
|
203
|
-
declare function steps(): StepBuilder;
|
|
204
|
-
//#endregion
|
|
205
|
-
//#region packages/ag-react/src/ui/progress/task.d.ts
|
|
206
|
-
interface TaskWrapper {
|
|
207
|
-
/**
|
|
208
|
-
* Wrap work with a spinner indicator
|
|
209
|
-
* @param work - Promise, function, or generator
|
|
210
|
-
*/
|
|
211
|
-
wrap<T>(work: T | PromiseLike<T> | (() => T | PromiseLike<T>) | (() => Generator<ProgressInfo, T, unknown>)): Promise<T>;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Create a task wrapper with spinner
|
|
215
|
-
*
|
|
216
|
-
* @param title - Display title for the task
|
|
217
|
-
* @returns TaskWrapper with wrap() method
|
|
218
|
-
*/
|
|
219
|
-
declare function task(title: string): TaskWrapper;
|
|
220
|
-
//#endregion
|
|
221
|
-
//#region packages/ag-react/src/ui/progress/tasks.d.ts
|
|
222
|
-
/** Options for run() */
|
|
223
|
-
interface RunOptions {
|
|
224
|
-
/** Clear progress display after completion (default: false) */
|
|
225
|
-
clear?: boolean;
|
|
226
|
-
}
|
|
227
|
-
interface TaskBuilder {
|
|
228
|
-
/**
|
|
229
|
-
* Add a task to the sequence
|
|
230
|
-
* @param title - Display title
|
|
231
|
-
* @param work - Function, async function, or generator
|
|
232
|
-
*/
|
|
233
|
-
add<T>(title: string, work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>): TaskBuilder;
|
|
234
|
-
/**
|
|
235
|
-
* Run all tasks in sequence
|
|
236
|
-
* @param options - Run options
|
|
237
|
-
* @returns Results keyed by task title
|
|
238
|
-
*/
|
|
239
|
-
run(options?: RunOptions): Promise<Record<string, unknown>>;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Create a sequential task builder
|
|
243
|
-
*
|
|
244
|
-
* @returns TaskBuilder with add() and run() methods
|
|
245
|
-
*/
|
|
246
|
-
declare function tasks(): TaskBuilder;
|
|
247
|
-
//#endregion
|
|
248
|
-
export { CallableSpinner, ExecuteOptions, MultiProgress, ProgressBar, ProgressInfo, RunOptions, Spinner, StepBuilder, type StepContext, type StepNode, StepProgress, type StepsDef, type StepsRunner, TaskBuilder, TaskHandle, TaskWrapper, createSpinner, step, steps, task, tasks };
|
|
249
|
-
//# sourceMappingURL=progress.d.mts.map
|
|
1
|
+
import { a as ProgressInfo, d as StepProgress } from "../types-kt_fKR37.mjs";
|
|
2
|
+
import { i as createSpinner, r as Spinner, t as CallableSpinner } from "../spinner-CZINHpkV.mjs";
|
|
3
|
+
import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-DHZ2xUT2.mjs";
|
|
4
|
+
import { a as StepContext, c as StepsDef, i as StepsRunner, n as StepBuilder, o as step, r as steps, s as StepNode, t as ExecuteOptions } from "../steps-Bp2uNqnn.mjs";
|
|
5
|
+
export { CallableSpinner, ExecuteOptions, MultiProgress, ProgressBar, ProgressInfo, Spinner, StepBuilder, StepContext, StepNode, StepProgress, StepsDef, StepsRunner, TaskHandle, createSpinner, step, steps };
|