@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,167 +0,0 @@
|
|
|
1
|
-
import PaidIcon from '@mui/icons-material/Paid';
|
|
2
|
-
import ReceiptLongIcon from '@mui/icons-material/ReceiptLong';
|
|
3
|
-
import ShoppingCartIcon from '@mui/icons-material/ShoppingCart';
|
|
4
|
-
import TrendingUpIcon from '@mui/icons-material/TrendingUp';
|
|
5
|
-
import { Box } from '@mui/material';
|
|
6
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
7
|
-
|
|
8
|
-
import { StatCard } from './StatCard';
|
|
9
|
-
|
|
10
|
-
const meta: Meta<typeof StatCard> = {
|
|
11
|
-
title: 'DataDisplay/StatCard',
|
|
12
|
-
component: StatCard,
|
|
13
|
-
parameters: {
|
|
14
|
-
layout: 'centered',
|
|
15
|
-
docs: {
|
|
16
|
-
description: {
|
|
17
|
-
component:
|
|
18
|
-
'KPI tile: one labelled figure with an optional period-over-period delta, icon, hint and loading state. Values arrive pre-formatted — the tile never formats money or percentages itself.',
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
tags: ['autodocs'],
|
|
23
|
-
argTypes: {
|
|
24
|
-
label: { control: 'text' },
|
|
25
|
-
value: { control: 'text' },
|
|
26
|
-
hint: { control: 'text' },
|
|
27
|
-
loading: { control: 'boolean' },
|
|
28
|
-
delta: { control: false },
|
|
29
|
-
icon: { control: false },
|
|
30
|
-
className: { control: 'text' },
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export default meta;
|
|
35
|
-
type Story = StoryObj<typeof meta>;
|
|
36
|
-
|
|
37
|
-
export const Default: Story = {
|
|
38
|
-
args: {
|
|
39
|
-
label: 'Receita',
|
|
40
|
-
value: 'R$ 12.480,00',
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export const WithPositiveDelta: Story = {
|
|
45
|
-
args: {
|
|
46
|
-
label: 'Receita',
|
|
47
|
-
value: 'R$ 12.480,00',
|
|
48
|
-
delta: { value: '+12,5%', direction: 'up', label: 'vs. período anterior' },
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export const WithNegativeDelta: Story = {
|
|
53
|
-
args: {
|
|
54
|
-
label: 'Pedidos',
|
|
55
|
-
value: '184',
|
|
56
|
-
delta: { value: '-8,2%', direction: 'down', label: 'vs. período anterior' },
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export const WithNeutralDelta: Story = {
|
|
61
|
-
args: {
|
|
62
|
-
label: 'Margem',
|
|
63
|
-
value: '62,0%',
|
|
64
|
-
delta: { value: '0,0%', direction: 'neutral', label: 'vs. período anterior' },
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* "Lower is better" metrics separate the ARROW from the MEANING: cost rose
|
|
70
|
-
* (`direction: 'up'`) but that reads badly (`tone: 'negative'`).
|
|
71
|
-
*/
|
|
72
|
-
export const InvertedTone: Story = {
|
|
73
|
-
args: {
|
|
74
|
-
label: 'Custo (CMV)',
|
|
75
|
-
value: 'R$ 4.900,00',
|
|
76
|
-
delta: {
|
|
77
|
-
value: '+9,4%',
|
|
78
|
-
direction: 'up',
|
|
79
|
-
tone: 'negative',
|
|
80
|
-
label: 'vs. período anterior',
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
export const WithIcon: Story = {
|
|
86
|
-
args: {
|
|
87
|
-
label: 'Lucro bruto',
|
|
88
|
-
value: 'R$ 7.580,00',
|
|
89
|
-
icon: <TrendingUpIcon fontSize="small" />,
|
|
90
|
-
delta: { value: '+14,0%', direction: 'up' },
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export const WithHint: Story = {
|
|
95
|
-
args: {
|
|
96
|
-
label: 'Receita',
|
|
97
|
-
value: 'R$ 12.480,00',
|
|
98
|
-
hint: 'Últimos 30 dias',
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
export const Loading: Story = {
|
|
103
|
-
args: {
|
|
104
|
-
label: 'Receita',
|
|
105
|
-
value: 'R$ 12.480,00',
|
|
106
|
-
delta: { value: '+12,5%', direction: 'up' },
|
|
107
|
-
loading: true,
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
export const LongValueOverflow: Story = {
|
|
112
|
-
args: {
|
|
113
|
-
label: 'Receita acumulada do exercício corrente',
|
|
114
|
-
value: 'R$ 1.284.930.577,25',
|
|
115
|
-
delta: { value: '+1.204,75%', direction: 'up', label: 'vs. período anterior' },
|
|
116
|
-
},
|
|
117
|
-
decorators: [
|
|
118
|
-
(Story) => (
|
|
119
|
-
<Box sx={{ width: 220 }}>
|
|
120
|
-
<Story />
|
|
121
|
-
</Box>
|
|
122
|
-
),
|
|
123
|
-
],
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
/** The dashboard shape: a responsive grid of tiles sharing one range. */
|
|
127
|
-
export const KpiGrid: Story = {
|
|
128
|
-
render: () => (
|
|
129
|
-
<Box
|
|
130
|
-
sx={{
|
|
131
|
-
display: 'grid',
|
|
132
|
-
gap: 2,
|
|
133
|
-
gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)', md: 'repeat(4, 1fr)' },
|
|
134
|
-
width: { xs: 280, sm: 520, md: 880 },
|
|
135
|
-
}}
|
|
136
|
-
>
|
|
137
|
-
<StatCard
|
|
138
|
-
label="Receita"
|
|
139
|
-
value="R$ 12.480,00"
|
|
140
|
-
icon={<PaidIcon fontSize="small" />}
|
|
141
|
-
delta={{ value: '+12,5%', direction: 'up', label: 'vs. período anterior' }}
|
|
142
|
-
dataTestId="kpi-revenue"
|
|
143
|
-
/>
|
|
144
|
-
<StatCard
|
|
145
|
-
label="Custo (CMV)"
|
|
146
|
-
value="R$ 4.900,00"
|
|
147
|
-
icon={<ReceiptLongIcon fontSize="small" />}
|
|
148
|
-
delta={{ value: '+9,4%', direction: 'up', tone: 'negative', label: 'vs. período anterior' }}
|
|
149
|
-
dataTestId="kpi-cogs"
|
|
150
|
-
/>
|
|
151
|
-
<StatCard
|
|
152
|
-
label="Lucro bruto"
|
|
153
|
-
value="R$ 7.580,00"
|
|
154
|
-
icon={<TrendingUpIcon fontSize="small" />}
|
|
155
|
-
delta={{ value: '+14,0%', direction: 'up', label: 'vs. período anterior' }}
|
|
156
|
-
dataTestId="kpi-profit"
|
|
157
|
-
/>
|
|
158
|
-
<StatCard
|
|
159
|
-
label="Pedidos"
|
|
160
|
-
value="184"
|
|
161
|
-
icon={<ShoppingCartIcon fontSize="small" />}
|
|
162
|
-
delta={{ value: '-8,2%', direction: 'down', label: 'vs. período anterior' }}
|
|
163
|
-
dataTestId="kpi-orders"
|
|
164
|
-
/>
|
|
165
|
-
</Box>
|
|
166
|
-
),
|
|
167
|
-
};
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import TrendingUpIcon from '@mui/icons-material/TrendingUp';
|
|
2
|
-
import { Box } from '@mui/material';
|
|
3
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
4
|
-
import { expect, waitFor, within } from 'storybook/test';
|
|
5
|
-
|
|
6
|
-
import { StatCard } from './StatCard';
|
|
7
|
-
|
|
8
|
-
const meta: Meta<typeof StatCard> = {
|
|
9
|
-
title: 'DataDisplay/StatCard/Tests',
|
|
10
|
-
component: StatCard,
|
|
11
|
-
parameters: {
|
|
12
|
-
layout: 'padded',
|
|
13
|
-
chromatic: { disableSnapshot: false },
|
|
14
|
-
},
|
|
15
|
-
tags: ['autodocs', 'test', 'component:StatCard'],
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export default meta;
|
|
19
|
-
type Story = StoryObj<typeof meta>;
|
|
20
|
-
|
|
21
|
-
export const BasicInteraction: Story = {
|
|
22
|
-
name: '🧪 Renders label and value',
|
|
23
|
-
args: {
|
|
24
|
-
label: 'Receita',
|
|
25
|
-
value: 'R$ 12.480,00',
|
|
26
|
-
dataTestId: 'kpi-revenue',
|
|
27
|
-
},
|
|
28
|
-
play: async ({ canvasElement, step }) => {
|
|
29
|
-
const canvas = within(canvasElement);
|
|
30
|
-
|
|
31
|
-
await step('Tile root is present', async () => {
|
|
32
|
-
await expect(canvas.getByTestId('kpi-revenue')).toBeInTheDocument();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
await step('Label and value render their text', async () => {
|
|
36
|
-
await expect(canvas.getByTestId('kpi-revenue-label')).toHaveTextContent('Receita');
|
|
37
|
-
await expect(canvas.getByTestId('kpi-revenue-value')).toHaveTextContent('R$ 12.480,00');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
await step('No delta renders when none is passed', async () => {
|
|
41
|
-
await waitFor(() =>
|
|
42
|
-
expect(canvas.queryByTestId('kpi-revenue-delta')).not.toBeInTheDocument(),
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export const ScreenReaderTest: Story = {
|
|
49
|
-
name: '🧪 Screen Reader — labelled group and delta sentence',
|
|
50
|
-
args: {
|
|
51
|
-
label: 'Receita',
|
|
52
|
-
value: 'R$ 12.480,00',
|
|
53
|
-
delta: { value: '+12,5%', direction: 'up', label: 'vs. período anterior' },
|
|
54
|
-
dataTestId: 'kpi-revenue',
|
|
55
|
-
},
|
|
56
|
-
play: async ({ canvasElement, step }) => {
|
|
57
|
-
const canvas = within(canvasElement);
|
|
58
|
-
|
|
59
|
-
await step('The tile is a group labelled by its own label element', async () => {
|
|
60
|
-
const group = canvas.getByRole('group', { name: 'Receita' });
|
|
61
|
-
await expect(group).toBe(canvas.getByTestId('kpi-revenue'));
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
await step('The delta exposes a direction-aware sentence', async () => {
|
|
65
|
-
await expect(
|
|
66
|
-
canvas.getByLabelText('Increase of +12,5% vs. período anterior'),
|
|
67
|
-
).toBeInTheDocument();
|
|
68
|
-
});
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export const VisualStateUpDelta: Story = {
|
|
73
|
-
name: '🧪 Visual State — upward delta reads positive',
|
|
74
|
-
args: {
|
|
75
|
-
label: 'Lucro bruto',
|
|
76
|
-
value: 'R$ 7.580,00',
|
|
77
|
-
icon: <TrendingUpIcon fontSize="small" />,
|
|
78
|
-
delta: { value: '+14,0%', direction: 'up' },
|
|
79
|
-
dataTestId: 'kpi-profit',
|
|
80
|
-
},
|
|
81
|
-
play: async ({ canvasElement, step }) => {
|
|
82
|
-
const canvas = within(canvasElement);
|
|
83
|
-
|
|
84
|
-
await step('Direction and tone are exposed on the delta row', async () => {
|
|
85
|
-
const delta = canvas.getByTestId('kpi-profit-delta');
|
|
86
|
-
await expect(delta).toHaveAttribute('data-direction', 'up');
|
|
87
|
-
await expect(delta).toHaveAttribute('data-tone', 'positive');
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
await step('The leading icon renders and is hidden from assistive tech', async () => {
|
|
91
|
-
await expect(canvas.getByTestId('kpi-profit-icon')).toHaveAttribute('aria-hidden', 'true');
|
|
92
|
-
});
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
export const VisualStateDownDelta: Story = {
|
|
97
|
-
name: '🧪 Visual State — downward delta reads negative',
|
|
98
|
-
args: {
|
|
99
|
-
label: 'Pedidos',
|
|
100
|
-
value: '184',
|
|
101
|
-
delta: { value: '-8,2%', direction: 'down' },
|
|
102
|
-
dataTestId: 'kpi-orders',
|
|
103
|
-
},
|
|
104
|
-
play: async ({ canvasElement, step }) => {
|
|
105
|
-
const canvas = within(canvasElement);
|
|
106
|
-
|
|
107
|
-
await step('Direction and tone are exposed on the delta row', async () => {
|
|
108
|
-
const delta = canvas.getByTestId('kpi-orders-delta');
|
|
109
|
-
await expect(delta).toHaveAttribute('data-direction', 'down');
|
|
110
|
-
await expect(delta).toHaveAttribute('data-tone', 'negative');
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
await step('The generated sentence says "Decrease"', async () => {
|
|
114
|
-
await expect(canvas.getByLabelText('Decrease of -8,2%')).toBeInTheDocument();
|
|
115
|
-
});
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
export const EdgeCaseInvertedTone: Story = {
|
|
120
|
-
name: '🧪 Edge Case — rising cost keeps the up arrow but reads negative',
|
|
121
|
-
args: {
|
|
122
|
-
label: 'Custo (CMV)',
|
|
123
|
-
value: 'R$ 4.900,00',
|
|
124
|
-
delta: { value: '+9,4%', direction: 'up', tone: 'negative' },
|
|
125
|
-
dataTestId: 'kpi-cogs',
|
|
126
|
-
},
|
|
127
|
-
play: async ({ canvasElement, step }) => {
|
|
128
|
-
const canvas = within(canvasElement);
|
|
129
|
-
|
|
130
|
-
await step('Arrow direction and semantic tone are independent', async () => {
|
|
131
|
-
const delta = canvas.getByTestId('kpi-cogs-delta');
|
|
132
|
-
await expect(delta).toHaveAttribute('data-direction', 'up');
|
|
133
|
-
await expect(delta).toHaveAttribute('data-tone', 'negative');
|
|
134
|
-
});
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
export const EdgeCaseLocalizedAria: Story = {
|
|
139
|
-
name: '🧪 Edge Case — ariaLabel overrides the English sentence',
|
|
140
|
-
args: {
|
|
141
|
-
label: 'Receita',
|
|
142
|
-
value: 'R$ 12.480,00',
|
|
143
|
-
delta: {
|
|
144
|
-
value: '+12,5%',
|
|
145
|
-
direction: 'up',
|
|
146
|
-
ariaLabel: 'Aumento de 12,5% em relação ao período anterior',
|
|
147
|
-
},
|
|
148
|
-
dataTestId: 'kpi-revenue',
|
|
149
|
-
},
|
|
150
|
-
play: async ({ canvasElement, step }) => {
|
|
151
|
-
const canvas = within(canvasElement);
|
|
152
|
-
|
|
153
|
-
await step('The override wins over the generated text', async () => {
|
|
154
|
-
await expect(
|
|
155
|
-
canvas.getByLabelText('Aumento de 12,5% em relação ao período anterior'),
|
|
156
|
-
).toBeInTheDocument();
|
|
157
|
-
await waitFor(() =>
|
|
158
|
-
expect(canvas.queryByLabelText('Increase of +12,5%')).not.toBeInTheDocument(),
|
|
159
|
-
);
|
|
160
|
-
});
|
|
161
|
-
},
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
export const LoadingStateTest: Story = {
|
|
165
|
-
name: '🧪 Loading State — skeletons replace value and delta',
|
|
166
|
-
args: {
|
|
167
|
-
label: 'Receita',
|
|
168
|
-
value: 'R$ 12.480,00',
|
|
169
|
-
delta: { value: '+12,5%', direction: 'up' },
|
|
170
|
-
loading: true,
|
|
171
|
-
dataTestId: 'kpi-revenue',
|
|
172
|
-
},
|
|
173
|
-
play: async ({ canvasElement, step }) => {
|
|
174
|
-
const canvas = within(canvasElement);
|
|
175
|
-
|
|
176
|
-
await step('The tile announces itself as busy', async () => {
|
|
177
|
-
await expect(canvas.getByTestId('kpi-revenue')).toHaveAttribute('aria-busy', 'true');
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
await step('Value and delta are replaced by skeletons', async () => {
|
|
181
|
-
await expect(canvas.getByTestId('kpi-revenue-value-skeleton')).toBeInTheDocument();
|
|
182
|
-
await expect(canvas.getByTestId('kpi-revenue-delta-skeleton')).toBeInTheDocument();
|
|
183
|
-
await waitFor(() => {
|
|
184
|
-
expect(canvas.queryByTestId('kpi-revenue-value')).not.toBeInTheDocument();
|
|
185
|
-
expect(canvas.queryByTestId('kpi-revenue-delta')).not.toBeInTheDocument();
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
await step('The label survives the loading swap (no reflow)', async () => {
|
|
190
|
-
await expect(canvas.getByTestId('kpi-revenue-label')).toHaveTextContent('Receita');
|
|
191
|
-
});
|
|
192
|
-
},
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
export const ResponsiveDesign: Story = {
|
|
196
|
-
name: '🧪 Responsive Design — tiles stack in a narrow grid',
|
|
197
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
198
|
-
render: () => (
|
|
199
|
-
<Box
|
|
200
|
-
sx={{
|
|
201
|
-
display: 'grid',
|
|
202
|
-
gap: 2,
|
|
203
|
-
gridTemplateColumns: { xs: '1fr', md: 'repeat(2, 1fr)' },
|
|
204
|
-
}}
|
|
205
|
-
>
|
|
206
|
-
<StatCard label="Receita" value="R$ 12.480,00" dataTestId="kpi-revenue" />
|
|
207
|
-
<StatCard label="Pedidos" value="184" dataTestId="kpi-orders" />
|
|
208
|
-
</Box>
|
|
209
|
-
),
|
|
210
|
-
play: async ({ canvasElement, step }) => {
|
|
211
|
-
const canvas = within(canvasElement);
|
|
212
|
-
|
|
213
|
-
await step('Both tiles render inside the grid', async () => {
|
|
214
|
-
await expect(canvas.getByTestId('kpi-revenue')).toBeVisible();
|
|
215
|
-
await expect(canvas.getByTestId('kpi-orders')).toBeVisible();
|
|
216
|
-
});
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export const IntegrationHintAndIcon: Story = {
|
|
221
|
-
name: '🧪 Integration — icon, hint and delta compose',
|
|
222
|
-
args: {
|
|
223
|
-
label: 'Margem',
|
|
224
|
-
value: '62,0%',
|
|
225
|
-
hint: 'Últimos 30 dias',
|
|
226
|
-
icon: <TrendingUpIcon fontSize="small" />,
|
|
227
|
-
delta: { value: '+1,4 p.p.', direction: 'up', label: 'vs. período anterior' },
|
|
228
|
-
dataTestId: 'kpi-margin',
|
|
229
|
-
},
|
|
230
|
-
play: async ({ canvasElement, step }) => {
|
|
231
|
-
const canvas = within(canvasElement);
|
|
232
|
-
|
|
233
|
-
await step('Every optional slot renders together', async () => {
|
|
234
|
-
await expect(canvas.getByTestId('kpi-margin-icon')).toBeInTheDocument();
|
|
235
|
-
await expect(canvas.getByTestId('kpi-margin-hint')).toHaveTextContent('Últimos 30 dias');
|
|
236
|
-
await expect(canvas.getByTestId('kpi-margin-delta')).toHaveAttribute('data-direction', 'up');
|
|
237
|
-
await expect(canvas.getByTestId('kpi-margin-value')).toHaveTextContent('62,0%');
|
|
238
|
-
});
|
|
239
|
-
},
|
|
240
|
-
};
|