@dashforge/tw 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/dist/index.esm.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/package.json +8 -3
- 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,199 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Window descriptor — which slice of the row array is currently
|
|
5
|
-
* mounted in DOM, and how much spacer height to render above and
|
|
6
|
-
* below the visible window so the scrollbar size matches the
|
|
7
|
-
* "virtual" total height.
|
|
8
|
-
*/
|
|
9
|
-
export interface VirtualizerWindow {
|
|
10
|
-
/** First row index inside the visible window (inclusive). */
|
|
11
|
-
startIndex: number;
|
|
12
|
-
/** Last row index inside the visible window (inclusive). */
|
|
13
|
-
endIndex: number;
|
|
14
|
-
/** Pixels to render above the visible rows (spacer top). */
|
|
15
|
-
paddingTop: number;
|
|
16
|
-
/** Pixels to render below the visible rows (spacer bottom). */
|
|
17
|
-
paddingBottom: number;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface UseVirtualizerArgs {
|
|
21
|
-
/** Total number of rows in the underlying data set. */
|
|
22
|
-
totalCount: number;
|
|
23
|
-
/** Fixed row height in pixels. */
|
|
24
|
-
rowHeight: number;
|
|
25
|
-
/**
|
|
26
|
-
* Visible viewport height in pixels. Pass the height of the
|
|
27
|
-
* scroll container.
|
|
28
|
-
*/
|
|
29
|
-
viewportHeight: number;
|
|
30
|
-
/** Current scrollTop of the scroll container. */
|
|
31
|
-
scrollTop: number;
|
|
32
|
-
/**
|
|
33
|
-
* How many extra rows to render above / below the visible window
|
|
34
|
-
* for smoother scrolling (reduces blank-flash on fast scroll).
|
|
35
|
-
* @default 5
|
|
36
|
-
*/
|
|
37
|
-
overscan?: number;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Compute the visible window of rows + the spacer heights given the
|
|
42
|
-
* current scroll position. Pure function — exported for testability.
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```ts
|
|
46
|
-
* computeWindow({ totalCount: 1000, rowHeight: 48, viewportHeight: 600,
|
|
47
|
-
* scrollTop: 0, overscan: 5 });
|
|
48
|
-
* // → { startIndex: 0, endIndex: 17, paddingTop: 0, paddingBottom: 47136 }
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export function computeWindow(args: UseVirtualizerArgs): VirtualizerWindow {
|
|
52
|
-
const { totalCount, rowHeight, viewportHeight, scrollTop, overscan = 5 } = args;
|
|
53
|
-
|
|
54
|
-
if (totalCount <= 0 || rowHeight <= 0 || viewportHeight <= 0) {
|
|
55
|
-
return { startIndex: 0, endIndex: -1, paddingTop: 0, paddingBottom: 0 };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Raw visible range from scrollTop alone.
|
|
59
|
-
const rawStart = Math.floor(scrollTop / rowHeight);
|
|
60
|
-
const rawEnd = Math.ceil((scrollTop + viewportHeight) / rowHeight);
|
|
61
|
-
|
|
62
|
-
// Apply overscan + clamp to [0, totalCount - 1].
|
|
63
|
-
const startIndex = Math.max(0, rawStart - overscan);
|
|
64
|
-
const endIndex = Math.min(totalCount - 1, rawEnd + overscan);
|
|
65
|
-
|
|
66
|
-
const paddingTop = startIndex * rowHeight;
|
|
67
|
-
const paddingBottom = Math.max(0, (totalCount - 1 - endIndex) * rowHeight);
|
|
68
|
-
|
|
69
|
-
return { startIndex, endIndex, paddingTop, paddingBottom };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* `useVirtualizer` — viewport-based row windowing for `<DataGrid>`.
|
|
74
|
-
*
|
|
75
|
-
* Hand-rolled (no `@tanstack/react-virtual` dep — constraint memorized
|
|
76
|
-
* in `feedback_dashforge_preset_is_identity` companion: "no new
|
|
77
|
-
* external runtime deps"). Uses scroll event + `requestAnimationFrame`
|
|
78
|
-
* debounce + `ResizeObserver` on the container. Fixed row height
|
|
79
|
-
* only in v1 — variable-height with measurement cache deferred to
|
|
80
|
-
* v1-bis.
|
|
81
|
-
*
|
|
82
|
-
* Returns:
|
|
83
|
-
* - `scrollRef`: attach to the scroll container `<div>`.
|
|
84
|
-
* - `window`: which row indices to mount + top/bottom spacer heights
|
|
85
|
-
* to preserve scroll-area size.
|
|
86
|
-
* - `viewportHeight`: current container height (re-measured on
|
|
87
|
-
* `ResizeObserver` ticks).
|
|
88
|
-
*
|
|
89
|
-
* The DataGrid renders `rows.slice(window.startIndex, window.endIndex + 1)`
|
|
90
|
-
* between two spacer `<tr style={{ height: paddingTop }} />` elements
|
|
91
|
-
* (above and below). This preserves `<table>` semantics — screen
|
|
92
|
-
* readers see a continuous structure with `aria-hidden` spacers.
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```tsx
|
|
96
|
-
* const { scrollRef, window } = useVirtualizer({
|
|
97
|
-
* totalCount: rows.length,
|
|
98
|
-
* rowHeight: 48,
|
|
99
|
-
* overscan: 5,
|
|
100
|
-
* });
|
|
101
|
-
*
|
|
102
|
-
* return (
|
|
103
|
-
* <div ref={scrollRef} style={{ height: 600, overflow: 'auto' }}>
|
|
104
|
-
* <table>
|
|
105
|
-
* <tbody>
|
|
106
|
-
* <tr aria-hidden="true" style={{ height: window.paddingTop }} />
|
|
107
|
-
* {rows.slice(window.startIndex, window.endIndex + 1).map(...)}
|
|
108
|
-
* <tr aria-hidden="true" style={{ height: window.paddingBottom }} />
|
|
109
|
-
* </tbody>
|
|
110
|
-
* </table>
|
|
111
|
-
* </div>
|
|
112
|
-
* );
|
|
113
|
-
* ```
|
|
114
|
-
*/
|
|
115
|
-
export function useVirtualizer(args: {
|
|
116
|
-
totalCount: number;
|
|
117
|
-
rowHeight: number;
|
|
118
|
-
overscan?: number;
|
|
119
|
-
/**
|
|
120
|
-
* Initial viewport height — used before the ResizeObserver
|
|
121
|
-
* settles on first paint. Pass an explicit `height` prop value
|
|
122
|
-
* if you have one; otherwise the hook re-measures on layout.
|
|
123
|
-
* @default 400
|
|
124
|
-
*/
|
|
125
|
-
initialViewportHeight?: number;
|
|
126
|
-
}): {
|
|
127
|
-
scrollRef: React.RefObject<HTMLDivElement | null>;
|
|
128
|
-
window: VirtualizerWindow;
|
|
129
|
-
viewportHeight: number;
|
|
130
|
-
} {
|
|
131
|
-
const { totalCount, rowHeight, overscan = 5, initialViewportHeight = 400 } = args;
|
|
132
|
-
|
|
133
|
-
const scrollRef = useRef<HTMLDivElement | null>(null);
|
|
134
|
-
const [scrollTop, setScrollTop] = useState(0);
|
|
135
|
-
const [viewportHeight, setViewportHeight] = useState(initialViewportHeight);
|
|
136
|
-
|
|
137
|
-
// Debounce scroll handler via requestAnimationFrame so we never
|
|
138
|
-
// re-render more than once per paint frame even when the scroll
|
|
139
|
-
// event fires rapidly during fast scrolling.
|
|
140
|
-
const rafIdRef = useRef<number | null>(null);
|
|
141
|
-
const handleScroll = useCallback(() => {
|
|
142
|
-
if (rafIdRef.current != null) return;
|
|
143
|
-
rafIdRef.current = requestAnimationFrame(() => {
|
|
144
|
-
rafIdRef.current = null;
|
|
145
|
-
const el = scrollRef.current;
|
|
146
|
-
if (!el) return;
|
|
147
|
-
setScrollTop(el.scrollTop);
|
|
148
|
-
});
|
|
149
|
-
}, []);
|
|
150
|
-
|
|
151
|
-
// Attach scroll listener.
|
|
152
|
-
useEffect(() => {
|
|
153
|
-
const el = scrollRef.current;
|
|
154
|
-
if (!el) return;
|
|
155
|
-
el.addEventListener('scroll', handleScroll, { passive: true });
|
|
156
|
-
return () => {
|
|
157
|
-
el.removeEventListener('scroll', handleScroll);
|
|
158
|
-
if (rafIdRef.current != null) {
|
|
159
|
-
cancelAnimationFrame(rafIdRef.current);
|
|
160
|
-
rafIdRef.current = null;
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
}, [handleScroll]);
|
|
164
|
-
|
|
165
|
-
// Track container viewport height via ResizeObserver — re-virtualize
|
|
166
|
-
// when the container size changes (window resize, sidebar collapse,
|
|
167
|
-
// etc.). Use `useLayoutEffect` so the first measurement happens
|
|
168
|
-
// before paint to avoid a flash of stale window.
|
|
169
|
-
//
|
|
170
|
-
// **Defensive**: only accept measurements > 0. jsdom (test env)
|
|
171
|
-
// returns `clientHeight === 0` for unmounted containers, which would
|
|
172
|
-
// collapse the window to empty. The hook keeps the
|
|
173
|
-
// `initialViewportHeight` fallback in that case.
|
|
174
|
-
useLayoutEffect(() => {
|
|
175
|
-
const el = scrollRef.current;
|
|
176
|
-
if (!el) return;
|
|
177
|
-
if (el.clientHeight > 0) {
|
|
178
|
-
setViewportHeight(el.clientHeight);
|
|
179
|
-
}
|
|
180
|
-
if (typeof ResizeObserver === 'undefined') return;
|
|
181
|
-
const observer = new ResizeObserver((entries) => {
|
|
182
|
-
const entry = entries[0];
|
|
183
|
-
if (!entry || entry.contentRect.height <= 0) return;
|
|
184
|
-
setViewportHeight(entry.contentRect.height);
|
|
185
|
-
});
|
|
186
|
-
observer.observe(el);
|
|
187
|
-
return () => observer.disconnect();
|
|
188
|
-
}, []);
|
|
189
|
-
|
|
190
|
-
const window = computeWindow({
|
|
191
|
-
totalCount,
|
|
192
|
-
rowHeight,
|
|
193
|
-
viewportHeight,
|
|
194
|
-
scrollTop,
|
|
195
|
-
overscan,
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
return { scrollRef, window, viewportHeight };
|
|
199
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import type { DashFormBridge } from '@dashforge/ui-core';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Resolved validation state for a bridge-managed field.
|
|
6
|
-
*
|
|
7
|
-
* Returned by `resolveValidationState`, this is consumed by all form
|
|
8
|
-
* components that surface error + helper text (TextField, Checkbox,
|
|
9
|
-
* Switch, …) to derive their final render state.
|
|
10
|
-
*/
|
|
11
|
-
export interface ValidationState {
|
|
12
|
-
error: boolean;
|
|
13
|
-
helperText: ReactNode;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Compute `error` + `helperText` for a bridge-managed field.
|
|
18
|
-
*
|
|
19
|
-
* **Renderer-agnostic** — copy of the MUI-side
|
|
20
|
-
* `textField.validation.ts`. Promoted to a `_shared/` directory inside
|
|
21
|
-
* `@dashforge/tw` so all form components (TextField + Checkbox +
|
|
22
|
-
* Switch) reuse the same precedence logic without depending on a
|
|
23
|
-
* specific component folder.
|
|
24
|
-
*
|
|
25
|
-
* Precedence rules (matches MUI side byte-for-byte):
|
|
26
|
-
*
|
|
27
|
-
* 1. **Explicit props win.** If the user passed `error` / `helperText`
|
|
28
|
-
* explicitly, those values are used as-is.
|
|
29
|
-
* 2. **Auto values are gated by interaction.** The bridge's error is
|
|
30
|
-
* surfaced only when the field is `touched` OR the form has been
|
|
31
|
-
* submitted at least once (`submitCount > 0`). This prevents the
|
|
32
|
-
* "error spam while typing" anti-pattern.
|
|
33
|
-
* 3. **`error === false` explicitly clears the bridge's error message
|
|
34
|
-
* text.** Useful for forcing a "valid" visual state regardless of
|
|
35
|
-
* bridge state.
|
|
36
|
-
*
|
|
37
|
-
* @param name field name registered with the bridge
|
|
38
|
-
* @param bridge active `DashFormBridge` (guaranteed non-null at
|
|
39
|
-
* call sites by the surrounding `if (bridge)`)
|
|
40
|
-
* @param explicitError `error` prop from the consumer
|
|
41
|
-
* @param explicitHelperText `helperText` prop from the consumer
|
|
42
|
-
*/
|
|
43
|
-
export function resolveValidationState(
|
|
44
|
-
name: string,
|
|
45
|
-
bridge: DashFormBridge,
|
|
46
|
-
explicitError: boolean | undefined,
|
|
47
|
-
explicitHelperText: ReactNode | undefined
|
|
48
|
-
): ValidationState {
|
|
49
|
-
const autoErr = bridge.getError(name) ?? null;
|
|
50
|
-
const autoTouched = bridge.isTouched(name) ?? false;
|
|
51
|
-
const submitCount = bridge.submitCount ?? 0;
|
|
52
|
-
|
|
53
|
-
const allowAutoError = autoTouched || submitCount > 0;
|
|
54
|
-
|
|
55
|
-
const error = explicitError ?? (Boolean(autoErr) && allowAutoError);
|
|
56
|
-
const helperText =
|
|
57
|
-
explicitHelperText ?? (allowAutoError ? autoErr?.message : undefined);
|
|
58
|
-
|
|
59
|
-
return { error, helperText };
|
|
60
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `_shared/severity/` — foundation for every severity-aware
|
|
3
|
-
* component in `@dashforge/tw` (Alert, refactored Snackbar, future
|
|
4
|
-
* Banner / status indicators).
|
|
5
|
-
*
|
|
6
|
-
* Centralising:
|
|
7
|
-
* - the `Severity` and `SeverityVariant` taxonomies (mirror MUI;
|
|
8
|
-
* `danger` not `error` for token alignment)
|
|
9
|
-
* - the 3×4 token-driven color matrix (token-resolved, no hardcoded
|
|
10
|
-
* hex, no `dark:` variants on neutral)
|
|
11
|
-
* - the default per-severity inline SVG icons (`icon={false}` opt-out
|
|
12
|
-
* supported on consumer components)
|
|
13
|
-
* - the ARIA role helper (`alert` vs `status`)
|
|
14
|
-
*
|
|
15
|
-
* Consumers (Alert, Snackbar) import from this barrel — never reach
|
|
16
|
-
* into the individual files.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
export type {
|
|
20
|
-
Severity,
|
|
21
|
-
SeverityClasses,
|
|
22
|
-
SeverityVariant,
|
|
23
|
-
} from './severity.types.js';
|
|
24
|
-
|
|
25
|
-
export {
|
|
26
|
-
getSeverityClasses,
|
|
27
|
-
getSeverityRole,
|
|
28
|
-
} from './severityVariants.js';
|
|
29
|
-
|
|
30
|
-
export {
|
|
31
|
-
SEVERITY_DEFAULT_ICON,
|
|
32
|
-
getDefaultSeverityIcon,
|
|
33
|
-
} from './severityIcons.js';
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared severity types — consumed by every component that surfaces
|
|
3
|
-
* a "semantic visual tone" (Alert, Snackbar, Banner, Badge, Chip when
|
|
4
|
-
* acting as a status indicator, …).
|
|
5
|
-
*
|
|
6
|
-
* **Naming choice**: we follow MUI's `severity` taxonomy
|
|
7
|
-
* (`info / success / warning / danger`) and `variant` taxonomy
|
|
8
|
-
* (`standard / filled / outlined`) so consumers porting from MUI keep
|
|
9
|
-
* their muscle memory. The single Dashforge-specific divergence is
|
|
10
|
-
* `danger` (not MUI's `error`) — chosen to match the `danger.*` token
|
|
11
|
-
* palette in `@dashforge/tw-tokens`. Semantically identical to MUI's
|
|
12
|
-
* `error`; documented in the migration guide.
|
|
13
|
-
*
|
|
14
|
-
* @module @dashforge/tw/_shared/severity
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Visual severity — drives the color treatment of a component.
|
|
19
|
-
* `danger` instead of `error` for token-palette alignment.
|
|
20
|
-
*/
|
|
21
|
-
export type Severity = 'info' | 'success' | 'warning' | 'danger';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Variant of the severity surface. Mirrors MUI's `Alert` variant axis
|
|
25
|
-
* 1:1 so the migration story is trivial.
|
|
26
|
-
*
|
|
27
|
-
* - `standard` (default) — tinted soft background with severity-toned
|
|
28
|
-
* text. The "all-purpose" reading. Most modern design systems call
|
|
29
|
-
* this "soft".
|
|
30
|
-
* - `filled` — solid severity background with light text. Strong
|
|
31
|
-
* visual weight, for high-priority callouts.
|
|
32
|
-
* - `outlined` — transparent background with severity border and
|
|
33
|
-
* severity-toned text. Minimal weight, for dense layouts.
|
|
34
|
-
*/
|
|
35
|
-
export type SeverityVariant = 'standard' | 'filled' | 'outlined';
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Per-slot Tailwind class strings emitted by the severity matrix for
|
|
39
|
-
* one (variant, severity) pair. Resolved through `dashforgePreset()`
|
|
40
|
-
* to CSS variables → patch-theme friendly.
|
|
41
|
-
*/
|
|
42
|
-
export interface SeverityClasses {
|
|
43
|
-
/** `<root>` surface: background + text + border base. */
|
|
44
|
-
surface: string;
|
|
45
|
-
/** Border overrides (kept separate from `surface` so components can
|
|
46
|
-
* swap `border-2` etc. without losing the color). */
|
|
47
|
-
border: string;
|
|
48
|
-
/** Icon container color (uses `currentColor` on the inner SVG). */
|
|
49
|
-
icon: string;
|
|
50
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import type { ComponentType, ReactNode, SVGProps } from 'react';
|
|
2
|
-
import type { Severity } from './severity.types.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Default severity icons — inline stroke SVG, no runtime icon dep.
|
|
6
|
-
*
|
|
7
|
-
* Convention copied from `Calendar` / `Autocomplete` (existing pattern
|
|
8
|
-
* in the lib): icons live INLINE inside the component module, never as
|
|
9
|
-
* imports from an external icon library. The "no icons in the library"
|
|
10
|
-
* principle means **no external icon package** (`lucide-react`,
|
|
11
|
-
* `phosphor-icons`, etc.) — small file-local SVG functions are
|
|
12
|
-
* allowed and already used.
|
|
13
|
-
*
|
|
14
|
-
* All icons:
|
|
15
|
-
* - 20×20 viewBox (5:1 ratio of intrinsic size to body text-sm)
|
|
16
|
-
* - `stroke="currentColor"` — colored via the parent's
|
|
17
|
-
* `text-<severity>-600` class through the severity matrix
|
|
18
|
-
* - `fill="none"` — outline style, matches Tabler / Heroicons /
|
|
19
|
-
* Phosphor-outline conventions, low visual weight
|
|
20
|
-
* - `aria-hidden="true"` — the message text carries the semantic;
|
|
21
|
-
* the icon is decorative reinforcement, not the announcement
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
type IconProps = SVGProps<SVGSVGElement>;
|
|
25
|
-
|
|
26
|
-
const BASE_PROPS: IconProps = {
|
|
27
|
-
width: '1.25em',
|
|
28
|
-
height: '1.25em',
|
|
29
|
-
viewBox: '0 0 20 20',
|
|
30
|
-
fill: 'none',
|
|
31
|
-
stroke: 'currentColor',
|
|
32
|
-
strokeWidth: 1.5,
|
|
33
|
-
strokeLinecap: 'round',
|
|
34
|
-
strokeLinejoin: 'round',
|
|
35
|
-
'aria-hidden': 'true',
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
function InfoIcon(props: IconProps) {
|
|
39
|
-
return (
|
|
40
|
-
<svg {...BASE_PROPS} {...props}>
|
|
41
|
-
<circle cx="10" cy="10" r="8.25" />
|
|
42
|
-
<path d="M10 6.5h.01M10 9.5v4" />
|
|
43
|
-
</svg>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function SuccessIcon(props: IconProps) {
|
|
48
|
-
return (
|
|
49
|
-
<svg {...BASE_PROPS} {...props}>
|
|
50
|
-
<circle cx="10" cy="10" r="8.25" />
|
|
51
|
-
<path d="m6.5 10 2.5 2.5 4.5-5" />
|
|
52
|
-
</svg>
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function WarningIcon(props: IconProps) {
|
|
57
|
-
return (
|
|
58
|
-
<svg {...BASE_PROPS} {...props}>
|
|
59
|
-
<path d="M10 2.5 18 17H2L10 2.5Z" />
|
|
60
|
-
<path d="M10 8v3.5M10 14.5h.01" />
|
|
61
|
-
</svg>
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function DangerIcon(props: IconProps) {
|
|
66
|
-
return (
|
|
67
|
-
<svg {...BASE_PROPS} {...props}>
|
|
68
|
-
<circle cx="10" cy="10" r="8.25" />
|
|
69
|
-
<path d="m7 7 6 6M13 7l-6 6" />
|
|
70
|
-
</svg>
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Map of severity → default Icon component. Used by Alert (and
|
|
76
|
-
* eventually Snackbar / Banner / etc.) to render the per-severity
|
|
77
|
-
* default when the consumer doesn't pass a custom `icon` prop and
|
|
78
|
-
* doesn't opt-out with `icon={false}`.
|
|
79
|
-
*/
|
|
80
|
-
export const SEVERITY_DEFAULT_ICON: Record<Severity, ComponentType<IconProps>> = {
|
|
81
|
-
info: InfoIcon,
|
|
82
|
-
success: SuccessIcon,
|
|
83
|
-
warning: WarningIcon,
|
|
84
|
-
danger: DangerIcon,
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Convenience helper — render the default icon for a severity as a
|
|
89
|
-
* `ReactNode`, ready to inject into a JSX slot.
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
* <span className={severityClasses.icon}>
|
|
93
|
-
* {getDefaultSeverityIcon('warning')}
|
|
94
|
-
* </span>
|
|
95
|
-
*/
|
|
96
|
-
export function getDefaultSeverityIcon(severity: Severity): ReactNode {
|
|
97
|
-
const Icon = SEVERITY_DEFAULT_ICON[severity];
|
|
98
|
-
return <Icon />;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Re-export individual icons for cases where a consumer wants the same
|
|
102
|
-
// glyph in a custom context (e.g. inline in a paragraph). Not part of
|
|
103
|
-
// the public `@dashforge/tw` barrel — internal use only.
|
|
104
|
-
export { InfoIcon, SuccessIcon, WarningIcon, DangerIcon };
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
getSeverityClasses,
|
|
4
|
-
getSeverityRole,
|
|
5
|
-
} from './severityVariants.js';
|
|
6
|
-
import { SEVERITY_DEFAULT_ICON } from './severityIcons.js';
|
|
7
|
-
import type { Severity, SeverityVariant } from './severity.types.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Exhaustive coverage of the 3×4 severity matrix.
|
|
11
|
-
*
|
|
12
|
-
* The matrix is the foundation every severity-aware component reads
|
|
13
|
-
* from. Regressions here ripple through Alert, Snackbar, future
|
|
14
|
-
* Banner, etc. — so we lock down every cell, the role helper, and the
|
|
15
|
-
* default-icon map.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const SEVERITIES: Severity[] = ['info', 'success', 'warning', 'danger'];
|
|
19
|
-
const VARIANTS: SeverityVariant[] = ['standard', 'filled', 'outlined'];
|
|
20
|
-
|
|
21
|
-
describe('getSeverityClasses', () => {
|
|
22
|
-
it('returns a SeverityClasses object for every (variant, severity) pair', () => {
|
|
23
|
-
for (const variant of VARIANTS) {
|
|
24
|
-
for (const severity of SEVERITIES) {
|
|
25
|
-
const classes = getSeverityClasses(variant, severity);
|
|
26
|
-
expect(classes).toBeDefined();
|
|
27
|
-
expect(typeof classes.surface).toBe('string');
|
|
28
|
-
expect(typeof classes.border).toBe('string');
|
|
29
|
-
expect(typeof classes.icon).toBe('string');
|
|
30
|
-
expect(classes.surface.length).toBeGreaterThan(0);
|
|
31
|
-
expect(classes.border.length).toBeGreaterThan(0);
|
|
32
|
-
expect(classes.icon.length).toBeGreaterThan(0);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('uses token-driven color utilities (no hardcoded hex, no dark: variants)', () => {
|
|
38
|
-
for (const variant of VARIANTS) {
|
|
39
|
-
for (const severity of SEVERITIES) {
|
|
40
|
-
const classes = getSeverityClasses(variant, severity);
|
|
41
|
-
const all = `${classes.surface} ${classes.border} ${classes.icon}`;
|
|
42
|
-
// No hex literals
|
|
43
|
-
expect(all).not.toMatch(/#[0-9a-fA-F]{3,8}/);
|
|
44
|
-
// No dark: variants — preset auto-inverts neutral via CSS var swap
|
|
45
|
-
expect(all).not.toMatch(/\bdark:/);
|
|
46
|
-
// Severity palette names appear in the utilities
|
|
47
|
-
if (severity === 'info' || severity === 'success' || severity === 'warning' || severity === 'danger') {
|
|
48
|
-
expect(all).toContain(severity);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe('standard variant — tinted soft surface', () => {
|
|
55
|
-
it.each(SEVERITIES)('uses bg-<severity>-50 + text-<severity>-900 for %s', (sev) => {
|
|
56
|
-
const { surface } = getSeverityClasses('standard', sev);
|
|
57
|
-
expect(surface).toContain(`bg-${sev}-50`);
|
|
58
|
-
expect(surface).toContain(`text-${sev}-900`);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it.each(SEVERITIES)('uses border-<severity>-100 for %s', (sev) => {
|
|
62
|
-
const { border } = getSeverityClasses('standard', sev);
|
|
63
|
-
expect(border).toContain(`border-${sev}-100`);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it.each(SEVERITIES)('uses text-<severity>-600 for icon in %s', (sev) => {
|
|
67
|
-
const { icon } = getSeverityClasses('standard', sev);
|
|
68
|
-
expect(icon).toContain(`text-${sev}-600`);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe('filled variant — solid colored surface', () => {
|
|
73
|
-
it.each(SEVERITIES)('uses bg-<severity>-600 + text-<severity>-50 for %s', (sev) => {
|
|
74
|
-
const { surface } = getSeverityClasses('filled', sev);
|
|
75
|
-
expect(surface).toContain(`bg-${sev}-600`);
|
|
76
|
-
expect(surface).toContain(`text-${sev}-50`);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it.each(SEVERITIES)('uses border-<severity>-700 for %s', (sev) => {
|
|
80
|
-
const { border } = getSeverityClasses('filled', sev);
|
|
81
|
-
expect(border).toContain(`border-${sev}-700`);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it.each(SEVERITIES)('icon inherits the light tone (text-<severity>-50) for %s', (sev) => {
|
|
85
|
-
const { icon } = getSeverityClasses('filled', sev);
|
|
86
|
-
expect(icon).toContain(`text-${sev}-50`);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe('outlined variant — transparent surface', () => {
|
|
91
|
-
it.each(SEVERITIES)('uses bg-transparent + text-<severity>-700 for %s', (sev) => {
|
|
92
|
-
const { surface } = getSeverityClasses('outlined', sev);
|
|
93
|
-
expect(surface).toContain('bg-transparent');
|
|
94
|
-
expect(surface).toContain(`text-${sev}-700`);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it.each(SEVERITIES)('uses border-<severity>-300 for %s', (sev) => {
|
|
98
|
-
const { border } = getSeverityClasses('outlined', sev);
|
|
99
|
-
expect(border).toContain(`border-${sev}-300`);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('never reuses primary-* for info severity (info has its own token scale)', () => {
|
|
104
|
-
// Regression: Snackbar 1.0.x aliased `info` to `primary-*`. The
|
|
105
|
-
// shared foundation MUST use the dedicated `info-*` scale so a
|
|
106
|
-
// patchTheme({ info: … }) call does not bleed into primary.
|
|
107
|
-
for (const variant of VARIANTS) {
|
|
108
|
-
const classes = getSeverityClasses(variant, 'info');
|
|
109
|
-
const all = `${classes.surface} ${classes.border} ${classes.icon}`;
|
|
110
|
-
expect(all).not.toMatch(/\bprimary-/);
|
|
111
|
-
expect(all).toContain('info-');
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
describe('getSeverityRole', () => {
|
|
117
|
-
it('returns "alert" for assertive severities (warning, danger)', () => {
|
|
118
|
-
expect(getSeverityRole('warning')).toBe('alert');
|
|
119
|
-
expect(getSeverityRole('danger')).toBe('alert');
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('returns "status" for polite severities (info, success)', () => {
|
|
123
|
-
expect(getSeverityRole('info')).toBe('status');
|
|
124
|
-
expect(getSeverityRole('success')).toBe('status');
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
describe('SEVERITY_DEFAULT_ICON', () => {
|
|
129
|
-
it('exposes a default icon component for every severity', () => {
|
|
130
|
-
for (const sev of SEVERITIES) {
|
|
131
|
-
const Icon = SEVERITY_DEFAULT_ICON[sev];
|
|
132
|
-
expect(Icon).toBeDefined();
|
|
133
|
-
expect(typeof Icon).toBe('function');
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|