@google/gemini-cli 0.7.1 → 0.8.0-nightly.20250926.2defdcff

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/README.md +10 -4
  2. package/dist/package.json +7 -5
  3. package/dist/src/commands/extensions/examples/mcp-server/gemini-extension.json +3 -2
  4. package/dist/src/commands/extensions/examples/mcp-server/package.json +18 -0
  5. package/dist/src/commands/extensions/examples/mcp-server/tsconfig.json +13 -0
  6. package/dist/src/commands/extensions/install.js +3 -3
  7. package/dist/src/commands/extensions/install.js.map +1 -1
  8. package/dist/src/commands/extensions/install.test.js +11 -2
  9. package/dist/src/commands/extensions/install.test.js.map +1 -1
  10. package/dist/src/commands/extensions/link.js +2 -2
  11. package/dist/src/commands/extensions/link.js.map +1 -1
  12. package/dist/src/commands/extensions/list.js +1 -1
  13. package/dist/src/commands/extensions/list.js.map +1 -1
  14. package/dist/src/commands/extensions/new.js +6 -1
  15. package/dist/src/commands/extensions/new.js.map +1 -1
  16. package/dist/src/commands/extensions/new.test.js +5 -3
  17. package/dist/src/commands/extensions/new.test.js.map +1 -1
  18. package/dist/src/commands/extensions/uninstall.test.js +4 -1
  19. package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
  20. package/dist/src/commands/extensions/update.js +19 -18
  21. package/dist/src/commands/extensions/update.js.map +1 -1
  22. package/dist/src/commands/mcp/add.js +6 -1
  23. package/dist/src/commands/mcp/add.js.map +1 -1
  24. package/dist/src/config/config.d.ts +2 -0
  25. package/dist/src/config/config.js +70 -24
  26. package/dist/src/config/config.js.map +1 -1
  27. package/dist/src/config/extension.d.ts +26 -4
  28. package/dist/src/config/extension.js +171 -69
  29. package/dist/src/config/extension.js.map +1 -1
  30. package/dist/src/config/extensions/github.d.ts +6 -2
  31. package/dist/src/config/extensions/github.js +84 -32
  32. package/dist/src/config/extensions/github.js.map +1 -1
  33. package/dist/src/config/extensions/github.test.js +5 -1
  34. package/dist/src/config/extensions/github.test.js.map +1 -1
  35. package/dist/src/config/extensions/update.d.ts +3 -3
  36. package/dist/src/config/extensions/update.js +19 -14
  37. package/dist/src/config/extensions/update.js.map +1 -1
  38. package/dist/src/config/extensions/update.test.js +53 -18
  39. package/dist/src/config/extensions/update.test.js.map +1 -1
  40. package/dist/src/config/settings.js +18 -3
  41. package/dist/src/config/settings.js.map +1 -1
  42. package/dist/src/config/settingsSchema.d.ts +20 -2
  43. package/dist/src/config/settingsSchema.js +20 -2
  44. package/dist/src/config/settingsSchema.js.map +1 -1
  45. package/dist/src/config/settingsSchema.test.js +1 -1
  46. package/dist/src/config/settingsSchema.test.js.map +1 -1
  47. package/dist/src/config/trustedFolders.d.ts +10 -1
  48. package/dist/src/config/trustedFolders.js +40 -14
  49. package/dist/src/config/trustedFolders.js.map +1 -1
  50. package/dist/src/config/trustedFolders.test.js +95 -14
  51. package/dist/src/config/trustedFolders.test.js.map +1 -1
  52. package/dist/src/gemini.js +100 -126
  53. package/dist/src/gemini.js.map +1 -1
  54. package/dist/src/gemini.test.js +74 -5
  55. package/dist/src/gemini.test.js.map +1 -1
  56. package/dist/src/generated/git-commit.d.ts +2 -2
  57. package/dist/src/generated/git-commit.js +2 -2
  58. package/dist/src/generated/git-commit.js.map +1 -1
  59. package/dist/src/services/BuiltinCommandLoader.js +4 -0
  60. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  61. package/dist/src/services/BuiltinCommandLoader.test.js +50 -1
  62. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  63. package/dist/src/test-utils/render.d.ts +3 -1
  64. package/dist/src/test-utils/render.js +2 -1
  65. package/dist/src/test-utils/render.js.map +1 -1
  66. package/dist/src/ui/App.js +1 -1
  67. package/dist/src/ui/App.js.map +1 -1
  68. package/dist/src/ui/AppContainer.js +32 -12
  69. package/dist/src/ui/AppContainer.js.map +1 -1
  70. package/dist/src/ui/AppContainer.test.js +31 -0
  71. package/dist/src/ui/AppContainer.test.js.map +1 -1
  72. package/dist/src/ui/commands/chatCommand.js +14 -3
  73. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  74. package/dist/src/ui/commands/extensionsCommand.js +5 -2
  75. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  76. package/dist/src/ui/commands/modelCommand.d.ts +7 -0
  77. package/dist/src/ui/commands/modelCommand.js +16 -0
  78. package/dist/src/ui/commands/modelCommand.js.map +1 -0
  79. package/dist/src/ui/commands/modelCommand.test.js +30 -0
  80. package/dist/src/ui/commands/modelCommand.test.js.map +1 -0
  81. package/dist/src/ui/commands/permissionsCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/permissionsCommand.js +16 -0
  83. package/dist/src/ui/commands/permissionsCommand.js.map +1 -0
  84. package/dist/src/ui/commands/permissionsCommand.test.d.ts +6 -0
  85. package/dist/src/ui/commands/permissionsCommand.test.js +30 -0
  86. package/dist/src/ui/commands/permissionsCommand.test.js.map +1 -0
  87. package/dist/src/ui/commands/types.d.ts +1 -1
  88. package/dist/src/ui/commands/types.js.map +1 -1
  89. package/dist/src/ui/components/AppHeader.js +2 -5
  90. package/dist/src/ui/components/AppHeader.js.map +1 -1
  91. package/dist/src/ui/components/Composer.js +2 -4
  92. package/dist/src/ui/components/Composer.js.map +1 -1
  93. package/dist/src/ui/components/DialogManager.d.ts +6 -1
  94. package/dist/src/ui/components/DialogManager.js +10 -1
  95. package/dist/src/ui/components/DialogManager.js.map +1 -1
  96. package/dist/src/ui/components/HistoryItemDisplay.d.ts +1 -1
  97. package/dist/src/ui/components/HistoryItemDisplay.js +6 -1
  98. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  99. package/dist/src/ui/components/HistoryItemDisplay.test.js +42 -1
  100. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  101. package/dist/src/ui/components/InputPrompt.d.ts +1 -1
  102. package/dist/src/ui/components/InputPrompt.js +17 -8
  103. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  104. package/dist/src/ui/components/LoadingIndicator.js +1 -1
  105. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  106. package/dist/src/ui/components/LoadingIndicator.test.js +4 -0
  107. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
  108. package/dist/src/ui/components/MainContent.js +1 -1
  109. package/dist/src/ui/components/MainContent.js.map +1 -1
  110. package/dist/src/ui/components/ModelDialog.d.ts +11 -0
  111. package/dist/src/ui/components/ModelDialog.js +53 -0
  112. package/dist/src/ui/components/ModelDialog.js.map +1 -0
  113. package/dist/src/ui/components/ModelDialog.test.d.ts +6 -0
  114. package/dist/src/ui/components/ModelDialog.test.js +153 -0
  115. package/dist/src/ui/components/ModelDialog.test.js.map +1 -0
  116. package/dist/src/ui/components/PermissionsModifyTrustDialog.d.ts +13 -0
  117. package/dist/src/ui/components/PermissionsModifyTrustDialog.js +45 -0
  118. package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -0
  119. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +6 -0
  120. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +158 -0
  121. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -0
  122. package/dist/src/ui/components/SettingsDialog.js +1 -1
  123. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  124. package/dist/src/ui/components/SettingsDialog.test.js +47 -13
  125. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  126. package/dist/src/ui/components/WorkspaceMigrationDialog.js +3 -1
  127. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
  128. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +1 -1
  129. package/dist/src/ui/components/messages/ToolGroupMessage.js +5 -5
  130. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  131. package/dist/src/ui/components/messages/ToolMessage.d.ts +1 -1
  132. package/dist/src/ui/components/messages/ToolMessage.js +3 -3
  133. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  134. package/dist/src/ui/components/shared/BaseSelectionList.d.ts +43 -0
  135. package/dist/src/ui/components/shared/BaseSelectionList.js +72 -0
  136. package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -0
  137. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +6 -0
  138. package/dist/src/ui/components/shared/BaseSelectionList.test.js +374 -0
  139. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -0
  140. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +36 -0
  141. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +13 -0
  142. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -0
  143. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +6 -0
  144. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +68 -0
  145. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -0
  146. package/dist/src/ui/components/shared/RadioButtonSelect.js +9 -104
  147. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  148. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +113 -92
  149. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  150. package/dist/src/ui/components/views/ExtensionsList.test.js +1 -1
  151. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
  152. package/dist/src/ui/contexts/KeypressContext.js +3 -0
  153. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  154. package/dist/src/ui/contexts/ShellFocusContext.d.ts +7 -0
  155. package/dist/src/ui/contexts/ShellFocusContext.js +9 -0
  156. package/dist/src/ui/contexts/ShellFocusContext.js.map +1 -0
  157. package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
  158. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  159. package/dist/src/ui/contexts/UIStateContext.d.ts +5 -1
  160. package/dist/src/ui/contexts/UIStateContext.js +1 -0
  161. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  162. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -0
  163. package/dist/src/ui/hooks/slashCommandProcessor.js +6 -0
  164. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  165. package/dist/src/ui/hooks/useExtensionUpdates.js +23 -17
  166. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  167. package/dist/src/ui/hooks/useExtensionUpdates.test.js +9 -11
  168. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  169. package/dist/src/ui/hooks/useFocus.js +10 -0
  170. package/dist/src/ui/hooks/useFocus.js.map +1 -1
  171. package/dist/src/ui/hooks/useFolderTrust.d.ts +1 -1
  172. package/dist/src/ui/hooks/useFolderTrust.js +2 -7
  173. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  174. package/dist/src/ui/hooks/useGeminiStream.js +5 -1
  175. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  176. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  177. package/dist/src/ui/hooks/useModelCommand.d.ts +12 -0
  178. package/dist/src/ui/hooks/useModelCommand.js +21 -0
  179. package/dist/src/ui/hooks/useModelCommand.js.map +1 -0
  180. package/dist/src/ui/hooks/useModelCommand.test.d.ts +6 -0
  181. package/dist/src/ui/hooks/useModelCommand.test.js +35 -0
  182. package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -0
  183. package/dist/src/ui/hooks/usePermissionsModifyTrust.d.ts +17 -0
  184. package/dist/src/ui/hooks/usePermissionsModifyTrust.js +78 -0
  185. package/dist/src/ui/hooks/usePermissionsModifyTrust.js.map +1 -0
  186. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +6 -0
  187. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +182 -0
  188. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -0
  189. package/dist/src/ui/hooks/useSelectionList.d.ts +33 -0
  190. package/dist/src/ui/hooks/useSelectionList.js +252 -0
  191. package/dist/src/ui/hooks/useSelectionList.js.map +1 -0
  192. package/dist/src/ui/hooks/useSelectionList.test.d.ts +6 -0
  193. package/dist/src/ui/hooks/useSelectionList.test.js +651 -0
  194. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -0
  195. package/dist/src/ui/hooks/useSlashCompletion.js +7 -2
  196. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  197. package/dist/src/ui/hooks/useSlashCompletion.test.js +33 -0
  198. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  199. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +3 -3
  200. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
  201. package/dist/src/ui/state/extensions.d.ts +1 -1
  202. package/dist/src/ui/state/extensions.js +1 -1
  203. package/dist/src/ui/state/extensions.js.map +1 -1
  204. package/dist/src/ui/themes/theme.js +2 -2
  205. package/dist/src/ui/themes/theme.js.map +1 -1
  206. package/dist/src/ui/utils/displayUtils.js +1 -1
  207. package/dist/src/ui/utils/textUtils.d.ts +1 -0
  208. package/dist/src/ui/utils/textUtils.js +56 -0
  209. package/dist/src/ui/utils/textUtils.js.map +1 -1
  210. package/dist/src/ui/utils/textUtils.test.d.ts +6 -0
  211. package/dist/src/ui/utils/textUtils.test.js +132 -0
  212. package/dist/src/ui/utils/textUtils.test.js.map +1 -0
  213. package/dist/src/utils/deepMerge.d.ts +2 -3
  214. package/dist/src/utils/relaunch.d.ts +7 -0
  215. package/dist/src/utils/relaunch.js +57 -0
  216. package/dist/src/utils/relaunch.js.map +1 -0
  217. package/dist/src/utils/relaunch.test.d.ts +6 -0
  218. package/dist/src/utils/relaunch.test.js +273 -0
  219. package/dist/src/utils/relaunch.test.js.map +1 -0
  220. package/dist/src/utils/sandbox.js +23 -9
  221. package/dist/src/utils/sandbox.js.map +1 -1
  222. package/dist/src/zed-integration/schema.d.ts +22 -22
  223. package/dist/src/zed-integration/zedIntegration.d.ts +7 -0
  224. package/dist/src/zed-integration/zedIntegration.js +14 -2
  225. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  226. package/dist/tsconfig.tsbuildinfo +1 -1
  227. package/package.json +7 -5
  228. package/dist/src/commands/extensions/examples/mcp-server/example.js +0 -46
  229. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +0 -1
  230. package/dist/src/ui/contexts/FocusContext.d.ts +0 -7
  231. package/dist/src/ui/contexts/FocusContext.js +0 -9
  232. package/dist/src/ui/contexts/FocusContext.js.map +0 -1
  233. /package/dist/src/{commands/extensions/examples/mcp-server/example.d.ts → ui/commands/modelCommand.test.d.ts} +0 -0
