@dashforge/tw 1.1.0 → 1.2.0
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/CHANGELOG.md +134 -1
- package/README.md +45 -0
- package/dist/index.esm.js +3986 -477
- package/dist/src/components/Accordion/Accordion.d.ts.map +1 -1
- package/dist/src/components/Accordion/accordion.types.d.ts +7 -0
- package/dist/src/components/Accordion/accordion.types.d.ts.map +1 -1
- package/dist/src/components/Alert/Alert.d.ts +1 -1
- package/dist/src/components/Alert/Alert.d.ts.map +1 -1
- package/dist/src/components/Alert/alert.types.d.ts +17 -0
- package/dist/src/components/Alert/alert.types.d.ts.map +1 -1
- package/dist/src/components/AppShell/AppShell.d.ts.map +1 -1
- package/dist/src/components/AppShell/appShell.types.d.ts +7 -0
- package/dist/src/components/AppShell/appShell.types.d.ts.map +1 -1
- package/dist/src/components/Autocomplete/Autocomplete.d.ts.map +1 -1
- package/dist/src/components/Autocomplete/autocomplete.types.d.ts +47 -1
- package/dist/src/components/Autocomplete/autocomplete.types.d.ts.map +1 -1
- package/dist/src/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/src/components/Avatar/avatar.types.d.ts +17 -1
- package/dist/src/components/Avatar/avatar.types.d.ts.map +1 -1
- package/dist/src/components/Badge/Badge.d.ts.map +1 -1
- package/dist/src/components/Badge/badge.types.d.ts +27 -2
- package/dist/src/components/Badge/badge.types.d.ts.map +1 -1
- package/dist/src/components/Box/Box.d.ts.map +1 -1
- package/dist/src/components/Box/box.types.d.ts +64 -1
- package/dist/src/components/Box/box.types.d.ts.map +1 -1
- package/dist/src/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/src/components/Breadcrumbs/breadcrumbs.types.d.ts +26 -1
- package/dist/src/components/Breadcrumbs/breadcrumbs.types.d.ts.map +1 -1
- package/dist/src/components/Button/Button.d.ts.map +1 -1
- package/dist/src/components/Button/button.types.d.ts +53 -1
- package/dist/src/components/Button/button.types.d.ts.map +1 -1
- package/dist/src/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/src/components/Calendar/calendar.types.d.ts +16 -0
- package/dist/src/components/Calendar/calendar.types.d.ts.map +1 -1
- package/dist/src/components/Card/Card.d.ts.map +1 -1
- package/dist/src/components/Card/card.types.d.ts +17 -0
- package/dist/src/components/Card/card.types.d.ts.map +1 -1
- package/dist/src/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/src/components/Checkbox/checkbox.types.d.ts +19 -1
- package/dist/src/components/Checkbox/checkbox.types.d.ts.map +1 -1
- package/dist/src/components/Chip/Chip.d.ts.map +1 -1
- package/dist/src/components/Chip/chip.types.d.ts +40 -1
- package/dist/src/components/Chip/chip.types.d.ts.map +1 -1
- package/dist/src/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -1
- package/dist/src/components/ConfirmDialog/confirmDialog.types.d.ts +30 -2
- package/dist/src/components/ConfirmDialog/confirmDialog.types.d.ts.map +1 -1
- package/dist/src/components/Container/Container.d.ts.map +1 -1
- package/dist/src/components/Container/container.types.d.ts +29 -1
- package/dist/src/components/Container/container.types.d.ts.map +1 -1
- package/dist/src/components/DataGrid/DataGrid.d.ts +1 -1
- package/dist/src/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/src/components/DataGrid/dataGrid.types.d.ts +124 -10
- package/dist/src/components/DataGrid/dataGrid.types.d.ts.map +1 -1
- package/dist/src/components/DatePicker/DatePicker.d.ts +1 -1
- package/dist/src/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/src/components/DatePicker/datePicker.types.d.ts +18 -0
- package/dist/src/components/DatePicker/datePicker.types.d.ts.map +1 -1
- package/dist/src/components/DateRangePicker/DateRangePicker.d.ts +1 -1
- package/dist/src/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/src/components/DateRangePicker/dateRangePicker.types.d.ts +18 -0
- package/dist/src/components/DateRangePicker/dateRangePicker.types.d.ts.map +1 -1
- package/dist/src/components/DateTimePicker/DateTimePicker.d.ts +1 -1
- package/dist/src/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/src/components/DateTimePicker/dateTimePicker.types.d.ts +20 -0
- package/dist/src/components/DateTimePicker/dateTimePicker.types.d.ts.map +1 -1
- package/dist/src/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/src/components/Dialog/dialog.types.d.ts +25 -1
- package/dist/src/components/Dialog/dialog.types.d.ts.map +1 -1
- package/dist/src/components/Divider/Divider.d.ts.map +1 -1
- package/dist/src/components/Divider/divider.types.d.ts +37 -1
- package/dist/src/components/Divider/divider.types.d.ts.map +1 -1
- package/dist/src/components/Drawer/Drawer.d.ts +21 -0
- package/dist/src/components/Drawer/Drawer.d.ts.map +1 -0
- package/dist/src/components/Drawer/drawer.types.d.ts +311 -0
- package/dist/src/components/Drawer/drawer.types.d.ts.map +1 -0
- package/dist/src/components/Drawer/drawer.variants.d.ts +177 -0
- package/dist/src/components/Drawer/drawer.variants.d.ts.map +1 -0
- package/dist/src/components/Grid/Grid.d.ts.map +1 -1
- package/dist/src/components/Grid/grid.types.d.ts +16 -0
- package/dist/src/components/Grid/grid.types.d.ts.map +1 -1
- package/dist/src/components/IconButton/IconButton.d.ts.map +1 -1
- package/dist/src/components/IconButton/iconButton.types.d.ts +40 -1
- package/dist/src/components/IconButton/iconButton.types.d.ts.map +1 -1
- package/dist/src/components/LeftNav/LeftNav.d.ts.map +1 -1
- package/dist/src/components/LeftNav/leftNav.types.d.ts +26 -6
- package/dist/src/components/LeftNav/leftNav.types.d.ts.map +1 -1
- package/dist/src/components/Link/Link.d.ts +15 -0
- package/dist/src/components/Link/Link.d.ts.map +1 -0
- package/dist/src/components/Link/link.types.d.ts +169 -0
- package/dist/src/components/Link/link.types.d.ts.map +1 -0
- package/dist/src/components/Link/link.variants.d.ts +107 -0
- package/dist/src/components/Link/link.variants.d.ts.map +1 -0
- package/dist/src/components/Menu/Menu.d.ts +1 -1
- package/dist/src/components/Menu/Menu.d.ts.map +1 -1
- package/dist/src/components/Menu/menu.types.d.ts +20 -0
- package/dist/src/components/Menu/menu.types.d.ts.map +1 -1
- package/dist/src/components/NumberField/NumberField.d.ts.map +1 -1
- package/dist/src/components/NumberField/numberField.types.d.ts +47 -1
- package/dist/src/components/NumberField/numberField.types.d.ts.map +1 -1
- package/dist/src/components/OTPField/OTPField.d.ts.map +1 -1
- package/dist/src/components/OTPField/otpField.types.d.ts +35 -1
- package/dist/src/components/OTPField/otpField.types.d.ts.map +1 -1
- package/dist/src/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/src/components/Pagination/pagination.types.d.ts +26 -1
- package/dist/src/components/Pagination/pagination.types.d.ts.map +1 -1
- package/dist/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/src/components/Popover/popover.types.d.ts +29 -0
- package/dist/src/components/Popover/popover.types.d.ts.map +1 -1
- package/dist/src/components/Progress/Progress.d.ts +20 -0
- package/dist/src/components/Progress/Progress.d.ts.map +1 -0
- package/dist/src/components/Progress/progress.types.d.ts +200 -0
- package/dist/src/components/Progress/progress.types.d.ts.map +1 -0
- package/dist/src/components/Progress/progress.variants.d.ts +224 -0
- package/dist/src/components/Progress/progress.variants.d.ts.map +1 -0
- package/dist/src/components/RadioGroup/RadioGroup.d.ts.map +1 -1
- package/dist/src/components/RadioGroup/radioGroup.types.d.ts +25 -1
- package/dist/src/components/RadioGroup/radioGroup.types.d.ts.map +1 -1
- package/dist/src/components/Select/Select.d.ts +14 -0
- package/dist/src/components/Select/Select.d.ts.map +1 -0
- package/dist/src/components/Select/select.types.d.ts +272 -0
- package/dist/src/components/Select/select.types.d.ts.map +1 -0
- package/dist/src/components/Select/select.variants.d.ts +204 -0
- package/dist/src/components/Select/select.variants.d.ts.map +1 -0
- package/dist/src/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/src/components/Skeleton/skeleton.types.d.ts +25 -1
- package/dist/src/components/Skeleton/skeleton.types.d.ts.map +1 -1
- package/dist/src/components/Slider/Slider.d.ts +15 -0
- package/dist/src/components/Slider/Slider.d.ts.map +1 -0
- package/dist/src/components/Slider/slider.types.d.ts +268 -0
- package/dist/src/components/Slider/slider.types.d.ts.map +1 -0
- package/dist/src/components/Slider/slider.variants.d.ts +313 -0
- package/dist/src/components/Slider/slider.variants.d.ts.map +1 -0
- package/dist/src/components/Snackbar/Snackbar.d.ts.map +1 -1
- package/dist/src/components/Snackbar/snackbar.types.d.ts +29 -5
- package/dist/src/components/Snackbar/snackbar.types.d.ts.map +1 -1
- package/dist/src/components/Spinner/Spinner.d.ts.map +1 -1
- package/dist/src/components/Spinner/spinner.types.d.ts +22 -2
- package/dist/src/components/Spinner/spinner.types.d.ts.map +1 -1
- package/dist/src/components/Stack/Stack.d.ts.map +1 -1
- package/dist/src/components/Stack/stack.types.d.ts +53 -2
- package/dist/src/components/Stack/stack.types.d.ts.map +1 -1
- package/dist/src/components/Stack/stack.variants.d.ts +23 -0
- package/dist/src/components/Stack/stack.variants.d.ts.map +1 -1
- package/dist/src/components/Stepper/Step.d.ts +30 -0
- package/dist/src/components/Stepper/Step.d.ts.map +1 -0
- package/dist/src/components/Stepper/Stepper.d.ts +15 -0
- package/dist/src/components/Stepper/Stepper.d.ts.map +1 -0
- package/dist/src/components/Stepper/StepperContext.d.ts +8 -0
- package/dist/src/components/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/src/components/Stepper/stepper.types.d.ts +358 -0
- package/dist/src/components/Stepper/stepper.types.d.ts.map +1 -0
- package/dist/src/components/Stepper/stepper.variants.d.ts +253 -0
- package/dist/src/components/Stepper/stepper.variants.d.ts.map +1 -0
- package/dist/src/components/Stepper/useStep.d.ts +53 -0
- package/dist/src/components/Stepper/useStep.d.ts.map +1 -0
- package/dist/src/components/Switch/Switch.d.ts.map +1 -1
- package/dist/src/components/Switch/switch.types.d.ts +44 -1
- package/dist/src/components/Switch/switch.types.d.ts.map +1 -1
- package/dist/src/components/Table/Table.d.ts +1 -1
- package/dist/src/components/Table/Table.d.ts.map +1 -1
- package/dist/src/components/Table/table.types.d.ts +103 -8
- package/dist/src/components/Table/table.types.d.ts.map +1 -1
- package/dist/src/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/src/components/Tabs/tabs.types.d.ts +26 -1
- package/dist/src/components/Tabs/tabs.types.d.ts.map +1 -1
- package/dist/src/components/TextField/TextField.d.ts.map +1 -1
- package/dist/src/components/TextField/textField.types.d.ts +30 -1
- package/dist/src/components/TextField/textField.types.d.ts.map +1 -1
- package/dist/src/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/src/components/Textarea/textarea.types.d.ts +51 -1
- package/dist/src/components/Textarea/textarea.types.d.ts.map +1 -1
- package/dist/src/components/TimePicker/TimePicker.d.ts +1 -1
- package/dist/src/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/src/components/TimePicker/timePicker.types.d.ts +18 -0
- package/dist/src/components/TimePicker/timePicker.types.d.ts.map +1 -1
- package/dist/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/src/components/Tooltip/tooltip.types.d.ts +30 -0
- package/dist/src/components/Tooltip/tooltip.types.d.ts.map +1 -1
- package/dist/src/components/TopBar/TopBar.d.ts.map +1 -1
- package/dist/src/components/TopBar/topBar.types.d.ts +25 -1
- package/dist/src/components/TopBar/topBar.types.d.ts.map +1 -1
- package/dist/src/components/Typography/Typography.d.ts.map +1 -1
- package/dist/src/components/Typography/typography.types.d.ts +47 -1
- package/dist/src/components/Typography/typography.types.d.ts.map +1 -1
- package/dist/src/components/Typography/typography.variants.d.ts +2 -2
- package/dist/src/components/Typography/typography.variants.d.ts.map +1 -1
- package/dist/src/hooks/useStandaloneFieldWarning.d.ts +38 -0
- package/dist/src/hooks/useStandaloneFieldWarning.d.ts.map +1 -0
- package/dist/src/index.d.ts +62 -42
- package/dist/src/index.d.ts.map +1 -1
- package/package.json +11 -5
- package/.swcrc +0 -29
- package/A11Y.md +0 -130
- package/CONSUMER-VALIDATION.md +0 -130
- package/COVERAGE.md +0 -63
- package/PARITY.md +0 -481
- package/PERFORMANCE.md +0 -227
- package/REFINEMENT-NOTES.md +0 -50
- package/THEME-AUDIT.md +0 -174
- package/dashforge-tw-1.0.0.tgz +0 -0
- package/eslint.config.mjs +0 -62
- package/project.json +0 -15
- package/rollup.config.cjs +0 -16
- package/src/components/Accordion/Accordion.test.tsx +0 -95
- package/src/components/Accordion/Accordion.tsx +0 -97
- package/src/components/Accordion/accordion.types.ts +0 -66
- package/src/components/Accordion/accordion.variants.ts +0 -32
- package/src/components/Alert/Alert.test.tsx +0 -302
- package/src/components/Alert/Alert.tsx +0 -186
- package/src/components/Alert/alert.types.ts +0 -144
- package/src/components/Alert/alert.variants.ts +0 -71
- package/src/components/AppShell/AppShell.test.tsx +0 -223
- package/src/components/AppShell/AppShell.tsx +0 -239
- package/src/components/AppShell/appShell.types.ts +0 -49
- package/src/components/AppShell/appShell.variants.ts +0 -54
- package/src/components/AspectRatio/AspectRatio.test.tsx +0 -173
- package/src/components/AspectRatio/AspectRatio.tsx +0 -73
- package/src/components/AspectRatio/aspectRatio.types.ts +0 -54
- package/src/components/Autocomplete/Autocomplete.perf.test.tsx +0 -225
- package/src/components/Autocomplete/Autocomplete.test.tsx +0 -556
- package/src/components/Autocomplete/Autocomplete.tsx +0 -1069
- package/src/components/Autocomplete/autocomplete.types.ts +0 -198
- package/src/components/Autocomplete/autocomplete.variants.ts +0 -141
- package/src/components/Avatar/Avatar.test.tsx +0 -287
- package/src/components/Avatar/Avatar.tsx +0 -304
- package/src/components/Avatar/avatar.types.ts +0 -205
- package/src/components/Avatar/avatar.variants.ts +0 -194
- package/src/components/Badge/Badge.test.tsx +0 -385
- package/src/components/Badge/Badge.tsx +0 -174
- package/src/components/Badge/badge.types.ts +0 -154
- package/src/components/Badge/badge.variants.ts +0 -161
- package/src/components/Box/Box.test.tsx +0 -391
- package/src/components/Box/Box.tsx +0 -112
- package/src/components/Box/box.types.ts +0 -116
- package/src/components/Box/box.variants.ts +0 -230
- package/src/components/Breadcrumbs/Breadcrumbs.perf.test.tsx +0 -128
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +0 -231
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +0 -203
- package/src/components/Breadcrumbs/breadcrumbs.types.ts +0 -87
- package/src/components/Breadcrumbs/breadcrumbs.variants.ts +0 -54
- package/src/components/Button/Button.test.tsx +0 -204
- package/src/components/Button/Button.tsx +0 -151
- package/src/components/Button/button.types.ts +0 -110
- package/src/components/Button/button.variants.ts +0 -159
- package/src/components/Calendar/Calendar.test.tsx +0 -75
- package/src/components/Calendar/Calendar.tsx +0 -264
- package/src/components/Calendar/calendar.types.ts +0 -65
- package/src/components/Calendar/calendar.variants.ts +0 -64
- package/src/components/Card/Card.test.tsx +0 -291
- package/src/components/Card/Card.tsx +0 -241
- package/src/components/Card/card.types.ts +0 -132
- package/src/components/Checkbox/Checkbox.test.tsx +0 -146
- package/src/components/Checkbox/Checkbox.tsx +0 -286
- package/src/components/Checkbox/checkbox.types.ts +0 -88
- package/src/components/Checkbox/checkbox.variants.ts +0 -68
- package/src/components/Chip/Chip.test.tsx +0 -316
- package/src/components/Chip/Chip.tsx +0 -224
- package/src/components/Chip/chip.types.ts +0 -128
- package/src/components/Chip/chip.variants.ts +0 -173
- package/src/components/ConfirmDialog/ConfirmDialog.perf.test.tsx +0 -172
- package/src/components/ConfirmDialog/ConfirmDialog.test.tsx +0 -311
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -252
- package/src/components/ConfirmDialog/confirmDialog.types.ts +0 -70
- package/src/components/ConfirmDialog/confirmDialog.variants.ts +0 -76
- package/src/components/Container/Container.test.tsx +0 -209
- package/src/components/Container/Container.tsx +0 -74
- package/src/components/Container/container.types.ts +0 -45
- package/src/components/Container/container.variants.ts +0 -81
- package/src/components/DataGrid/DataGrid.perf.test.tsx +0 -114
- package/src/components/DataGrid/DataGrid.test.tsx +0 -1153
- package/src/components/DataGrid/DataGrid.tsx +0 -1282
- package/src/components/DataGrid/dataGrid.types.ts +0 -238
- package/src/components/DataGrid/dataGrid.variants.ts +0 -152
- package/src/components/DataGrid/filters/ColumnFilters.test.tsx +0 -330
- package/src/components/DataGrid/filters/ColumnFilters.tsx +0 -456
- package/src/components/DataGrid/reorder/useColumnReorder.test.ts +0 -130
- package/src/components/DataGrid/reorder/useColumnReorder.ts +0 -144
- package/src/components/DataGrid/resize/useColumnResize.test.ts +0 -144
- package/src/components/DataGrid/resize/useColumnResize.ts +0 -135
- package/src/components/DataGrid/visibility/ColumnVisibilityMenu.tsx +0 -186
- package/src/components/DatePicker/DatePicker.test.tsx +0 -76
- package/src/components/DatePicker/DatePicker.tsx +0 -305
- package/src/components/DatePicker/datePicker.types.ts +0 -77
- package/src/components/DatePicker/datePicker.variants.ts +0 -50
- package/src/components/DateRangePicker/DateRangePicker.test.tsx +0 -92
- package/src/components/DateRangePicker/DateRangePicker.tsx +0 -510
- package/src/components/DateRangePicker/dateRangePicker.types.ts +0 -74
- package/src/components/DateRangePicker/dateRangePicker.variants.ts +0 -101
- package/src/components/DateTimePicker/DateTimePicker.test.tsx +0 -78
- package/src/components/DateTimePicker/DateTimePicker.tsx +0 -347
- package/src/components/DateTimePicker/dateTimePicker.types.ts +0 -79
- package/src/components/DateTimePicker/dateTimePicker.variants.ts +0 -55
- package/src/components/Dialog/Dialog.test.tsx +0 -96
- package/src/components/Dialog/Dialog.tsx +0 -102
- package/src/components/Dialog/dialog.types.ts +0 -62
- package/src/components/Dialog/dialog.variants.ts +0 -66
- package/src/components/Divider/Divider.test.tsx +0 -243
- package/src/components/Divider/Divider.tsx +0 -140
- package/src/components/Divider/divider.types.ts +0 -52
- package/src/components/Divider/divider.variants.ts +0 -116
- package/src/components/Grid/Grid.test.tsx +0 -321
- package/src/components/Grid/Grid.tsx +0 -148
- package/src/components/Grid/grid.types.ts +0 -112
- package/src/components/Grid/grid.variants.ts +0 -133
- package/src/components/IconButton/IconButton.test.tsx +0 -367
- package/src/components/IconButton/IconButton.tsx +0 -159
- package/src/components/IconButton/iconButton.types.ts +0 -106
- package/src/components/IconButton/iconButton.variants.ts +0 -31
- package/src/components/LeftNav/LeftNav.perf.test.tsx +0 -172
- package/src/components/LeftNav/LeftNav.test.tsx +0 -302
- package/src/components/LeftNav/LeftNav.tsx +0 -330
- package/src/components/LeftNav/leftNav.types.ts +0 -120
- package/src/components/LeftNav/leftNav.variants.ts +0 -107
- package/src/components/Menu/Menu.test.tsx +0 -408
- package/src/components/Menu/Menu.tsx +0 -335
- package/src/components/Menu/menu.types.ts +0 -221
- package/src/components/Menu/menu.variants.ts +0 -132
- package/src/components/NumberField/NumberField.test.tsx +0 -83
- package/src/components/NumberField/NumberField.tsx +0 -321
- package/src/components/NumberField/numberField.types.ts +0 -72
- package/src/components/NumberField/numberField.variants.ts +0 -94
- package/src/components/OTPField/OTPField.test.tsx +0 -121
- package/src/components/OTPField/OTPField.tsx +0 -250
- package/src/components/OTPField/otpField.types.ts +0 -58
- package/src/components/OTPField/otpField.variants.ts +0 -72
- package/src/components/Pagination/Pagination.test.tsx +0 -314
- package/src/components/Pagination/Pagination.tsx +0 -277
- package/src/components/Pagination/pagination.helpers.ts +0 -102
- package/src/components/Pagination/pagination.types.ts +0 -117
- package/src/components/Pagination/pagination.variants.ts +0 -117
- package/src/components/Popover/Popover.test.tsx +0 -72
- package/src/components/Popover/Popover.tsx +0 -55
- package/src/components/Popover/popover.types.ts +0 -42
- package/src/components/Popover/popover.variants.ts +0 -24
- package/src/components/RadioGroup/RadioGroup.test.tsx +0 -140
- package/src/components/RadioGroup/RadioGroup.tsx +0 -283
- package/src/components/RadioGroup/radioGroup.types.ts +0 -85
- package/src/components/RadioGroup/radioGroup.variants.ts +0 -87
- package/src/components/Skeleton/Skeleton.test.tsx +0 -127
- package/src/components/Skeleton/Skeleton.tsx +0 -49
- package/src/components/Skeleton/skeleton.types.ts +0 -59
- package/src/components/Skeleton/skeleton.variants.ts +0 -87
- package/src/components/Snackbar/Snackbar.perf.test.tsx +0 -144
- package/src/components/Snackbar/Snackbar.test.tsx +0 -327
- package/src/components/Snackbar/Snackbar.tsx +0 -316
- package/src/components/Snackbar/snackbar.types.ts +0 -127
- package/src/components/Snackbar/snackbar.variants.ts +0 -81
- package/src/components/Spinner/Spinner.test.tsx +0 -199
- package/src/components/Spinner/Spinner.tsx +0 -158
- package/src/components/Spinner/spinner.types.ts +0 -113
- package/src/components/Spinner/spinner.variants.ts +0 -83
- package/src/components/Stack/Stack.test.tsx +0 -309
- package/src/components/Stack/Stack.tsx +0 -115
- package/src/components/Stack/stack.types.ts +0 -68
- package/src/components/Stack/stack.variants.ts +0 -80
- package/src/components/Switch/Switch.test.tsx +0 -131
- package/src/components/Switch/Switch.tsx +0 -158
- package/src/components/Switch/switch.types.ts +0 -36
- package/src/components/Switch/switch.variants.ts +0 -70
- package/src/components/Table/Table.perf.test.tsx +0 -81
- package/src/components/Table/Table.test.tsx +0 -674
- package/src/components/Table/Table.tsx +0 -863
- package/src/components/Table/cells/RenderButton.tsx +0 -23
- package/src/components/Table/cells/RenderChip.tsx +0 -37
- package/src/components/Table/cells/RenderText.tsx +0 -37
- package/src/components/Table/cells/RenderTwoLine.tsx +0 -34
- package/src/components/Table/cells/RowActionsMenu.tsx +0 -147
- package/src/components/Table/cells/cells.test.tsx +0 -247
- package/src/components/Table/cells/index.ts +0 -14
- package/src/components/Table/table.types.ts +0 -438
- package/src/components/Table/table.variants.ts +0 -207
- package/src/components/Tabs/Tabs.test.tsx +0 -145
- package/src/components/Tabs/Tabs.tsx +0 -77
- package/src/components/Tabs/tabs.types.ts +0 -55
- package/src/components/Tabs/tabs.variants.ts +0 -69
- package/src/components/Tabs/useTabs.ts +0 -167
- package/src/components/TextField/TextField.test.tsx +0 -198
- package/src/components/TextField/TextField.tsx +0 -245
- package/src/components/TextField/textField.types.ts +0 -90
- package/src/components/TextField/textField.variants.ts +0 -105
- package/src/components/Textarea/Textarea.test.tsx +0 -75
- package/src/components/Textarea/Textarea.tsx +0 -190
- package/src/components/Textarea/textarea.types.ts +0 -60
- package/src/components/Textarea/textarea.variants.ts +0 -85
- package/src/components/TimePicker/TimePicker.test.tsx +0 -65
- package/src/components/TimePicker/TimePicker.tsx +0 -274
- package/src/components/TimePicker/timePicker.types.ts +0 -69
- package/src/components/TimePicker/timePicker.variants.ts +0 -53
- package/src/components/Tooltip/Tooltip.test.tsx +0 -73
- package/src/components/Tooltip/Tooltip.tsx +0 -70
- package/src/components/Tooltip/tooltip.types.ts +0 -44
- package/src/components/Tooltip/tooltip.variants.ts +0 -28
- package/src/components/TopBar/TopBar.test.tsx +0 -129
- package/src/components/TopBar/TopBar.tsx +0 -66
- package/src/components/TopBar/topBar.types.ts +0 -42
- package/src/components/TopBar/topBar.variants.ts +0 -38
- package/src/components/Typography/Typography.test.tsx +0 -247
- package/src/components/Typography/Typography.tsx +0 -112
- package/src/components/Typography/typography.types.ts +0 -65
- package/src/components/Typography/typography.variants.ts +0 -130
- package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +0 -86
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +0 -59
- package/src/components/VisuallyHidden/visuallyHidden.types.ts +0 -45
- package/src/components/_shared/data/getNestedValue.test.ts +0 -50
- package/src/components/_shared/data/getNestedValue.ts +0 -32
- package/src/components/_shared/data/useColumnAutoDetect.test.ts +0 -123
- package/src/components/_shared/data/useColumnAutoDetect.ts +0 -100
- package/src/components/_shared/data/useControllableState.ts +0 -48
- package/src/components/_shared/data/useDebouncedValue.ts +0 -24
- package/src/components/_shared/data/useTableFilter.test.ts +0 -166
- package/src/components/_shared/data/useTableFilter.ts +0 -118
- package/src/components/_shared/data/useTableSearch.test.ts +0 -115
- package/src/components/_shared/data/useTableSearch.ts +0 -66
- package/src/components/_shared/data/useTableSelection.test.ts +0 -100
- package/src/components/_shared/data/useTableSelection.ts +0 -100
- package/src/components/_shared/data/useTableSort.test.ts +0 -150
- package/src/components/_shared/data/useTableSort.ts +0 -141
- package/src/components/_shared/data/useVirtualizer.test.ts +0 -158
- package/src/components/_shared/data/useVirtualizer.ts +0 -199
- package/src/components/_shared/resolveValidationState.ts +0 -60
- package/src/components/_shared/severity/index.ts +0 -33
- package/src/components/_shared/severity/severity.types.ts +0 -50
- package/src/components/_shared/severity/severityIcons.tsx +0 -104
- package/src/components/_shared/severity/severityVariants.test.ts +0 -136
- package/src/components/_shared/severity/severityVariants.ts +0 -115
- package/src/components/_shared/themeIdentity.test.ts +0 -113
- package/src/hooks/useAccessState.spec.tsx +0 -161
- package/src/hooks/useAccessState.ts +0 -81
- package/src/index.ts +0 -550
- package/src/utils/cn.spec.ts +0 -16
- package/src/utils/cn.ts +0 -29
- package/test-output/vitest/coverage/base.css +0 -224
- package/test-output/vitest/coverage/block-navigation.js +0 -87
- package/test-output/vitest/coverage/clover.xml +0 -2418
- package/test-output/vitest/coverage/coverage-final.json +0 -89
- package/test-output/vitest/coverage/favicon.png +0 -0
- package/test-output/vitest/coverage/index.html +0 -746
- package/test-output/vitest/coverage/prettify.css +0 -1
- package/test-output/vitest/coverage/prettify.js +0 -2
- package/test-output/vitest/coverage/sort-arrow-sprite.png +0 -0
- package/test-output/vitest/coverage/sorter.js +0 -210
- package/test-output/vitest/coverage/src/components/Accordion/Accordion.tsx.html +0 -376
- package/test-output/vitest/coverage/src/components/Accordion/accordion.variants.ts.html +0 -181
- package/test-output/vitest/coverage/src/components/Accordion/index.html +0 -131
- package/test-output/vitest/coverage/src/components/AppShell/AppShell.tsx.html +0 -802
- package/test-output/vitest/coverage/src/components/AppShell/appShell.variants.ts.html +0 -247
- package/test-output/vitest/coverage/src/components/AppShell/index.html +0 -131
- package/test-output/vitest/coverage/src/components/AspectRatio/AspectRatio.tsx.html +0 -304
- package/test-output/vitest/coverage/src/components/AspectRatio/index.html +0 -116
- package/test-output/vitest/coverage/src/components/Autocomplete/Autocomplete.tsx.html +0 -3292
- package/test-output/vitest/coverage/src/components/Autocomplete/autocomplete.variants.ts.html +0 -508
- package/test-output/vitest/coverage/src/components/Autocomplete/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Box/Box.tsx.html +0 -334
- package/test-output/vitest/coverage/src/components/Box/box.variants.ts.html +0 -775
- package/test-output/vitest/coverage/src/components/Box/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Breadcrumbs/Breadcrumbs.tsx.html +0 -694
- package/test-output/vitest/coverage/src/components/Breadcrumbs/breadcrumbs.variants.ts.html +0 -247
- package/test-output/vitest/coverage/src/components/Breadcrumbs/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Button/Button.tsx.html +0 -535
- package/test-output/vitest/coverage/src/components/Button/button.variants.ts.html +0 -562
- package/test-output/vitest/coverage/src/components/Button/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Checkbox/Checkbox.tsx.html +0 -943
- package/test-output/vitest/coverage/src/components/Checkbox/checkbox.variants.ts.html +0 -289
- package/test-output/vitest/coverage/src/components/Checkbox/index.html +0 -131
- package/test-output/vitest/coverage/src/components/ConfirmDialog/ConfirmDialog.tsx.html +0 -841
- package/test-output/vitest/coverage/src/components/ConfirmDialog/confirmDialog.variants.ts.html +0 -313
- package/test-output/vitest/coverage/src/components/ConfirmDialog/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Container/Container.tsx.html +0 -307
- package/test-output/vitest/coverage/src/components/Container/container.variants.ts.html +0 -328
- package/test-output/vitest/coverage/src/components/Container/index.html +0 -131
- package/test-output/vitest/coverage/src/components/DataGrid/DataGrid.tsx.html +0 -3937
- package/test-output/vitest/coverage/src/components/DataGrid/dataGrid.variants.ts.html +0 -541
- package/test-output/vitest/coverage/src/components/DataGrid/filters/ColumnFilters.tsx.html +0 -1453
- package/test-output/vitest/coverage/src/components/DataGrid/filters/index.html +0 -116
- package/test-output/vitest/coverage/src/components/DataGrid/index.html +0 -131
- package/test-output/vitest/coverage/src/components/DataGrid/reorder/index.html +0 -116
- package/test-output/vitest/coverage/src/components/DataGrid/reorder/useColumnReorder.ts.html +0 -517
- package/test-output/vitest/coverage/src/components/DataGrid/resize/index.html +0 -116
- package/test-output/vitest/coverage/src/components/DataGrid/resize/useColumnResize.ts.html +0 -490
- package/test-output/vitest/coverage/src/components/DataGrid/visibility/ColumnVisibilityMenu.tsx.html +0 -592
- package/test-output/vitest/coverage/src/components/DataGrid/visibility/index.html +0 -116
- package/test-output/vitest/coverage/src/components/DateTimePicker/DateTimePicker.tsx.html +0 -1042
- package/test-output/vitest/coverage/src/components/DateTimePicker/dateTimePicker.variants.ts.html +0 -337
- package/test-output/vitest/coverage/src/components/DateTimePicker/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Dialog/Dialog.tsx.html +0 -391
- package/test-output/vitest/coverage/src/components/Dialog/dialog.variants.ts.html +0 -283
- package/test-output/vitest/coverage/src/components/Dialog/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Divider/Divider.tsx.html +0 -505
- package/test-output/vitest/coverage/src/components/Divider/divider.variants.ts.html +0 -433
- package/test-output/vitest/coverage/src/components/Divider/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Grid/Grid.tsx.html +0 -529
- package/test-output/vitest/coverage/src/components/Grid/grid.variants.ts.html +0 -484
- package/test-output/vitest/coverage/src/components/Grid/index.html +0 -131
- package/test-output/vitest/coverage/src/components/LeftNav/LeftNav.tsx.html +0 -1075
- package/test-output/vitest/coverage/src/components/LeftNav/index.html +0 -131
- package/test-output/vitest/coverage/src/components/LeftNav/leftNav.variants.ts.html +0 -406
- package/test-output/vitest/coverage/src/components/NumberField/NumberField.tsx.html +0 -1048
- package/test-output/vitest/coverage/src/components/NumberField/index.html +0 -131
- package/test-output/vitest/coverage/src/components/NumberField/numberField.variants.ts.html +0 -367
- package/test-output/vitest/coverage/src/components/OTPField/OTPField.tsx.html +0 -835
- package/test-output/vitest/coverage/src/components/OTPField/index.html +0 -131
- package/test-output/vitest/coverage/src/components/OTPField/otpField.variants.ts.html +0 -301
- package/test-output/vitest/coverage/src/components/Pagination/Pagination.tsx.html +0 -916
- package/test-output/vitest/coverage/src/components/Pagination/index.html +0 -146
- package/test-output/vitest/coverage/src/components/Pagination/pagination.helpers.ts.html +0 -391
- package/test-output/vitest/coverage/src/components/Pagination/pagination.variants.ts.html +0 -436
- package/test-output/vitest/coverage/src/components/Popover/Popover.tsx.html +0 -250
- package/test-output/vitest/coverage/src/components/Popover/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Popover/popover.variants.ts.html +0 -157
- package/test-output/vitest/coverage/src/components/RadioGroup/RadioGroup.tsx.html +0 -934
- package/test-output/vitest/coverage/src/components/RadioGroup/index.html +0 -131
- package/test-output/vitest/coverage/src/components/RadioGroup/radioGroup.variants.ts.html +0 -346
- package/test-output/vitest/coverage/src/components/Skeleton/Skeleton.tsx.html +0 -232
- package/test-output/vitest/coverage/src/components/Skeleton/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Skeleton/skeleton.variants.ts.html +0 -346
- package/test-output/vitest/coverage/src/components/Snackbar/Snackbar.tsx.html +0 -979
- package/test-output/vitest/coverage/src/components/Snackbar/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Snackbar/snackbar.variants.ts.html +0 -307
- package/test-output/vitest/coverage/src/components/Stack/Stack.tsx.html +0 -430
- package/test-output/vitest/coverage/src/components/Stack/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Stack/stack.variants.ts.html +0 -325
- package/test-output/vitest/coverage/src/components/Switch/Switch.tsx.html +0 -559
- package/test-output/vitest/coverage/src/components/Switch/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Switch/switch.variants.ts.html +0 -295
- package/test-output/vitest/coverage/src/components/Table/Table.tsx.html +0 -2677
- package/test-output/vitest/coverage/src/components/Table/cells/RenderButton.tsx.html +0 -154
- package/test-output/vitest/coverage/src/components/Table/cells/RenderChip.tsx.html +0 -385
- package/test-output/vitest/coverage/src/components/Table/cells/RenderText.tsx.html +0 -196
- package/test-output/vitest/coverage/src/components/Table/cells/RenderTwoLine.tsx.html +0 -187
- package/test-output/vitest/coverage/src/components/Table/cells/RowActionsMenu.tsx.html +0 -526
- package/test-output/vitest/coverage/src/components/Table/cells/index.html +0 -191
- package/test-output/vitest/coverage/src/components/Table/cells/index.ts.html +0 -127
- package/test-output/vitest/coverage/src/components/Table/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Table/table.variants.ts.html +0 -706
- package/test-output/vitest/coverage/src/components/Tabs/Tabs.tsx.html +0 -283
- package/test-output/vitest/coverage/src/components/Tabs/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Tabs/tabs.variants.ts.html +0 -292
- package/test-output/vitest/coverage/src/components/TextField/TextField.tsx.html +0 -820
- package/test-output/vitest/coverage/src/components/TextField/index.html +0 -131
- package/test-output/vitest/coverage/src/components/TextField/textField.variants.ts.html +0 -400
- package/test-output/vitest/coverage/src/components/Textarea/Textarea.tsx.html +0 -655
- package/test-output/vitest/coverage/src/components/Textarea/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Textarea/textarea.variants.ts.html +0 -340
- package/test-output/vitest/coverage/src/components/Tooltip/Tooltip.tsx.html +0 -295
- package/test-output/vitest/coverage/src/components/Tooltip/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Tooltip/tooltip.variants.ts.html +0 -169
- package/test-output/vitest/coverage/src/components/TopBar/TopBar.tsx.html +0 -283
- package/test-output/vitest/coverage/src/components/TopBar/index.html +0 -131
- package/test-output/vitest/coverage/src/components/TopBar/topBar.variants.ts.html +0 -199
- package/test-output/vitest/coverage/src/components/Typography/Typography.tsx.html +0 -421
- package/test-output/vitest/coverage/src/components/Typography/index.html +0 -131
- package/test-output/vitest/coverage/src/components/Typography/typography.variants.ts.html +0 -436
- package/test-output/vitest/coverage/src/components/VisuallyHidden/VisuallyHidden.tsx.html +0 -262
- package/test-output/vitest/coverage/src/components/VisuallyHidden/index.html +0 -116
- package/test-output/vitest/coverage/src/components/_shared/data/getNestedValue.ts.html +0 -181
- package/test-output/vitest/coverage/src/components/_shared/data/index.html +0 -236
- package/test-output/vitest/coverage/src/components/_shared/data/useColumnAutoDetect.ts.html +0 -385
- package/test-output/vitest/coverage/src/components/_shared/data/useControllableState.ts.html +0 -229
- package/test-output/vitest/coverage/src/components/_shared/data/useDebouncedValue.ts.html +0 -157
- package/test-output/vitest/coverage/src/components/_shared/data/useTableFilter.ts.html +0 -439
- package/test-output/vitest/coverage/src/components/_shared/data/useTableSearch.ts.html +0 -283
- package/test-output/vitest/coverage/src/components/_shared/data/useTableSelection.ts.html +0 -385
- package/test-output/vitest/coverage/src/components/_shared/data/useTableSort.ts.html +0 -508
- package/test-output/vitest/coverage/src/components/_shared/data/useVirtualizer.ts.html +0 -682
- package/test-output/vitest/coverage/src/components/_shared/index.html +0 -116
- package/test-output/vitest/coverage/src/components/_shared/resolveValidationState.ts.html +0 -265
- package/test-output/vitest/coverage/src/hooks/index.html +0 -116
- package/test-output/vitest/coverage/src/hooks/useAccessState.ts.html +0 -328
- package/test-output/vitest/coverage/src/index.html +0 -116
- package/test-output/vitest/coverage/src/index.ts.html +0 -1153
- package/test-output/vitest/coverage/src/utils/cn.ts.html +0 -172
- package/test-output/vitest/coverage/src/utils/index.html +0 -116
- package/tsconfig.json +0 -13
- package/tsconfig.lib.json +0 -58
- package/tsconfig.spec.json +0 -34
- package/vite.config.ts +0 -33
- package/vitest.config.mts +0 -29
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { tv, type VariantProps } from 'tailwind-variants';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* `boxVariants` — the surface primitive for @dashforge/tw.
|
|
5
|
-
*
|
|
6
|
-
* Architectural choice (planned with the user — F9 deep dive):
|
|
7
|
-
*
|
|
8
|
-
* Box replaces FOUR overlapping concepts from MUI in one component:
|
|
9
|
-
* • Box (typed div)
|
|
10
|
-
* • Paper (surface with elevation)
|
|
11
|
-
* • Card (Paper specialisation)
|
|
12
|
-
* • Surface (Joy UI's outlined / soft / solid / plain variants)
|
|
13
|
-
*
|
|
14
|
-
* The reason for the consolidation: in MUI you have to compose two or
|
|
15
|
-
* three of these to express even basic intent ("an outlined card with
|
|
16
|
-
* warning tone"). Here, one `<Box variant="outlined" color="warning">`
|
|
17
|
-
* says exactly that.
|
|
18
|
-
*
|
|
19
|
-
* Variant taxonomy (5 axes, intentionally non-overlapping with Stack/Grid):
|
|
20
|
-
*
|
|
21
|
-
* • plain — bare div + padding + radius. The escape hatch.
|
|
22
|
-
* • outlined — 1px border + subtle bg tint. The "card lite".
|
|
23
|
-
* • elevated — bg surface + shadow scale (0-5). The "floating panel".
|
|
24
|
-
* • soft — semi-transparent intent bg + intent text. The "callout".
|
|
25
|
-
* • solid — solid intent bg + contrasting text. The "CTA banner".
|
|
26
|
-
*
|
|
27
|
-
* `color` applies to outlined/soft/solid (each gets the 7 intent
|
|
28
|
-
* variants). `elevated` is color-agnostic (always neutral surface +
|
|
29
|
-
* shadow scale). `plain` is everything-agnostic.
|
|
30
|
-
*
|
|
31
|
-
* Spacing axes (p/px/py/m/mx/my): mapped explicitly to the 11 token
|
|
32
|
-
* steps from @dashforge/tw-tokens (0, 0.5, 1, 2, 3, 4, 6, 8, 12, 16, 24).
|
|
33
|
-
* Tailwind JIT requires literal class strings — building them dynamically
|
|
34
|
-
* with template literals would purge them. The verbosity below is the
|
|
35
|
-
* cost of keeping the bundle CSS-pure and rebuild-free.
|
|
36
|
-
*
|
|
37
|
-
* What this does NOT do (deliberate, see component docs):
|
|
38
|
-
* • No display / flex / grid props → use Stack or Grid
|
|
39
|
-
* • No position / overflow / z-index → use `sx`
|
|
40
|
-
* • No animation / transition → use `sx`
|
|
41
|
-
*
|
|
42
|
-
* The "Box is not flex" rule is the spine of the layout layer. Without
|
|
43
|
-
* it, every `<div>` in an app gravitates back to Box and the surface
|
|
44
|
-
* vs layout distinction collapses — exactly the failure mode this
|
|
45
|
-
* primitive exists to prevent.
|
|
46
|
-
*/
|
|
47
|
-
export const boxVariants = tv({
|
|
48
|
-
base: 'block',
|
|
49
|
-
|
|
50
|
-
variants: {
|
|
51
|
-
/*
|
|
52
|
-
* Surface variant. Compound with `color` for outlined / soft / solid;
|
|
53
|
-
* standalone for plain / elevated.
|
|
54
|
-
*/
|
|
55
|
-
variant: {
|
|
56
|
-
plain: '',
|
|
57
|
-
outlined: 'border',
|
|
58
|
-
// `bg-white` is hardcoded (does NOT auto-invert via CSS vars),
|
|
59
|
-
// so the `dark:` variant is required. Target `dark:bg-neutral-100`
|
|
60
|
-
// resolves to `#171717` via the inversion → one elevation tier
|
|
61
|
-
// above the page surface (`bg-neutral-50` = `#0a0a0a`) in dark
|
|
62
|
-
// mode. `dark:bg-neutral-900` was wrong (resolved to near-white
|
|
63
|
-
// in dark mode — overpowering elevation).
|
|
64
|
-
elevated: 'bg-white dark:bg-neutral-100',
|
|
65
|
-
soft: '',
|
|
66
|
-
solid: '',
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
/*
|
|
70
|
-
* Intent color. Only meaningful when variant is outlined / soft /
|
|
71
|
-
* solid (resolved via compoundVariants below). For plain / elevated
|
|
72
|
-
* this axis is ignored at the visual level — but kept in the type
|
|
73
|
-
* so the prop is always available without conditional typing.
|
|
74
|
-
*/
|
|
75
|
-
color: {
|
|
76
|
-
primary: '',
|
|
77
|
-
secondary: '',
|
|
78
|
-
success: '',
|
|
79
|
-
warning: '',
|
|
80
|
-
danger: '',
|
|
81
|
-
info: '',
|
|
82
|
-
neutral: '',
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
/*
|
|
86
|
-
* Shadow scale — relevant for `variant='elevated'`. We keep elevation
|
|
87
|
-
* as a separate axis (not folded into `variant`) so consumers can
|
|
88
|
-
* dial it up/down without changing the variant. Default `0` = no
|
|
89
|
-
* shadow (consistent with MUI's elevation=0).
|
|
90
|
-
*/
|
|
91
|
-
elevation: {
|
|
92
|
-
0: 'shadow-none',
|
|
93
|
-
1: 'shadow-sm',
|
|
94
|
-
2: 'shadow',
|
|
95
|
-
3: 'shadow-md',
|
|
96
|
-
4: 'shadow-lg',
|
|
97
|
-
5: 'shadow-xl',
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
rounded: {
|
|
101
|
-
none: 'rounded-none',
|
|
102
|
-
sm: 'rounded-sm',
|
|
103
|
-
md: 'rounded-md',
|
|
104
|
-
lg: 'rounded-lg',
|
|
105
|
-
xl: 'rounded-xl',
|
|
106
|
-
'2xl':'rounded-2xl',
|
|
107
|
-
full: 'rounded-full',
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
/*
|
|
111
|
-
* Spacing — six axes (p/px/py/m/mx/my), 11 token steps each.
|
|
112
|
-
* Literals enumerated explicitly so Tailwind's JIT scanner finds
|
|
113
|
-
* every class. Token steps mirror @dashforge/tw-tokens spacing scale.
|
|
114
|
-
*/
|
|
115
|
-
p: {
|
|
116
|
-
0: 'p-0', '0.5': 'p-0.5', 1: 'p-1', 2: 'p-2', 3: 'p-3',
|
|
117
|
-
4: 'p-4', 6: 'p-6', 8: 'p-8', 12: 'p-12', 16: 'p-16',
|
|
118
|
-
24: 'p-24',
|
|
119
|
-
},
|
|
120
|
-
px: {
|
|
121
|
-
0: 'px-0', '0.5': 'px-0.5', 1: 'px-1', 2: 'px-2', 3: 'px-3',
|
|
122
|
-
4: 'px-4', 6: 'px-6', 8: 'px-8', 12: 'px-12', 16: 'px-16',
|
|
123
|
-
24: 'px-24',
|
|
124
|
-
},
|
|
125
|
-
py: {
|
|
126
|
-
0: 'py-0', '0.5': 'py-0.5', 1: 'py-1', 2: 'py-2', 3: 'py-3',
|
|
127
|
-
4: 'py-4', 6: 'py-6', 8: 'py-8', 12: 'py-12', 16: 'py-16',
|
|
128
|
-
24: 'py-24',
|
|
129
|
-
},
|
|
130
|
-
m: {
|
|
131
|
-
0: 'm-0', '0.5': 'm-0.5', 1: 'm-1', 2: 'm-2', 3: 'm-3',
|
|
132
|
-
4: 'm-4', 6: 'm-6', 8: 'm-8', 12: 'm-12', 16: 'm-16',
|
|
133
|
-
24: 'm-24',
|
|
134
|
-
},
|
|
135
|
-
mx: {
|
|
136
|
-
0: 'mx-0', '0.5': 'mx-0.5', 1: 'mx-1', 2: 'mx-2', 3: 'mx-3',
|
|
137
|
-
4: 'mx-4', 6: 'mx-6', 8: 'mx-8', 12: 'mx-12', 16: 'mx-16',
|
|
138
|
-
24: 'mx-24',
|
|
139
|
-
},
|
|
140
|
-
my: {
|
|
141
|
-
0: 'my-0', '0.5': 'my-0.5', 1: 'my-1', 2: 'my-2', 3: 'my-3',
|
|
142
|
-
4: 'my-4', 6: 'my-6', 8: 'my-8', 12: 'my-12', 16: 'my-16',
|
|
143
|
-
24: 'my-24',
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
fullWidth: { true: 'w-full' },
|
|
147
|
-
fullHeight: { true: 'h-full' },
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
/*
|
|
151
|
-
* Compound variants — where surface × color get their actual visual.
|
|
152
|
-
* Twenty-one entries: 7 (outlined) + 7 (soft) + 7 (solid).
|
|
153
|
-
* `plain` and `elevated` don't appear here (no color contribution).
|
|
154
|
-
*
|
|
155
|
-
* Dark-mode pair is baked in: light-mode picks the 50-300 steps,
|
|
156
|
-
* dark-mode picks the 800-950 steps — both reactive to setMode()
|
|
157
|
-
* via the @dashforge/tw-theme CSS variables.
|
|
158
|
-
*/
|
|
159
|
-
compoundVariants: [
|
|
160
|
-
// ─── outlined × color ─────────────────────────────────────────────
|
|
161
|
-
{ variant: 'outlined', color: 'primary',
|
|
162
|
-
class: 'border-primary-300 bg-primary-50/40 dark:border-primary-800 dark:bg-primary-950/30' },
|
|
163
|
-
{ variant: 'outlined', color: 'secondary',
|
|
164
|
-
class: 'border-secondary-300 bg-secondary-50/40 dark:border-secondary-800 dark:bg-secondary-950/30' },
|
|
165
|
-
{ variant: 'outlined', color: 'success',
|
|
166
|
-
class: 'border-success-300 bg-success-50/40 dark:border-success-800 dark:bg-success-950/30' },
|
|
167
|
-
{ variant: 'outlined', color: 'warning',
|
|
168
|
-
class: 'border-warning-300 bg-warning-50/40 dark:border-warning-800 dark:bg-warning-950/30' },
|
|
169
|
-
{ variant: 'outlined', color: 'danger',
|
|
170
|
-
class: 'border-danger-300 bg-danger-50/40 dark:border-danger-800 dark:bg-danger-950/30' },
|
|
171
|
-
{ variant: 'outlined', color: 'info',
|
|
172
|
-
class: 'border-info-300 bg-info-50/40 dark:border-info-800 dark:bg-info-950/30' },
|
|
173
|
-
{ variant: 'outlined', color: 'neutral',
|
|
174
|
-
// border-neutral-200 auto-inverts via CSS var swap (no `dark:`
|
|
175
|
-
// needed). bg-white is hardcoded — `dark:bg-neutral-100` keeps
|
|
176
|
-
// elevation tier above page surface in dark mode (NOT
|
|
177
|
-
// `dark:bg-neutral-900` which renders near-white).
|
|
178
|
-
class: 'border-neutral-200 bg-white dark:bg-neutral-100' },
|
|
179
|
-
|
|
180
|
-
// ─── soft × color ─────────────────────────────────────────────────
|
|
181
|
-
{ variant: 'soft', color: 'primary',
|
|
182
|
-
class: 'bg-primary-100 text-primary-900 dark:bg-primary-950/50 dark:text-primary-100' },
|
|
183
|
-
{ variant: 'soft', color: 'secondary',
|
|
184
|
-
class: 'bg-secondary-100 text-secondary-900 dark:bg-secondary-950/50 dark:text-secondary-100' },
|
|
185
|
-
{ variant: 'soft', color: 'success',
|
|
186
|
-
class: 'bg-success-100 text-success-900 dark:bg-success-950/50 dark:text-success-100' },
|
|
187
|
-
{ variant: 'soft', color: 'warning',
|
|
188
|
-
class: 'bg-warning-100 text-warning-900 dark:bg-warning-950/50 dark:text-warning-100' },
|
|
189
|
-
{ variant: 'soft', color: 'danger',
|
|
190
|
-
class: 'bg-danger-100 text-danger-900 dark:bg-danger-950/50 dark:text-danger-100' },
|
|
191
|
-
{ variant: 'soft', color: 'info',
|
|
192
|
-
class: 'bg-info-100 text-info-900 dark:bg-info-950/50 dark:text-info-100' },
|
|
193
|
-
{ variant: 'soft', color: 'neutral',
|
|
194
|
-
// Both neutral classes auto-invert via the dashforgePreset() CSS
|
|
195
|
-
// var swap — no `dark:` variants needed.
|
|
196
|
-
class: 'bg-neutral-100 text-neutral-900' },
|
|
197
|
-
|
|
198
|
-
// ─── solid × color ────────────────────────────────────────────────
|
|
199
|
-
{ variant: 'solid', color: 'primary',
|
|
200
|
-
class: 'bg-primary-600 text-white dark:bg-primary-500' },
|
|
201
|
-
{ variant: 'solid', color: 'secondary',
|
|
202
|
-
class: 'bg-secondary-600 text-white dark:bg-secondary-500' },
|
|
203
|
-
{ variant: 'solid', color: 'success',
|
|
204
|
-
class: 'bg-success-600 text-white dark:bg-success-500' },
|
|
205
|
-
{ variant: 'solid', color: 'warning',
|
|
206
|
-
class: 'bg-warning-500 text-white dark:bg-warning-600' },
|
|
207
|
-
{ variant: 'solid', color: 'danger',
|
|
208
|
-
class: 'bg-danger-600 text-white dark:bg-danger-500' },
|
|
209
|
-
{ variant: 'solid', color: 'info',
|
|
210
|
-
class: 'bg-info-600 text-white dark:bg-info-500' },
|
|
211
|
-
{ variant: 'solid', color: 'neutral',
|
|
212
|
-
// Solid neutral is the high-emphasis "always-foreground accent"
|
|
213
|
-
// variant. Both classes auto-invert: dark surface + light text
|
|
214
|
-
// in light mode (`#171717` / `#fafafa`) flips to light surface +
|
|
215
|
-
// dark text in dark mode (`#f5f5f5` / `#0a0a0a`). The
|
|
216
|
-
// accent inverts WITH the page surface — consistent with the
|
|
217
|
-
// identity rule. Previously used `text-white` (no auto-invert)
|
|
218
|
-
// which forced double-inversion to keep readable.
|
|
219
|
-
class: 'bg-neutral-900 text-neutral-50' },
|
|
220
|
-
],
|
|
221
|
-
|
|
222
|
-
defaultVariants: {
|
|
223
|
-
variant: 'plain',
|
|
224
|
-
color: 'neutral',
|
|
225
|
-
elevation: 0,
|
|
226
|
-
rounded: 'none',
|
|
227
|
-
},
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
export type BoxVariants = VariantProps<typeof boxVariants>;
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
/**
|
|
3
|
-
* Performance + re-render budget tests for `<Breadcrumbs>`.
|
|
4
|
-
*
|
|
5
|
-
* Layout components are typically near the top of the tree, so a
|
|
6
|
-
* regression here ripples through everything below. Guardrails:
|
|
7
|
-
*
|
|
8
|
-
* 1. Mount cost stays bounded even with very long trails.
|
|
9
|
-
* 2. Re-rendering the parent with the SAME items reference does not
|
|
10
|
-
* re-do the truncation memo work (verifies `useMemo` deps).
|
|
11
|
-
* 3. Truncation does not allocate per-render arrays that would defeat
|
|
12
|
-
* the React keyed-reuse heuristics.
|
|
13
|
-
*/
|
|
14
|
-
import * as React from 'react';
|
|
15
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
16
|
-
import { render, cleanup } from '@testing-library/react';
|
|
17
|
-
import { Breadcrumbs } from './Breadcrumbs.js';
|
|
18
|
-
import type { BreadcrumbItem } from './breadcrumbs.types.js';
|
|
19
|
-
|
|
20
|
-
void React;
|
|
21
|
-
afterEach(() => cleanup());
|
|
22
|
-
|
|
23
|
-
function makeTrail(n: number): BreadcrumbItem[] {
|
|
24
|
-
return Array.from({ length: n }, (_, i) => ({
|
|
25
|
-
id: `c${i}`,
|
|
26
|
-
label: `Crumb ${i}`,
|
|
27
|
-
href: i === n - 1 ? undefined : `/c${i}`,
|
|
28
|
-
}));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function withRenderCounter<P>(
|
|
32
|
-
Component: React.ComponentType<P>,
|
|
33
|
-
counterRef: { count: number }
|
|
34
|
-
): React.FC<P> {
|
|
35
|
-
return function Counted(props: P) {
|
|
36
|
-
counterRef.count++;
|
|
37
|
-
return <Component {...(props as P & object)} />;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
describe('<Breadcrumbs> performance', () => {
|
|
42
|
-
it('mounts a 50-crumb trail under 200ms', () => {
|
|
43
|
-
const trail = makeTrail(50);
|
|
44
|
-
const t0 = performance.now();
|
|
45
|
-
render(<Breadcrumbs items={trail} />);
|
|
46
|
-
const t1 = performance.now();
|
|
47
|
-
// Generous bound — matches the rest of the perf suite. The old
|
|
48
|
-
// 50ms budget was flaky under a parallel full-suite run (cold
|
|
49
|
-
// start jitter), not a real regression signal.
|
|
50
|
-
expect(t1 - t0).toBeLessThan(200);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('mounts a 1000-crumb (collapsed) trail under 100ms', () => {
|
|
54
|
-
const trail = makeTrail(1000);
|
|
55
|
-
const t0 = performance.now();
|
|
56
|
-
render(<Breadcrumbs items={trail} maxItems={5} />);
|
|
57
|
-
const t1 = performance.now();
|
|
58
|
-
expect(t1 - t0).toBeLessThan(100);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
describe('<Breadcrumbs> re-render budget', () => {
|
|
63
|
-
it('renders at most 2 times on mount', () => {
|
|
64
|
-
const counter = { count: 0 };
|
|
65
|
-
const Counted = withRenderCounter(Breadcrumbs, counter);
|
|
66
|
-
render(<Counted items={makeTrail(5)} />);
|
|
67
|
-
expect(counter.count).toBeLessThanOrEqual(2);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('re-renders exactly once per prop change to items', () => {
|
|
71
|
-
const counter = { count: 0 };
|
|
72
|
-
const Counted = withRenderCounter(Breadcrumbs, counter);
|
|
73
|
-
const a = makeTrail(3);
|
|
74
|
-
const b = makeTrail(4);
|
|
75
|
-
const c = makeTrail(5);
|
|
76
|
-
const { rerender } = render(<Counted items={a} />);
|
|
77
|
-
const baseline = counter.count;
|
|
78
|
-
rerender(<Counted items={b} />);
|
|
79
|
-
rerender(<Counted items={c} />);
|
|
80
|
-
// Two prop changes → up to two renders (plus tolerance).
|
|
81
|
-
expect(counter.count - baseline).toBeLessThanOrEqual(3);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('does NOT re-render siblings when only Breadcrumbs items change', () => {
|
|
85
|
-
// Truncation memoization shouldn't leak through React.memo'd
|
|
86
|
-
// siblings, but at minimum it must not trigger sibling renders
|
|
87
|
-
// when the parent re-renders for an unrelated reason.
|
|
88
|
-
const sibCount = { count: 0 };
|
|
89
|
-
const Sibling = () => {
|
|
90
|
-
sibCount.count++;
|
|
91
|
-
return <div data-testid="sib" />;
|
|
92
|
-
};
|
|
93
|
-
const Tree = ({ items }: { items: BreadcrumbItem[] }) => (
|
|
94
|
-
<div>
|
|
95
|
-
<Breadcrumbs items={items} />
|
|
96
|
-
<Sibling />
|
|
97
|
-
</div>
|
|
98
|
-
);
|
|
99
|
-
const trail = makeTrail(5);
|
|
100
|
-
const { rerender } = render(<Tree items={trail} />);
|
|
101
|
-
const baseline = sibCount.count;
|
|
102
|
-
// Re-render the parent with the SAME items reference — Sibling
|
|
103
|
-
// should still re-render (parent re-rendered) but only ONCE per
|
|
104
|
-
// parent re-render, no extra renders triggered by Breadcrumbs.
|
|
105
|
-
rerender(<Tree items={trail} />);
|
|
106
|
-
rerender(<Tree items={trail} />);
|
|
107
|
-
expect(sibCount.count - baseline).toBeLessThanOrEqual(2);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('truncation logic is stable: same items + same maxItems => same DOM ids', () => {
|
|
111
|
-
// If `useMemo` is well-keyed, the rendered <li> elements (with
|
|
112
|
-
// stable keys from item.id) should be identical DOM nodes across
|
|
113
|
-
// unrelated re-renders. Detects an accidental "always new array"
|
|
114
|
-
// refactor that would invalidate keys.
|
|
115
|
-
const items = makeTrail(10);
|
|
116
|
-
const { rerender, container } = render(
|
|
117
|
-
<Breadcrumbs items={items} maxItems={4} />
|
|
118
|
-
);
|
|
119
|
-
const firstSnapshot = Array.from(container.querySelectorAll('li')).map(
|
|
120
|
-
(li) => li.outerHTML
|
|
121
|
-
);
|
|
122
|
-
rerender(<Breadcrumbs items={items} maxItems={4} />);
|
|
123
|
-
const secondSnapshot = Array.from(container.querySelectorAll('li')).map(
|
|
124
|
-
(li) => li.outerHTML
|
|
125
|
-
);
|
|
126
|
-
expect(secondSnapshot).toEqual(firstSnapshot);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
import { describe, it, expect, vi, afterEach } from 'vitest';
|
|
4
|
-
import {
|
|
5
|
-
render,
|
|
6
|
-
screen,
|
|
7
|
-
fireEvent,
|
|
8
|
-
cleanup,
|
|
9
|
-
} from '@testing-library/react';
|
|
10
|
-
import { Breadcrumbs } from './Breadcrumbs.js';
|
|
11
|
-
import type { BreadcrumbItem } from './breadcrumbs.types.js';
|
|
12
|
-
|
|
13
|
-
// Keep the React import alive for the classic JSX transform — when this
|
|
14
|
-
// file is run in environments where the bundler tree-shakes
|
|
15
|
-
// `import * as React`, the JSX call sites would lose the global.
|
|
16
|
-
void React;
|
|
17
|
-
|
|
18
|
-
// Auto-cleanup is not reliably registered when test-library is loaded
|
|
19
|
-
// before vitest globals are wired up — register the unmount step
|
|
20
|
-
// explicitly so back-to-back `render()` calls don't accumulate trees.
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
cleanup();
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const trail: BreadcrumbItem[] = [
|
|
26
|
-
{ id: 'home', label: 'Home', href: '/' },
|
|
27
|
-
{ id: 'settings', label: 'Settings', href: '/settings' },
|
|
28
|
-
{ id: 'profile', label: 'Profile' },
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
describe('<Breadcrumbs>', () => {
|
|
32
|
-
describe('basic rendering', () => {
|
|
33
|
-
it('renders a nav with role + accessible name', () => {
|
|
34
|
-
render(<Breadcrumbs items={trail} />);
|
|
35
|
-
const nav = screen.getByRole('navigation', { name: 'Breadcrumb' });
|
|
36
|
-
expect(nav).toBeTruthy();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('renders an <ol> with one <li> per item', () => {
|
|
40
|
-
const { container } = render(<Breadcrumbs items={trail} />);
|
|
41
|
-
expect(container.querySelectorAll('li')).toHaveLength(3);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('returns null for an empty items array', () => {
|
|
45
|
-
const { container } = render(<Breadcrumbs items={[]} />);
|
|
46
|
-
expect(container.firstChild).toBeNull();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('marks the last crumb as aria-current="page" by default', () => {
|
|
50
|
-
render(<Breadcrumbs items={trail} />);
|
|
51
|
-
const current = screen.getByText('Profile').closest('span');
|
|
52
|
-
expect(current?.getAttribute('aria-current')).toBe('page');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('honours an explicit `current: true` flag', () => {
|
|
56
|
-
const custom: BreadcrumbItem[] = [
|
|
57
|
-
{ id: 'a', label: 'A', href: '/a' },
|
|
58
|
-
{ id: 'b', label: 'B', current: true },
|
|
59
|
-
{ id: 'c', label: 'C', href: '/c' },
|
|
60
|
-
];
|
|
61
|
-
render(<Breadcrumbs items={custom} />);
|
|
62
|
-
const bElement = screen.getByText('B').closest('span');
|
|
63
|
-
expect(bElement?.getAttribute('aria-current')).toBe('page');
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('separator', () => {
|
|
68
|
-
it('inserts the default `/` between crumbs', () => {
|
|
69
|
-
const { container } = render(<Breadcrumbs items={trail} />);
|
|
70
|
-
const separators = container.querySelectorAll('[aria-hidden="true"]');
|
|
71
|
-
// 2 separators between 3 crumbs.
|
|
72
|
-
expect(separators).toHaveLength(2);
|
|
73
|
-
expect(separators[0].textContent).toBe('/');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('accepts a custom separator (string)', () => {
|
|
77
|
-
const { container } = render(
|
|
78
|
-
<Breadcrumbs items={trail} separator=">" />
|
|
79
|
-
);
|
|
80
|
-
const separators = container.querySelectorAll('[aria-hidden="true"]');
|
|
81
|
-
expect(separators[0].textContent).toBe('>');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('accepts a custom separator (ReactNode)', () => {
|
|
85
|
-
render(
|
|
86
|
-
<Breadcrumbs
|
|
87
|
-
items={trail}
|
|
88
|
-
separator={<span data-testid="sep">»</span>}
|
|
89
|
-
/>
|
|
90
|
-
);
|
|
91
|
-
// Two separators ⇒ two custom nodes.
|
|
92
|
-
expect(screen.getAllByTestId('sep')).toHaveLength(2);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
describe('navigation links', () => {
|
|
97
|
-
it('renders a non-current crumb with href as a real link', () => {
|
|
98
|
-
render(<Breadcrumbs items={trail} />);
|
|
99
|
-
const link = screen.getByRole('link', { name: 'Home' });
|
|
100
|
-
expect(link.getAttribute('href')).toBe('/');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('renders a crumb without href as a non-link span', () => {
|
|
104
|
-
const noHref: BreadcrumbItem[] = [
|
|
105
|
-
{ id: 'a', label: 'A' },
|
|
106
|
-
{ id: 'b', label: 'B' },
|
|
107
|
-
];
|
|
108
|
-
render(<Breadcrumbs items={noHref} />);
|
|
109
|
-
expect(screen.queryByRole('link')).toBeNull();
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('fires onClick on link crumbs', () => {
|
|
113
|
-
const onClick = vi.fn();
|
|
114
|
-
const itemsWithClick: BreadcrumbItem[] = [
|
|
115
|
-
{ id: 'a', label: 'A', href: '/a', onClick },
|
|
116
|
-
{ id: 'b', label: 'B' },
|
|
117
|
-
];
|
|
118
|
-
render(<Breadcrumbs items={itemsWithClick} />);
|
|
119
|
-
fireEvent.click(screen.getByText('A'));
|
|
120
|
-
expect(onClick).toHaveBeenCalled();
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('renders a disabled crumb as a non-interactive span', () => {
|
|
124
|
-
const dis: BreadcrumbItem[] = [
|
|
125
|
-
{ id: 'a', label: 'A', href: '/a', disabled: true },
|
|
126
|
-
{ id: 'b', label: 'B' },
|
|
127
|
-
];
|
|
128
|
-
render(<Breadcrumbs items={dis} />);
|
|
129
|
-
// 'A' must not be a link (disabled overrides interactivity).
|
|
130
|
-
expect(screen.queryByRole('link', { name: 'A' })).toBeNull();
|
|
131
|
-
const span = screen.getByText('A').closest('span');
|
|
132
|
-
expect(span?.getAttribute('aria-disabled')).toBe('true');
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
describe('truncation', () => {
|
|
137
|
-
const long: BreadcrumbItem[] = Array.from({ length: 6 }, (_, i) => ({
|
|
138
|
-
id: `c${i}`,
|
|
139
|
-
label: `Crumb ${i}`,
|
|
140
|
-
href: i === 5 ? undefined : `/c${i}`,
|
|
141
|
-
}));
|
|
142
|
-
|
|
143
|
-
it('collapses the middle when items > maxItems', () => {
|
|
144
|
-
const { container } = render(
|
|
145
|
-
<Breadcrumbs items={long} maxItems={3} />
|
|
146
|
-
);
|
|
147
|
-
// 1 (head) + 1 ellipsis + 1 (tail) = 3 <li>s.
|
|
148
|
-
expect(container.querySelectorAll('li')).toHaveLength(3);
|
|
149
|
-
expect(
|
|
150
|
-
container.querySelector('[aria-label="More breadcrumbs"]')
|
|
151
|
-
).toBeTruthy();
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('respects itemsBeforeCollapse / itemsAfterCollapse', () => {
|
|
155
|
-
const { container } = render(
|
|
156
|
-
<Breadcrumbs
|
|
157
|
-
items={long}
|
|
158
|
-
maxItems={4}
|
|
159
|
-
itemsBeforeCollapse={2}
|
|
160
|
-
itemsAfterCollapse={2}
|
|
161
|
-
/>
|
|
162
|
-
);
|
|
163
|
-
// 2 head + 1 ellipsis + 2 tail = 5 <li>s.
|
|
164
|
-
// (maxItems is the visible-budget hint; once collapsed the
|
|
165
|
-
// before/after counts drive the final visible count.)
|
|
166
|
-
expect(container.querySelectorAll('li')).toHaveLength(5);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('does NOT collapse when items.length <= maxItems', () => {
|
|
170
|
-
const { container } = render(
|
|
171
|
-
<Breadcrumbs items={trail} maxItems={10} />
|
|
172
|
-
);
|
|
173
|
-
expect(container.querySelectorAll('li')).toHaveLength(3);
|
|
174
|
-
expect(
|
|
175
|
-
container.querySelector('[aria-label="More breadcrumbs"]')
|
|
176
|
-
).toBeNull();
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('does NOT collapse when maxItems is 0 (default)', () => {
|
|
180
|
-
const { container } = render(<Breadcrumbs items={long} />);
|
|
181
|
-
expect(container.querySelectorAll('li')).toHaveLength(6);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('preserves the LAST crumb (current page) when collapsing', () => {
|
|
185
|
-
render(<Breadcrumbs items={long} maxItems={3} />);
|
|
186
|
-
expect(screen.getByText('Crumb 0')).toBeTruthy(); // first
|
|
187
|
-
expect(screen.getByText('Crumb 5')).toBeTruthy(); // last/current
|
|
188
|
-
expect(screen.queryByText('Crumb 2')).toBeNull(); // middle, collapsed
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
describe('polymorphic link component', () => {
|
|
193
|
-
it('uses the provided linkComponent instead of <a>', () => {
|
|
194
|
-
const MyLink = vi.fn(
|
|
195
|
-
({ children, ...rest }: React.AnchorHTMLAttributes<HTMLAnchorElement>) => (
|
|
196
|
-
<a data-testid="custom-link" {...rest}>
|
|
197
|
-
{children}
|
|
198
|
-
</a>
|
|
199
|
-
)
|
|
200
|
-
);
|
|
201
|
-
render(<Breadcrumbs items={trail} linkComponent={MyLink} />);
|
|
202
|
-
// Two interactive crumbs ⇒ MyLink called twice.
|
|
203
|
-
expect(MyLink).toHaveBeenCalledTimes(2);
|
|
204
|
-
expect(screen.getAllByTestId('custom-link')).toHaveLength(2);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
describe('size variants', () => {
|
|
209
|
-
it('renders sm / md / lg without throwing', () => {
|
|
210
|
-
const sizes = ['sm', 'md', 'lg'] as const;
|
|
211
|
-
sizes.forEach((s) => {
|
|
212
|
-
const { unmount } = render(
|
|
213
|
-
<Breadcrumbs items={trail} size={s} />
|
|
214
|
-
);
|
|
215
|
-
expect(
|
|
216
|
-
screen.getByRole('navigation', { name: 'Breadcrumb' })
|
|
217
|
-
).toBeTruthy();
|
|
218
|
-
unmount();
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
describe('aria-label override', () => {
|
|
224
|
-
it('applies a custom aria-label to the nav landmark', () => {
|
|
225
|
-
render(<Breadcrumbs items={trail} ariaLabel="Sentiero corrente" />);
|
|
226
|
-
expect(
|
|
227
|
-
screen.getByRole('navigation', { name: 'Sentiero corrente' })
|
|
228
|
-
).toBeTruthy();
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
});
|