@12-apps/ui 1.4.1 → 1.5.1

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 (229) hide show
  1. package/package.json +17 -8
  2. package/src/button/index.ts +1 -0
  3. package/src/social-login-button/index.ts +1 -0
  4. package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
  5. package/src/user-avatar/index.ts +1 -0
  6. package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
  7. package/eslint.config.js +0 -77
  8. package/src/__tests__/data-grid.test.tsx +0 -125
  9. package/src/__tests__/package-wiring.test.ts +0 -41
  10. package/src/__tests__/setup.ts +0 -1
  11. package/src/__tests__/social-login-button.test.tsx +0 -186
  12. package/src/__tests__/user-avatar.test.tsx +0 -195
  13. package/src/__tests__/viewport.test.ts +0 -50
  14. package/src/components/command/__tests__/command.test.tsx +0 -112
  15. package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
  16. package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
  17. package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
  18. package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -753
  19. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
  20. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
  21. package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
  22. package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
  23. package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
  24. package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
  25. package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
  26. package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -503
  27. package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
  28. package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -691
  29. package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
  30. package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
  31. package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
  32. package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
  33. package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
  34. package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
  35. package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
  36. package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
  37. package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
  38. package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
  39. package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
  40. package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
  41. package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
  42. package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
  43. package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
  44. package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
  45. package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
  46. package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
  47. package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
  48. package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
  49. package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
  50. package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
  51. package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
  52. package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
  53. package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
  54. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
  55. package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
  56. package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
  57. package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
  58. package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
  59. package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
  60. package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
  61. package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
  62. package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
  63. package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
  64. package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
  65. package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
  66. package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
  67. package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
  68. package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
  69. package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1101
  70. package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
  71. package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
  72. package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
  73. package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
  74. package/src/components/data-display/Table/Table.stories.tsx +0 -803
  75. package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
  76. package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
  77. package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
  78. package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
  79. package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
  80. package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
  81. package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
  82. package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
  83. package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
  84. package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
  85. package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
  86. package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -955
  87. package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
  88. package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
  89. package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
  90. package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
  91. package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
  92. package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
  93. package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -975
  94. package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
  95. package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
  96. package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
  97. package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
  98. package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
  99. package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
  100. package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
  101. package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
  102. package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
  103. package/src/components/form/Button/Button.stories.tsx +0 -365
  104. package/src/components/form/Button/Button.test.stories.tsx +0 -607
  105. package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
  106. package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
  107. package/src/components/form/CepField/CepField.stories.tsx +0 -138
  108. package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
  109. package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
  110. package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
  111. package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
  112. package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
  113. package/src/components/form/Command/Command.stories.tsx +0 -580
  114. package/src/components/form/Command/Command.test.stories.tsx +0 -215
  115. package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
  116. package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
  117. package/src/components/form/Form/Form.stories.tsx +0 -687
  118. package/src/components/form/Form/Form.test.stories.tsx +0 -601
  119. package/src/components/form/Input/Input.stories.tsx +0 -260
  120. package/src/components/form/Input/Input.test.stories.tsx +0 -1191
  121. package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
  122. package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
  123. package/src/components/form/Label/Label.stories.tsx +0 -473
  124. package/src/components/form/Label/Label.test.stories.tsx +0 -909
  125. package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
  126. package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
  127. package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
  128. package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
  129. package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
  130. package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
  131. package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
  132. package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
  133. package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
  134. package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
  135. package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
  136. package/src/components/form/Select/Select.stories.tsx +0 -364
  137. package/src/components/form/Select/Select.test.stories.tsx +0 -985
  138. package/src/components/form/Slider/Slider.stories.tsx +0 -418
  139. package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
  140. package/src/components/form/Switch/Switch.stories.tsx +0 -697
  141. package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
  142. package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
  143. package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
  144. package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
  145. package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
  146. package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
  147. package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -918
  148. package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
  149. package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
  150. package/src/components/form/total-form/total-form.test.tsx +0 -214
  151. package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
  152. package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
  153. package/src/components/layout/Card/Card.stories.tsx +0 -591
  154. package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
  155. package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
  156. package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
  157. package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
  158. package/src/components/layout/Container/Container.stories.tsx +0 -557
  159. package/src/components/layout/Container/Container.test.stories.tsx +0 -745
  160. package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
  161. package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
  162. package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
  163. package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
  164. package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
  165. package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
  166. package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
  167. package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
  168. package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
  169. package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
  170. package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -750
  171. package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
  172. package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
  173. package/src/components/layout/Separator/Separator.stories.tsx +0 -563
  174. package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
  175. package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
  176. package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
  177. package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
  178. package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
  179. package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
  180. package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
  181. package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
  182. package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -472
  183. package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
  184. package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
  185. package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
  186. package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
  187. package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
  188. package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
  189. package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
  190. package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
  191. package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
  192. package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
  193. package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
  194. package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
  195. package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
  196. package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
  197. package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
  198. package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
  199. package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
  200. package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
  201. package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
  202. package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
  203. package/src/components/typography/Code/Code.stories.tsx +0 -686
  204. package/src/components/typography/Code/Code.test.stories.tsx +0 -703
  205. package/src/components/typography/Heading/Heading.stories.tsx +0 -451
  206. package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
  207. package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
  208. package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
  209. package/src/components/typography/Text/Text.stories.tsx +0 -359
  210. package/src/components/typography/Text/Text.test.stories.tsx +0 -762
  211. package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
  212. package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
  213. package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
  214. package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
  215. package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
  216. package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
  217. package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
  218. package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
  219. package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
  220. package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
  221. package/src/components/utility/Portal/Portal.stories.tsx +0 -340
  222. package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
  223. package/src/components/utility/Transition/Transition.stories.tsx +0 -493
  224. package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
  225. package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
  226. package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
  227. package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
  228. package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
  229. /package/src/{button.tsx → button/button.tsx} +0 -0