@@ -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,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,68 @@
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 { renderWithProviders } from '../../../test-utils/render.js';
9
+ import { DescriptiveRadioButtonSelect, } from './DescriptiveRadioButtonSelect.js';
10
+ vi.mock('./BaseSelectionList.js', async (importOriginal) => {
11
+ const actual = await importOriginal();
12
+ return {
13
+ ...actual,
14
+ BaseSelectionList: vi.fn(({ children, ...props }) => (_jsx(actual.BaseSelectionList, { ...props, children: children }))),
15
+ };
16
+ });
17
+ vi.mock('../../semantic-colors.js', () => ({
18
+ theme: {
19
+ text: {
20
+ primary: 'COLOR_PRIMARY',
21
+ secondary: 'COLOR_SECONDARY',
22
+ },
23
+ status: {
24
+ success: 'COLOR_SUCCESS',
25
+ },
26
+ },
27
+ }));
28
+ describe('DescriptiveRadioButtonSelect', () => {
29
+ const mockOnSelect = vi.fn();
30
+ const mockOnHighlight = vi.fn();
31
+ const ITEMS = [
32
+ { title: 'Foo Title', description: 'This is Foo.', value: 'foo' },
33
+ { title: 'Bar Title', description: 'This is Bar.', value: 'bar' },
34
+ {
35
+ title: 'Baz Title',
36
+ description: 'This is Baz.',
37
+ value: 'baz',
38
+ disabled: true,
39
+ },
40
+ ];
41
+ const renderComponent = (props = {}) => {
42
+ const defaultProps = {
43
+ items: ITEMS,
44
+ onSelect: mockOnSelect,
45
+ ...props,
46
+ };
47
+ return renderWithProviders(_jsx(DescriptiveRadioButtonSelect, { ...defaultProps }));
48
+ };
49
+ beforeEach(() => {
50
+ vi.clearAllMocks();
51
+ });
52
+ it('should render correctly with default props', () => {
53
+ const { lastFrame } = renderComponent();
54
+ expect(lastFrame()).toMatchSnapshot();
55
+ });
56
+ it('should render correctly with custom props', () => {
57
+ const { lastFrame } = renderComponent({
58
+ initialIndex: 1,
59
+ isFocused: false,
60
+ showScrollArrows: true,
61
+ maxItemsToShow: 5,
62
+ showNumbers: true,
63
+ onHighlight: mockOnHighlight,
64
+ });
65
+ expect(lastFrame()).toMatchSnapshot();
66
+ });
67
+ });
68
+ //# sourceMappingURL=DescriptiveRadioButtonSelect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DescriptiveRadioButtonSelect.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/DescriptiveRadioButtonSelect.test.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,4BAA4B,GAG7B,MAAM,mCAAmC,CAAC;AAE3C,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACzD,MAAM,MAAM,GACV,MAAM,cAAc,EAA2C,CAAC;IAClE,OAAO;QACL,GAAG,MAAM;QACT,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,CACnD,KAAC,MAAM,CAAC,iBAAiB,OAAK,KAAK,YAAG,QAAQ,GAA4B,CAC3E,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,OAAO,EAAE,eAAe;YACxB,SAAS,EAAE,iBAAiB;SAC7B;QACD,MAAM,EAAE;YACN,OAAO,EAAE,eAAe;SACzB;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAEhC,MAAM,KAAK,GAA8C;QACvD,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACjE,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACjE;YACE,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,cAAc;YAC3B,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IAEF,MAAM,eAAe,GAAG,CACtB,QAA4D,EAAE,EAC9D,EAAE;QACF,MAAM,YAAY,GAA8C;YAC9D,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,YAAY;YACtB,GAAG,KAAK;SACT,CAAC;QACF,OAAO,mBAAmB,CACxB,KAAC,4BAA4B,OAAK,YAAY,GAAI,CACnD,CAAC;IACJ,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;YACpC,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,KAAK;YAChB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}