@12-apps/ui 1.5.0 → 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.
- package/package.json +16 -8
- 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,104 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { Box, Button, TextField, Typography } from '@mui/material';
|
|
3
|
-
import { fn } from 'storybook/test';
|
|
4
|
-
|
|
5
|
-
import { Dashboard } from './Dashboard';
|
|
6
|
-
|
|
7
|
-
const meta: Meta<typeof Dashboard> = {
|
|
8
|
-
title: 'Layout/Dashboard',
|
|
9
|
-
component: Dashboard,
|
|
10
|
-
parameters: {
|
|
11
|
-
layout: 'padded',
|
|
12
|
-
docs: {
|
|
13
|
-
description: {
|
|
14
|
-
component:
|
|
15
|
-
'Composable page shell. `<Dashboard>` is a context provider; every part — `Dashboard.Header`, `Dashboard.Breadcrumb`, `Dashboard.Filters`, `Dashboard.Info`, `Dashboard.FilterToggle`, `Dashboard.Settings`, `Dashboard.Export`, `Dashboard.MoreFilters`, `Dashboard.Body` — is opt-in. Compose only what you need; authoring order does not matter, parts render in a fixed slot order.',
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
tags: ['autodocs'],
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export default meta;
|
|
23
|
-
type Story = StoryObj<typeof meta>;
|
|
24
|
-
|
|
25
|
-
const table = (
|
|
26
|
-
<Box sx={{ p: 4, borderRadius: 1, border: '1px dashed', borderColor: 'divider', textAlign: 'center', color: 'text.secondary' }}>
|
|
27
|
-
Your table / grid goes here
|
|
28
|
-
</Box>
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
export const FullComposition: Story = {
|
|
32
|
-
args: { activeFilterCount: 2 },
|
|
33
|
-
render: (args) => (
|
|
34
|
-
<Dashboard {...args}>
|
|
35
|
-
<Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Products' }]} />
|
|
36
|
-
<Dashboard.Header title="Products">
|
|
37
|
-
<Dashboard.Info title="About Products">
|
|
38
|
-
Manage your catalog: create products, set prices, and control stock visibility.
|
|
39
|
-
</Dashboard.Info>
|
|
40
|
-
<Dashboard.FilterToggle />
|
|
41
|
-
<Dashboard.Settings title="Product settings">
|
|
42
|
-
<Typography>In development — coming in the next version.</Typography>
|
|
43
|
-
</Dashboard.Settings>
|
|
44
|
-
<Dashboard.Spacer />
|
|
45
|
-
<Dashboard.Export onExport={fn()} />
|
|
46
|
-
<Dashboard.Action>
|
|
47
|
-
<Button variant="contained">New product</Button>
|
|
48
|
-
</Dashboard.Action>
|
|
49
|
-
</Dashboard.Header>
|
|
50
|
-
<Dashboard.Filters>
|
|
51
|
-
<TextField size="small" placeholder="Search across all columns…" fullWidth />
|
|
52
|
-
<Dashboard.MoreFilters>
|
|
53
|
-
<Box sx={{ display: 'flex', gap: 2 }}>
|
|
54
|
-
<TextField size="small" label="Min price" type="number" />
|
|
55
|
-
<TextField size="small" label="Max price" type="number" />
|
|
56
|
-
</Box>
|
|
57
|
-
</Dashboard.MoreFilters>
|
|
58
|
-
</Dashboard.Filters>
|
|
59
|
-
<Dashboard.Body>{table}</Dashboard.Body>
|
|
60
|
-
</Dashboard>
|
|
61
|
-
),
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
export const HeaderOnly: Story = {
|
|
65
|
-
render: () => (
|
|
66
|
-
<Dashboard>
|
|
67
|
-
<Dashboard.Header title="Simple page">
|
|
68
|
-
<Dashboard.Action>
|
|
69
|
-
<Button variant="contained">Primary action</Button>
|
|
70
|
-
</Dashboard.Action>
|
|
71
|
-
</Dashboard.Header>
|
|
72
|
-
<Dashboard.Body>{table}</Dashboard.Body>
|
|
73
|
-
</Dashboard>
|
|
74
|
-
),
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export const WithoutFilters: Story = {
|
|
78
|
-
render: () => (
|
|
79
|
-
<Dashboard>
|
|
80
|
-
<Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Team' }]} />
|
|
81
|
-
<Dashboard.Header title="Team">
|
|
82
|
-
<Dashboard.Info>Invite teammates and manage their roles.</Dashboard.Info>
|
|
83
|
-
</Dashboard.Header>
|
|
84
|
-
<Dashboard.Body>{table}</Dashboard.Body>
|
|
85
|
-
</Dashboard>
|
|
86
|
-
),
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export const OrderIndependent: Story = {
|
|
90
|
-
name: 'Order-independent authoring',
|
|
91
|
-
render: () => (
|
|
92
|
-
<Dashboard>
|
|
93
|
-
{/* Deliberately authored out of order — still renders breadcrumb → header → filters → body. */}
|
|
94
|
-
<Dashboard.Body>{table}</Dashboard.Body>
|
|
95
|
-
<Dashboard.Filters>
|
|
96
|
-
<TextField size="small" placeholder="Search…" fullWidth />
|
|
97
|
-
</Dashboard.Filters>
|
|
98
|
-
<Dashboard.Header title="Reordered">
|
|
99
|
-
<Dashboard.FilterToggle />
|
|
100
|
-
</Dashboard.Header>
|
|
101
|
-
<Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Reordered' }]} />
|
|
102
|
-
</Dashboard>
|
|
103
|
-
),
|
|
104
|
-
};
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { Box, Button, TextField, Typography } from '@mui/material';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
-
import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
|
|
4
|
-
|
|
5
|
-
import { Dashboard, markDashboardSlot } from './Dashboard';
|
|
6
|
-
|
|
7
|
-
const meta: Meta<typeof Dashboard> = {
|
|
8
|
-
title: 'Layout/Dashboard/Tests',
|
|
9
|
-
component: Dashboard,
|
|
10
|
-
parameters: {
|
|
11
|
-
layout: 'padded',
|
|
12
|
-
chromatic: { disableSnapshot: false },
|
|
13
|
-
},
|
|
14
|
-
tags: ['autodocs', 'test', 'component:Dashboard', 'checked'],
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export default meta;
|
|
18
|
-
type Story = StoryObj<typeof meta>;
|
|
19
|
-
|
|
20
|
-
const body = <Box data-testid="content">content</Box>;
|
|
21
|
-
|
|
22
|
-
/** Full composition reused across tests. */
|
|
23
|
-
const Composed = ({ onExport = fn() }: { onExport?: (id: string) => void }) => (
|
|
24
|
-
<Dashboard activeFilterCount={2}>
|
|
25
|
-
<Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Products' }]} />
|
|
26
|
-
<Dashboard.Header title="Products">
|
|
27
|
-
<Dashboard.Info title="About Products">Manage your catalog.</Dashboard.Info>
|
|
28
|
-
<Dashboard.FilterToggle />
|
|
29
|
-
<Dashboard.Settings title="Product settings">
|
|
30
|
-
<Typography>In development.</Typography>
|
|
31
|
-
</Dashboard.Settings>
|
|
32
|
-
<Dashboard.Spacer />
|
|
33
|
-
<Dashboard.Export onExport={onExport} />
|
|
34
|
-
<Dashboard.Action>
|
|
35
|
-
<Button variant="contained">New product</Button>
|
|
36
|
-
</Dashboard.Action>
|
|
37
|
-
</Dashboard.Header>
|
|
38
|
-
<Dashboard.Filters>
|
|
39
|
-
<TextField size="small" placeholder="Search…" fullWidth inputProps={{ 'data-testid': 'search' }} />
|
|
40
|
-
<Dashboard.MoreFilters>
|
|
41
|
-
<TextField size="small" label="Min price" type="number" />
|
|
42
|
-
</Dashboard.MoreFilters>
|
|
43
|
-
</Dashboard.Filters>
|
|
44
|
-
<Dashboard.Body>{body}</Dashboard.Body>
|
|
45
|
-
</Dashboard>
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
export const FilterToggleInteraction: Story = {
|
|
49
|
-
name: '🧪 Filter toggle shows/hides filters',
|
|
50
|
-
render: () => <Composed />,
|
|
51
|
-
play: async ({ canvasElement, step }) => {
|
|
52
|
-
const canvas = within(canvasElement);
|
|
53
|
-
await step('Filters visible by default', async () => {
|
|
54
|
-
await expect(canvas.getByTestId('search')).toBeVisible();
|
|
55
|
-
});
|
|
56
|
-
await step('Toggle hides the filter region', async () => {
|
|
57
|
-
await userEvent.click(canvas.getByTestId('dashboard-filter-toggle'));
|
|
58
|
-
await waitFor(() => expect(canvas.queryByTestId('search')).not.toBeInTheDocument());
|
|
59
|
-
});
|
|
60
|
-
await step('Toggle again restores it', async () => {
|
|
61
|
-
await userEvent.click(canvas.getByTestId('dashboard-filter-toggle'));
|
|
62
|
-
await waitFor(() => expect(canvas.getByTestId('search')).toBeVisible());
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
export const InfoPopover: Story = {
|
|
68
|
-
name: '🧪 Info popover opens',
|
|
69
|
-
render: () => <Composed />,
|
|
70
|
-
play: async ({ canvasElement, step }) => {
|
|
71
|
-
const canvas = within(canvasElement);
|
|
72
|
-
await step('Open the info popover', async () => {
|
|
73
|
-
await userEvent.click(canvas.getByTestId('dashboard-info-trigger'));
|
|
74
|
-
await waitFor(() => expect(within(document.body).getByText('About Products')).toBeVisible());
|
|
75
|
-
});
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export const SettingsDialog: Story = {
|
|
80
|
-
name: '🧪 Settings gear opens dialog',
|
|
81
|
-
render: () => <Composed />,
|
|
82
|
-
play: async ({ canvasElement, step }) => {
|
|
83
|
-
const canvas = within(canvasElement);
|
|
84
|
-
await step('Open the settings dialog', async () => {
|
|
85
|
-
await userEvent.click(canvas.getByTestId('dashboard-settings-trigger'));
|
|
86
|
-
await waitFor(() => expect(within(document.body).getByText('In development.')).toBeVisible());
|
|
87
|
-
});
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
export const SettingsLink: Story = {
|
|
92
|
-
name: '🧪 Settings gear links to a settings route (no dialog)',
|
|
93
|
-
render: () => (
|
|
94
|
-
<Dashboard>
|
|
95
|
-
<Dashboard.Header title="Estoque">
|
|
96
|
-
<Dashboard.Settings ariaLabel="Configurações de estoque" href="/admin/acme/config/inventory" />
|
|
97
|
-
</Dashboard.Header>
|
|
98
|
-
<Dashboard.Body>{body}</Dashboard.Body>
|
|
99
|
-
</Dashboard>
|
|
100
|
-
),
|
|
101
|
-
play: async ({ canvasElement, step }) => {
|
|
102
|
-
const canvas = within(canvasElement);
|
|
103
|
-
await step('Gear renders as an anchor pointing at the config route', async () => {
|
|
104
|
-
const gear = canvas.getByTestId('dashboard-settings-trigger');
|
|
105
|
-
await expect(gear.tagName).toBe('A');
|
|
106
|
-
await expect(gear).toHaveAttribute('href', '/admin/acme/config/inventory');
|
|
107
|
-
});
|
|
108
|
-
await step('Clicking it opens no dialog', async () => {
|
|
109
|
-
await userEvent.click(canvas.getByTestId('dashboard-settings-trigger'));
|
|
110
|
-
await expect(canvas.queryAllByTestId('dashboard-settings-dialog')).toHaveLength(0);
|
|
111
|
-
});
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
export const ExportMenu: Story = {
|
|
116
|
-
name: '🧪 Export menu invokes handler',
|
|
117
|
-
render: () => {
|
|
118
|
-
const onExport = fn();
|
|
119
|
-
return <Composed onExport={onExport} />;
|
|
120
|
-
},
|
|
121
|
-
play: async ({ canvasElement, step }) => {
|
|
122
|
-
const canvas = within(canvasElement);
|
|
123
|
-
await step('Open export menu and choose CSV', async () => {
|
|
124
|
-
await userEvent.click(canvas.getByTestId('dashboard-export-trigger'));
|
|
125
|
-
await waitFor(() => expect(within(document.body).getByTestId('dashboard-export-csv')).toBeVisible());
|
|
126
|
-
await userEvent.click(within(document.body).getByTestId('dashboard-export-csv'));
|
|
127
|
-
});
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
export const MoreFiltersExpands: Story = {
|
|
132
|
-
name: '🧪 More filters expands advanced panel',
|
|
133
|
-
render: () => <Composed />,
|
|
134
|
-
play: async ({ canvasElement, step }) => {
|
|
135
|
-
const canvas = within(canvasElement);
|
|
136
|
-
await step('Expand advanced filters', async () => {
|
|
137
|
-
await userEvent.click(canvas.getByTestId('dashboard-more-filters-toggle'));
|
|
138
|
-
await waitFor(() => expect(canvas.getByLabelText('Min price')).toBeVisible());
|
|
139
|
-
});
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
export const OrderIndependentRendering: Story = {
|
|
144
|
-
name: '🧪 Renders in slot order regardless of authoring order',
|
|
145
|
-
render: () => (
|
|
146
|
-
<Dashboard>
|
|
147
|
-
<Dashboard.Body>{body}</Dashboard.Body>
|
|
148
|
-
<Dashboard.Header title="Reordered" />
|
|
149
|
-
<Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Reordered' }]} />
|
|
150
|
-
</Dashboard>
|
|
151
|
-
),
|
|
152
|
-
play: async ({ canvasElement, step }) => {
|
|
153
|
-
const canvas = within(canvasElement);
|
|
154
|
-
await step('Breadcrumb renders before header, header before body', async () => {
|
|
155
|
-
const breadcrumb = canvas.getByTestId('dashboard-breadcrumb');
|
|
156
|
-
const header = canvas.getByTestId('dashboard-header');
|
|
157
|
-
const content = canvas.getByTestId('dashboard-body');
|
|
158
|
-
const bcBeforeHeader = breadcrumb.compareDocumentPosition(header) & Node.DOCUMENT_POSITION_FOLLOWING;
|
|
159
|
-
const headerBeforeBody = header.compareDocumentPosition(content) & Node.DOCUMENT_POSITION_FOLLOWING;
|
|
160
|
-
await expect(Boolean(bcBeforeHeader)).toBe(true);
|
|
161
|
-
await expect(Boolean(headerBeforeBody)).toBe(true);
|
|
162
|
-
});
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
/** A page-owned wrapper around `<Dashboard.Header>`, tagged with its slot. */
|
|
167
|
-
const WrappedHeader = markDashboardSlot(
|
|
168
|
-
({ title }: { title: string }) => <Dashboard.Header title={title} />,
|
|
169
|
-
'header',
|
|
170
|
-
);
|
|
171
|
-
|
|
172
|
-
export const MarkedWrapperKeepsHeaderAboveBody: Story = {
|
|
173
|
-
name: '🧪 A slot-marked header wrapper still renders above the body',
|
|
174
|
-
render: () => (
|
|
175
|
-
<Dashboard>
|
|
176
|
-
<Dashboard.Breadcrumb items={[{ label: 'Admin', href: '#' }, { label: 'Wrapped' }]} />
|
|
177
|
-
<WrappedHeader title="Wrapped" />
|
|
178
|
-
<Dashboard.Body>{body}</Dashboard.Body>
|
|
179
|
-
</Dashboard>
|
|
180
|
-
),
|
|
181
|
-
play: async ({ canvasElement, step }) => {
|
|
182
|
-
const canvas = within(canvasElement);
|
|
183
|
-
await step('Wrapped header sits above the body, not below it', async () => {
|
|
184
|
-
const header = canvas.getByTestId('dashboard-header');
|
|
185
|
-
const content = canvas.getByTestId('dashboard-body');
|
|
186
|
-
const headerBeforeBody = header.compareDocumentPosition(content) & Node.DOCUMENT_POSITION_FOLLOWING;
|
|
187
|
-
await expect(Boolean(headerBeforeBody)).toBe(true);
|
|
188
|
-
});
|
|
189
|
-
},
|
|
190
|
-
};
|