@@ -1,955 +0,0 @@
1
- /* eslint-env browser */
2
- import { Box,Button, Typography } from '@mui/material';
3
- import type { Meta, StoryObj } from '@storybook/react-vite';
4
- import React, { useState } from 'react';
5
- import { expect, fn,userEvent, waitFor, within } from 'storybook/test';
6
-
7
- import { Dialog, DialogActions,DialogContent, DialogHeader } from './Dialog';
8
-
9
- const meta: Meta<typeof Dialog> = {
10
- title: 'Feedback/Dialog/Tests',
11
- component: Dialog,
12
- parameters: {
13
- layout: 'centered',
14
- chromatic: { disableSnapshot: false },
15
- docs: {
16
- description: {
17
- component:
18
- 'Comprehensive test suite for the Dialog component covering interactions, accessibility, visual states, performance, and edge cases.',
19
- },
20
- },
21
- },
22
- tags: ['autodocs', 'test', 'component:Dialog'],
23
- };
24
-
25
- export default meta;
26
- type Story = StoryObj<typeof meta>;
27
-
28
- // Test wrapper component
29
- const TestDialogWrapper = ({
30
- children,
31
- onOpen = fn(),
32
- onClose = fn(),
33
- ...args
34
- }: {
35
- children: React.ReactNode;
36
- onOpen?: () => void;
37
- onClose?: () => void;
38
- [key: string]: unknown;
39
- }) => {
40
- const [open, setOpen] = useState(false);
41
-
42
- const handleOpen = () => {
43
- setOpen(true);
44
- onOpen();
45
- };
46
-
47
- const handleClose = () => {
48
- setOpen(false);
49
- onClose();
50
- };
51
-
52
- return (
53
- <Box>
54
- <Button variant="contained" onClick={handleOpen} data-testid="open-dialog-button">
55
- Open Dialog
56
- </Button>
57
- <Dialog {...args} open={open} onClose={handleClose}>
58
- {React.Children.map(children, (child) => {
59
- if (React.isValidElement(child) && child.type === DialogActions) {
60
- // Clone DialogActions and add onClick handlers to buttons
61
- return React.cloneElement(
62
- child,
63
- {},
64
- React.Children.map(child.props.children, (button) => {
65
- if (
66
- React.isValidElement(button) &&
67
- (button.props['data-testid'] === 'cancel-button' ||
68
- button.props['data-testid'] === 'close-modal-button' ||
69
- button.props['data-testid'] === 'force-close-button')
70
- ) {
71
- return React.cloneElement(button, { onClick: handleClose });
72
- }
73
- return button;
74
- }),
75
- );
76
- }
77
- return child;
78
- })}
79
- </Dialog>
80
- </Box>
81
- );
82
- };
83
-
84
- // 1. Basic Interaction Tests
85
- export const BasicInteraction: Story = {
86
- name: '🧪 Basic Interaction Test',
87
- render: (args) => (
88
- <TestDialogWrapper {...args}>
89
- <DialogHeader
90
- title="Basic Interaction Dialog"
91
- subtitle="Test basic user interactions"
92
- data-testid="dialog-header"
93
- />
94
- <DialogContent data-testid="dialog-content">
95
- <Typography>Test content for basic interactions.</Typography>
96
- </DialogContent>
97
- <DialogActions data-testid="dialog-actions">
98
- <Button data-testid="cancel-button">Cancel</Button>
99
- <Button variant="contained" data-testid="confirm-button">
100
- Confirm
101
- </Button>
102
- </DialogActions>
103
- </TestDialogWrapper>
104
- ),
105
- args: {
106
- variant: 'default',
107
- size: 'md',
108
- onOpen: fn(),
109
- onClose: fn(),
110
- },
111
- play: async ({ canvasElement, step, args }) => {
112
- const canvas = within(canvasElement);
113
-
114
- await step('Initial render verification', async () => {
115
- const openButton = canvas.getByTestId('open-dialog-button');
116
- await expect(openButton).toBeInTheDocument();
117
- await expect(openButton).toHaveTextContent('Open Dialog');
118
- });
119
-
120
- await step('Open dialog interaction', async () => {
121
- const openButton = canvas.getByTestId('open-dialog-button');
122
- await userEvent.click(openButton);
123
-
124
- await waitFor(
125
- async () => {
126
- // MUI Dialog renders in a portal outside the component tree
127
- const dialog = document.querySelector('[role="dialog"]');
128
- await expect(dialog).toBeInTheDocument();
129
- },
130
- { timeout: 3000 },
131
- );
132
-
133
- await expect(args.onOpen).toHaveBeenCalledTimes(1);
134
- });
135
-
136
- await step('Dialog content verification', async () => {
137
- // Query within document since dialog is in a portal
138
- const dialogTitle = within(document.body).getByText('Basic Interaction Dialog');
139
- const dialogSubtitle = within(document.body).getByText('Test basic user interactions');
140
- const dialogContent = within(document.body).getByText('Test content for basic interactions.');
141
-
142
- await expect(dialogTitle).toBeInTheDocument();
143
- await expect(dialogSubtitle).toBeInTheDocument();
144
- await expect(dialogContent).toBeInTheDocument();
145
- });
146
-
147
- await step('Close dialog interaction', async () => {
148
- const cancelButton = within(document.body).getByTestId('cancel-button');
149
- await userEvent.click(cancelButton);
150
-
151
- await waitFor(async () => {
152
- const dialog = document.querySelector('[role="dialog"]');
153
- await expect(dialog).not.toBeInTheDocument();
154
- });
155
- });
156
- },
157
- };
158
-
159
- // 2. Keyboard Navigation Test
160
- export const KeyboardNavigation: Story = {
161
- name: '⌨️ Keyboard Navigation Test',
162
- render: (args) => (
163
- <TestDialogWrapper {...args}>
164
- <DialogHeader title="Keyboard Navigation Test" subtitle="Test keyboard accessibility" />
165
- <DialogContent>
166
- <Typography paragraph>Test keyboard navigation and focus management.</Typography>
167
- <Button data-testid="first-focusable">First Button</Button>
168
- <Button data-testid="second-focusable" sx={{ ml: 1 }}>
169
- Second Button
170
- </Button>
171
- </DialogContent>
172
- <DialogActions>
173
- <Button data-testid="cancel-action">Cancel</Button>
174
- <Button variant="contained" data-testid="confirm-action">
175
- Confirm
176
- </Button>
177
- </DialogActions>
178
- </TestDialogWrapper>
179
- ),
180
- args: {
181
- variant: 'default',
182
- size: 'md',
183
- onOpen: fn(),
184
- onClose: fn(),
185
- },
186
- parameters: {
187
- a11y: {
188
- element: '#storybook-root',
189
- config: {
190
- rules: [
191
- { id: 'color-contrast', enabled: true },
192
- { id: 'aria-required-attr', enabled: true },
193
- { id: 'aria-roles', enabled: true },
194
- { id: 'aria-valid-attr-value', enabled: true },
195
- { id: 'button-name', enabled: true },
196
- { id: 'duplicate-id', enabled: true },
197
- { id: 'label', enabled: true },
198
- ],
199
- },
200
- },
201
- },
202
- play: async ({ canvasElement, step }) => {
203
- const canvas = within(canvasElement);
204
-
205
- await step('Open dialog for keyboard testing', async () => {
206
- const openButton = canvas.getByTestId('open-dialog-button');
207
- await userEvent.click(openButton);
208
-
209
- await waitFor(async () => {
210
- const dialog = document.querySelector('[role="dialog"]');
211
- await expect(dialog).toBeInTheDocument();
212
- });
213
- });
214
-
215
- await step('Tab navigation forward', async () => {
216
- // First focusable element should be the first button
217
- const firstButton = within(document.body).getByTestId('first-focusable');
218
- firstButton.focus();
219
- await expect(firstButton).toHaveFocus();
220
-
221
- // Tab to next element
222
- await userEvent.tab();
223
- const secondButton = within(document.body).getByTestId('second-focusable');
224
- await expect(secondButton).toHaveFocus();
225
-
226
- // Continue tabbing to action buttons
227
- await userEvent.tab();
228
- const cancelButton = within(document.body).getByTestId('cancel-action');
229
- await expect(cancelButton).toHaveFocus();
230
- });
231
-
232
- await step('Tab navigation backward', async () => {
233
- await userEvent.tab({ shift: true });
234
- const secondButton = within(document.body).getByTestId('second-focusable');
235
- await expect(secondButton).toHaveFocus();
236
- });
237
-
238
- await step('Escape key handling', async () => {
239
- await userEvent.keyboard('{Escape}');
240
-
241
- await waitFor(async () => {
242
- const dialog = document.querySelector('[role="dialog"]');
243
- await expect(dialog).not.toBeInTheDocument();
244
- });
245
- });
246
- },
247
- };
248
-
249
- // 3. Screen Reader Test
250
- export const ScreenReaderTest: Story = {
251
- name: '🔊 Screen Reader Test',
252
- render: (args) => (
253
- <TestDialogWrapper {...args}>
254
- <DialogHeader
255
- title="Screen Reader Test Dialog"
256
- subtitle="Testing ARIA attributes and labels"
257
- />
258
- <DialogContent>
259
- <Typography>
260
- This dialog tests screen reader compatibility with proper ARIA attributes.
261
- </Typography>
262
- <Typography id="description-text">
263
- Additional description text that should be referenced by aria-describedby.
264
- </Typography>
265
- </DialogContent>
266
- <DialogActions>
267
- <Button aria-label="Cancel dialog">Cancel</Button>
268
- <Button variant="contained" aria-label="Confirm action">
269
- Confirm
270
- </Button>
271
- </DialogActions>
272
- </TestDialogWrapper>
273
- ),
274
- args: {
275
- variant: 'default',
276
- size: 'md',
277
- },
278
- play: async ({ canvasElement, step }) => {
279
- const canvas = within(canvasElement);
280
-
281
- await step('Open dialog for ARIA testing', async () => {
282
- const openButton = canvas.getByTestId('open-dialog-button');
283
- await userEvent.click(openButton);
284
-
285
- await waitFor(async () => {
286
- const dialog = document.querySelector('[role="dialog"]');
287
- await expect(dialog).toBeInTheDocument();
288
- });
289
- });
290
-
291
- await step('Verify dialog role and attributes', async () => {
292
- const dialog = document.querySelector('[role="dialog"]');
293
- await expect(dialog).toBeInTheDocument();
294
- await expect(dialog).toHaveAttribute('role', 'dialog');
295
- });
296
-
297
- await step('Verify ARIA labels on buttons', async () => {
298
- const cancelButton = within(document.body).getByLabelText('Cancel dialog');
299
- const confirmButton = within(document.body).getByLabelText('Confirm action');
300
-
301
- await expect(cancelButton).toBeInTheDocument();
302
- await expect(confirmButton).toBeInTheDocument();
303
- await expect(confirmButton).toHaveAttribute('aria-label', 'Confirm action');
304
- });
305
-
306
- await step('Verify dialog controls accessibility', async () => {
307
- // Verify action buttons have proper ARIA attributes
308
- const cancelButton = within(document.body).getByLabelText('Cancel dialog');
309
- const confirmButton = within(document.body).getByLabelText('Confirm action');
310
- await expect(cancelButton).toBeInTheDocument();
311
- await expect(confirmButton).toBeInTheDocument();
312
- });
313
- },
314
- };
315
-
316
- // 4. Focus Management Test
317
- export const FocusManagement: Story = {
318
- name: '🎯 Focus Management Test',
319
- render: (args) => (
320
- <Box>
321
- <Button data-testid="trigger-button">Trigger Button</Button>
322
- <TestDialogWrapper {...args}>
323
- <DialogHeader title="Focus Management Test" subtitle="Testing focus trap and restoration" />
324
- <DialogContent>
325
- <Button data-testid="first-modal-element">First Element</Button>
326
- <Button data-testid="second-modal-element" sx={{ ml: 1 }}>
327
- Second Element
328
- </Button>
329
- </DialogContent>
330
- <DialogActions>
331
- <Button data-testid="close-modal-button">Close</Button>
332
- </DialogActions>
333
- </TestDialogWrapper>
334
- </Box>
335
- ),
336
- args: {
337
- variant: 'default',
338
- size: 'md',
339
- onOpen: fn(),
340
- onClose: fn(),
341
- },
342
- play: async ({ canvasElement, step }) => {
343
- const canvas = within(canvasElement);
344
-
345
- await step('Focus initial trigger button', async () => {
346
- const triggerButton = canvas.getByTestId('trigger-button');
347
- triggerButton.focus();
348
- await expect(triggerButton).toHaveFocus();
349
- });
350
-
351
- await step('Open modal and verify focus management', async () => {
352
- const openButton = canvas.getByTestId('open-dialog-button');
353
- await userEvent.click(openButton);
354
-
355
- await waitFor(async () => {
356
- const dialog = document.querySelector('[role="dialog"]');
357
- await expect(dialog).toBeInTheDocument();
358
- });
359
-
360
- // Focus should move to the first focusable element in the dialog
361
- // In MUI Dialog, focus typically goes to the dialog container or first interactive element
362
- await waitFor(() => {
363
- const firstElement = within(document.body).getByTestId('first-modal-element');
364
- firstElement.focus();
365
- expect(document.activeElement).toBeTruthy();
366
- });
367
- });
368
-
369
- await step('Test focus trap within modal', async () => {
370
- const firstElement = within(document.body).getByTestId('first-modal-element');
371
- const secondElement = within(document.body).getByTestId('second-modal-element');
372
- const closeModalButton = within(document.body).getByTestId('close-modal-button');
373
-
374
- // Focus first element explicitly
375
- firstElement.focus();
376
- await expect(firstElement).toHaveFocus();
377
-
378
- // Tab to next element
379
- await userEvent.tab();
380
- await expect(secondElement).toHaveFocus();
381
-
382
- // Tab to close button
383
- await userEvent.tab();
384
- await expect(closeModalButton).toHaveFocus();
385
-
386
- // Tab should cycle back (focus trap) - verify focus is managed
387
- await userEvent.tab();
388
- await waitFor(() => {
389
- const focusedElement = document.activeElement;
390
- expect(focusedElement).toBeTruthy();
391
- // Focus should be on one of the dialog elements
392
- const isInDialog =
393
- focusedElement &&
394
- (focusedElement === firstElement ||
395
- focusedElement === secondElement ||
396
- focusedElement === closeModalButton);
397
- expect(isInDialog).toBe(true);
398
- });
399
- });
400
-
401
- await step('Close modal and verify focus restoration', async () => {
402
- const closeModalButton = within(document.body).getByTestId('close-modal-button');
403
- await userEvent.click(closeModalButton);
404
-
405
- await waitFor(async () => {
406
- const dialog = document.querySelector('[role="dialog"]');
407
- await expect(dialog).not.toBeInTheDocument();
408
- });
409
-
410
- // Focus should return to the open button
411
- const openButton = canvas.getByTestId('open-dialog-button');
412
- await expect(openButton).toHaveFocus();
413
- });
414
- },
415
- };
416
-
417
- // 5. Visual States Test
418
- export const VisualStates: Story = {
419
- name: '👁️ Visual States Test',
420
- render: (args) => (
421
- <TestDialogWrapper {...args}>
422
- <DialogHeader
423
- title="Visual States Test"
424
- subtitle="Testing different visual states and variants"
425
- />
426
- <DialogContent data-testid="dialog-content">
427
- <Typography>Testing visual states and styling.</Typography>
428
- <Button data-testid="interactive-element">Interactive Element</Button>
429
- </DialogContent>
430
- <DialogActions>
431
- <Button disabled data-testid="disabled-button">
432
- Disabled
433
- </Button>
434
- <Button variant="contained" data-testid="active-button">
435
- Active
436
- </Button>
437
- </DialogActions>
438
- </TestDialogWrapper>
439
- ),
440
- args: {
441
- variant: 'glass',
442
- size: 'md',
443
- glow: true,
444
- gradient: true,
445
- borderRadius: 'lg',
446
- onOpen: fn(),
447
- onClose: fn(),
448
- },
449
- play: async ({ canvasElement, step }) => {
450
- const canvas = within(canvasElement);
451
-
452
- await step('Open dialog for visual testing', async () => {
453
- const openButton = canvas.getByTestId('open-dialog-button');
454
- await userEvent.click(openButton);
455
-
456
- await waitFor(async () => {
457
- const dialog = document.querySelector('[role="dialog"]');
458
- await expect(dialog).toBeInTheDocument();
459
- });
460
- });
461
-
462
- await step('Verify glass variant styling', async () => {
463
- const dialog = document.querySelector('[role="dialog"]');
464
-
465
- // Dialog should have glass morphism styles
466
- await expect(dialog).toBeInTheDocument();
467
- });
468
-
469
- await step('Test hover interactions', async () => {
470
- const interactiveElement = within(document.body).getByTestId('interactive-element');
471
-
472
- await userEvent.hover(interactiveElement);
473
- await expect(interactiveElement).toHaveClass('MuiButton-root');
474
-
475
- await userEvent.unhover(interactiveElement);
476
- });
477
-
478
- await step('Test disabled state', async () => {
479
- const disabledButton = within(document.body).getByTestId('disabled-button');
480
- await expect(disabledButton).toBeDisabled();
481
-
482
- // Verify disabled button has proper styling and cannot receive focus
483
- const computedStyle = window.getComputedStyle(disabledButton);
484
- await expect(computedStyle.pointerEvents).toBe('none');
485
- await expect(disabledButton).toBeDisabled();
486
- });
487
-
488
- await step('Test active button state', async () => {
489
- const activeButton = within(document.body).getByTestId('active-button');
490
- await expect(activeButton).not.toBeDisabled();
491
- await expect(activeButton).toHaveClass('MuiButton-contained');
492
- });
493
- },
494
- };
495
-
496
- // 6. Performance Test
497
- export const PerformanceTest: Story = {
498
- name: '⚡ Performance Test',
499
- render: (args) => {
500
- const items = Array.from({ length: 100 }, (_, i) => ({
501
- id: i,
502
- name: `Item ${i + 1}`,
503
- }));
504
-
505
- return (
506
- <TestDialogWrapper {...args}>
507
- <DialogHeader title="Performance Test Dialog" subtitle="Testing with large content" />
508
- <DialogContent data-testid="performance-content">
509
- <Box sx={{ maxHeight: 400, overflow: 'auto' }} data-testid="scroll-container">
510
- {items.map((item) => (
511
- <Typography key={item.id} data-testid={`item-${item.id}`}>
512
- {item.name}
513
- </Typography>
514
- ))}
515
- </Box>
516
- </DialogContent>
517
- <DialogActions>
518
- <Button>Close</Button>
519
- </DialogActions>
520
- </TestDialogWrapper>
521
- );
522
- },
523
- args: {
524
- variant: 'default',
525
- size: 'lg',
526
- },
527
- play: async ({ canvasElement, step }) => {
528
- const canvas = within(canvasElement);
529
-
530
- await step('Open dialog for performance testing', async () => {
531
- const openButton = canvas.getByTestId('open-dialog-button');
532
-
533
- const startTime = window.performance.now();
534
- await userEvent.click(openButton);
535
-
536
- await waitFor(async () => {
537
- const dialog = document.querySelector('[role="dialog"]');
538
- await expect(dialog).toBeInTheDocument();
539
- });
540
-
541
- const endTime = window.performance.now();
542
- const renderTime = endTime - startTime;
543
-
544
- // console.log(`Dialog open time: ${renderTime}ms`);
545
- // Reasonable render time for dialog open
546
- await expect(renderTime).toBeLessThan(500);
547
- });
548
-
549
- await step('Test scroll performance', async () => {
550
- const scrollContainer = within(document.body).getByTestId('scroll-container');
551
-
552
- // Simulate rapid scrolling
553
- for (let i = 0; i < 5; i++) {
554
- scrollContainer.scrollTop = i * 50;
555
- await new Promise((resolve) => window.setTimeout(resolve, 10));
556
- }
557
-
558
- // Verify scrolling works
559
- await expect(scrollContainer).toBeInTheDocument();
560
- await expect(scrollContainer.scrollTop).toBeGreaterThan(0);
561
- });
562
-
563
- await step('Measure item render performance', async () => {
564
- const items = within(document.body).getAllByTestId(/item-\d+/);
565
- await expect(items).toHaveLength(100);
566
-
567
- // All items should be rendered efficiently
568
- const startTime = window.performance.now();
569
- items.forEach((item) => {
570
- expect(item).toBeInTheDocument();
571
- });
572
- const endTime = window.performance.now();
573
-
574
- const measureTime = endTime - startTime;
575
- // console.log(`Item measurement time: ${measureTime}ms`);
576
- await expect(measureTime).toBeLessThan(100);
577
- });
578
- },
579
- };
580
-
581
- // 7. Edge Cases Test
582
- export const EdgeCases: Story = {
583
- name: '🔧 Edge Cases Test',
584
- render: (args) => (
585
- <TestDialogWrapper {...args}>
586
- <DialogHeader
587
- title="Edge Cases Test Dialog with Very Long Title That Should Handle Overflow Gracefully"
588
- subtitle="This is a very long subtitle that tests how the dialog handles overflow content and maintains proper layout and accessibility standards"
589
- showCloseButton={args.showCloseButton}
590
- />
591
- <DialogContent data-testid="edge-case-content">
592
- <Typography data-testid="long-text">
593
- This is a very long piece of text that should test how the dialog handles content overflow
594
- and text wrapping. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
595
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
596
- exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
597
- dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
598
- </Typography>
599
- <Box data-testid="empty-state" sx={{ display: 'none' }}>
600
- <Typography>No data available</Typography>
601
- </Box>
602
- </DialogContent>
603
- <DialogActions data-testid="edge-case-actions">
604
- <Button>Very Long Button Text That Tests Overflow</Button>
605
- <Button variant="contained">OK</Button>
606
- </DialogActions>
607
- </TestDialogWrapper>
608
- ),
609
- args: {
610
- variant: 'default',
611
- size: 'md',
612
- showCloseButton: true,
613
- },
614
- play: async ({ canvasElement, step }) => {
615
- const canvas = within(canvasElement);
616
-
617
- await step('Open dialog for edge case testing', async () => {
618
- const openButton = canvas.getByTestId('open-dialog-button');
619
- await userEvent.click(openButton);
620
-
621
- await waitFor(async () => {
622
- const dialog = document.querySelector('[role="dialog"]');
623
- await expect(dialog).toBeInTheDocument();
624
- });
625
- });
626
-
627
- await step('Test long title handling', async () => {
628
- const longTitle = within(document.body).getByText(
629
- /Edge Cases Test Dialog with Very Long Title/,
630
- );
631
- await expect(longTitle).toBeInTheDocument();
632
-
633
- // Title should be visible and not cause layout issues
634
- const titleElement = longTitle.closest('[class*="MuiDialogTitle"]');
635
- if (titleElement) {
636
- const computedStyle = window.getComputedStyle(titleElement);
637
- await expect(computedStyle.overflow).toBeDefined();
638
- }
639
- });
640
-
641
- await step('Test long content text wrapping', async () => {
642
- const longText = within(document.body).getByTestId('long-text');
643
- await expect(longText).toBeInTheDocument();
644
-
645
- const computedStyle = window.getComputedStyle(longText);
646
- // Text should wrap properly - check that it's not 'nowrap'
647
- await expect(computedStyle.wordWrap).not.toBe('nowrap');
648
- await expect(computedStyle.overflowWrap).toBeDefined();
649
- });
650
-
651
- await step('Test dialog responsiveness', async () => {
652
- const dialog = document.querySelector('[role="dialog"]');
653
- const dialogContent = within(document.body).getByTestId('edge-case-content');
654
-
655
- await expect(dialog).toBeInTheDocument();
656
- await expect(dialogContent).toBeInTheDocument();
657
-
658
- // Dialog should maintain proper dimensions
659
- const dialogRect = dialog.getBoundingClientRect();
660
- await expect(dialogRect.width).toBeGreaterThan(0);
661
- await expect(dialogRect.height).toBeGreaterThan(0);
662
- });
663
-
664
- await step('Test button overflow handling', async () => {
665
- const longButton = within(document.body).getByText(
666
- 'Very Long Button Text That Tests Overflow',
667
- );
668
- await expect(longButton).toBeInTheDocument();
669
-
670
- // Button should be clickable despite long text
671
- await userEvent.hover(longButton);
672
- await userEvent.click(longButton);
673
- });
674
- },
675
- };
676
-
677
- // 8. Persistent Dialog Test
678
- export const PersistentDialogTest: Story = {
679
- name: '🔒 Persistent Dialog Test',
680
- render: (args) => (
681
- <TestDialogWrapper {...args}>
682
- <DialogHeader
683
- title="Persistent Dialog"
684
- subtitle="Cannot be closed by backdrop or escape"
685
- showCloseButton={false}
686
- />
687
- <DialogContent>
688
- <Typography>
689
- This dialog is persistent and cannot be closed by clicking the backdrop or pressing the
690
- Escape key. It must be closed using the action buttons.
691
- </Typography>
692
- </DialogContent>
693
- <DialogActions>
694
- <Button color="error" data-testid="force-close-button">
695
- Force Close
696
- </Button>
697
- <Button variant="contained">Confirm</Button>
698
- </DialogActions>
699
- </TestDialogWrapper>
700
- ),
701
- args: {
702
- variant: 'default',
703
- size: 'md',
704
- persistent: true,
705
- backdrop: true,
706
- onOpen: fn(),
707
- onClose: fn(),
708
- },
709
- play: async ({ canvasElement, step }) => {
710
- const canvas = within(canvasElement);
711
-
712
- await step('Open persistent dialog', async () => {
713
- const openButton = canvas.getByTestId('open-dialog-button');
714
- await userEvent.click(openButton);
715
-
716
- await waitFor(async () => {
717
- const dialog = document.querySelector('[role="dialog"]');
718
- await expect(dialog).toBeInTheDocument();
719
- });
720
- });
721
-
722
- await step('Test escape key does not close persistent dialog', async () => {
723
- await userEvent.keyboard('{Escape}');
724
-
725
- // Wait a moment and verify dialog is still open
726
- await new Promise((resolve) => window.setTimeout(resolve, 100));
727
- const dialog = document.querySelector('[role="dialog"]');
728
- await expect(dialog).toBeInTheDocument();
729
- });
730
-
731
- await step('Test backdrop click does not close persistent dialog', async () => {
732
- const backdrop = document.querySelector('.MuiBackdrop-root');
733
- if (backdrop) {
734
- await userEvent.click(backdrop);
735
-
736
- // Wait a moment and verify dialog is still open
737
- await new Promise((resolve) => window.setTimeout(resolve, 100));
738
- const dialog = document.querySelector('[role="dialog"]');
739
- await expect(dialog).toBeInTheDocument();
740
- }
741
- });
742
-
743
- await step('Test dialog cannot be closed by backdrop', async () => {
744
- // This dialog is persistent - no close button in header
745
- const dialogHeader = document.querySelector('[class*="MuiDialogTitle"]');
746
- const closeButton = dialogHeader ? dialogHeader.querySelector('[aria-label="close"]') : null;
747
- await expect(closeButton).not.toBeInTheDocument();
748
- });
749
-
750
- await step('Test dialog can only be closed via action buttons', async () => {
751
- const forceCloseButton = within(document.body).getByTestId('force-close-button');
752
- await userEvent.click(forceCloseButton);
753
-
754
- await waitFor(async () => {
755
- const dialog = document.querySelector('[role="dialog"]');
756
- await expect(dialog).not.toBeInTheDocument();
757
- });
758
- });
759
- },
760
- };
761
-
762
- // 9. Responsive Design Test
763
- export const ResponsiveDesign: Story = {
764
- name: '📱 Responsive Design Test',
765
- render: (args) => (
766
- <TestDialogWrapper {...args}>
767
- <DialogHeader title="Responsive Design Test" subtitle="Testing dialog responsiveness" />
768
- <DialogContent>
769
- <Typography>
770
- This dialog should adapt to different screen sizes and maintain proper layout on mobile,
771
- tablet, and desktop viewports.
772
- </Typography>
773
- </DialogContent>
774
- <DialogActions>
775
- <Button>Cancel</Button>
776
- <Button variant="contained">Confirm</Button>
777
- </DialogActions>
778
- </TestDialogWrapper>
779
- ),
780
- args: {
781
- variant: 'default',
782
- size: 'md',
783
- onOpen: fn(),
784
- onClose: fn(),
785
- },
786
- parameters: {
787
- viewport: {
788
- defaultViewport: 'mobile1',
789
- },
790
- },
791
- play: async ({ canvasElement, step }) => {
792
- const canvas = within(canvasElement);
793
-
794
- await step('Open dialog on mobile viewport', async () => {
795
- const openButton = canvas.getByTestId('open-dialog-button');
796
- await userEvent.click(openButton);
797
-
798
- await waitFor(async () => {
799
- const dialog = document.querySelector('[role="dialog"]');
800
- await expect(dialog).toBeInTheDocument();
801
- });
802
- });
803
-
804
- await step('Test mobile dialog layout', async () => {
805
- const dialog = document.querySelector('[role="dialog"]');
806
- const dialogRect = dialog.getBoundingClientRect();
807
-
808
- // On mobile, dialog should take a significant portion of the screen width
809
- const viewportWidth = window.innerWidth;
810
- const widthRatio = dialogRect.width / viewportWidth;
811
- await expect(widthRatio).toBeGreaterThan(0.5); // Dialog should take at least 50% of width
812
- });
813
- },
814
- };
815
-
816
- // 10. Theme Variations Test
817
- export const ThemeVariations: Story = {
818
- name: '🎨 Theme Variations Test',
819
- render: (args) => (
820
- <TestDialogWrapper {...args}>
821
- <DialogHeader title="Theme Variations Test" subtitle="Testing dark and light themes" />
822
- <DialogContent>
823
- <Typography>
824
- This dialog should display correctly in both light and dark themes, maintaining proper
825
- contrast and readability.
826
- </Typography>
827
- </DialogContent>
828
- <DialogActions>
829
- <Button>Cancel</Button>
830
- <Button variant="contained">Confirm</Button>
831
- </DialogActions>
832
- </TestDialogWrapper>
833
- ),
834
- args: {
835
- variant: 'default',
836
- size: 'md',
837
- onOpen: fn(),
838
- onClose: fn(),
839
- },
840
- parameters: {
841
- backgrounds: {
842
- default: 'dark',
843
- },
844
- },
845
- play: async ({ canvasElement, step }) => {
846
- const canvas = within(canvasElement);
847
-
848
- await step('Open dialog for theme testing', async () => {
849
- const openButton = canvas.getByTestId('open-dialog-button');
850
- await userEvent.click(openButton);
851
-
852
- await waitFor(async () => {
853
- const dialog = document.querySelector('[role="dialog"]');
854
- await expect(dialog).toBeInTheDocument();
855
- });
856
- });
857
-
858
- await step('Verify theme-aware styling', async () => {
859
- const dialog = document.querySelector('[role="dialog"]');
860
- const computedStyle = window.getComputedStyle(dialog);
861
-
862
- // Dialog should have proper background color
863
- await expect(computedStyle.backgroundColor).toBeDefined();
864
- await expect(computedStyle.color).toBeDefined();
865
- });
866
- },
867
- };
868
-
869
- // 11. Integration Test
870
- export const Integration: Story = {
871
- name: '🔗 Integration Test',
872
- render: (args) => {
873
- const [nestedOpen, setNestedOpen] = useState(false);
874
-
875
- return (
876
- <TestDialogWrapper {...args}>
877
- <DialogHeader title="Integration Test" subtitle="Testing dialog with other components" />
878
- <DialogContent>
879
- <Typography paragraph>
880
- This test verifies dialog integration with other components like nested dialogs, form
881
- elements, and complex interactions.
882
- </Typography>
883
- <Button
884
- variant="outlined"
885
- onClick={() => setNestedOpen(true)}
886
- data-testid="open-nested-dialog"
887
- >
888
- Open Nested Dialog
889
- </Button>
890
- <Dialog open={nestedOpen} onClose={() => setNestedOpen(false)} size="sm">
891
- <DialogHeader title="Nested Dialog" />
892
- <DialogContent>
893
- <Typography>This is a nested dialog for testing integration.</Typography>
894
- </DialogContent>
895
- <DialogActions>
896
- <Button onClick={() => setNestedOpen(false)} data-testid="close-nested-dialog">
897
- Close Nested
898
- </Button>
899
- </DialogActions>
900
- </Dialog>
901
- </DialogContent>
902
- <DialogActions>
903
- <Button>Cancel</Button>
904
- <Button variant="contained">Confirm</Button>
905
- </DialogActions>
906
- </TestDialogWrapper>
907
- );
908
- },
909
- args: {
910
- variant: 'default',
911
- size: 'lg',
912
- onOpen: fn(),
913
- onClose: fn(),
914
- },
915
- play: async ({ canvasElement, step }) => {
916
- const canvas = within(canvasElement);
917
-
918
- await step('Open main dialog', async () => {
919
- const openButton = canvas.getByTestId('open-dialog-button');
920
- await userEvent.click(openButton);
921
-
922
- await waitFor(async () => {
923
- const dialog = document.querySelector('[role="dialog"]');
924
- await expect(dialog).toBeInTheDocument();
925
- });
926
- });
927
-
928
- await step('Test nested dialog functionality', async () => {
929
- const openNestedButton = within(document.body).getByTestId('open-nested-dialog');
930
- await userEvent.click(openNestedButton);
931
-
932
- await waitFor(async () => {
933
- const dialogs = document.querySelectorAll('[role="dialog"]');
934
- await expect(dialogs).toHaveLength(2);
935
- });
936
-
937
- // Close nested dialog
938
- const closeNestedButton = within(document.body).getByTestId('close-nested-dialog');
939
- await userEvent.click(closeNestedButton);
940
-
941
- await waitFor(async () => {
942
- const dialogs = document.querySelectorAll('[role="dialog"]');
943
- await expect(dialogs).toHaveLength(1);
944
- });
945
- });
946
-
947
- await step('Verify main dialog still functional', async () => {
948
- const mainDialog = document.querySelector('[role="dialog"]');
949
- await expect(mainDialog).toBeInTheDocument();
950
-
951
- const dialogTitle = within(document.body).getByText('Integration Test');
952
- await expect(dialogTitle).toBeInTheDocument();
953
- });
954
- },
955
- };