@fnd-platform/cli 1.0.0-alpha.24 → 1.0.0-alpha.26
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/lib/bin/fnd.js +101 -4
- package/lib/bin/fnd.js.map +1 -1
- package/lib/commands/add.js +72 -75
- package/lib/commands/add.js.map +1 -1
- package/lib/commands/build.js +29 -34
- package/lib/commands/build.js.map +1 -1
- package/lib/commands/deploy.d.ts +13 -5
- package/lib/commands/deploy.d.ts.map +1 -1
- package/lib/commands/deploy.js +94 -75
- package/lib/commands/deploy.js.map +1 -1
- package/lib/commands/destroy.js +33 -38
- package/lib/commands/destroy.js.map +1 -1
- package/lib/commands/index.d.ts +1 -0
- package/lib/commands/index.d.ts.map +1 -1
- package/lib/commands/index.js +7 -15
- package/lib/commands/index.js.map +1 -1
- package/lib/commands/new.js +46 -50
- package/lib/commands/new.js.map +1 -1
- package/lib/commands/synth.d.ts +8 -1
- package/lib/commands/synth.d.ts.map +1 -1
- package/lib/commands/synth.js +82 -22
- package/lib/commands/synth.js.map +1 -1
- package/lib/commands/test.d.ts +73 -0
- package/lib/commands/test.d.ts.map +1 -0
- package/lib/commands/test.js +193 -0
- package/lib/commands/test.js.map +1 -0
- package/lib/index.d.ts +11 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +29 -18
- package/lib/index.js.map +1 -1
- package/lib/lib/deploy-utils.d.ts.map +1 -1
- package/lib/lib/deploy-utils.js +73 -72
- package/lib/lib/deploy-utils.js.map +1 -1
- package/lib/lib/infra-generator.js +55 -63
- package/lib/lib/infra-generator.js.map +1 -1
- package/lib/lib/logger.js +23 -29
- package/lib/lib/logger.js.map +1 -1
- package/lib/lib/nx-stats.js +12 -18
- package/lib/lib/nx-stats.js.map +1 -1
- package/lib/lib/project.js +7 -11
- package/lib/lib/project.js.map +1 -1
- package/lib/lib/templates.js +2 -6
- package/lib/lib/templates.js.map +1 -1
- package/lib/lib/timer.js +2 -7
- package/lib/lib/timer.js.map +1 -1
- package/lib/lib/validation.d.ts +135 -0
- package/lib/lib/validation.d.ts.map +1 -0
- package/lib/lib/validation.js +233 -0
- package/lib/lib/validation.js.map +1 -0
- package/lib/tui/App.d.ts +11 -0
- package/lib/tui/App.d.ts.map +1 -0
- package/lib/tui/App.js +98 -0
- package/lib/tui/App.js.map +1 -0
- package/lib/tui/components/branding/AsciiBanner.d.ts +21 -0
- package/lib/tui/components/branding/AsciiBanner.d.ts.map +1 -0
- package/lib/tui/components/branding/AsciiBanner.js +15 -0
- package/lib/tui/components/branding/AsciiBanner.js.map +1 -0
- package/lib/tui/components/branding/index.d.ts +5 -0
- package/lib/tui/components/branding/index.d.ts.map +1 -0
- package/lib/tui/components/branding/index.js +5 -0
- package/lib/tui/components/branding/index.js.map +1 -0
- package/lib/tui/components/feedback/Notification.d.ts +51 -0
- package/lib/tui/components/feedback/Notification.d.ts.map +1 -0
- package/lib/tui/components/feedback/Notification.js +89 -0
- package/lib/tui/components/feedback/Notification.js.map +1 -0
- package/lib/tui/components/feedback/ProgressBar.d.ts +46 -0
- package/lib/tui/components/feedback/ProgressBar.d.ts.map +1 -0
- package/lib/tui/components/feedback/ProgressBar.js +30 -0
- package/lib/tui/components/feedback/ProgressBar.js.map +1 -0
- package/lib/tui/components/feedback/ProgressSteps.d.ts +35 -0
- package/lib/tui/components/feedback/ProgressSteps.d.ts.map +1 -0
- package/lib/tui/components/feedback/ProgressSteps.js +37 -0
- package/lib/tui/components/feedback/ProgressSteps.js.map +1 -0
- package/lib/tui/components/feedback/Spinner.d.ts +18 -0
- package/lib/tui/components/feedback/Spinner.d.ts.map +1 -0
- package/lib/tui/components/feedback/Spinner.js +28 -0
- package/lib/tui/components/feedback/Spinner.js.map +1 -0
- package/lib/tui/components/feedback/index.d.ts +8 -0
- package/lib/tui/components/feedback/index.d.ts.map +1 -0
- package/lib/tui/components/feedback/index.js +8 -0
- package/lib/tui/components/feedback/index.js.map +1 -0
- package/lib/tui/components/index.d.ts +8 -0
- package/lib/tui/components/index.d.ts.map +1 -0
- package/lib/tui/components/index.js +8 -0
- package/lib/tui/components/index.js.map +1 -0
- package/lib/tui/components/input/Checkbox.d.ts +26 -0
- package/lib/tui/components/input/Checkbox.d.ts.map +1 -0
- package/lib/tui/components/input/Checkbox.js +20 -0
- package/lib/tui/components/input/Checkbox.js.map +1 -0
- package/lib/tui/components/input/SelectInput.d.ts +41 -0
- package/lib/tui/components/input/SelectInput.d.ts.map +1 -0
- package/lib/tui/components/input/SelectInput.js +53 -0
- package/lib/tui/components/input/SelectInput.js.map +1 -0
- package/lib/tui/components/input/TextInput.d.ts +30 -0
- package/lib/tui/components/input/TextInput.d.ts.map +1 -0
- package/lib/tui/components/input/TextInput.js +48 -0
- package/lib/tui/components/input/TextInput.js.map +1 -0
- package/lib/tui/components/input/index.d.ts +7 -0
- package/lib/tui/components/input/index.d.ts.map +1 -0
- package/lib/tui/components/input/index.js +7 -0
- package/lib/tui/components/input/index.js.map +1 -0
- package/lib/tui/components/layout/Breadcrumbs.d.ts +11 -0
- package/lib/tui/components/layout/Breadcrumbs.d.ts.map +1 -0
- package/lib/tui/components/layout/Breadcrumbs.js +34 -0
- package/lib/tui/components/layout/Breadcrumbs.js.map +1 -0
- package/lib/tui/components/layout/Footer.d.ts +11 -0
- package/lib/tui/components/layout/Footer.d.ts.map +1 -0
- package/lib/tui/components/layout/Footer.js +20 -0
- package/lib/tui/components/layout/Footer.js.map +1 -0
- package/lib/tui/components/layout/Header.d.ts +21 -0
- package/lib/tui/components/layout/Header.d.ts.map +1 -0
- package/lib/tui/components/layout/Header.js +21 -0
- package/lib/tui/components/layout/Header.js.map +1 -0
- package/lib/tui/components/layout/Screen.d.ts +27 -0
- package/lib/tui/components/layout/Screen.d.ts.map +1 -0
- package/lib/tui/components/layout/Screen.js +11 -0
- package/lib/tui/components/layout/Screen.js.map +1 -0
- package/lib/tui/components/layout/index.d.ts +8 -0
- package/lib/tui/components/layout/index.d.ts.map +1 -0
- package/lib/tui/components/layout/index.js +8 -0
- package/lib/tui/components/layout/index.js.map +1 -0
- package/lib/tui/hooks/index.d.ts +20 -0
- package/lib/tui/hooks/index.d.ts.map +1 -0
- package/lib/tui/hooks/index.js +18 -0
- package/lib/tui/hooks/index.js.map +1 -0
- package/lib/tui/hooks/useAddPackage.d.ts +120 -0
- package/lib/tui/hooks/useAddPackage.d.ts.map +1 -0
- package/lib/tui/hooks/useAddPackage.js +344 -0
- package/lib/tui/hooks/useAddPackage.js.map +1 -0
- package/lib/tui/hooks/useCreateProject.d.ts +66 -0
- package/lib/tui/hooks/useCreateProject.d.ts.map +1 -0
- package/lib/tui/hooks/useCreateProject.js +156 -0
- package/lib/tui/hooks/useCreateProject.js.map +1 -0
- package/lib/tui/hooks/useDeploy.d.ts +93 -0
- package/lib/tui/hooks/useDeploy.d.ts.map +1 -0
- package/lib/tui/hooks/useDeploy.js +252 -0
- package/lib/tui/hooks/useDeploy.js.map +1 -0
- package/lib/tui/hooks/useKeyboard.d.ts +66 -0
- package/lib/tui/hooks/useKeyboard.d.ts.map +1 -0
- package/lib/tui/hooks/useKeyboard.js +101 -0
- package/lib/tui/hooks/useKeyboard.js.map +1 -0
- package/lib/tui/hooks/useNavigation.d.ts +33 -0
- package/lib/tui/hooks/useNavigation.d.ts.map +1 -0
- package/lib/tui/hooks/useNavigation.js +27 -0
- package/lib/tui/hooks/useNavigation.js.map +1 -0
- package/lib/tui/hooks/useProject.d.ts +36 -0
- package/lib/tui/hooks/useProject.d.ts.map +1 -0
- package/lib/tui/hooks/useProject.js +47 -0
- package/lib/tui/hooks/useProject.js.map +1 -0
- package/lib/tui/index.d.ts +15 -0
- package/lib/tui/index.d.ts.map +1 -0
- package/lib/tui/index.js +16 -0
- package/lib/tui/index.js.map +1 -0
- package/lib/tui/lib/add-package-tui.d.ts +127 -0
- package/lib/tui/lib/add-package-tui.d.ts.map +1 -0
- package/lib/tui/lib/add-package-tui.js +467 -0
- package/lib/tui/lib/add-package-tui.js.map +1 -0
- package/lib/tui/lib/create-project-tui.d.ts +92 -0
- package/lib/tui/lib/create-project-tui.d.ts.map +1 -0
- package/lib/tui/lib/create-project-tui.js +181 -0
- package/lib/tui/lib/create-project-tui.js.map +1 -0
- package/lib/tui/lib/deploy-tui.d.ts +131 -0
- package/lib/tui/lib/deploy-tui.d.ts.map +1 -0
- package/lib/tui/lib/deploy-tui.js +347 -0
- package/lib/tui/lib/deploy-tui.js.map +1 -0
- package/lib/tui/screens/AddPackageScreen.d.ts +12 -0
- package/lib/tui/screens/AddPackageScreen.d.ts.map +1 -0
- package/lib/tui/screens/AddPackageScreen.js +436 -0
- package/lib/tui/screens/AddPackageScreen.js.map +1 -0
- package/lib/tui/screens/CreateProjectScreen.d.ts +12 -0
- package/lib/tui/screens/CreateProjectScreen.d.ts.map +1 -0
- package/lib/tui/screens/CreateProjectScreen.js +253 -0
- package/lib/tui/screens/CreateProjectScreen.js.map +1 -0
- package/lib/tui/screens/DeployScreen.d.ts +11 -0
- package/lib/tui/screens/DeployScreen.d.ts.map +1 -0
- package/lib/tui/screens/DeployScreen.js +224 -0
- package/lib/tui/screens/DeployScreen.js.map +1 -0
- package/lib/tui/screens/ProjectDashboard.d.ts +11 -0
- package/lib/tui/screens/ProjectDashboard.d.ts.map +1 -0
- package/lib/tui/screens/ProjectDashboard.js +42 -0
- package/lib/tui/screens/ProjectDashboard.js.map +1 -0
- package/lib/tui/screens/WelcomeScreen.d.ts +11 -0
- package/lib/tui/screens/WelcomeScreen.d.ts.map +1 -0
- package/lib/tui/screens/WelcomeScreen.js +26 -0
- package/lib/tui/screens/WelcomeScreen.js.map +1 -0
- package/lib/tui/screens/index.d.ts +9 -0
- package/lib/tui/screens/index.d.ts.map +1 -0
- package/lib/tui/screens/index.js +9 -0
- package/lib/tui/screens/index.js.map +1 -0
- package/lib/tui/services/ConfigService.d.ts +133 -0
- package/lib/tui/services/ConfigService.d.ts.map +1 -0
- package/lib/tui/services/ConfigService.js +221 -0
- package/lib/tui/services/ConfigService.js.map +1 -0
- package/lib/tui/services/ProjectService.d.ts +55 -0
- package/lib/tui/services/ProjectService.d.ts.map +1 -0
- package/lib/tui/services/ProjectService.js +179 -0
- package/lib/tui/services/ProjectService.js.map +1 -0
- package/lib/tui/services/index.d.ts +6 -0
- package/lib/tui/services/index.d.ts.map +1 -0
- package/lib/tui/services/index.js +6 -0
- package/lib/tui/services/index.js.map +1 -0
- package/lib/tui/state/AppContext.d.ts +58 -0
- package/lib/tui/state/AppContext.d.ts.map +1 -0
- package/lib/tui/state/AppContext.js +75 -0
- package/lib/tui/state/AppContext.js.map +1 -0
- package/lib/tui/state/index.d.ts +7 -0
- package/lib/tui/state/index.d.ts.map +1 -0
- package/lib/tui/state/index.js +7 -0
- package/lib/tui/state/index.js.map +1 -0
- package/lib/tui/state/reducer.d.ts +13 -0
- package/lib/tui/state/reducer.d.ts.map +1 -0
- package/lib/tui/state/reducer.js +136 -0
- package/lib/tui/state/reducer.js.map +1 -0
- package/lib/tui/state/types.d.ts +132 -0
- package/lib/tui/state/types.d.ts.map +1 -0
- package/lib/tui/state/types.js +38 -0
- package/lib/tui/state/types.js.map +1 -0
- package/lib/tui/utils/ascii.d.ts +42 -0
- package/lib/tui/utils/ascii.d.ts.map +1 -0
- package/lib/tui/utils/ascii.js +63 -0
- package/lib/tui/utils/ascii.js.map +1 -0
- package/lib/tui/utils/colors.d.ts +65 -0
- package/lib/tui/utils/colors.d.ts.map +1 -0
- package/lib/tui/utils/colors.js +65 -0
- package/lib/tui/utils/colors.js.map +1 -0
- package/lib/tui/utils/index.d.ts +6 -0
- package/lib/tui/utils/index.d.ts.map +1 -0
- package/lib/tui/utils/index.js +6 -0
- package/lib/tui/utils/index.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Notification component for the FND TUI.
|
|
4
|
+
*
|
|
5
|
+
* Displays toast-style notification messages.
|
|
6
|
+
*/
|
|
7
|
+
import { useEffect, useState } from 'react';
|
|
8
|
+
import { Box, Text } from 'ink';
|
|
9
|
+
import { colors } from '../../utils/colors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Get icon for notification type.
|
|
12
|
+
*/
|
|
13
|
+
function getIcon(type) {
|
|
14
|
+
switch (type) {
|
|
15
|
+
case 'success':
|
|
16
|
+
return '✓';
|
|
17
|
+
case 'warning':
|
|
18
|
+
return '!';
|
|
19
|
+
case 'error':
|
|
20
|
+
return '✗';
|
|
21
|
+
case 'info':
|
|
22
|
+
default:
|
|
23
|
+
return 'ℹ';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get color for notification type.
|
|
28
|
+
*/
|
|
29
|
+
function getColor(type) {
|
|
30
|
+
switch (type) {
|
|
31
|
+
case 'success':
|
|
32
|
+
return colors.success;
|
|
33
|
+
case 'warning':
|
|
34
|
+
return colors.warning;
|
|
35
|
+
case 'error':
|
|
36
|
+
return colors.error;
|
|
37
|
+
case 'info':
|
|
38
|
+
default:
|
|
39
|
+
return colors.primary;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Toast-style notification component.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* // Basic info notification
|
|
47
|
+
* <Notification message="Operation completed" />
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Success notification with auto-dismiss
|
|
51
|
+
* <Notification
|
|
52
|
+
* message="Project created successfully!"
|
|
53
|
+
* type="success"
|
|
54
|
+
* duration={3000}
|
|
55
|
+
* onDismiss={() => setShowNotification(false)}
|
|
56
|
+
* />
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // Error notification with border
|
|
60
|
+
* <Notification
|
|
61
|
+
* message="Deployment failed"
|
|
62
|
+
* type="error"
|
|
63
|
+
* bordered
|
|
64
|
+
* />
|
|
65
|
+
*/
|
|
66
|
+
export function Notification({ message, type = 'info', duration = 0, onDismiss, bordered = false, }) {
|
|
67
|
+
const [visible, setVisible] = useState(true);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (duration > 0) {
|
|
70
|
+
const timer = setTimeout(() => {
|
|
71
|
+
setVisible(false);
|
|
72
|
+
onDismiss?.();
|
|
73
|
+
}, duration);
|
|
74
|
+
return () => clearTimeout(timer);
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}, [duration, onDismiss]);
|
|
78
|
+
if (!visible) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const icon = getIcon(type);
|
|
82
|
+
const color = getColor(type);
|
|
83
|
+
const content = (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: color, children: icon }), _jsx(Text, { children: message })] }));
|
|
84
|
+
if (bordered) {
|
|
85
|
+
return (_jsx(Box, { borderStyle: "round", borderColor: color, paddingX: 2, paddingY: 0, children: content }));
|
|
86
|
+
}
|
|
87
|
+
return content;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=Notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Notification.js","sourceRoot":"","sources":["../../../../src/tui/components/feedback/Notification.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAuB/C;;GAEG;AACH,SAAS,OAAO,CAAC,IAAsB;IACrC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,OAAO;YACV,OAAO,GAAG,CAAC;QACb,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAsB;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,EACP,IAAI,GAAG,MAAM,EACb,QAAQ,GAAG,CAAC,EACZ,SAAS,EACT,QAAQ,GAAG,KAAK,GACE;IAClB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,SAAS,EAAE,EAAE,CAAC;YAChB,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEb,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,CACd,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,IAAI,GAAQ,EACjC,KAAC,IAAI,cAAE,OAAO,GAAQ,IAClB,CACP,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,KAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,YAEV,OAAO,GACJ,CACP,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress bar component for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Provides a visual progress indicator.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Props for the ProgressBar component.
|
|
9
|
+
*/
|
|
10
|
+
export interface ProgressBarProps {
|
|
11
|
+
/** Current progress value (0 to total) */
|
|
12
|
+
value: number;
|
|
13
|
+
/** Total/max value */
|
|
14
|
+
total: number;
|
|
15
|
+
/** Width of the progress bar in characters (default: 30) */
|
|
16
|
+
width?: number;
|
|
17
|
+
/** Label to show after the progress bar */
|
|
18
|
+
label?: string;
|
|
19
|
+
/** Show percentage instead of fraction (default: false) */
|
|
20
|
+
showPercentage?: boolean;
|
|
21
|
+
/** Fill character (default: '█') */
|
|
22
|
+
fillChar?: string;
|
|
23
|
+
/** Empty character (default: '░') */
|
|
24
|
+
emptyChar?: string;
|
|
25
|
+
/** Color for the filled portion (default: primary) */
|
|
26
|
+
fillColor?: string;
|
|
27
|
+
/** Color for the empty portion (default: muted) */
|
|
28
|
+
emptyColor?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Visual progress bar component.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Basic usage
|
|
35
|
+
* <ProgressBar value={3} total={10} />
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // With percentage and custom width
|
|
39
|
+
* <ProgressBar value={75} total={100} width={40} showPercentage />
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // With custom characters
|
|
43
|
+
* <ProgressBar value={5} total={10} fillChar="#" emptyChar="-" />
|
|
44
|
+
*/
|
|
45
|
+
export declare function ProgressBar({ value, total, width, label, showPercentage, fillChar, emptyChar, fillColor, emptyColor, }: ProgressBarProps): React.ReactElement;
|
|
46
|
+
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/feedback/ProgressBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,KAAU,EACV,KAAK,EACL,cAAsB,EACtB,QAAc,EACd,SAAe,EACf,SAA0B,EAC1B,UAAyB,GAC1B,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAqBvC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { colors } from '../../utils/colors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Visual progress bar component.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // Basic usage
|
|
9
|
+
* <ProgressBar value={3} total={10} />
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* // With percentage and custom width
|
|
13
|
+
* <ProgressBar value={75} total={100} width={40} showPercentage />
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // With custom characters
|
|
17
|
+
* <ProgressBar value={5} total={10} fillChar="#" emptyChar="-" />
|
|
18
|
+
*/
|
|
19
|
+
export function ProgressBar({ value, total, width = 30, label, showPercentage = false, fillChar = '█', emptyChar = '░', fillColor = colors.primary, emptyColor = colors.muted, }) {
|
|
20
|
+
// Calculate progress
|
|
21
|
+
const percentage = total > 0 ? Math.min(value / total, 1) : 0;
|
|
22
|
+
const filledWidth = Math.round(percentage * width);
|
|
23
|
+
const emptyWidth = width - filledWidth;
|
|
24
|
+
// Build progress display text
|
|
25
|
+
const progressText = showPercentage
|
|
26
|
+
? `${Math.round(percentage * 100)}%`
|
|
27
|
+
: `${value}/${total}`;
|
|
28
|
+
return (_jsxs(Box, { children: [_jsx(Text, { children: "[" }), _jsx(Text, { color: fillColor, children: fillChar.repeat(filledWidth) }), _jsx(Text, { color: emptyColor, children: emptyChar.repeat(emptyWidth) }), _jsx(Text, { children: "]" }), _jsxs(Text, { color: colors.muted, children: [" ", progressText] }), label && _jsxs(Text, { color: colors.muted, children: [" ", label] })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../../../src/tui/components/feedback/ProgressBar.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AA0B/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,KAAK,GAAG,EAAE,EACV,KAAK,EACL,cAAc,GAAG,KAAK,EACtB,QAAQ,GAAG,GAAG,EACd,SAAS,GAAG,GAAG,EACf,SAAS,GAAG,MAAM,CAAC,OAAO,EAC1B,UAAU,GAAG,MAAM,CAAC,KAAK,GACR;IACjB,qBAAqB;IACrB,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC;IAEvC,8BAA8B;IAC9B,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG;QACpC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;IAExB,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAQ,EAC7D,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,YAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,GAAQ,EAC9D,KAAC,IAAI,oBAAS,EACd,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,kBAAI,YAAY,IAAQ,EAChD,KAAK,IAAI,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,kBAAI,KAAK,IAAQ,IAChD,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress steps component for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Displays a vertical list of progress steps with status indicators.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Status of a progress step.
|
|
9
|
+
*/
|
|
10
|
+
export type ProgressStepStatus = 'pending' | 'in-progress' | 'complete' | 'error';
|
|
11
|
+
/**
|
|
12
|
+
* A single progress step.
|
|
13
|
+
*/
|
|
14
|
+
export interface ProgressStep {
|
|
15
|
+
/** Unique step identifier */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Step label */
|
|
18
|
+
label: string;
|
|
19
|
+
/** Step status */
|
|
20
|
+
status: ProgressStepStatus;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Props for the ProgressSteps component.
|
|
24
|
+
*/
|
|
25
|
+
export interface ProgressStepsProps {
|
|
26
|
+
/** List of steps */
|
|
27
|
+
steps: ProgressStep[];
|
|
28
|
+
/** Error message to display */
|
|
29
|
+
errorMessage?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Progress steps component showing multiple steps with their status.
|
|
33
|
+
*/
|
|
34
|
+
export declare function ProgressSteps({ steps, errorMessage }: ProgressStepsProps): React.ReactElement;
|
|
35
|
+
//# sourceMappingURL=ProgressSteps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressSteps.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/feedback/ProgressSteps.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CA6B7F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { colors } from '../../utils/colors.js';
|
|
4
|
+
import { Spinner } from './Spinner.js';
|
|
5
|
+
/**
|
|
6
|
+
* Renders a status indicator for a step.
|
|
7
|
+
*/
|
|
8
|
+
function StepIndicator({ status }) {
|
|
9
|
+
switch (status) {
|
|
10
|
+
case 'pending':
|
|
11
|
+
return _jsx(Text, { color: colors.muted, children: "\u25CB" });
|
|
12
|
+
case 'in-progress':
|
|
13
|
+
return _jsx(Spinner, {});
|
|
14
|
+
case 'complete':
|
|
15
|
+
return _jsx(Text, { color: colors.success, children: "\u2713" });
|
|
16
|
+
case 'error':
|
|
17
|
+
return _jsx(Text, { color: colors.error, children: "\u2717" });
|
|
18
|
+
default:
|
|
19
|
+
return _jsx(Text, { color: colors.muted, children: "\u25CB" });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Progress steps component showing multiple steps with their status.
|
|
24
|
+
*/
|
|
25
|
+
export function ProgressSteps({ steps, errorMessage }) {
|
|
26
|
+
return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [steps.map((step) => {
|
|
27
|
+
const textColor = step.status === 'complete'
|
|
28
|
+
? colors.success
|
|
29
|
+
: step.status === 'error'
|
|
30
|
+
? colors.error
|
|
31
|
+
: step.status === 'in-progress'
|
|
32
|
+
? undefined
|
|
33
|
+
: colors.muted;
|
|
34
|
+
return (_jsxs(Box, { children: [_jsx(Box, { width: 3, children: _jsx(StepIndicator, { status: step.status }) }), _jsx(Text, { color: textColor, children: step.label })] }, step.id));
|
|
35
|
+
}), errorMessage && (_jsx(Box, { marginTop: 1, marginLeft: 3, children: _jsx(Text, { color: colors.error, children: errorMessage }) }))] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ProgressSteps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressSteps.js","sourceRoot":"","sources":["../../../../src/tui/components/feedback/ProgressSteps.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA6BvC;;GAEG;AACH,SAAS,aAAa,CAAC,EAAE,MAAM,EAAkC;IAC/D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,uBAAU,CAAC;QAC7C,KAAK,aAAa;YAChB,OAAO,KAAC,OAAO,KAAG,CAAC;QACrB,KAAK,UAAU;YACb,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,uBAAU,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,uBAAU,CAAC;QAC7C;YACE,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,uBAAU,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,YAAY,EAAsB;IACvE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,aAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClB,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,KAAK,UAAU;oBACxB,CAAC,CAAC,MAAM,CAAC,OAAO;oBAChB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO;wBACvB,CAAC,CAAC,MAAM,CAAC,KAAK;wBACd,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa;4BAC7B,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAEvB,OAAO,CACL,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,YACX,KAAC,aAAa,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAI,GAClC,EACN,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,IAAI,CAAC,KAAK,GAAQ,KAJnC,IAAI,CAAC,EAAE,CAKX,CACP,CAAC;YACJ,CAAC,CAAC,EACD,YAAY,IAAI,CACf,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YAC9B,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,YAAY,GAAQ,GAC5C,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spinner component for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Provides an animated loading indicator.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Props for the Spinner component.
|
|
9
|
+
*/
|
|
10
|
+
export interface SpinnerProps {
|
|
11
|
+
/** Text to display alongside the spinner */
|
|
12
|
+
text?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Animated spinner component.
|
|
16
|
+
*/
|
|
17
|
+
export declare function Spinner({ text }: SpinnerProps): React.ReactElement;
|
|
18
|
+
//# sourceMappingURL=Spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/feedback/Spinner.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AASnD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,GAAG,KAAK,CAAC,YAAY,CAmBlE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Spinner component for the FND TUI.
|
|
4
|
+
*
|
|
5
|
+
* Provides an animated loading indicator.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useEffect } from 'react';
|
|
8
|
+
import { Box, Text } from 'ink';
|
|
9
|
+
import { colors } from '../../utils/colors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Spinner animation frames.
|
|
12
|
+
*/
|
|
13
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
14
|
+
/**
|
|
15
|
+
* Animated spinner component.
|
|
16
|
+
*/
|
|
17
|
+
export function Spinner({ text }) {
|
|
18
|
+
const [frameIndex, setFrameIndex] = useState(0);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const timer = setInterval(() => {
|
|
21
|
+
setFrameIndex((prev) => (prev + 1) % SPINNER_FRAMES.length);
|
|
22
|
+
}, 80);
|
|
23
|
+
return () => clearInterval(timer);
|
|
24
|
+
}, []);
|
|
25
|
+
const frame = SPINNER_FRAMES[frameIndex];
|
|
26
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: colors.primary, children: frame }), text && _jsxs(Text, { children: [" ", text] })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../../src/tui/components/feedback/Spinner.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAU1E;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,IAAI,EAAgB;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEzC,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,KAAK,GAAQ,EAC1C,IAAI,IAAI,MAAC,IAAI,oBAAG,IAAI,IAAQ,IACzB,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/feedback/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tui/components/feedback/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkbox component for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Provides a toggleable checkbox input.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Props for the Checkbox component.
|
|
9
|
+
*/
|
|
10
|
+
export interface CheckboxProps {
|
|
11
|
+
/** Checkbox label */
|
|
12
|
+
label: string;
|
|
13
|
+
/** Whether the checkbox is checked */
|
|
14
|
+
checked: boolean;
|
|
15
|
+
/** Change handler */
|
|
16
|
+
onChange: (checked: boolean) => void;
|
|
17
|
+
/** Whether the checkbox is focused */
|
|
18
|
+
isFocused?: boolean;
|
|
19
|
+
/** Optional description */
|
|
20
|
+
description?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Checkbox component with space/enter toggle.
|
|
24
|
+
*/
|
|
25
|
+
export declare function Checkbox({ label, checked, onChange, isFocused, description, }: CheckboxProps): React.ReactElement;
|
|
26
|
+
//# sourceMappingURL=Checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/input/Checkbox.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,sCAAsC;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAiB,EACjB,WAAW,GACZ,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAiCpC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { colors } from '../../utils/colors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Checkbox component with space/enter toggle.
|
|
6
|
+
*/
|
|
7
|
+
export function Checkbox({ label, checked, onChange, isFocused = false, description, }) {
|
|
8
|
+
// Handle keyboard input
|
|
9
|
+
useInput((input, key) => {
|
|
10
|
+
if (!isFocused)
|
|
11
|
+
return;
|
|
12
|
+
if (input === ' ' || key.return) {
|
|
13
|
+
onChange(!checked);
|
|
14
|
+
}
|
|
15
|
+
}, { isActive: isFocused });
|
|
16
|
+
const indicator = isFocused ? '>' : ' ';
|
|
17
|
+
const checkbox = checked ? '[x]' : '[ ]';
|
|
18
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? colors.primary : colors.muted, children: [indicator, ' '] }), _jsxs(Text, { color: isFocused ? colors.primary : undefined, children: [checkbox, " ", label] })] }), description && isFocused && (_jsx(Box, { marginLeft: 4, children: _jsx(Text, { color: colors.muted, children: description }) }))] }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../../src/tui/components/input/Checkbox.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAkB/C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,GAAG,KAAK,EACjB,WAAW,GACG;IACd,wBAAwB;IACxB,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAEzC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,aACnD,SAAS,EAAE,GAAG,IACV,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,aAChD,QAAQ,OAAG,KAAK,IACZ,IACH,EACL,WAAW,IAAI,SAAS,IAAI,CAC3B,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,WAAW,GAAQ,GAC3C,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Select input component for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Provides an arrow-key navigable option selector.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Option for the select input.
|
|
9
|
+
*/
|
|
10
|
+
export interface SelectOption<T = string> {
|
|
11
|
+
/** Display label */
|
|
12
|
+
label: string;
|
|
13
|
+
/** Option value */
|
|
14
|
+
value: T;
|
|
15
|
+
/** Optional description */
|
|
16
|
+
description?: string;
|
|
17
|
+
/** Whether this option is recommended */
|
|
18
|
+
recommended?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Props for the SelectInput component.
|
|
22
|
+
*/
|
|
23
|
+
export interface SelectInputProps<T = string> {
|
|
24
|
+
/** Available options */
|
|
25
|
+
options: SelectOption<T>[];
|
|
26
|
+
/** Currently selected value */
|
|
27
|
+
value: T;
|
|
28
|
+
/** Change handler */
|
|
29
|
+
onChange: (value: T) => void;
|
|
30
|
+
/** Label text */
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Whether the input is focused */
|
|
33
|
+
isFocused?: boolean;
|
|
34
|
+
/** Submit handler (Enter key) */
|
|
35
|
+
onSubmit?: () => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Select input component with arrow key navigation.
|
|
39
|
+
*/
|
|
40
|
+
export declare function SelectInput<T = string>({ options, value, onChange, label, isFocused, onSubmit, }: SelectInputProps<T>): React.ReactElement;
|
|
41
|
+
//# sourceMappingURL=SelectInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectInput.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/input/SelectInput.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM;IACtC,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,KAAK,EAAE,CAAC,CAAC;IACT,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,MAAM;IAC1C,wBAAwB;IACxB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,+BAA+B;IAC/B,KAAK,EAAE,CAAC,CAAC;IACT,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,EACtC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,SAAgB,EAChB,QAAQ,GACT,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CA4E1C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Select input component for the FND TUI.
|
|
4
|
+
*
|
|
5
|
+
* Provides an arrow-key navigable option selector.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useEffect } from 'react';
|
|
8
|
+
import { Box, Text, useInput } from 'ink';
|
|
9
|
+
import { colors } from '../../utils/colors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Select input component with arrow key navigation.
|
|
12
|
+
*/
|
|
13
|
+
export function SelectInput({ options, value, onChange, label, isFocused = true, onSubmit, }) {
|
|
14
|
+
const [highlightedIndex, setHighlightedIndex] = useState(() => {
|
|
15
|
+
const idx = options.findIndex((opt) => opt.value === value);
|
|
16
|
+
return idx >= 0 ? idx : 0;
|
|
17
|
+
});
|
|
18
|
+
// Sync highlighted index with value when value changes externally
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const idx = options.findIndex((opt) => opt.value === value);
|
|
21
|
+
if (idx >= 0 && idx !== highlightedIndex) {
|
|
22
|
+
setHighlightedIndex(idx);
|
|
23
|
+
}
|
|
24
|
+
}, [value, options, highlightedIndex]);
|
|
25
|
+
// Handle keyboard input
|
|
26
|
+
useInput((input, key) => {
|
|
27
|
+
if (!isFocused)
|
|
28
|
+
return;
|
|
29
|
+
if (key.upArrow) {
|
|
30
|
+
const newIndex = highlightedIndex > 0 ? highlightedIndex - 1 : options.length - 1;
|
|
31
|
+
setHighlightedIndex(newIndex);
|
|
32
|
+
onChange(options[newIndex].value);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (key.downArrow) {
|
|
36
|
+
const newIndex = highlightedIndex < options.length - 1 ? highlightedIndex + 1 : 0;
|
|
37
|
+
setHighlightedIndex(newIndex);
|
|
38
|
+
onChange(options[newIndex].value);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (key.return && onSubmit) {
|
|
42
|
+
onSubmit();
|
|
43
|
+
}
|
|
44
|
+
}, { isActive: isFocused });
|
|
45
|
+
return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [label && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.muted, children: label }) })), options.map((option, index) => {
|
|
46
|
+
const isHighlighted = index === highlightedIndex;
|
|
47
|
+
const isSelected = option.value === value;
|
|
48
|
+
const indicator = isHighlighted ? '>' : ' ';
|
|
49
|
+
const bullet = isSelected ? '●' : '○';
|
|
50
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isHighlighted ? colors.primary : colors.muted, children: [indicator, ' '] }), _jsxs(Text, { color: isHighlighted ? colors.primary : undefined, children: [bullet, " ", option.label] }), option.recommended && (_jsx(Text, { color: colors.success, children: " (recommended)" }))] }), option.description && isHighlighted && (_jsx(Box, { marginLeft: 4, children: _jsx(Text, { color: colors.muted, children: option.description }) }))] }, String(option.value)));
|
|
51
|
+
})] }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=SelectInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectInput.js","sourceRoot":"","sources":["../../../../src/tui/components/input/SelectInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text input component for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Provides a styled text input with validation support.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Props for the TextInput component.
|
|
9
|
+
*/
|
|
10
|
+
export interface TextInputProps {
|
|
11
|
+
/** Current value */
|
|
12
|
+
value: string;
|
|
13
|
+
/** Change handler */
|
|
14
|
+
onChange: (value: string) => void;
|
|
15
|
+
/** Placeholder text */
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
/** Label text */
|
|
18
|
+
label?: string;
|
|
19
|
+
/** Error message */
|
|
20
|
+
error?: string;
|
|
21
|
+
/** Whether the input is focused */
|
|
22
|
+
isFocused?: boolean;
|
|
23
|
+
/** Submit handler (Enter key) */
|
|
24
|
+
onSubmit?: () => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Text input component with cursor and validation display.
|
|
28
|
+
*/
|
|
29
|
+
export declare function TextInput({ value, onChange, placeholder, label, error, isFocused, onSubmit, }: TextInputProps): React.ReactElement;
|
|
30
|
+
//# sourceMappingURL=TextInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/input/TextInput.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,WAAgB,EAChB,KAAK,EACL,KAAK,EACL,SAAgB,EAChB,QAAQ,GACT,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CAwErC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Text input component for the FND TUI.
|
|
4
|
+
*
|
|
5
|
+
* Provides a styled text input with validation support.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useEffect } from 'react';
|
|
8
|
+
import { Box, Text, useInput } from 'ink';
|
|
9
|
+
import { colors } from '../../utils/colors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Text input component with cursor and validation display.
|
|
12
|
+
*/
|
|
13
|
+
export function TextInput({ value, onChange, placeholder = '', label, error, isFocused = true, onSubmit, }) {
|
|
14
|
+
const [cursorVisible, setCursorVisible] = useState(true);
|
|
15
|
+
// Cursor blink effect
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (!isFocused) {
|
|
18
|
+
setCursorVisible(false);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const timer = setInterval(() => {
|
|
22
|
+
setCursorVisible((prev) => !prev);
|
|
23
|
+
}, 530);
|
|
24
|
+
return () => clearInterval(timer);
|
|
25
|
+
}, [isFocused]);
|
|
26
|
+
// Handle keyboard input
|
|
27
|
+
useInput((input, key) => {
|
|
28
|
+
if (!isFocused)
|
|
29
|
+
return;
|
|
30
|
+
if (key.return && onSubmit) {
|
|
31
|
+
onSubmit();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (key.backspace || key.delete) {
|
|
35
|
+
onChange(value.slice(0, -1));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Only accept printable characters
|
|
39
|
+
if (input && !key.ctrl && !key.meta) {
|
|
40
|
+
onChange(value + input);
|
|
41
|
+
}
|
|
42
|
+
}, { isActive: isFocused });
|
|
43
|
+
const displayValue = value || '';
|
|
44
|
+
const showPlaceholder = !displayValue && placeholder;
|
|
45
|
+
const cursor = isFocused && cursorVisible ? '▌' : ' ';
|
|
46
|
+
return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [label && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.muted, children: label }) })), _jsxs(Box, { children: [_jsx(Text, { color: colors.primary, children: '> ' }), showPlaceholder ? (_jsxs(Text, { color: colors.muted, children: [placeholder, cursor] })) : (_jsxs(Text, { children: [displayValue, _jsx(Text, { color: colors.primary, children: cursor })] }))] }), error && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: colors.error, children: error }) }))] }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=TextInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../../src/tui/components/input/TextInput.tsx"],"names":[],"mappings":"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"}
|