@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,584 +0,0 @@
|
|
|
1
|
-
import DarkModeIcon from '@mui/icons-material/DarkMode';
|
|
2
|
-
import HomeIcon from '@mui/icons-material/Home';
|
|
3
|
-
import NotificationsIcon from '@mui/icons-material/Notifications';
|
|
4
|
-
import SettingsIcon from '@mui/icons-material/Settings';
|
|
5
|
-
import { Avatar,Box, IconButton, Typography } from '@mui/material';
|
|
6
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
7
|
-
import React from 'react';
|
|
8
|
-
import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
|
|
9
|
-
|
|
10
|
-
import { Menubar } from './Menubar';
|
|
11
|
-
import type { MenubarItem } from './Menubar.types';
|
|
12
|
-
|
|
13
|
-
const meta: Meta<typeof Menubar> = {
|
|
14
|
-
title: 'Form/Menubar/Tests',
|
|
15
|
-
component: Menubar,
|
|
16
|
-
parameters: {
|
|
17
|
-
layout: 'fullscreen',
|
|
18
|
-
chromatic: { disableSnapshot: false },
|
|
19
|
-
},
|
|
20
|
-
tags: ['autodocs', 'test', 'component:Menubar'],
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export default meta;
|
|
24
|
-
type Story = StoryObj<typeof meta>;
|
|
25
|
-
|
|
26
|
-
// Test data
|
|
27
|
-
const basicMenuItems: MenubarItem[] = [
|
|
28
|
-
{
|
|
29
|
-
id: 'file',
|
|
30
|
-
label: 'File',
|
|
31
|
-
children: [
|
|
32
|
-
{ id: 'new', label: 'New File', shortcut: '⌘N', action: fn() },
|
|
33
|
-
{ id: 'open', label: 'Open...', shortcut: '⌘O', action: fn() },
|
|
34
|
-
{ id: 'save', label: 'Save', shortcut: '⌘S', action: fn() },
|
|
35
|
-
],
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
id: 'edit',
|
|
39
|
-
label: 'Edit',
|
|
40
|
-
children: [
|
|
41
|
-
{ id: 'undo', label: 'Undo', shortcut: '⌘Z', action: fn() },
|
|
42
|
-
{ id: 'redo', label: 'Redo', shortcut: '⌘⇧Z', action: fn() },
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
const Logo = () => (
|
|
48
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
49
|
-
<HomeIcon />
|
|
50
|
-
<Typography variant="h6" sx={{ fontWeight: 'bold' }}>
|
|
51
|
-
TestApp
|
|
52
|
-
</Typography>
|
|
53
|
-
</Box>
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const EndContent = () => (
|
|
57
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
58
|
-
<IconButton color="inherit" size="small" data-testid="notifications-btn">
|
|
59
|
-
<NotificationsIcon />
|
|
60
|
-
</IconButton>
|
|
61
|
-
<IconButton color="inherit" size="small" data-testid="darkmode-btn">
|
|
62
|
-
<DarkModeIcon />
|
|
63
|
-
</IconButton>
|
|
64
|
-
<Avatar sx={{ width: 32, height: 32 }} data-testid="avatar">
|
|
65
|
-
U
|
|
66
|
-
</Avatar>
|
|
67
|
-
</Box>
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
// ====================================
|
|
71
|
-
// Interaction Tests
|
|
72
|
-
// ====================================
|
|
73
|
-
|
|
74
|
-
export const BasicInteraction: Story = {
|
|
75
|
-
name: '🧪 Basic Interaction Test',
|
|
76
|
-
args: {
|
|
77
|
-
items: basicMenuItems,
|
|
78
|
-
logo: <Logo />,
|
|
79
|
-
endContent: <EndContent />,
|
|
80
|
-
'data-testid': 'menubar-basic',
|
|
81
|
-
onClick: fn(),
|
|
82
|
-
onFocus: fn(),
|
|
83
|
-
onBlur: fn(),
|
|
84
|
-
},
|
|
85
|
-
play: async ({ canvasElement, step }) => {
|
|
86
|
-
const canvas = within(canvasElement);
|
|
87
|
-
|
|
88
|
-
await step('Initial render verification', async () => {
|
|
89
|
-
// Check for the AppBar header which contains the menubar
|
|
90
|
-
const appBar = canvas.getByRole('banner');
|
|
91
|
-
await expect(appBar).toBeInTheDocument();
|
|
92
|
-
|
|
93
|
-
const fileButton = canvas.getByRole('button', { name: /file/i });
|
|
94
|
-
await expect(fileButton).toBeInTheDocument();
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
await step('Menu item clicking', async () => {
|
|
98
|
-
const fileButton = canvas.getByRole('button', { name: /file/i });
|
|
99
|
-
await userEvent.click(fileButton);
|
|
100
|
-
|
|
101
|
-
await waitFor(() => {
|
|
102
|
-
const newMenuItem = document.querySelector('[role="menuitem"]');
|
|
103
|
-
expect(newMenuItem).toBeInTheDocument();
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
await step('Logo and end content display', async () => {
|
|
108
|
-
const logo = canvas.getByText('TestApp');
|
|
109
|
-
await expect(logo).toBeInTheDocument();
|
|
110
|
-
|
|
111
|
-
const avatar = canvas.getByTestId('avatar');
|
|
112
|
-
await expect(avatar).toBeInTheDocument();
|
|
113
|
-
});
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
export const FormInteraction: Story = {
|
|
118
|
-
name: '🧪 Form Interaction Test',
|
|
119
|
-
args: {
|
|
120
|
-
items: [
|
|
121
|
-
{
|
|
122
|
-
id: 'settings',
|
|
123
|
-
label: 'Settings',
|
|
124
|
-
icon: <SettingsIcon fontSize="small" />,
|
|
125
|
-
children: [
|
|
126
|
-
{ id: 'profile', label: 'Profile Settings', action: fn() },
|
|
127
|
-
{ id: 'preferences', label: 'Preferences', action: fn() },
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
],
|
|
131
|
-
onClick: fn(),
|
|
132
|
-
onFocus: fn(),
|
|
133
|
-
onBlur: fn(),
|
|
134
|
-
},
|
|
135
|
-
play: async ({ canvasElement, step, args }) => {
|
|
136
|
-
const canvas = within(canvasElement);
|
|
137
|
-
|
|
138
|
-
await step('Menu item with children interaction', async () => {
|
|
139
|
-
const settingsButton = canvas.getByRole('button', { name: /settings/i });
|
|
140
|
-
await userEvent.click(settingsButton);
|
|
141
|
-
|
|
142
|
-
await waitFor(() => {
|
|
143
|
-
const menu = document.querySelector('[role="menu"]');
|
|
144
|
-
expect(menu).toBeInTheDocument();
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
await step('Callback verification', async () => {
|
|
149
|
-
const profileItem = document.querySelector('[role="menuitem"]');
|
|
150
|
-
expect(profileItem).toBeInTheDocument();
|
|
151
|
-
await userEvent.click(profileItem as HTMLElement);
|
|
152
|
-
|
|
153
|
-
await waitFor(() => {
|
|
154
|
-
expect(args.onClick).toHaveBeenCalled();
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
export const KeyboardNavigation: Story = {
|
|
161
|
-
name: '🧪 Keyboard Navigation Test',
|
|
162
|
-
args: {
|
|
163
|
-
items: basicMenuItems,
|
|
164
|
-
logo: <Logo />,
|
|
165
|
-
onClick: fn(),
|
|
166
|
-
onFocus: fn(),
|
|
167
|
-
onBlur: fn(),
|
|
168
|
-
},
|
|
169
|
-
play: async ({ canvasElement, step }) => {
|
|
170
|
-
const canvas = within(canvasElement);
|
|
171
|
-
|
|
172
|
-
await step('Tab navigation', async () => {
|
|
173
|
-
const fileButton = canvas.getByRole('button', { name: /file/i });
|
|
174
|
-
const editButton = canvas.getByRole('button', { name: /edit/i });
|
|
175
|
-
|
|
176
|
-
// Focus the first button explicitly
|
|
177
|
-
await userEvent.click(fileButton);
|
|
178
|
-
await waitFor(() => expect(fileButton).toHaveFocus());
|
|
179
|
-
|
|
180
|
-
// Tab to next button
|
|
181
|
-
await userEvent.keyboard('{Tab}');
|
|
182
|
-
await waitFor(() => expect(editButton).toHaveFocus());
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
await step('Enter key opens menu', async () => {
|
|
186
|
-
await userEvent.keyboard('{Enter}');
|
|
187
|
-
|
|
188
|
-
await waitFor(() => {
|
|
189
|
-
// Look for the menu in the document, not just within canvas
|
|
190
|
-
const menu = document.querySelector('[role="menu"]');
|
|
191
|
-
expect(menu).toBeInTheDocument();
|
|
192
|
-
const undoText = Array.from(document.querySelectorAll('[role="menuitem"]')).find((el) =>
|
|
193
|
-
el.textContent?.includes('Undo'),
|
|
194
|
-
);
|
|
195
|
-
expect(undoText).toBeTruthy();
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
await step('Escape key closes menu', async () => {
|
|
200
|
-
await userEvent.keyboard('{Escape}');
|
|
201
|
-
|
|
202
|
-
await waitFor(() => {
|
|
203
|
-
const menu = document.querySelector('[role="menu"]');
|
|
204
|
-
expect(menu).not.toBeInTheDocument();
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
},
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
export const ScreenReader: Story = {
|
|
211
|
-
name: '🧪 Screen Reader Test',
|
|
212
|
-
args: {
|
|
213
|
-
items: basicMenuItems,
|
|
214
|
-
logo: <Logo />,
|
|
215
|
-
onClick: fn(),
|
|
216
|
-
onFocus: fn(),
|
|
217
|
-
onBlur: fn(),
|
|
218
|
-
},
|
|
219
|
-
play: async ({ canvasElement, step }) => {
|
|
220
|
-
const canvas = within(canvasElement);
|
|
221
|
-
|
|
222
|
-
await step('ARIA attributes verification', async () => {
|
|
223
|
-
const fileButton = canvas.getByRole('button', { name: /file/i });
|
|
224
|
-
await expect(fileButton).toHaveAttribute('type', 'button');
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
await step('Menu ARIA structure', async () => {
|
|
228
|
-
const fileButton = canvas.getByRole('button', { name: /file/i });
|
|
229
|
-
await userEvent.click(fileButton);
|
|
230
|
-
|
|
231
|
-
await waitFor(() => {
|
|
232
|
-
const menu = document.querySelector('[role="menu"]');
|
|
233
|
-
expect(menu).toBeInTheDocument();
|
|
234
|
-
expect(menu).toHaveAttribute('role', 'menu');
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
await step('Menu items have proper roles', async () => {
|
|
239
|
-
await waitFor(() => {
|
|
240
|
-
const menuItems = document.querySelectorAll('[role="menuitem"]');
|
|
241
|
-
expect(menuItems.length).toBeGreaterThan(0);
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
},
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
export const FocusManagement: Story = {
|
|
248
|
-
name: '🧪 Focus Management Test',
|
|
249
|
-
args: {
|
|
250
|
-
items: basicMenuItems,
|
|
251
|
-
logo: <Logo />,
|
|
252
|
-
endContent: <EndContent />,
|
|
253
|
-
onClick: fn(),
|
|
254
|
-
onFocus: fn(),
|
|
255
|
-
onBlur: fn(),
|
|
256
|
-
},
|
|
257
|
-
play: async ({ canvasElement, step }) => {
|
|
258
|
-
const canvas = within(canvasElement);
|
|
259
|
-
|
|
260
|
-
await step('Focus on menu trigger', async () => {
|
|
261
|
-
// Use data-testid to find the button more reliably
|
|
262
|
-
const fileButton = canvas.getByTestId('menubar-button-file');
|
|
263
|
-
await userEvent.click(fileButton);
|
|
264
|
-
|
|
265
|
-
await waitFor(() => {
|
|
266
|
-
const menu = document.querySelector('[role="menu"]');
|
|
267
|
-
expect(menu).toBeInTheDocument();
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
await step('Focus returns after menu closes', async () => {
|
|
272
|
-
const fileButton = canvas.getByTestId('menubar-button-file');
|
|
273
|
-
await userEvent.keyboard('{Escape}');
|
|
274
|
-
|
|
275
|
-
await waitFor(() => {
|
|
276
|
-
expect(fileButton).toHaveFocus();
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
await step('End content focus', async () => {
|
|
281
|
-
const notificationBtn = canvas.getByTestId('notifications-btn');
|
|
282
|
-
await userEvent.click(notificationBtn);
|
|
283
|
-
await waitFor(() => expect(notificationBtn).toHaveFocus());
|
|
284
|
-
});
|
|
285
|
-
},
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
export const ResponsiveDesign: Story = {
|
|
289
|
-
name: '🧪 Responsive Design Test',
|
|
290
|
-
args: {
|
|
291
|
-
items: basicMenuItems,
|
|
292
|
-
logo: <Logo />,
|
|
293
|
-
endContent: <EndContent />,
|
|
294
|
-
onClick: fn(),
|
|
295
|
-
onFocus: fn(),
|
|
296
|
-
onBlur: fn(),
|
|
297
|
-
},
|
|
298
|
-
parameters: {
|
|
299
|
-
viewport: { defaultViewport: 'mobile1' },
|
|
300
|
-
},
|
|
301
|
-
play: async ({ canvasElement, step }) => {
|
|
302
|
-
const canvas = within(canvasElement);
|
|
303
|
-
|
|
304
|
-
await step('Mobile rendering', async () => {
|
|
305
|
-
const appBar = canvas.getByRole('banner');
|
|
306
|
-
await expect(appBar).toBeInTheDocument();
|
|
307
|
-
|
|
308
|
-
const logo = canvas.getByText('TestApp');
|
|
309
|
-
await expect(logo).toBeInTheDocument();
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
await step('Menu interaction on mobile', async () => {
|
|
313
|
-
const fileButton = canvas.getByRole('button', { name: /file/i });
|
|
314
|
-
await userEvent.click(fileButton);
|
|
315
|
-
|
|
316
|
-
await waitFor(() => {
|
|
317
|
-
const menu = document.querySelector('[role="menu"]');
|
|
318
|
-
expect(menu).toBeInTheDocument();
|
|
319
|
-
});
|
|
320
|
-
});
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
export const ThemeVariations: Story = {
|
|
325
|
-
name: '🧪 Theme Variations Test',
|
|
326
|
-
render: () => (
|
|
327
|
-
<Box>
|
|
328
|
-
{(['default', 'glass', 'gradient'] as const).map((variant) => (
|
|
329
|
-
<Box key={variant} sx={{ mb: 2 }} data-testid={`variant-${variant}`}>
|
|
330
|
-
<Typography variant="caption" sx={{ mb: 1, display: 'block' }}>
|
|
331
|
-
Variant: {variant}
|
|
332
|
-
</Typography>
|
|
333
|
-
<Menubar
|
|
334
|
-
items={basicMenuItems}
|
|
335
|
-
variant={variant}
|
|
336
|
-
color="primary"
|
|
337
|
-
logo={<Logo />}
|
|
338
|
-
glass={variant === 'glass'}
|
|
339
|
-
gradient={variant === 'gradient'}
|
|
340
|
-
onClick={fn()}
|
|
341
|
-
onFocus={fn()}
|
|
342
|
-
onBlur={fn()}
|
|
343
|
-
/>
|
|
344
|
-
</Box>
|
|
345
|
-
))}
|
|
346
|
-
</Box>
|
|
347
|
-
),
|
|
348
|
-
play: async ({ canvasElement, step }) => {
|
|
349
|
-
const canvas = within(canvasElement);
|
|
350
|
-
|
|
351
|
-
await step('All variants render', async () => {
|
|
352
|
-
const variants = ['default', 'glass', 'gradient'];
|
|
353
|
-
|
|
354
|
-
for (const variant of variants) {
|
|
355
|
-
const variantElement = canvas.getByTestId(`variant-${variant}`);
|
|
356
|
-
await expect(variantElement).toBeInTheDocument();
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
await step('Glass variant functionality', async () => {
|
|
361
|
-
const glassVariant = canvas.getByTestId('variant-glass');
|
|
362
|
-
const glassFileButton = within(glassVariant).getByRole('button', { name: /file/i });
|
|
363
|
-
await userEvent.click(glassFileButton);
|
|
364
|
-
|
|
365
|
-
await waitFor(() => {
|
|
366
|
-
// Look for the menu item in the document, not just within the variant
|
|
367
|
-
const newMenuItem = document.querySelector('[role="menuitem"]');
|
|
368
|
-
expect(newMenuItem).toBeInTheDocument();
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
},
|
|
372
|
-
};
|
|
373
|
-
|
|
374
|
-
export const VisualStates: Story = {
|
|
375
|
-
name: '🧪 Visual States Test',
|
|
376
|
-
render: () => (
|
|
377
|
-
<Box>
|
|
378
|
-
<Typography variant="h6" gutterBottom>
|
|
379
|
-
Loading State
|
|
380
|
-
</Typography>
|
|
381
|
-
<Menubar
|
|
382
|
-
items={[]}
|
|
383
|
-
loading
|
|
384
|
-
logo={<Logo />}
|
|
385
|
-
onClick={fn()}
|
|
386
|
-
onFocus={fn()}
|
|
387
|
-
onBlur={fn()}
|
|
388
|
-
data-testid="menubar-loading"
|
|
389
|
-
/>
|
|
390
|
-
|
|
391
|
-
<Typography variant="h6" gutterBottom sx={{ mt: 3 }}>
|
|
392
|
-
Disabled State
|
|
393
|
-
</Typography>
|
|
394
|
-
<Menubar
|
|
395
|
-
items={basicMenuItems}
|
|
396
|
-
disabled
|
|
397
|
-
logo={<Logo />}
|
|
398
|
-
onClick={fn()}
|
|
399
|
-
onFocus={fn()}
|
|
400
|
-
onBlur={fn()}
|
|
401
|
-
data-testid="menubar-disabled"
|
|
402
|
-
/>
|
|
403
|
-
|
|
404
|
-
<Typography variant="h6" gutterBottom sx={{ mt: 3 }}>
|
|
405
|
-
Glass Effect
|
|
406
|
-
</Typography>
|
|
407
|
-
<Box sx={{ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)', p: 2 }}>
|
|
408
|
-
<Menubar
|
|
409
|
-
items={basicMenuItems}
|
|
410
|
-
variant="glass"
|
|
411
|
-
glass
|
|
412
|
-
transparent
|
|
413
|
-
logo={<Logo />}
|
|
414
|
-
onClick={fn()}
|
|
415
|
-
onFocus={fn()}
|
|
416
|
-
onBlur={fn()}
|
|
417
|
-
/>
|
|
418
|
-
</Box>
|
|
419
|
-
</Box>
|
|
420
|
-
),
|
|
421
|
-
play: async ({ canvasElement, step }) => {
|
|
422
|
-
const canvas = within(canvasElement);
|
|
423
|
-
|
|
424
|
-
await step('Loading state displays', async () => {
|
|
425
|
-
// Simply verify the loading menubar exists
|
|
426
|
-
const loadingMenubar = canvas.getByTestId('menubar-loading');
|
|
427
|
-
await expect(loadingMenubar).toBeInTheDocument();
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
await step('Disabled state verification', async () => {
|
|
431
|
-
const disabledMenubar = canvas.getByTestId('menubar-disabled');
|
|
432
|
-
const disabledFileButton = within(disabledMenubar).getByTestId('menubar-button-file');
|
|
433
|
-
await expect(disabledFileButton).toBeDisabled();
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
await step('Glass variant renders', async () => {
|
|
437
|
-
const glassMenus = canvas.getAllByText('File');
|
|
438
|
-
expect(glassMenus.length).toBeGreaterThan(0);
|
|
439
|
-
// Check the glass variant specifically by looking for the last instance
|
|
440
|
-
const lastFileButton = glassMenus[glassMenus.length - 1];
|
|
441
|
-
await expect(lastFileButton).toBeInTheDocument();
|
|
442
|
-
});
|
|
443
|
-
},
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
export const Performance: Story = {
|
|
447
|
-
name: '🧪 Performance Test',
|
|
448
|
-
args: {
|
|
449
|
-
items: Array.from({ length: 20 }, (_, i) => ({
|
|
450
|
-
id: `item-${i}`,
|
|
451
|
-
label: `Menu Item ${i + 1}`,
|
|
452
|
-
children: Array.from({ length: 5 }, (_, j) => ({
|
|
453
|
-
id: `subitem-${i}-${j}`,
|
|
454
|
-
label: `Submenu ${i + 1}.${j + 1}`,
|
|
455
|
-
action: fn(),
|
|
456
|
-
})),
|
|
457
|
-
})),
|
|
458
|
-
logo: <Logo />,
|
|
459
|
-
onClick: fn(),
|
|
460
|
-
onFocus: fn(),
|
|
461
|
-
onBlur: fn(),
|
|
462
|
-
},
|
|
463
|
-
play: async ({ canvasElement, step }) => {
|
|
464
|
-
const canvas = within(canvasElement);
|
|
465
|
-
|
|
466
|
-
await step('Many items render performance', async () => {
|
|
467
|
-
|
|
468
|
-
const firstMenuItem = canvas.getByRole('button', { name: 'Menu Item 1' });
|
|
469
|
-
await expect(firstMenuItem).toBeInTheDocument();
|
|
470
|
-
|
|
471
|
-
await userEvent.click(firstMenuItem);
|
|
472
|
-
|
|
473
|
-
await waitFor(() => {
|
|
474
|
-
// Look for menu items in the document level
|
|
475
|
-
const menuItems = document.querySelectorAll('[role="menuitem"]');
|
|
476
|
-
expect(menuItems.length).toBeGreaterThan(0);
|
|
477
|
-
});
|
|
478
|
-
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
await step('Menu closes quickly', async () => {
|
|
482
|
-
await userEvent.keyboard('{Escape}');
|
|
483
|
-
|
|
484
|
-
await waitFor(() => {
|
|
485
|
-
const menuItems = document.querySelectorAll('[role="menuitem"]');
|
|
486
|
-
expect(menuItems.length).toBe(0);
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
},
|
|
490
|
-
};
|
|
491
|
-
|
|
492
|
-
export const EdgeCases: Story = {
|
|
493
|
-
name: '🧪 Edge Cases Test',
|
|
494
|
-
render: () => (
|
|
495
|
-
<Box>
|
|
496
|
-
<Typography variant="h6" gutterBottom>
|
|
497
|
-
Empty Menu
|
|
498
|
-
</Typography>
|
|
499
|
-
<Menubar items={[]} logo={<Logo />} />
|
|
500
|
-
|
|
501
|
-
<Typography variant="h6" gutterBottom sx={{ mt: 3 }}>
|
|
502
|
-
Mixed Item Types
|
|
503
|
-
</Typography>
|
|
504
|
-
<Menubar
|
|
505
|
-
items={[
|
|
506
|
-
{ id: 'normal', label: 'Normal Item', action: fn() },
|
|
507
|
-
{ id: 'sep1', divider: true, label: '', action: fn() },
|
|
508
|
-
{ id: 'disabled', label: 'Disabled Item', disabled: true, action: fn() },
|
|
509
|
-
]}
|
|
510
|
-
logo={<Logo />}
|
|
511
|
-
/>
|
|
512
|
-
</Box>
|
|
513
|
-
),
|
|
514
|
-
play: async ({ canvasElement, step }) => {
|
|
515
|
-
const canvas = within(canvasElement);
|
|
516
|
-
|
|
517
|
-
await step('Empty menu renders', async () => {
|
|
518
|
-
const emptyMenubar = canvas.getAllByRole('toolbar')[0];
|
|
519
|
-
await expect(emptyMenubar).toBeInTheDocument();
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
await step('Mixed item types work', async () => {
|
|
523
|
-
const normalItem = canvas.getByRole('button', { name: 'Normal Item' });
|
|
524
|
-
const disabledItem = canvas.getByRole('button', { name: 'Disabled Item' });
|
|
525
|
-
|
|
526
|
-
await expect(normalItem).toBeInTheDocument();
|
|
527
|
-
await expect(disabledItem).toBeDisabled();
|
|
528
|
-
});
|
|
529
|
-
},
|
|
530
|
-
};
|
|
531
|
-
|
|
532
|
-
export const Integration: Story = {
|
|
533
|
-
name: '🧪 Integration Test',
|
|
534
|
-
render: () => (
|
|
535
|
-
<Box>
|
|
536
|
-
<Menubar
|
|
537
|
-
items={[
|
|
538
|
-
{
|
|
539
|
-
id: 'actions',
|
|
540
|
-
label: 'Actions',
|
|
541
|
-
children: [
|
|
542
|
-
{ id: 'create', label: 'Create New', action: fn() },
|
|
543
|
-
{ id: 'import', label: 'Import Data', action: fn() },
|
|
544
|
-
],
|
|
545
|
-
},
|
|
546
|
-
]}
|
|
547
|
-
variant="elevated"
|
|
548
|
-
color="primary"
|
|
549
|
-
logo={<Logo />}
|
|
550
|
-
endContent={<EndContent />}
|
|
551
|
-
onFocus={fn()}
|
|
552
|
-
onBlur={fn()}
|
|
553
|
-
onClick={fn()}
|
|
554
|
-
/>
|
|
555
|
-
</Box>
|
|
556
|
-
),
|
|
557
|
-
play: async ({ canvasElement, step }) => {
|
|
558
|
-
const canvas = within(canvasElement);
|
|
559
|
-
|
|
560
|
-
await step('Integrated components render', async () => {
|
|
561
|
-
const appBar = canvas.getByRole('banner');
|
|
562
|
-
await expect(appBar).toBeInTheDocument();
|
|
563
|
-
|
|
564
|
-
const logo = canvas.getByText('TestApp');
|
|
565
|
-
await expect(logo).toBeInTheDocument();
|
|
566
|
-
|
|
567
|
-
const avatar = canvas.getByTestId('avatar');
|
|
568
|
-
await expect(avatar).toBeInTheDocument();
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
await step('Menu integration works', async () => {
|
|
572
|
-
const actionsButton = canvas.getByRole('button', { name: /actions/i });
|
|
573
|
-
await userEvent.click(actionsButton);
|
|
574
|
-
|
|
575
|
-
await waitFor(() => {
|
|
576
|
-
const menu = document.querySelector('[role="menu"]');
|
|
577
|
-
expect(menu).toBeInTheDocument();
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
const menuItems = document.querySelectorAll('[role="menuitem"]');
|
|
581
|
-
expect(menuItems.length).toBeGreaterThan(0);
|
|
582
|
-
});
|
|
583
|
-
},
|
|
584
|
-
};
|