@google/gemini-cli 0.7.0-nightly.20250918.2722473a → 0.7.0-preview.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +4 -3
- package/dist/src/commands/extensions/disable.d.ts +1 -2
- package/dist/src/commands/extensions/disable.js +17 -3
- package/dist/src/commands/extensions/disable.js.map +1 -1
- package/dist/src/commands/extensions/enable.d.ts +1 -2
- package/dist/src/commands/extensions/enable.js +17 -4
- package/dist/src/commands/extensions/enable.js.map +1 -1
- package/dist/src/commands/extensions/install.d.ts +1 -0
- package/dist/src/commands/extensions/install.js +10 -2
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +12 -2
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +1 -1
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/new.test.js +2 -2
- package/dist/src/commands/extensions/new.test.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.js +1 -1
- package/dist/src/commands/extensions/uninstall.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.test.js +4 -1
- package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
- package/dist/src/commands/extensions/update.js +38 -17
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/mcp/add.js +6 -1
- package/dist/src/commands/mcp/add.js.map +1 -1
- package/dist/src/config/config.d.ts +2 -0
- package/dist/src/config/config.js +84 -64
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +5 -18
- package/dist/src/config/extension.js +95 -201
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.d.ts +14 -0
- package/dist/src/config/extensions/extensionEnablement.js +81 -33
- package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.test.js +164 -19
- package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
- package/dist/src/config/extensions/github.d.ts +29 -0
- package/dist/src/config/extensions/github.js +301 -0
- package/dist/src/config/extensions/github.js.map +1 -0
- package/dist/src/config/extensions/github.test.d.ts +6 -0
- package/dist/src/config/extensions/github.test.js +271 -0
- package/dist/src/config/extensions/github.test.js.map +1 -0
- package/dist/src/config/extensions/update.d.ts +20 -0
- package/dist/src/config/extensions/update.js +94 -0
- package/dist/src/config/extensions/update.js.map +1 -0
- package/dist/src/config/extensions/update.test.d.ts +6 -0
- package/dist/src/config/extensions/update.test.js +327 -0
- package/dist/src/config/extensions/update.test.js.map +1 -0
- package/dist/src/config/policy-engine.integration.test.d.ts +6 -0
- package/dist/src/config/policy-engine.integration.test.js +270 -0
- package/dist/src/config/policy-engine.integration.test.js.map +1 -0
- package/dist/src/config/policy.d.ts +8 -0
- package/dist/src/config/policy.js +150 -0
- package/dist/src/config/policy.js.map +1 -0
- package/dist/src/config/policy.test.d.ts +6 -0
- package/dist/src/config/policy.test.js +336 -0
- package/dist/src/config/policy.test.js.map +1 -0
- package/dist/src/config/settings.js +19 -4
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +27 -9
- package/dist/src/config/settingsSchema.js +27 -9
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/trustedFolders.d.ts +10 -1
- package/dist/src/config/trustedFolders.js +40 -14
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/config/trustedFolders.test.js +95 -14
- package/dist/src/config/trustedFolders.test.js.map +1 -1
- package/dist/src/gemini.js +102 -127
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +74 -5
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/nonInteractiveCli.d.ts +2 -1
- package/dist/src/nonInteractiveCli.js +29 -16
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCliCommands.d.ts +17 -0
- package/dist/src/nonInteractiveCliCommands.js +79 -0
- package/dist/src/nonInteractiveCliCommands.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.js +4 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +50 -1
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/test-utils/createExtension.d.ts +15 -0
- package/dist/src/test-utils/createExtension.js +25 -0
- package/dist/src/test-utils/createExtension.js.map +1 -0
- package/dist/src/test-utils/mockCommandContext.js +2 -0
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/test-utils/render.d.ts +3 -1
- package/dist/src/test-utils/render.js +2 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.js +3 -2
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/AppContainer.js +55 -42
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +130 -0
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.d.ts +2 -2
- package/dist/src/ui/IdeIntegrationNudge.js +1 -2
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +14 -3
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +1 -1
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +22 -6
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.js +1 -1
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +9 -2
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.d.ts +7 -0
- package/dist/src/ui/commands/modelCommand.js +16 -0
- package/dist/src/ui/commands/modelCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/modelCommand.test.js +30 -0
- package/dist/src/ui/commands/modelCommand.test.js.map +1 -0
- package/dist/src/ui/commands/permissionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/permissionsCommand.js +16 -0
- package/dist/src/ui/commands/permissionsCommand.js.map +1 -0
- package/dist/src/ui/commands/permissionsCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/permissionsCommand.test.js +30 -0
- package/dist/src/ui/commands/permissionsCommand.test.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +3 -3
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AppHeader.js +2 -5
- package/dist/src/ui/components/AppHeader.js.map +1 -1
- package/dist/src/ui/components/Composer.js +4 -10
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +13 -21
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/DialogManager.d.ts +6 -1
- package/dist/src/ui/components/DialogManager.js +10 -1
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.d.ts +1 -1
- package/dist/src/ui/components/InputPrompt.js +17 -8
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +1 -1
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.d.ts +11 -0
- package/dist/src/ui/components/ModelDialog.js +53 -0
- package/dist/src/ui/components/ModelDialog.js.map +1 -0
- package/dist/src/ui/components/ModelDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ModelDialog.test.js +153 -0
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.d.ts +13 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js +45 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +6 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +158 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -0
- package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
- package/dist/src/ui/components/QueuedMessageDisplay.js +20 -0
- package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.js +56 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
- package/dist/src/ui/components/SettingsDialog.js +1 -1
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +50 -16
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +11 -9
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.d.ts +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +13 -6
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.d.ts +43 -0
- package/dist/src/ui/components/shared/BaseSelectionList.js +72 -0
- package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +6 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +374 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +36 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +13 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +6 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +68 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.js +9 -104
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +113 -92
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.js +63 -2
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/constants.d.ts +1 -0
- package/dist/src/ui/constants.js +1 -0
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.js +3 -0
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
- package/dist/src/ui/contexts/SessionContext.js +107 -5
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/contexts/ShellFocusContext.d.ts +7 -0
- package/dist/src/ui/contexts/ShellFocusContext.js +9 -0
- package/dist/src/ui/contexts/ShellFocusContext.js.map +1 -0
- package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +7 -4
- package/dist/src/ui/contexts/UIStateContext.js +1 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +7 -5
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +4 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +7 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +12 -0
- package/dist/src/ui/hooks/useExtensionUpdates.js +64 -0
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +165 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
- package/dist/src/ui/hooks/useFocus.js +10 -0
- package/dist/src/ui/hooks/useFocus.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.d.ts +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js +2 -7
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +7 -6
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
- package/dist/src/ui/hooks/useModelCommand.d.ts +12 -0
- package/dist/src/ui/hooks/useModelCommand.js +21 -0
- package/dist/src/ui/hooks/useModelCommand.js.map +1 -0
- package/dist/src/ui/hooks/useModelCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useModelCommand.test.js +35 -0
- package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.d.ts +17 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.js +78 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.js.map +1 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +6 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +182 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.d.ts +33 -0
- package/dist/src/ui/hooks/useSelectionList.js +252 -0
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSelectionList.test.js +651 -0
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +7 -2
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +33 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useStateAndRef.d.ts +1 -1
- package/dist/src/ui/hooks/useStateAndRef.js +2 -2
- package/dist/src/ui/hooks/useStateAndRef.js.map +1 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.d.ts +12 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +27 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -0
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +3 -3
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
- package/dist/src/ui/state/extensions.d.ts +2 -1
- package/dist/src/ui/state/extensions.js +1 -0
- package/dist/src/ui/state/extensions.js.map +1 -1
- package/dist/src/utils/deepMerge.d.ts +2 -3
- package/dist/src/utils/events.d.ts +2 -1
- package/dist/src/utils/events.js +1 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/relaunch.d.ts +7 -0
- package/dist/src/utils/relaunch.js +57 -0
- package/dist/src/utils/relaunch.js.map +1 -0
- package/dist/src/utils/relaunch.test.d.ts +6 -0
- package/dist/src/utils/relaunch.test.js +273 -0
- package/dist/src/utils/relaunch.test.js.map +1 -0
- package/dist/src/zed-integration/schema.d.ts +22 -22
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type React from 'react';
|
|
7
|
+
export interface RenderItemContext {
|
|
8
|
+
isSelected: boolean;
|
|
9
|
+
titleColor: string;
|
|
10
|
+
numberColor: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BaseSelectionListProps<T, TItem = Record<string, unknown>> {
|
|
13
|
+
items: Array<TItem & {
|
|
14
|
+
value: T;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
initialIndex?: number;
|
|
18
|
+
onSelect: (value: T) => void;
|
|
19
|
+
onHighlight?: (value: T) => void;
|
|
20
|
+
isFocused?: boolean;
|
|
21
|
+
showNumbers?: boolean;
|
|
22
|
+
showScrollArrows?: boolean;
|
|
23
|
+
maxItemsToShow?: number;
|
|
24
|
+
renderItem: (item: TItem & {
|
|
25
|
+
value: T;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
}, context: RenderItemContext) => React.ReactNode;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Base component for selection lists that provides common UI structure
|
|
31
|
+
* and keyboard navigation logic via the useSelectionList hook.
|
|
32
|
+
*
|
|
33
|
+
* This component handles:
|
|
34
|
+
* - Radio button indicators
|
|
35
|
+
* - Item numbering
|
|
36
|
+
* - Scrolling for long lists
|
|
37
|
+
* - Color theming based on selection/disabled state
|
|
38
|
+
* - Keyboard navigation and numeric selection
|
|
39
|
+
*
|
|
40
|
+
* Specific components should use this as a base and provide
|
|
41
|
+
* their own renderItem implementation for custom content.
|
|
42
|
+
*/
|
|
43
|
+
export declare function BaseSelectionList<T, TItem = Record<string, unknown>>({ items, initialIndex, onSelect, onHighlight, isFocused, showNumbers, showScrollArrows, maxItemsToShow, renderItem, }: BaseSelectionListProps<T, TItem>): React.JSX.Element;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Text, Box } from 'ink';
|
|
4
|
+
import { theme } from '../../semantic-colors.js';
|
|
5
|
+
import { useSelectionList } from '../../hooks/useSelectionList.js';
|
|
6
|
+
/**
|
|
7
|
+
* Base component for selection lists that provides common UI structure
|
|
8
|
+
* and keyboard navigation logic via the useSelectionList hook.
|
|
9
|
+
*
|
|
10
|
+
* This component handles:
|
|
11
|
+
* - Radio button indicators
|
|
12
|
+
* - Item numbering
|
|
13
|
+
* - Scrolling for long lists
|
|
14
|
+
* - Color theming based on selection/disabled state
|
|
15
|
+
* - Keyboard navigation and numeric selection
|
|
16
|
+
*
|
|
17
|
+
* Specific components should use this as a base and provide
|
|
18
|
+
* their own renderItem implementation for custom content.
|
|
19
|
+
*/
|
|
20
|
+
export function BaseSelectionList({ items, initialIndex = 0, onSelect, onHighlight, isFocused = true, showNumbers = true, showScrollArrows = false, maxItemsToShow = 10, renderItem, }) {
|
|
21
|
+
const { activeIndex } = useSelectionList({
|
|
22
|
+
items,
|
|
23
|
+
initialIndex,
|
|
24
|
+
onSelect,
|
|
25
|
+
onHighlight,
|
|
26
|
+
isFocused,
|
|
27
|
+
showNumbers,
|
|
28
|
+
});
|
|
29
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
30
|
+
// Handle scrolling for long lists
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const newScrollOffset = Math.max(0, Math.min(activeIndex - maxItemsToShow + 1, items.length - maxItemsToShow));
|
|
33
|
+
if (activeIndex < scrollOffset) {
|
|
34
|
+
setScrollOffset(activeIndex);
|
|
35
|
+
}
|
|
36
|
+
else if (activeIndex >= scrollOffset + maxItemsToShow) {
|
|
37
|
+
setScrollOffset(newScrollOffset);
|
|
38
|
+
}
|
|
39
|
+
}, [activeIndex, items.length, scrollOffset, maxItemsToShow]);
|
|
40
|
+
const visibleItems = items.slice(scrollOffset, scrollOffset + maxItemsToShow);
|
|
41
|
+
const numberColumnWidth = String(items.length).length;
|
|
42
|
+
return (_jsxs(Box, { flexDirection: "column", children: [showScrollArrows && (_jsx(Text, { color: scrollOffset > 0 ? theme.text.primary : theme.text.secondary, children: "\u25B2" })), visibleItems.map((item, index) => {
|
|
43
|
+
const itemIndex = scrollOffset + index;
|
|
44
|
+
const isSelected = activeIndex === itemIndex;
|
|
45
|
+
// Determine colors based on selection and disabled state
|
|
46
|
+
let titleColor = theme.text.primary;
|
|
47
|
+
let numberColor = theme.text.primary;
|
|
48
|
+
if (isSelected) {
|
|
49
|
+
titleColor = theme.status.success;
|
|
50
|
+
numberColor = theme.status.success;
|
|
51
|
+
}
|
|
52
|
+
else if (item.disabled) {
|
|
53
|
+
titleColor = theme.text.secondary;
|
|
54
|
+
numberColor = theme.text.secondary;
|
|
55
|
+
}
|
|
56
|
+
if (!isFocused && !item.disabled) {
|
|
57
|
+
numberColor = theme.text.secondary;
|
|
58
|
+
}
|
|
59
|
+
if (!showNumbers) {
|
|
60
|
+
numberColor = theme.text.secondary;
|
|
61
|
+
}
|
|
62
|
+
const itemNumberText = `${String(itemIndex + 1).padStart(numberColumnWidth)}.`;
|
|
63
|
+
return (_jsxs(Box, { alignItems: "flex-start", children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: _jsx(Text, { color: isSelected ? theme.status.success : theme.text.primary, "aria-hidden": true, children: isSelected ? '●' : ' ' }) }), showNumbers && (_jsx(Box, { marginRight: 1, flexShrink: 0, minWidth: itemNumberText.length, "aria-state": { checked: isSelected }, children: _jsx(Text, { color: numberColor, children: itemNumberText }) })), _jsx(Box, { flexGrow: 1, children: renderItem(item, {
|
|
64
|
+
isSelected,
|
|
65
|
+
titleColor,
|
|
66
|
+
numberColor,
|
|
67
|
+
}) })] }, itemIndex));
|
|
68
|
+
}), showScrollArrows && (_jsx(Text, { color: scrollOffset + maxItemsToShow < items.length
|
|
69
|
+
? theme.text.primary
|
|
70
|
+
: theme.text.secondary, children: "\u25BC" }))] }));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=BaseSelectionList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseSelectionList.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/BaseSelectionList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2025 Google LLC
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
8
|
+
import { waitFor } from '@testing-library/react';
|
|
9
|
+
import { renderWithProviders } from '../../../test-utils/render.js';
|
|
10
|
+
import { BaseSelectionList, } from './BaseSelectionList.js';
|
|
11
|
+
import { useSelectionList } from '../../hooks/useSelectionList.js';
|
|
12
|
+
import { Text } from 'ink';
|
|
13
|
+
vi.mock('../../hooks/useSelectionList.js');
|
|
14
|
+
const mockTheme = {
|
|
15
|
+
text: { primary: 'COLOR_PRIMARY', secondary: 'COLOR_SECONDARY' },
|
|
16
|
+
status: { success: 'COLOR_SUCCESS' },
|
|
17
|
+
};
|
|
18
|
+
vi.mock('../../semantic-colors.js', () => ({
|
|
19
|
+
theme: {
|
|
20
|
+
text: { primary: 'COLOR_PRIMARY', secondary: 'COLOR_SECONDARY' },
|
|
21
|
+
status: { success: 'COLOR_SUCCESS' },
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
describe('BaseSelectionList', () => {
|
|
25
|
+
const mockOnSelect = vi.fn();
|
|
26
|
+
const mockOnHighlight = vi.fn();
|
|
27
|
+
const mockRenderItem = vi.fn();
|
|
28
|
+
// Define standard test items
|
|
29
|
+
const items = [
|
|
30
|
+
{ value: 'A', label: 'Item A' },
|
|
31
|
+
{ value: 'B', label: 'Item B', disabled: true },
|
|
32
|
+
{ value: 'C', label: 'Item C' },
|
|
33
|
+
];
|
|
34
|
+
// Helper to render the component with default props
|
|
35
|
+
const renderComponent = (props = {}, activeIndex = 0) => {
|
|
36
|
+
vi.mocked(useSelectionList).mockReturnValue({
|
|
37
|
+
activeIndex,
|
|
38
|
+
setActiveIndex: vi.fn(),
|
|
39
|
+
});
|
|
40
|
+
mockRenderItem.mockImplementation((item, context) => (_jsx(Text, { color: context.titleColor, children: item.label })));
|
|
41
|
+
const defaultProps = {
|
|
42
|
+
items,
|
|
43
|
+
onSelect: mockOnSelect,
|
|
44
|
+
onHighlight: mockOnHighlight,
|
|
45
|
+
renderItem: mockRenderItem,
|
|
46
|
+
...props,
|
|
47
|
+
};
|
|
48
|
+
return renderWithProviders(_jsx(BaseSelectionList, { ...defaultProps }));
|
|
49
|
+
};
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
vi.clearAllMocks();
|
|
52
|
+
});
|
|
53
|
+
describe('Rendering and Structure', () => {
|
|
54
|
+
it('should render all items using the renderItem prop', () => {
|
|
55
|
+
const { lastFrame } = renderComponent();
|
|
56
|
+
expect(lastFrame()).toContain('Item A');
|
|
57
|
+
expect(lastFrame()).toContain('Item B');
|
|
58
|
+
expect(lastFrame()).toContain('Item C');
|
|
59
|
+
expect(mockRenderItem).toHaveBeenCalledTimes(3);
|
|
60
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[0], expect.any(Object));
|
|
61
|
+
});
|
|
62
|
+
it('should render the selection indicator (● or space) and layout', () => {
|
|
63
|
+
const { lastFrame } = renderComponent({}, 0);
|
|
64
|
+
const output = lastFrame();
|
|
65
|
+
// Use regex to assert the structure: Indicator + Whitespace + Number + Label
|
|
66
|
+
expect(output).toMatch(/●\s+1\.\s+Item A/);
|
|
67
|
+
expect(output).toMatch(/\s+2\.\s+Item B/);
|
|
68
|
+
expect(output).toMatch(/\s+3\.\s+Item C/);
|
|
69
|
+
});
|
|
70
|
+
it('should handle an empty list gracefully', () => {
|
|
71
|
+
const { lastFrame } = renderComponent({ items: [] });
|
|
72
|
+
expect(mockRenderItem).not.toHaveBeenCalled();
|
|
73
|
+
expect(lastFrame()).toBe('');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('useSelectionList Integration', () => {
|
|
77
|
+
it('should pass props correctly to useSelectionList', () => {
|
|
78
|
+
const initialIndex = 1;
|
|
79
|
+
const isFocused = false;
|
|
80
|
+
const showNumbers = false;
|
|
81
|
+
renderComponent({ initialIndex, isFocused, showNumbers });
|
|
82
|
+
expect(useSelectionList).toHaveBeenCalledWith({
|
|
83
|
+
items,
|
|
84
|
+
initialIndex,
|
|
85
|
+
onSelect: mockOnSelect,
|
|
86
|
+
onHighlight: mockOnHighlight,
|
|
87
|
+
isFocused,
|
|
88
|
+
showNumbers,
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
it('should use the activeIndex returned by the hook', () => {
|
|
92
|
+
renderComponent({}, 2); // Active index is C
|
|
93
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[0], expect.objectContaining({ isSelected: false }));
|
|
94
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[2], expect.objectContaining({ isSelected: true }));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('Styling and Colors', () => {
|
|
98
|
+
it('should apply success color to the selected item', () => {
|
|
99
|
+
renderComponent({}, 0); // Item A selected
|
|
100
|
+
// Check renderItem context colors against the mocked theme
|
|
101
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[0], expect.objectContaining({
|
|
102
|
+
titleColor: mockTheme.status.success,
|
|
103
|
+
numberColor: mockTheme.status.success,
|
|
104
|
+
isSelected: true,
|
|
105
|
+
}));
|
|
106
|
+
});
|
|
107
|
+
it('should apply primary color to unselected, enabled items', () => {
|
|
108
|
+
renderComponent({}, 0); // Item A selected, Item C unselected/enabled
|
|
109
|
+
// Check renderItem context colors for Item C
|
|
110
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[2], expect.objectContaining({
|
|
111
|
+
titleColor: mockTheme.text.primary,
|
|
112
|
+
numberColor: mockTheme.text.primary,
|
|
113
|
+
isSelected: false,
|
|
114
|
+
}));
|
|
115
|
+
});
|
|
116
|
+
it('should apply secondary color to disabled items (when not selected)', () => {
|
|
117
|
+
renderComponent({}, 0); // Item A selected, Item B disabled
|
|
118
|
+
// Check renderItem context colors for Item B
|
|
119
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[1], expect.objectContaining({
|
|
120
|
+
titleColor: mockTheme.text.secondary,
|
|
121
|
+
numberColor: mockTheme.text.secondary,
|
|
122
|
+
isSelected: false,
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
it('should apply success color to disabled items if they are selected', () => {
|
|
126
|
+
// The component should visually reflect the selection even if the item is disabled.
|
|
127
|
+
renderComponent({}, 1); // Item B (disabled) selected
|
|
128
|
+
// Check renderItem context colors for Item B
|
|
129
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[1], expect.objectContaining({
|
|
130
|
+
titleColor: mockTheme.status.success,
|
|
131
|
+
numberColor: mockTheme.status.success,
|
|
132
|
+
isSelected: true,
|
|
133
|
+
}));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('Numbering (showNumbers)', () => {
|
|
137
|
+
it('should show numbers by default with correct formatting', () => {
|
|
138
|
+
const { lastFrame } = renderComponent();
|
|
139
|
+
const output = lastFrame();
|
|
140
|
+
expect(output).toContain('1.');
|
|
141
|
+
expect(output).toContain('2.');
|
|
142
|
+
expect(output).toContain('3.');
|
|
143
|
+
});
|
|
144
|
+
it('should hide numbers when showNumbers is false', () => {
|
|
145
|
+
const { lastFrame } = renderComponent({ showNumbers: false });
|
|
146
|
+
const output = lastFrame();
|
|
147
|
+
expect(output).not.toContain('1.');
|
|
148
|
+
expect(output).not.toContain('2.');
|
|
149
|
+
expect(output).not.toContain('3.');
|
|
150
|
+
});
|
|
151
|
+
it('should apply correct padding for alignment in long lists', () => {
|
|
152
|
+
const longList = Array.from({ length: 15 }, (_, i) => ({
|
|
153
|
+
value: `Item ${i + 1}`,
|
|
154
|
+
label: `Item ${i + 1}`,
|
|
155
|
+
}));
|
|
156
|
+
// We must increase maxItemsToShow (default 10) to see the 10th item and beyond
|
|
157
|
+
const { lastFrame } = renderComponent({
|
|
158
|
+
items: longList,
|
|
159
|
+
maxItemsToShow: 15,
|
|
160
|
+
});
|
|
161
|
+
const output = lastFrame();
|
|
162
|
+
// Check formatting for single and double digits.
|
|
163
|
+
// The implementation uses padStart, resulting in " 1." and "10.".
|
|
164
|
+
expect(output).toContain(' 1.');
|
|
165
|
+
expect(output).toContain('10.');
|
|
166
|
+
});
|
|
167
|
+
it('should apply secondary color to numbers if showNumbers is false (internal logic check)', () => {
|
|
168
|
+
renderComponent({ showNumbers: false }, 0);
|
|
169
|
+
expect(mockRenderItem).toHaveBeenCalledWith(items[0], expect.objectContaining({
|
|
170
|
+
isSelected: true,
|
|
171
|
+
titleColor: mockTheme.status.success,
|
|
172
|
+
numberColor: mockTheme.text.secondary,
|
|
173
|
+
}));
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('Scrolling and Pagination (maxItemsToShow)', () => {
|
|
177
|
+
const longList = Array.from({ length: 10 }, (_, i) => ({
|
|
178
|
+
value: `Item ${i + 1}`,
|
|
179
|
+
label: `Item ${i + 1}`,
|
|
180
|
+
}));
|
|
181
|
+
const MAX_ITEMS = 3;
|
|
182
|
+
const renderScrollableList = (initialActiveIndex = 0) => {
|
|
183
|
+
// Define the props used for the initial render and subsequent rerenders
|
|
184
|
+
const componentProps = {
|
|
185
|
+
items: longList,
|
|
186
|
+
maxItemsToShow: MAX_ITEMS,
|
|
187
|
+
onSelect: mockOnSelect,
|
|
188
|
+
onHighlight: mockOnHighlight,
|
|
189
|
+
renderItem: mockRenderItem,
|
|
190
|
+
};
|
|
191
|
+
vi.mocked(useSelectionList).mockReturnValue({
|
|
192
|
+
activeIndex: initialActiveIndex,
|
|
193
|
+
setActiveIndex: vi.fn(),
|
|
194
|
+
});
|
|
195
|
+
mockRenderItem.mockImplementation((item, context) => (_jsx(Text, { color: context.titleColor, children: item.label })));
|
|
196
|
+
const { rerender, lastFrame } = renderWithProviders(_jsx(BaseSelectionList, { ...componentProps }));
|
|
197
|
+
// Function to simulate the activeIndex changing over time
|
|
198
|
+
const updateActiveIndex = async (newIndex) => {
|
|
199
|
+
vi.mocked(useSelectionList).mockReturnValue({
|
|
200
|
+
activeIndex: newIndex,
|
|
201
|
+
setActiveIndex: vi.fn(),
|
|
202
|
+
});
|
|
203
|
+
rerender(_jsx(BaseSelectionList, { ...componentProps }));
|
|
204
|
+
await waitFor(() => {
|
|
205
|
+
expect(lastFrame()).toBeTruthy();
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
return { updateActiveIndex, lastFrame };
|
|
209
|
+
};
|
|
210
|
+
it('should only show maxItemsToShow items initially', () => {
|
|
211
|
+
const { lastFrame } = renderScrollableList(0);
|
|
212
|
+
const output = lastFrame();
|
|
213
|
+
expect(output).toContain('Item 1');
|
|
214
|
+
expect(output).toContain('Item 3');
|
|
215
|
+
expect(output).not.toContain('Item 4');
|
|
216
|
+
});
|
|
217
|
+
it('should scroll down when activeIndex moves beyond the visible window', async () => {
|
|
218
|
+
const { updateActiveIndex, lastFrame } = renderScrollableList(0);
|
|
219
|
+
// Move to index 3 (Item 4). Should trigger scroll.
|
|
220
|
+
// New visible window should be Items 2, 3, 4 (scroll offset 1).
|
|
221
|
+
await updateActiveIndex(3);
|
|
222
|
+
const output = lastFrame();
|
|
223
|
+
expect(output).not.toContain('Item 1');
|
|
224
|
+
expect(output).toContain('Item 2');
|
|
225
|
+
expect(output).toContain('Item 4');
|
|
226
|
+
expect(output).not.toContain('Item 5');
|
|
227
|
+
});
|
|
228
|
+
it('should scroll up when activeIndex moves before the visible window', async () => {
|
|
229
|
+
const { updateActiveIndex, lastFrame } = renderScrollableList(0);
|
|
230
|
+
await updateActiveIndex(4);
|
|
231
|
+
let output = lastFrame();
|
|
232
|
+
expect(output).toContain('Item 3'); // Should see items 3, 4, 5
|
|
233
|
+
expect(output).toContain('Item 5');
|
|
234
|
+
expect(output).not.toContain('Item 2');
|
|
235
|
+
// Now test scrolling up: move to index 1 (Item 2)
|
|
236
|
+
// This should trigger scroll up to show items 2, 3, 4
|
|
237
|
+
await updateActiveIndex(1);
|
|
238
|
+
output = lastFrame();
|
|
239
|
+
expect(output).toContain('Item 2');
|
|
240
|
+
expect(output).toContain('Item 4');
|
|
241
|
+
expect(output).not.toContain('Item 5'); // Item 5 should no longer be visible
|
|
242
|
+
});
|
|
243
|
+
it('should pin the scroll offset to the end if selection starts near the end', async () => {
|
|
244
|
+
// List length 10. Max items 3. Active index 9 (last item).
|
|
245
|
+
// Scroll offset should be 10 - 3 = 7.
|
|
246
|
+
// Visible items: 8, 9, 10.
|
|
247
|
+
const { lastFrame } = renderScrollableList(9);
|
|
248
|
+
await waitFor(() => {
|
|
249
|
+
const output = lastFrame();
|
|
250
|
+
expect(output).toContain('Item 10');
|
|
251
|
+
expect(output).toContain('Item 8');
|
|
252
|
+
expect(output).not.toContain('Item 7');
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
it('should handle dynamic scrolling through multiple activeIndex changes', async () => {
|
|
256
|
+
const { updateActiveIndex, lastFrame } = renderScrollableList(0);
|
|
257
|
+
expect(lastFrame()).toContain('Item 1');
|
|
258
|
+
expect(lastFrame()).toContain('Item 3');
|
|
259
|
+
// Scroll down gradually
|
|
260
|
+
await updateActiveIndex(2); // Still within window
|
|
261
|
+
expect(lastFrame()).toContain('Item 1');
|
|
262
|
+
await updateActiveIndex(3); // Should trigger scroll
|
|
263
|
+
let output = lastFrame();
|
|
264
|
+
expect(output).toContain('Item 2');
|
|
265
|
+
expect(output).toContain('Item 4');
|
|
266
|
+
expect(output).not.toContain('Item 1');
|
|
267
|
+
await updateActiveIndex(5); // Scroll further
|
|
268
|
+
output = lastFrame();
|
|
269
|
+
expect(output).toContain('Item 4');
|
|
270
|
+
expect(output).toContain('Item 6');
|
|
271
|
+
expect(output).not.toContain('Item 3');
|
|
272
|
+
});
|
|
273
|
+
it('should correctly identify the selected item within the visible window', () => {
|
|
274
|
+
renderScrollableList(1); // activeIndex 1 = Item 2
|
|
275
|
+
expect(mockRenderItem).toHaveBeenCalledTimes(MAX_ITEMS);
|
|
276
|
+
expect(mockRenderItem).toHaveBeenCalledWith(expect.objectContaining({ value: 'Item 1' }), expect.objectContaining({ isSelected: false }));
|
|
277
|
+
expect(mockRenderItem).toHaveBeenCalledWith(expect.objectContaining({ value: 'Item 2' }), expect.objectContaining({ isSelected: true }));
|
|
278
|
+
});
|
|
279
|
+
it('should correctly identify the selected item when scrolled (high index)', async () => {
|
|
280
|
+
renderScrollableList(5);
|
|
281
|
+
await waitFor(() => {
|
|
282
|
+
// Item 6 (index 5) should be selected
|
|
283
|
+
expect(mockRenderItem).toHaveBeenCalledWith(expect.objectContaining({ value: 'Item 6' }), expect.objectContaining({ isSelected: true }));
|
|
284
|
+
});
|
|
285
|
+
// Item 4 (index 3) should not be selected
|
|
286
|
+
expect(mockRenderItem).toHaveBeenCalledWith(expect.objectContaining({ value: 'Item 4' }), expect.objectContaining({ isSelected: false }));
|
|
287
|
+
});
|
|
288
|
+
it('should handle maxItemsToShow larger than the list length', () => {
|
|
289
|
+
// Test edge case where maxItemsToShow exceeds available items
|
|
290
|
+
const { lastFrame } = renderComponent({ items: longList, maxItemsToShow: 15 }, 0);
|
|
291
|
+
const output = lastFrame();
|
|
292
|
+
// Should show all available items (10 items)
|
|
293
|
+
expect(output).toContain('Item 1');
|
|
294
|
+
expect(output).toContain('Item 10');
|
|
295
|
+
expect(mockRenderItem).toHaveBeenCalledTimes(10);
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
describe('Scroll Arrows (showScrollArrows)', () => {
|
|
299
|
+
const longList = Array.from({ length: 10 }, (_, i) => ({
|
|
300
|
+
value: `Item ${i + 1}`,
|
|
301
|
+
label: `Item ${i + 1}`,
|
|
302
|
+
}));
|
|
303
|
+
const MAX_ITEMS = 3;
|
|
304
|
+
it('should not show arrows by default', () => {
|
|
305
|
+
const { lastFrame } = renderComponent({
|
|
306
|
+
items: longList,
|
|
307
|
+
maxItemsToShow: MAX_ITEMS,
|
|
308
|
+
});
|
|
309
|
+
const output = lastFrame();
|
|
310
|
+
expect(output).not.toContain('▲');
|
|
311
|
+
expect(output).not.toContain('▼');
|
|
312
|
+
});
|
|
313
|
+
it('should show arrows with correct colors when enabled (at the top)', async () => {
|
|
314
|
+
const { lastFrame } = renderComponent({
|
|
315
|
+
items: longList,
|
|
316
|
+
maxItemsToShow: MAX_ITEMS,
|
|
317
|
+
showScrollArrows: true,
|
|
318
|
+
}, 0);
|
|
319
|
+
await waitFor(() => {
|
|
320
|
+
const output = lastFrame();
|
|
321
|
+
// At the top, should show first 3 items
|
|
322
|
+
expect(output).toContain('Item 1');
|
|
323
|
+
expect(output).toContain('Item 3');
|
|
324
|
+
expect(output).not.toContain('Item 4');
|
|
325
|
+
// Both arrows should be visible
|
|
326
|
+
expect(output).toContain('▲');
|
|
327
|
+
expect(output).toContain('▼');
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
it('should show arrows and correct items when scrolled to the middle', async () => {
|
|
331
|
+
const { lastFrame } = renderComponent({ items: longList, maxItemsToShow: MAX_ITEMS, showScrollArrows: true }, 5);
|
|
332
|
+
await waitFor(() => {
|
|
333
|
+
const output = lastFrame();
|
|
334
|
+
// After scrolling to middle, should see items around index 5
|
|
335
|
+
expect(output).toContain('Item 4');
|
|
336
|
+
expect(output).toContain('Item 6');
|
|
337
|
+
expect(output).not.toContain('Item 3');
|
|
338
|
+
expect(output).not.toContain('Item 7');
|
|
339
|
+
// Both scroll arrows should be visible
|
|
340
|
+
expect(output).toContain('▲');
|
|
341
|
+
expect(output).toContain('▼');
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
it('should show arrows and correct items when scrolled to the end', async () => {
|
|
345
|
+
const { lastFrame } = renderComponent({ items: longList, maxItemsToShow: MAX_ITEMS, showScrollArrows: true }, 9);
|
|
346
|
+
await waitFor(() => {
|
|
347
|
+
const output = lastFrame();
|
|
348
|
+
// At the end, should show last 3 items
|
|
349
|
+
expect(output).toContain('Item 8');
|
|
350
|
+
expect(output).toContain('Item 10');
|
|
351
|
+
expect(output).not.toContain('Item 7');
|
|
352
|
+
// Both arrows should be visible
|
|
353
|
+
expect(output).toContain('▲');
|
|
354
|
+
expect(output).toContain('▼');
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
it('should show both arrows dimmed when list fits entirely', () => {
|
|
358
|
+
const { lastFrame } = renderComponent({
|
|
359
|
+
items,
|
|
360
|
+
maxItemsToShow: 5,
|
|
361
|
+
showScrollArrows: true,
|
|
362
|
+
});
|
|
363
|
+
const output = lastFrame();
|
|
364
|
+
// Should show all items since maxItemsToShow > items.length
|
|
365
|
+
expect(output).toContain('Item A');
|
|
366
|
+
expect(output).toContain('Item B');
|
|
367
|
+
expect(output).toContain('Item C');
|
|
368
|
+
// Both arrows should be visible but dimmed (this test doesn't need waitFor since no scrolling occurs)
|
|
369
|
+
expect(output).toContain('▲');
|
|
370
|
+
expect(output).toContain('▼');
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
//# sourceMappingURL=BaseSelectionList.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseSelectionList.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/BaseSelectionList.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type React from 'react';
|
|
7
|
+
export interface DescriptiveRadioSelectItem<T> {
|
|
8
|
+
value: T;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface DescriptiveRadioButtonSelectProps<T> {
|
|
14
|
+
/** An array of items to display as descriptive radio options. */
|
|
15
|
+
items: Array<DescriptiveRadioSelectItem<T>>;
|
|
16
|
+
/** The initial index selected */
|
|
17
|
+
initialIndex?: number;
|
|
18
|
+
/** Function called when an item is selected. Receives the `value` of the selected item. */
|
|
19
|
+
onSelect: (value: T) => void;
|
|
20
|
+
/** Function called when an item is highlighted. Receives the `value` of the selected item. */
|
|
21
|
+
onHighlight?: (value: T) => void;
|
|
22
|
+
/** Whether this select input is currently focused and should respond to input. */
|
|
23
|
+
isFocused?: boolean;
|
|
24
|
+
/** Whether to show numbers next to items. */
|
|
25
|
+
showNumbers?: boolean;
|
|
26
|
+
/** Whether to show the scroll arrows. */
|
|
27
|
+
showScrollArrows?: boolean;
|
|
28
|
+
/** The maximum number of items to show at once. */
|
|
29
|
+
maxItemsToShow?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A radio button select component that displays items with title and description.
|
|
33
|
+
*
|
|
34
|
+
* @template T The type of the value associated with each descriptive radio item.
|
|
35
|
+
*/
|
|
36
|
+
export declare function DescriptiveRadioButtonSelect<T>({ items, initialIndex, onSelect, onHighlight, isFocused, showNumbers, showScrollArrows, maxItemsToShow, }: DescriptiveRadioButtonSelectProps<T>): React.JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text, Box } from 'ink';
|
|
3
|
+
import { theme } from '../../semantic-colors.js';
|
|
4
|
+
import { BaseSelectionList } from './BaseSelectionList.js';
|
|
5
|
+
/**
|
|
6
|
+
* A radio button select component that displays items with title and description.
|
|
7
|
+
*
|
|
8
|
+
* @template T The type of the value associated with each descriptive radio item.
|
|
9
|
+
*/
|
|
10
|
+
export function DescriptiveRadioButtonSelect({ items, initialIndex = 0, onSelect, onHighlight, isFocused = true, showNumbers = false, showScrollArrows = false, maxItemsToShow = 10, }) {
|
|
11
|
+
return (_jsx(BaseSelectionList, { items: items, initialIndex: initialIndex, onSelect: onSelect, onHighlight: onHighlight, isFocused: isFocused, showNumbers: showNumbers, showScrollArrows: showScrollArrows, maxItemsToShow: maxItemsToShow, renderItem: (item, { titleColor }) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: titleColor, children: item.title }), _jsx(Text, { color: theme.text.secondary, children: item.description })] })) }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=DescriptiveRadioButtonSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DescriptiveRadioButtonSelect.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/DescriptiveRadioButtonSelect.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA4B3D;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAI,EAC9C,KAAK,EACL,YAAY,GAAG,CAAC,EAChB,QAAQ,EACR,WAAW,EACX,SAAS,GAAG,IAAI,EAChB,WAAW,GAAG,KAAK,EACnB,gBAAgB,GAAG,KAAK,EACxB,cAAc,GAAG,EAAE,GACkB;IACrC,OAAO,CACL,KAAC,iBAAiB,IAChB,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CACpC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,YAAG,IAAI,CAAC,KAAK,GAAQ,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,YAAG,IAAI,CAAC,WAAW,GAAQ,IACxD,CACP,GACD,CACH,CAAC;AACJ,CAAC"}
|