@12-apps/ui 1.5.0 → 1.5.2
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/package.json +17 -9
- package/src/button/index.ts +1 -0
- package/src/social-login-button/index.ts +1 -0
- package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
- package/src/user-avatar/index.ts +1 -0
- package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
- package/eslint.config.js +0 -89
- package/src/__tests__/data-grid.test.tsx +0 -125
- package/src/__tests__/package-wiring.test.ts +0 -41
- package/src/__tests__/setup.ts +0 -1
- package/src/__tests__/social-login-button.test.tsx +0 -186
- package/src/__tests__/user-avatar.test.tsx +0 -195
- package/src/__tests__/viewport.test.ts +0 -50
- package/src/components/command/__tests__/command.test.tsx +0 -112
- package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
- package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -763
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
- package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
- package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
- package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
- package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
- package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -511
- package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -701
- package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
- package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
- package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
- package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
- package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
- package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
- package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
- package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
- package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
- package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
- package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
- package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
- package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
- package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
- package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
- package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
- package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
- package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
- package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
- package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
- package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1105
- package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
- package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
- package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
- package/src/components/data-display/Table/Table.stories.tsx +0 -803
- package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
- package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
- package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
- package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
- package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
- package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -964
- package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
- package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
- package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
- package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -973
- package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
- package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
- package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
- package/src/components/form/Button/Button.stories.tsx +0 -365
- package/src/components/form/Button/Button.test.stories.tsx +0 -607
- package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
- package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
- package/src/components/form/CepField/CepField.stories.tsx +0 -138
- package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
- package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
- package/src/components/form/Command/Command.stories.tsx +0 -580
- package/src/components/form/Command/Command.test.stories.tsx +0 -215
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
- package/src/components/form/Form/Form.stories.tsx +0 -687
- package/src/components/form/Form/Form.test.stories.tsx +0 -601
- package/src/components/form/Input/Input.stories.tsx +0 -260
- package/src/components/form/Input/Input.test.stories.tsx +0 -1191
- package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
- package/src/components/form/Label/Label.stories.tsx +0 -473
- package/src/components/form/Label/Label.test.stories.tsx +0 -915
- package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
- package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
- package/src/components/form/Select/Select.stories.tsx +0 -364
- package/src/components/form/Select/Select.test.stories.tsx +0 -985
- package/src/components/form/Slider/Slider.stories.tsx +0 -418
- package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
- package/src/components/form/Switch/Switch.stories.tsx +0 -697
- package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
- package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
- package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
- package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
- package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -915
- package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
- package/src/components/form/total-form/total-form.test.tsx +0 -214
- package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
- package/src/components/layout/Card/Card.stories.tsx +0 -591
- package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
- package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
- package/src/components/layout/Container/Container.stories.tsx +0 -557
- package/src/components/layout/Container/Container.test.stories.tsx +0 -745
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
- package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
- package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -754
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
- package/src/components/layout/Separator/Separator.stories.tsx +0 -563
- package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
- package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -474
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
- package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
- package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
- package/src/components/typography/Code/Code.stories.tsx +0 -686
- package/src/components/typography/Code/Code.test.stories.tsx +0 -703
- package/src/components/typography/Heading/Heading.stories.tsx +0 -451
- package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
- package/src/components/typography/Text/Text.stories.tsx +0 -359
- package/src/components/typography/Text/Text.test.stories.tsx +0 -759
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
- package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
- package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
- package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
- package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
- package/src/components/utility/Portal/Portal.stories.tsx +0 -340
- package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
- package/src/components/utility/Transition/Transition.stories.tsx +0 -493
- package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
- /package/src/{button.tsx → button/button.tsx} +0 -0
|
@@ -1,435 +0,0 @@
|
|
|
1
|
-
import HomeIcon from '@mui/icons-material/Home';
|
|
2
|
-
import SearchIcon from '@mui/icons-material/Search';
|
|
3
|
-
import SettingsIcon from '@mui/icons-material/Settings';
|
|
4
|
-
import { Button } from '@mui/material';
|
|
5
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
6
|
-
import React from 'react';
|
|
7
|
-
import { expect, fn,userEvent, waitFor, within } from 'storybook/test';
|
|
8
|
-
|
|
9
|
-
import { PaletteCommand } from './CommandPalette.types';
|
|
10
|
-
import {CommandPalette } from './CommandPalette';
|
|
11
|
-
|
|
12
|
-
const meta: Meta<typeof CommandPalette> = {
|
|
13
|
-
title: 'Enhanced/CommandPalette/Tests',
|
|
14
|
-
component: CommandPalette,
|
|
15
|
-
parameters: {
|
|
16
|
-
layout: 'centered',
|
|
17
|
-
chromatic: { disableSnapshot: false },
|
|
18
|
-
},
|
|
19
|
-
tags: ['autodocs', 'test', 'component:CommandPalette'],
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export default meta;
|
|
23
|
-
export type Story = StoryObj<typeof meta>;
|
|
24
|
-
|
|
25
|
-
// Sample commands for testing
|
|
26
|
-
const testCommands: PaletteCommand[] = [
|
|
27
|
-
{
|
|
28
|
-
id: 'home',
|
|
29
|
-
label: 'Go to Home',
|
|
30
|
-
description: 'Navigate to the home page',
|
|
31
|
-
icon: <HomeIcon />,
|
|
32
|
-
shortcut: '⌘H',
|
|
33
|
-
category: 'Navigation',
|
|
34
|
-
action: fn(() => {
|
|
35
|
-
// Home action
|
|
36
|
-
}),
|
|
37
|
-
keywords: ['home', 'main', 'start'],
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
id: 'settings',
|
|
41
|
-
label: 'Settings',
|
|
42
|
-
description: 'Open application settings',
|
|
43
|
-
icon: <SettingsIcon />,
|
|
44
|
-
shortcut: '⌘,',
|
|
45
|
-
category: 'Navigation',
|
|
46
|
-
action: fn(() => {
|
|
47
|
-
// Settings action
|
|
48
|
-
}),
|
|
49
|
-
keywords: ['config', 'preferences', 'options'],
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: 'search',
|
|
53
|
-
label: 'Search',
|
|
54
|
-
description: 'Open search functionality',
|
|
55
|
-
icon: <SearchIcon />,
|
|
56
|
-
shortcut: '⌘F',
|
|
57
|
-
category: 'Tools',
|
|
58
|
-
action: fn(() => {
|
|
59
|
-
// Search action
|
|
60
|
-
}),
|
|
61
|
-
keywords: ['find', 'lookup'],
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
// 1. Basic Interaction Tests
|
|
66
|
-
export const BasicInteraction: Story = {
|
|
67
|
-
render: () => {
|
|
68
|
-
const [open, setOpen] = React.useState(false);
|
|
69
|
-
const onCommandExecute = fn();
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<>
|
|
73
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
74
|
-
Open Command Palette
|
|
75
|
-
</Button>
|
|
76
|
-
<CommandPalette
|
|
77
|
-
open={open}
|
|
78
|
-
onClose={() => setOpen(false)}
|
|
79
|
-
commands={testCommands}
|
|
80
|
-
onCommandExecute={onCommandExecute}
|
|
81
|
-
/>
|
|
82
|
-
</>
|
|
83
|
-
);
|
|
84
|
-
},
|
|
85
|
-
play: async ({ canvasElement, step }) => {
|
|
86
|
-
const canvas = within(canvasElement);
|
|
87
|
-
|
|
88
|
-
await step('Open command palette', async () => {
|
|
89
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
90
|
-
await userEvent.click(openButton);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
await step('Verify search input exists and is functional', async () => {
|
|
94
|
-
const searchInput = within(document.body).getByTestId('command-palette-input');
|
|
95
|
-
await expect(searchInput).toBeVisible();
|
|
96
|
-
await userEvent.type(searchInput, 'home');
|
|
97
|
-
await expect(searchInput).toHaveValue('home');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
await step('Verify commands are filtered by search', async () => {
|
|
101
|
-
await waitFor(async () => {
|
|
102
|
-
const homeCommandItem = within(document.body).getByTestId('command-palette-item-home');
|
|
103
|
-
await expect(homeCommandItem).toBeVisible();
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
// 2. Keyboard Navigation Tests
|
|
110
|
-
export const KeyboardNavigation: Story = {
|
|
111
|
-
render: () => {
|
|
112
|
-
const [open, setOpen] = React.useState(false);
|
|
113
|
-
const onCommandExecute = fn();
|
|
114
|
-
|
|
115
|
-
return (
|
|
116
|
-
<>
|
|
117
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
118
|
-
Open Command Palette
|
|
119
|
-
</Button>
|
|
120
|
-
<CommandPalette
|
|
121
|
-
open={open}
|
|
122
|
-
onClose={() => setOpen(false)}
|
|
123
|
-
commands={testCommands}
|
|
124
|
-
onCommandExecute={onCommandExecute}
|
|
125
|
-
/>
|
|
126
|
-
</>
|
|
127
|
-
);
|
|
128
|
-
},
|
|
129
|
-
play: async ({ canvasElement, step }) => {
|
|
130
|
-
const canvas = within(canvasElement);
|
|
131
|
-
|
|
132
|
-
await step('Open command palette', async () => {
|
|
133
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
134
|
-
await userEvent.click(openButton);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
await step('Test arrow key navigation', async () => {
|
|
138
|
-
await userEvent.keyboard('{ArrowDown}');
|
|
139
|
-
await userEvent.keyboard('{ArrowDown}');
|
|
140
|
-
await userEvent.keyboard('{ArrowUp}');
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
await step('Test Escape key to close', async () => {
|
|
144
|
-
await userEvent.keyboard('{Escape}');
|
|
145
|
-
// Palette should be closed
|
|
146
|
-
await waitFor(async () => {
|
|
147
|
-
const dialog = within(document.body).queryByRole('dialog');
|
|
148
|
-
expect(dialog).toBeNull();
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
},
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
// 3. Screen Reader Tests
|
|
155
|
-
export const ScreenReader: Story = {
|
|
156
|
-
render: () => {
|
|
157
|
-
const [open, setOpen] = React.useState(false);
|
|
158
|
-
|
|
159
|
-
return (
|
|
160
|
-
<>
|
|
161
|
-
<Button
|
|
162
|
-
variant="contained"
|
|
163
|
-
onClick={() => setOpen(true)}
|
|
164
|
-
data-testid="open-palette"
|
|
165
|
-
aria-describedby="palette-help"
|
|
166
|
-
>
|
|
167
|
-
Open Command Palette
|
|
168
|
-
</Button>
|
|
169
|
-
<div id="palette-help" style={{ display: 'none' }}>
|
|
170
|
-
Press Ctrl+K or Cmd+K to open command palette
|
|
171
|
-
</div>
|
|
172
|
-
<CommandPalette open={open} onClose={() => setOpen(false)} commands={testCommands} />
|
|
173
|
-
</>
|
|
174
|
-
);
|
|
175
|
-
},
|
|
176
|
-
play: async ({ canvasElement, step }) => {
|
|
177
|
-
const canvas = within(canvasElement);
|
|
178
|
-
|
|
179
|
-
await step('Verify ARIA attributes exist', async () => {
|
|
180
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
181
|
-
await expect(openButton).toHaveAttribute('aria-describedby');
|
|
182
|
-
await userEvent.click(openButton);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
await step('Verify search input accessibility', async () => {
|
|
186
|
-
const searchInput = within(document.body).getByPlaceholderText('Type a command or search...');
|
|
187
|
-
await expect(searchInput).toBeVisible();
|
|
188
|
-
await expect(searchInput).toHaveAttribute('autoComplete', 'off');
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
await step('Verify command list structure', async () => {
|
|
192
|
-
const commandList = within(document.body).getByRole('list');
|
|
193
|
-
await expect(commandList).toBeVisible();
|
|
194
|
-
|
|
195
|
-
const commandItems = within(document.body).getAllByRole('listitem');
|
|
196
|
-
await expect(commandItems.length).toBeGreaterThan(0);
|
|
197
|
-
});
|
|
198
|
-
},
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
// 4. Focus Management Tests
|
|
202
|
-
export const FocusManagement: Story = {
|
|
203
|
-
render: () => {
|
|
204
|
-
const [open, setOpen] = React.useState(false);
|
|
205
|
-
|
|
206
|
-
return (
|
|
207
|
-
<>
|
|
208
|
-
<Button data-testid="before-button" variant="outlined">
|
|
209
|
-
Button Before
|
|
210
|
-
</Button>
|
|
211
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
212
|
-
Open Command Palette
|
|
213
|
-
</Button>
|
|
214
|
-
<Button data-testid="after-button" variant="outlined">
|
|
215
|
-
Button After
|
|
216
|
-
</Button>
|
|
217
|
-
<CommandPalette open={open} onClose={() => setOpen(false)} commands={testCommands} />
|
|
218
|
-
</>
|
|
219
|
-
);
|
|
220
|
-
},
|
|
221
|
-
play: async ({ canvasElement, step }) => {
|
|
222
|
-
const canvas = within(canvasElement);
|
|
223
|
-
|
|
224
|
-
await step('Test initial focus management', async () => {
|
|
225
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
226
|
-
await userEvent.click(openButton);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
await step('Verify search input is available and functional', async () => {
|
|
230
|
-
await waitFor(
|
|
231
|
-
async () => {
|
|
232
|
-
const searchInput = within(document.body).getByPlaceholderText(
|
|
233
|
-
'Type a command or search...',
|
|
234
|
-
);
|
|
235
|
-
await expect(searchInput).toBeVisible();
|
|
236
|
-
await expect(searchInput).toBeEnabled();
|
|
237
|
-
// Try to interact with it to verify it's functional
|
|
238
|
-
await userEvent.type(searchInput, 'h');
|
|
239
|
-
await expect(searchInput).toHaveValue('h');
|
|
240
|
-
},
|
|
241
|
-
{ timeout: 1000 },
|
|
242
|
-
);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
await step('Close and verify dialog closes', async () => {
|
|
246
|
-
await userEvent.keyboard('{Escape}');
|
|
247
|
-
await waitFor(async () => {
|
|
248
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
249
|
-
await expect(openButton).toBeVisible();
|
|
250
|
-
// Verify the command palette is closed by checking the search input is not in DOM
|
|
251
|
-
await expect(() =>
|
|
252
|
-
within(document.body).getByPlaceholderText('Type a command or search...'),
|
|
253
|
-
).toThrow();
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
},
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
// 5. Responsive Design Tests
|
|
260
|
-
export const ResponsiveDesign: Story = {
|
|
261
|
-
render: () => {
|
|
262
|
-
const [open, setOpen] = React.useState(false);
|
|
263
|
-
|
|
264
|
-
return (
|
|
265
|
-
<>
|
|
266
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
267
|
-
Open Responsive Palette
|
|
268
|
-
</Button>
|
|
269
|
-
<CommandPalette open={open} onClose={() => setOpen(false)} commands={testCommands} />
|
|
270
|
-
</>
|
|
271
|
-
);
|
|
272
|
-
},
|
|
273
|
-
play: async ({ canvasElement, step }) => {
|
|
274
|
-
const canvas = within(canvasElement);
|
|
275
|
-
|
|
276
|
-
await step('Test responsive viewport', async () => {
|
|
277
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
278
|
-
await userEvent.click(openButton);
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
await step('Verify palette adapts to viewport', async () => {
|
|
282
|
-
const palette = within(document.body).getByRole('dialog');
|
|
283
|
-
await expect(palette).toBeVisible();
|
|
284
|
-
|
|
285
|
-
// Check if palette is responsive
|
|
286
|
-
const computedStyle = window.getComputedStyle(palette);
|
|
287
|
-
await expect(computedStyle.width).toBeDefined();
|
|
288
|
-
});
|
|
289
|
-
},
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
// 6. Theme Variations Tests
|
|
293
|
-
export const ThemeVariations: Story = {
|
|
294
|
-
render: () => {
|
|
295
|
-
const [open, setOpen] = React.useState(false);
|
|
296
|
-
|
|
297
|
-
return (
|
|
298
|
-
<>
|
|
299
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
300
|
-
Open Themed Palette
|
|
301
|
-
</Button>
|
|
302
|
-
<CommandPalette open={open} onClose={() => setOpen(false)} commands={testCommands} />
|
|
303
|
-
</>
|
|
304
|
-
);
|
|
305
|
-
},
|
|
306
|
-
play: async ({ canvasElement, step }) => {
|
|
307
|
-
const canvas = within(canvasElement);
|
|
308
|
-
|
|
309
|
-
await step('Open palette and verify theme integration', async () => {
|
|
310
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
311
|
-
await userEvent.click(openButton);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
await step('Verify glass effect styling', async () => {
|
|
315
|
-
const palette = within(document.body).getByRole('dialog');
|
|
316
|
-
await expect(palette).toBeVisible();
|
|
317
|
-
});
|
|
318
|
-
},
|
|
319
|
-
};
|
|
320
|
-
|
|
321
|
-
// 7. Visual States Tests
|
|
322
|
-
export const VisualStates: Story = {
|
|
323
|
-
render: () => {
|
|
324
|
-
const [open, setOpen] = React.useState(false);
|
|
325
|
-
|
|
326
|
-
return (
|
|
327
|
-
<>
|
|
328
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
329
|
-
Open for Visual States
|
|
330
|
-
</Button>
|
|
331
|
-
<CommandPalette open={open} onClose={() => setOpen(false)} commands={testCommands} />
|
|
332
|
-
</>
|
|
333
|
-
);
|
|
334
|
-
},
|
|
335
|
-
play: async ({ canvasElement, step }) => {
|
|
336
|
-
const canvas = within(canvasElement);
|
|
337
|
-
|
|
338
|
-
await step('Test default state', async () => {
|
|
339
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
340
|
-
await userEvent.click(openButton);
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
await step('Test hover states', async () => {
|
|
344
|
-
const homeCommand = within(document.body).getByText('Go to Home').closest('[role="button"]');
|
|
345
|
-
if (homeCommand) {
|
|
346
|
-
await userEvent.hover(homeCommand);
|
|
347
|
-
await expect(homeCommand).toBeVisible();
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
await step('Test empty state', async () => {
|
|
352
|
-
const searchInput = within(document.body).getByPlaceholderText('Type a command or search...');
|
|
353
|
-
await userEvent.type(searchInput, 'nonexistentcommand123');
|
|
354
|
-
|
|
355
|
-
await waitFor(async () => {
|
|
356
|
-
const noResults = within(document.body).getByText(/No commands found/);
|
|
357
|
-
await expect(noResults).toBeVisible();
|
|
358
|
-
});
|
|
359
|
-
});
|
|
360
|
-
},
|
|
361
|
-
};
|
|
362
|
-
|
|
363
|
-
// 8. Edge Cases Tests
|
|
364
|
-
export const EdgeCases: Story = {
|
|
365
|
-
render: () => {
|
|
366
|
-
const [open, setOpen] = React.useState(false);
|
|
367
|
-
|
|
368
|
-
const edgeCaseCommands: PaletteCommand[] = [
|
|
369
|
-
{
|
|
370
|
-
id: 'empty-description',
|
|
371
|
-
label: 'Command with no description',
|
|
372
|
-
category: 'Test',
|
|
373
|
-
action: fn(),
|
|
374
|
-
},
|
|
375
|
-
{
|
|
376
|
-
id: 'very-long-label',
|
|
377
|
-
label:
|
|
378
|
-
'This is a very long command label that might cause layout issues if not handled properly',
|
|
379
|
-
description:
|
|
380
|
-
'This is also a very long description that should be handled gracefully in the UI without breaking the layout or causing overflow issues',
|
|
381
|
-
category: 'Test',
|
|
382
|
-
action: fn(),
|
|
383
|
-
},
|
|
384
|
-
{
|
|
385
|
-
id: 'special-chars',
|
|
386
|
-
label: 'Command with special chars: @#$%^&*()',
|
|
387
|
-
description: 'Special characters: <>?:"{}|+=-_`~',
|
|
388
|
-
category: 'Test',
|
|
389
|
-
action: fn(),
|
|
390
|
-
},
|
|
391
|
-
];
|
|
392
|
-
|
|
393
|
-
return (
|
|
394
|
-
<>
|
|
395
|
-
<Button variant="contained" onClick={() => setOpen(true)} data-testid="open-palette">
|
|
396
|
-
Open Edge Cases Test
|
|
397
|
-
</Button>
|
|
398
|
-
<CommandPalette open={open} onClose={() => setOpen(false)} commands={edgeCaseCommands} />
|
|
399
|
-
</>
|
|
400
|
-
);
|
|
401
|
-
},
|
|
402
|
-
play: async ({ canvasElement, step }) => {
|
|
403
|
-
const canvas = within(canvasElement);
|
|
404
|
-
|
|
405
|
-
await step('Test with edge case commands', async () => {
|
|
406
|
-
const openButton = canvas.getByTestId('open-palette');
|
|
407
|
-
await userEvent.click(openButton);
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
await step('Test empty description handling', async () => {
|
|
411
|
-
const emptyDescCommand = within(document.body).getByText('Command with no description');
|
|
412
|
-
await expect(emptyDescCommand).toBeVisible();
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
await step('Test very long text handling', async () => {
|
|
416
|
-
const longLabelCommand = within(document.body).getByText(/This is a very long command label/);
|
|
417
|
-
await expect(longLabelCommand).toBeVisible();
|
|
418
|
-
|
|
419
|
-
// Check that it doesn't break layout
|
|
420
|
-
const palette = within(document.body).getByRole('dialog');
|
|
421
|
-
const computedStyle = window.getComputedStyle(palette);
|
|
422
|
-
expect(computedStyle.overflow).toBeDefined();
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
await step('Test special characters', async () => {
|
|
426
|
-
const searchInput = within(document.body).getByPlaceholderText('Type a command or search...');
|
|
427
|
-
await userEvent.type(searchInput, '@#$');
|
|
428
|
-
|
|
429
|
-
await waitFor(async () => {
|
|
430
|
-
const specialCharCommand = within(document.body).getByText(/Command with special chars/);
|
|
431
|
-
await expect(specialCharCommand).toBeVisible();
|
|
432
|
-
});
|
|
433
|
-
});
|
|
434
|
-
},
|
|
435
|
-
};
|