@dashforge/tw 0.11.0-beta → 1.0.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 +13 -12
- package/COVERAGE.md +2 -2
- package/PARITY.md +7 -9
- package/PERFORMANCE.md +3 -4
- package/THEME-AUDIT.md +3 -4
- package/dist/components/Accordion/Accordion.d.ts +21 -0
- package/dist/components/Accordion/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion/accordion.types.d.ts +74 -0
- package/dist/components/Accordion/accordion.types.d.ts.map +1 -0
- package/dist/components/Accordion/accordion.variants.d.ts +58 -0
- package/dist/components/Accordion/accordion.variants.d.ts.map +1 -0
- package/dist/components/AppShell/AppShell.d.ts +46 -0
- package/dist/components/AppShell/AppShell.d.ts.map +1 -0
- package/dist/components/AppShell/appShell.types.d.ts +62 -0
- package/dist/components/AppShell/appShell.types.d.ts.map +1 -0
- package/dist/components/AppShell/appShell.variants.d.ts +65 -0
- package/dist/components/AppShell/appShell.variants.d.ts.map +1 -0
- package/dist/components/AspectRatio/AspectRatio.d.ts +36 -0
- package/dist/components/AspectRatio/AspectRatio.d.ts.map +1 -0
- package/dist/components/AspectRatio/aspectRatio.types.d.ts +50 -0
- package/dist/components/AspectRatio/aspectRatio.types.d.ts.map +1 -0
- package/dist/components/Autocomplete/Autocomplete.d.ts +32 -0
- package/dist/components/Autocomplete/Autocomplete.d.ts.map +1 -0
- package/dist/components/Autocomplete/autocomplete.types.d.ts +214 -0
- package/dist/components/Autocomplete/autocomplete.types.d.ts.map +1 -0
- package/dist/components/Autocomplete/autocomplete.variants.d.ts +214 -0
- package/dist/components/Autocomplete/autocomplete.variants.d.ts.map +1 -0
- package/dist/components/Box/Box.d.ts +36 -0
- package/dist/components/Box/Box.d.ts.map +1 -0
- package/dist/components/Box/box.types.d.ts +54 -0
- package/dist/components/Box/box.types.d.ts.map +1 -0
- package/dist/components/Box/box.variants.d.ts +402 -0
- package/dist/components/Box/box.variants.d.ts.map +1 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +23 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/components/Breadcrumbs/breadcrumbs.types.d.ts +98 -0
- package/dist/components/Breadcrumbs/breadcrumbs.types.d.ts.map +1 -0
- package/dist/components/Breadcrumbs/breadcrumbs.variants.d.ts +85 -0
- package/dist/components/Breadcrumbs/breadcrumbs.variants.d.ts.map +1 -0
- package/dist/components/Button/Button.d.ts +44 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/button.types.d.ts +66 -0
- package/dist/components/Button/button.types.d.ts.map +1 -0
- package/dist/components/Button/button.variants.d.ts +104 -0
- package/dist/components/Button/button.variants.d.ts.map +1 -0
- package/dist/components/Calendar/Calendar.d.ts +14 -0
- package/dist/components/Calendar/Calendar.d.ts.map +1 -0
- package/dist/components/Calendar/calendar.types.d.ts +72 -0
- package/dist/components/Calendar/calendar.types.d.ts.map +1 -0
- package/dist/components/Calendar/calendar.variants.d.ts +99 -0
- package/dist/components/Calendar/calendar.variants.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +31 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/checkbox.types.d.ts +86 -0
- package/dist/components/Checkbox/checkbox.types.d.ts.map +1 -0
- package/dist/components/Checkbox/checkbox.variants.d.ts +109 -0
- package/dist/components/Checkbox/checkbox.variants.d.ts.map +1 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +38 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/ConfirmDialog/confirmDialog.types.d.ts +80 -0
- package/dist/components/ConfirmDialog/confirmDialog.types.d.ts.map +1 -0
- package/dist/components/ConfirmDialog/confirmDialog.variants.d.ts +90 -0
- package/dist/components/ConfirmDialog/confirmDialog.variants.d.ts.map +1 -0
- package/dist/components/Container/Container.d.ts +35 -0
- package/dist/components/Container/Container.d.ts.map +1 -0
- package/dist/components/Container/container.types.d.ts +41 -0
- package/dist/components/Container/container.types.d.ts.map +1 -0
- package/dist/components/Container/container.variants.d.ts +93 -0
- package/dist/components/Container/container.variants.d.ts.map +1 -0
- package/dist/components/DataGrid/DataGrid.d.ts +29 -0
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -0
- package/dist/components/DataGrid/dataGrid.types.d.ts +214 -0
- package/dist/components/DataGrid/dataGrid.types.d.ts.map +1 -0
- package/dist/components/DataGrid/dataGrid.variants.d.ts +222 -0
- package/dist/components/DataGrid/dataGrid.variants.d.ts.map +1 -0
- package/dist/components/DataGrid/filters/ColumnFilters.d.ts +23 -0
- package/dist/components/DataGrid/filters/ColumnFilters.d.ts.map +1 -0
- package/dist/components/DataGrid/reorder/useColumnReorder.d.ts +50 -0
- package/dist/components/DataGrid/reorder/useColumnReorder.d.ts.map +1 -0
- package/dist/components/DataGrid/resize/useColumnResize.d.ts +39 -0
- package/dist/components/DataGrid/resize/useColumnResize.d.ts.map +1 -0
- package/dist/components/DataGrid/visibility/ColumnVisibilityMenu.d.ts +44 -0
- package/dist/components/DataGrid/visibility/ColumnVisibilityMenu.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePicker.d.ts +14 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker/datePicker.types.d.ts +88 -0
- package/dist/components/DatePicker/datePicker.types.d.ts.map +1 -0
- package/dist/components/DatePicker/datePicker.variants.d.ts +97 -0
- package/dist/components/DatePicker/datePicker.variants.d.ts.map +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +13 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker/dateRangePicker.types.d.ts +85 -0
- package/dist/components/DateRangePicker/dateRangePicker.types.d.ts.map +1 -0
- package/dist/components/DateRangePicker/dateRangePicker.variants.d.ts +183 -0
- package/dist/components/DateRangePicker/dateRangePicker.variants.d.ts.map +1 -0
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +13 -0
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -0
- package/dist/components/DateTimePicker/dateTimePicker.types.d.ts +90 -0
- package/dist/components/DateTimePicker/dateTimePicker.types.d.ts.map +1 -0
- package/dist/components/DateTimePicker/dateTimePicker.variants.d.ts +107 -0
- package/dist/components/DateTimePicker/dateTimePicker.variants.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.d.ts +17 -0
- package/dist/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog/dialog.types.d.ts +75 -0
- package/dist/components/Dialog/dialog.types.d.ts.map +1 -0
- package/dist/components/Dialog/dialog.variants.d.ts +80 -0
- package/dist/components/Dialog/dialog.variants.d.ts.map +1 -0
- package/dist/components/Divider/Divider.d.ts +50 -0
- package/dist/components/Divider/Divider.d.ts.map +1 -0
- package/dist/components/Divider/divider.types.d.ts +47 -0
- package/dist/components/Divider/divider.types.d.ts.map +1 -0
- package/dist/components/Divider/divider.variants.d.ts +129 -0
- package/dist/components/Divider/divider.variants.d.ts.map +1 -0
- package/dist/components/Grid/Grid.d.ts +32 -0
- package/dist/components/Grid/Grid.d.ts.map +1 -0
- package/dist/components/Grid/grid.types.d.ts +103 -0
- package/dist/components/Grid/grid.types.d.ts.map +1 -0
- package/dist/components/Grid/grid.variants.d.ts +453 -0
- package/dist/components/Grid/grid.variants.d.ts.map +1 -0
- package/dist/components/LeftNav/LeftNav.d.ts +34 -0
- package/dist/components/LeftNav/LeftNav.d.ts.map +1 -0
- package/dist/components/LeftNav/leftNav.types.d.ts +136 -0
- package/dist/components/LeftNav/leftNav.types.d.ts.map +1 -0
- package/dist/components/LeftNav/leftNav.variants.d.ts +143 -0
- package/dist/components/LeftNav/leftNav.variants.d.ts.map +1 -0
- package/dist/components/NumberField/NumberField.d.ts +18 -0
- package/dist/components/NumberField/NumberField.d.ts.map +1 -0
- package/dist/components/NumberField/numberField.types.d.ts +79 -0
- package/dist/components/NumberField/numberField.types.d.ts.map +1 -0
- package/dist/components/NumberField/numberField.variants.d.ts +169 -0
- package/dist/components/NumberField/numberField.variants.d.ts.map +1 -0
- package/dist/components/OTPField/OTPField.d.ts +25 -0
- package/dist/components/OTPField/OTPField.d.ts.map +1 -0
- package/dist/components/OTPField/otpField.types.d.ts +74 -0
- package/dist/components/OTPField/otpField.types.d.ts.map +1 -0
- package/dist/components/OTPField/otpField.variants.d.ts +105 -0
- package/dist/components/OTPField/otpField.variants.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.d.ts +32 -0
- package/dist/components/Pagination/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination/pagination.helpers.d.ts +23 -0
- package/dist/components/Pagination/pagination.helpers.d.ts.map +1 -0
- package/dist/components/Pagination/pagination.types.d.ts +120 -0
- package/dist/components/Pagination/pagination.types.d.ts.map +1 -0
- package/dist/components/Pagination/pagination.variants.d.ts +150 -0
- package/dist/components/Pagination/pagination.variants.d.ts.map +1 -0
- package/dist/components/Popover/Popover.d.ts +15 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -0
- package/dist/components/Popover/popover.types.d.ts +45 -0
- package/dist/components/Popover/popover.types.d.ts.map +1 -0
- package/dist/components/Popover/popover.variants.d.ts +34 -0
- package/dist/components/Popover/popover.variants.d.ts.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +35 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
- package/dist/components/RadioGroup/radioGroup.types.d.ts +103 -0
- package/dist/components/RadioGroup/radioGroup.types.d.ts.map +1 -0
- package/dist/components/RadioGroup/radioGroup.variants.d.ts +166 -0
- package/dist/components/RadioGroup/radioGroup.variants.d.ts.map +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +23 -0
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton/skeleton.types.d.ts +56 -0
- package/dist/components/Skeleton/skeleton.types.d.ts.map +1 -0
- package/dist/components/Skeleton/skeleton.variants.d.ts +110 -0
- package/dist/components/Skeleton/skeleton.variants.d.ts.map +1 -0
- package/dist/components/Snackbar/Snackbar.d.ts +37 -0
- package/dist/components/Snackbar/Snackbar.d.ts.map +1 -0
- package/dist/components/Snackbar/snackbar.types.d.ts +86 -0
- package/dist/components/Snackbar/snackbar.types.d.ts.map +1 -0
- package/dist/components/Snackbar/snackbar.variants.d.ts +153 -0
- package/dist/components/Snackbar/snackbar.variants.d.ts.map +1 -0
- package/dist/components/Stack/Stack.d.ts +24 -0
- package/dist/components/Stack/Stack.d.ts.map +1 -0
- package/dist/components/Stack/stack.types.d.ts +61 -0
- package/dist/components/Stack/stack.types.d.ts.map +1 -0
- package/dist/components/Stack/stack.variants.d.ts +163 -0
- package/dist/components/Stack/stack.variants.d.ts.map +1 -0
- package/dist/components/Switch/Switch.d.ts +15 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -0
- package/dist/components/Switch/switch.types.d.ts +47 -0
- package/dist/components/Switch/switch.types.d.ts.map +1 -0
- package/dist/components/Switch/switch.variants.d.ts +105 -0
- package/dist/components/Switch/switch.variants.d.ts.map +1 -0
- package/dist/components/Table/Table.d.ts +24 -0
- package/dist/components/Table/Table.d.ts.map +1 -0
- package/dist/components/Table/cells/RenderButton.d.ts +13 -0
- package/dist/components/Table/cells/RenderButton.d.ts.map +1 -0
- package/dist/components/Table/cells/RenderChip.d.ts +80 -0
- package/dist/components/Table/cells/RenderChip.d.ts.map +1 -0
- package/dist/components/Table/cells/RenderText.d.ts +21 -0
- package/dist/components/Table/cells/RenderText.d.ts.map +1 -0
- package/dist/components/Table/cells/RenderTwoLine.d.ts +20 -0
- package/dist/components/Table/cells/RenderTwoLine.d.ts.map +1 -0
- package/dist/components/Table/cells/RowActionsMenu.d.ts +36 -0
- package/dist/components/Table/cells/RowActionsMenu.d.ts.map +1 -0
- package/dist/components/Table/cells/index.d.ts +11 -0
- package/dist/components/Table/cells/index.d.ts.map +1 -0
- package/dist/components/Table/table.types.d.ts +399 -0
- package/dist/components/Table/table.types.d.ts.map +1 -0
- package/dist/components/Table/table.variants.d.ts +285 -0
- package/dist/components/Table/table.variants.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts +19 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs/tabs.types.d.ts +61 -0
- package/dist/components/Tabs/tabs.types.d.ts.map +1 -0
- package/dist/components/Tabs/tabs.variants.d.ts +82 -0
- package/dist/components/Tabs/tabs.variants.d.ts.map +1 -0
- package/dist/components/Tabs/useTabs.d.ts +55 -0
- package/dist/components/Tabs/useTabs.d.ts.map +1 -0
- package/dist/components/TextField/TextField.d.ts +25 -0
- package/dist/components/TextField/TextField.d.ts.map +1 -0
- package/dist/components/TextField/textField.types.d.ts +98 -0
- package/dist/components/TextField/textField.types.d.ts.map +1 -0
- package/dist/components/TextField/textField.variants.d.ts +166 -0
- package/dist/components/TextField/textField.variants.d.ts.map +1 -0
- package/dist/components/Textarea/Textarea.d.ts +16 -0
- package/dist/components/Textarea/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea/textarea.types.d.ts +63 -0
- package/dist/components/Textarea/textarea.types.d.ts.map +1 -0
- package/dist/components/Textarea/textarea.variants.d.ts +197 -0
- package/dist/components/Textarea/textarea.variants.d.ts.map +1 -0
- package/dist/components/TimePicker/TimePicker.d.ts +12 -0
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -0
- package/dist/components/TimePicker/timePicker.types.d.ts +80 -0
- package/dist/components/TimePicker/timePicker.types.d.ts.map +1 -0
- package/dist/components/TimePicker/timePicker.variants.d.ts +103 -0
- package/dist/components/TimePicker/timePicker.variants.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts +29 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/tooltip.types.d.ts +47 -0
- package/dist/components/Tooltip/tooltip.types.d.ts.map +1 -0
- package/dist/components/Tooltip/tooltip.variants.d.ts +34 -0
- package/dist/components/Tooltip/tooltip.variants.d.ts.map +1 -0
- package/dist/components/TopBar/TopBar.d.ts +33 -0
- package/dist/components/TopBar/TopBar.d.ts.map +1 -0
- package/dist/components/TopBar/topBar.types.d.ts +49 -0
- package/dist/components/TopBar/topBar.types.d.ts.map +1 -0
- package/dist/components/TopBar/topBar.variants.d.ts +79 -0
- package/dist/components/TopBar/topBar.variants.d.ts.map +1 -0
- package/dist/components/Typography/Typography.d.ts +42 -0
- package/dist/components/Typography/Typography.d.ts.map +1 -0
- package/dist/components/Typography/typography.types.d.ts +61 -0
- package/dist/components/Typography/typography.types.d.ts.map +1 -0
- package/dist/components/Typography/typography.variants.d.ts +167 -0
- package/dist/components/Typography/typography.variants.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +42 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/visuallyHidden.types.d.ts +42 -0
- package/dist/components/VisuallyHidden/visuallyHidden.types.d.ts.map +1 -0
- package/dist/components/_shared/data/getNestedValue.d.ts +20 -0
- package/dist/components/_shared/data/getNestedValue.d.ts.map +1 -0
- package/dist/components/_shared/data/useColumnAutoDetect.d.ts +45 -0
- package/dist/components/_shared/data/useColumnAutoDetect.d.ts.map +1 -0
- package/dist/components/_shared/data/useControllableState.d.ts +23 -0
- package/dist/components/_shared/data/useControllableState.d.ts.map +1 -0
- package/dist/components/_shared/data/useDebouncedValue.d.ts +10 -0
- package/dist/components/_shared/data/useDebouncedValue.d.ts.map +1 -0
- package/dist/components/_shared/data/useTableFilter.d.ts +36 -0
- package/dist/components/_shared/data/useTableFilter.d.ts.map +1 -0
- package/dist/components/_shared/data/useTableSearch.d.ts +23 -0
- package/dist/components/_shared/data/useTableSearch.d.ts.map +1 -0
- package/dist/components/_shared/data/useTableSelection.d.ts +25 -0
- package/dist/components/_shared/data/useTableSelection.d.ts.map +1 -0
- package/dist/components/_shared/data/useTableSort.d.ts +20 -0
- package/dist/components/_shared/data/useTableSort.d.ts.map +1 -0
- package/dist/components/_shared/data/useVirtualizer.d.ts +107 -0
- package/dist/components/_shared/data/useVirtualizer.d.ts.map +1 -0
- package/dist/components/_shared/resolveValidationState.d.ts +42 -0
- package/dist/components/_shared/resolveValidationState.d.ts.map +1 -0
- package/dist/hooks/useAccessState.d.ts +37 -0
- package/dist/hooks/useAccessState.d.ts.map +1 -0
- package/dist/index.d.ts +146 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/utils/cn.d.ts +26 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/package.json +7 -7
- package/src/components/TextField/TextField.test.tsx +5 -1
- package/vite.config.ts +8 -0
- package/vitest.config.mts +8 -1
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,17 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
12
12
|
> duplicated intentionally — no shared "lowest common denominator" headless
|
|
13
13
|
> layer.
|
|
14
14
|
|
|
15
|
+
## [1.0.0] — 2026-05-23
|
|
16
|
+
|
|
17
|
+
**Stable release.** First semver-stable version. The public API is now
|
|
18
|
+
governed by strict semver — any future breaking change requires a major
|
|
19
|
+
bump. Functionally identical to the previous beta tarball.
|
|
20
|
+
|
|
21
|
+
- Version: `1.0.0`
|
|
22
|
+
- Cross-package `@dashforge/*` peer-dependency ranges updated to `^1.0.0`.
|
|
23
|
+
- See the [top-level CHANGELOG](https://github.com/kensaadi/dashforge/blob/main/CHANGELOG.md#100---2026-05-23) for the coordinated release context.
|
|
24
|
+
- See [`MIGRATION.md`](https://github.com/kensaadi/dashforge/blob/main/MIGRATION.md) for the upgrade guide from any `0.x-beta` to `1.0.0` (no code changes required).
|
|
25
|
+
|
|
15
26
|
## [0.11.0-beta] — 2026-05-22
|
|
16
27
|
|
|
17
28
|
**Sprint 7 — Tabs.** `<Tabs>` rebuilt as a custom, clean-room component.
|
|
@@ -137,8 +148,8 @@ Strictly additive — no breaking changes on existing component APIs.
|
|
|
137
148
|
starts a column-reorder drag. On coarse-pointer (touch) devices the
|
|
138
149
|
reorder `draggable` affordance is disabled — native HTML5
|
|
139
150
|
drag-and-drop does not fire touch events, so it was a dead
|
|
140
|
-
interaction.
|
|
141
|
-
|
|
151
|
+
interaction. A pointer-event reorder covering touch is tracked
|
|
152
|
+
internally.
|
|
142
153
|
- **`Table`** now emits a dev-only `console.warn` when `getRowId` is
|
|
143
154
|
omitted while sort / search / selection / expandable rows are
|
|
144
155
|
active — the positional-index fallback breaks row identity on
|
|
@@ -1349,16 +1360,6 @@ have shipped as `0.2.2-beta` in isolation.
|
|
|
1349
1360
|
Breadcrumbs in its center slot, so fixing the Breadcrumbs link
|
|
1350
1361
|
fixes TopBar transitively.
|
|
1351
1362
|
|
|
1352
|
-
### Internal
|
|
1353
|
-
|
|
1354
|
-
- **`libs/dashforge/tw/CONSUMER-VALIDATION.md`** — Sprint 2 P1
|
|
1355
|
-
deliverable. Per-component status table for the dash-consumer
|
|
1356
|
-
end-to-end validation pass (24 components, 7-point check each).
|
|
1357
|
-
Records the pattern lesson that motivated the Autocomplete
|
|
1358
|
-
async fix: the bug was invisible to both unit tests (using
|
|
1359
|
-
static `options`) and the docs lab (static demo) — only a real
|
|
1360
|
-
consumer with `loadOptions` configured exposed it.
|
|
1361
|
-
|
|
1362
1363
|
### Compatibility
|
|
1363
1364
|
|
|
1364
1365
|
| Compatibility axis | Pre-`0.3.0` | Post-`0.3.0` |
|
package/COVERAGE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# COVERAGE — `@dashforge/tw`
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> Test-coverage audit for `@dashforge/tw`. Current numbers, the gap-fill
|
|
4
|
+
> performed, and the tracked debt.
|
|
5
5
|
|
|
6
6
|
## Current coverage (`vitest --coverage`, v8 provider)
|
|
7
7
|
|
package/PARITY.md
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
# `@dashforge/tw` ↔ `@dashforge/ui` parity audit
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> Per-component diff between the two Dashforge UI lines for the
|
|
4
|
+
> **10 bridge-integrated components**.
|
|
5
5
|
>
|
|
6
|
-
> **Motivation
|
|
7
|
-
> support customer migration MUI→TW (no consumer switches across UI
|
|
8
|
-
> ecosystems in real life). It exists because:
|
|
6
|
+
> **Motivation.** This audit ensures:
|
|
9
7
|
>
|
|
10
8
|
> 1. **Internal consistency** — a refactor on `@dashforge/ui` that
|
|
11
9
|
> doesn't land on `@dashforge/tw` would otherwise be invisible.
|
|
12
|
-
> 2. **Bridge contract validation** —
|
|
13
|
-
>
|
|
14
|
-
> 3. **
|
|
10
|
+
> 2. **Bridge contract validation** — the same `@dashforge/forms`
|
|
11
|
+
> schema works identically on both lines.
|
|
12
|
+
> 3. **Parallel starter-kit maintainability** — two parallel kits
|
|
15
13
|
> (one MUI, one TW) require call-site-level parity to stay
|
|
16
|
-
>
|
|
14
|
+
> in sync.
|
|
17
15
|
|
|
18
16
|
## Versions audited
|
|
19
17
|
|
package/PERFORMANCE.md
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
# `@dashforge/tw` performance baseline
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
5
|
-
>
|
|
6
|
-
> justify the regression in `CHANGELOG.md`.
|
|
3
|
+
> Establishes the performance commitment for `@dashforge/tw`. Every
|
|
4
|
+
> subsequent release should hold these numbers or justify any
|
|
5
|
+
> regression in `CHANGELOG.md`.
|
|
7
6
|
|
|
8
7
|
## Bundle size
|
|
9
8
|
|
package/THEME-AUDIT.md
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
# THEME-AUDIT — @dashforge/tw catalog identity sweep
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
5
|
-
> (memory: `feedback_dashforge_preset_is_identity`).
|
|
3
|
+
> Audit of every `@dashforge/tw` component against the **default
|
|
4
|
+
> `dashforgePreset()` identity rule**.
|
|
6
5
|
>
|
|
7
6
|
> **Rule recap.** The `dashforgePreset()` CSS-variable swap
|
|
8
7
|
> auto-inverts the neutral palette:
|
|
9
8
|
> `bg-neutral-50` / `text-neutral-900` etc. resolve to the
|
|
10
9
|
> appropriate physical color via `--df-tw-color-neutral-N`. Adding a
|
|
11
10
|
> `dark:` variant on a neutral class **double-inverts** the value
|
|
12
|
-
> and breaks dark mode. The
|
|
11
|
+
> and breaks dark mode. The Table fix established the
|
|
13
12
|
> canonical patterns; Sprint 4.3 applies them to the whole catalog.
|
|
14
13
|
|
|
15
14
|
## Scoring legend
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AccordionProps } from './accordion.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Dashforge TW `<Accordion>` — collapsible section list.
|
|
4
|
+
*
|
|
5
|
+
* Built on `@radix-ui/react-accordion`:
|
|
6
|
+
* - APG accordion pattern: `role="region"` on content, header
|
|
7
|
+
* button with `aria-expanded` and `aria-controls` linked to
|
|
8
|
+
* the panel.
|
|
9
|
+
* - Keyboard support: Space / Enter toggle, ArrowDown / ArrowUp
|
|
10
|
+
* move focus between triggers, Home / End to extremes.
|
|
11
|
+
* - Two modes:
|
|
12
|
+
* - `type="single"` — at most one section open at a time;
|
|
13
|
+
* `collapsible` allows clicking the open section to close it
|
|
14
|
+
* (default true).
|
|
15
|
+
* - `type="multiple"` — multiple sections open simultaneously.
|
|
16
|
+
*
|
|
17
|
+
* The trigger renders a chevron that flips 180° via CSS
|
|
18
|
+
* (`data-state=open` selector) — no React state, no JS animation.
|
|
19
|
+
*/
|
|
20
|
+
export declare function Accordion(props: AccordionProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=Accordion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/Accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAqE9C"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface AccordionSlotProps {
|
|
3
|
+
root?: {
|
|
4
|
+
className?: string;
|
|
5
|
+
};
|
|
6
|
+
item?: {
|
|
7
|
+
className?: string;
|
|
8
|
+
};
|
|
9
|
+
header?: {
|
|
10
|
+
className?: string;
|
|
11
|
+
};
|
|
12
|
+
trigger?: {
|
|
13
|
+
className?: string;
|
|
14
|
+
};
|
|
15
|
+
content?: {
|
|
16
|
+
className?: string;
|
|
17
|
+
};
|
|
18
|
+
chevron?: {
|
|
19
|
+
className?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Single accordion section — paired `{ value, header, content }`.
|
|
24
|
+
* The `value` is the canonical id (used in `value` / `defaultValue`
|
|
25
|
+
* to control which sections are expanded).
|
|
26
|
+
*/
|
|
27
|
+
export interface AccordionItem {
|
|
28
|
+
value: string;
|
|
29
|
+
/** Trigger label (clickable to expand / collapse). */
|
|
30
|
+
header: ReactNode;
|
|
31
|
+
/** Section body, revealed when this item is expanded. */
|
|
32
|
+
content: ReactNode;
|
|
33
|
+
/** Per-item disabled flag. */
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
}
|
|
36
|
+
interface AccordionBaseProps {
|
|
37
|
+
items: AccordionItem[];
|
|
38
|
+
/** Root className shortcut. */
|
|
39
|
+
sx?: string;
|
|
40
|
+
/** Per-slot overrides. */
|
|
41
|
+
slotProps?: AccordionSlotProps;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Single-mode props — at most one section open at a time.
|
|
45
|
+
* `collapsible: true` (default) lets the user close the open
|
|
46
|
+
* section by clicking it again.
|
|
47
|
+
*/
|
|
48
|
+
export interface AccordionSingleProps extends AccordionBaseProps {
|
|
49
|
+
type?: 'single';
|
|
50
|
+
value?: string;
|
|
51
|
+
defaultValue?: string;
|
|
52
|
+
onValueChange?: (value: string) => void;
|
|
53
|
+
/** @default true */
|
|
54
|
+
collapsible?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Multiple-mode props — any number of sections open simultaneously.
|
|
58
|
+
*/
|
|
59
|
+
export interface AccordionMultipleProps extends AccordionBaseProps {
|
|
60
|
+
type: 'multiple';
|
|
61
|
+
value?: string[];
|
|
62
|
+
defaultValue?: string[];
|
|
63
|
+
onValueChange?: (value: string[]) => void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Props for `<Accordion>`.
|
|
67
|
+
*
|
|
68
|
+
* Built on `@radix-ui/react-accordion`. Discriminated by `type`:
|
|
69
|
+
* - `type="single"` (default) — `value` is `string`.
|
|
70
|
+
* - `type="multiple"` — `value` is `string[]`.
|
|
71
|
+
*/
|
|
72
|
+
export type AccordionProps = AccordionSingleProps | AccordionMultipleProps;
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=accordion.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.types.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,EAAE,SAAS,CAAC;IAClB,yDAAyD;IACzD,OAAO,EAAE,SAAS,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oBAAoB;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type VariantProps } from 'tailwind-variants';
|
|
2
|
+
export declare const accordionVariants: import("tailwind-variants").TVReturnType<{
|
|
3
|
+
[key: string]: {
|
|
4
|
+
[key: string]: import("tailwind-merge").ClassNameValue | {
|
|
5
|
+
content?: import("tailwind-merge").ClassNameValue;
|
|
6
|
+
root?: import("tailwind-merge").ClassNameValue;
|
|
7
|
+
header?: import("tailwind-merge").ClassNameValue;
|
|
8
|
+
trigger?: import("tailwind-merge").ClassNameValue;
|
|
9
|
+
item?: import("tailwind-merge").ClassNameValue;
|
|
10
|
+
chevron?: import("tailwind-merge").ClassNameValue;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
} | {
|
|
14
|
+
[x: string]: {
|
|
15
|
+
[x: string]: import("tailwind-merge").ClassNameValue | {
|
|
16
|
+
content?: import("tailwind-merge").ClassNameValue;
|
|
17
|
+
root?: import("tailwind-merge").ClassNameValue;
|
|
18
|
+
header?: import("tailwind-merge").ClassNameValue;
|
|
19
|
+
trigger?: import("tailwind-merge").ClassNameValue;
|
|
20
|
+
item?: import("tailwind-merge").ClassNameValue;
|
|
21
|
+
chevron?: import("tailwind-merge").ClassNameValue;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
} | {}, {
|
|
25
|
+
root: string;
|
|
26
|
+
item: string;
|
|
27
|
+
header: string;
|
|
28
|
+
trigger: string[];
|
|
29
|
+
content: string[];
|
|
30
|
+
chevron: string[];
|
|
31
|
+
}, undefined, {
|
|
32
|
+
[key: string]: {
|
|
33
|
+
[key: string]: import("tailwind-merge").ClassNameValue | {
|
|
34
|
+
content?: import("tailwind-merge").ClassNameValue;
|
|
35
|
+
root?: import("tailwind-merge").ClassNameValue;
|
|
36
|
+
header?: import("tailwind-merge").ClassNameValue;
|
|
37
|
+
trigger?: import("tailwind-merge").ClassNameValue;
|
|
38
|
+
item?: import("tailwind-merge").ClassNameValue;
|
|
39
|
+
chevron?: import("tailwind-merge").ClassNameValue;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
} | {}, {
|
|
43
|
+
root: string;
|
|
44
|
+
item: string;
|
|
45
|
+
header: string;
|
|
46
|
+
trigger: string[];
|
|
47
|
+
content: string[];
|
|
48
|
+
chevron: string[];
|
|
49
|
+
}, import("tailwind-variants").TVReturnType<unknown, {
|
|
50
|
+
root: string;
|
|
51
|
+
item: string;
|
|
52
|
+
header: string;
|
|
53
|
+
trigger: string[];
|
|
54
|
+
content: string[];
|
|
55
|
+
chevron: string[];
|
|
56
|
+
}, undefined, unknown, unknown, undefined>>;
|
|
57
|
+
export type AccordionVariants = VariantProps<typeof accordionVariants>;
|
|
58
|
+
//# sourceMappingURL=accordion.variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.variants.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA2B5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AppShellProps } from './appShell.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Dashforge TW AppShell — top-level layout orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* ┌──────────────────────────────────────────┐
|
|
6
|
+
* │ header │ ← `header` slot
|
|
7
|
+
* ├────────┬─────────────────────────────────┤
|
|
8
|
+
* │ │ │
|
|
9
|
+
* │ nav │ main │ ← `nav` + `children`
|
|
10
|
+
* │ │ │
|
|
11
|
+
* ├────────┴─────────────────────────────────┤
|
|
12
|
+
* │ footer │ ← `footer` slot
|
|
13
|
+
* └──────────────────────────────────────────┘
|
|
14
|
+
*
|
|
15
|
+
* **Responsive**:
|
|
16
|
+
* - `≥ md`: nav stays in the inline slot at the left.
|
|
17
|
+
* - `< md`: nav becomes a slide-in drawer toggled by `navOpen`.
|
|
18
|
+
* A backdrop closes the drawer on click (mirrors `<Dialog>` UX).
|
|
19
|
+
*
|
|
20
|
+
* **Body scroll lock**: when the mobile drawer is open we add
|
|
21
|
+
* `overflow-hidden` to `<body>` to prevent dual-scroll wobble. The
|
|
22
|
+
* effect cleans up on close + on unmount.
|
|
23
|
+
*
|
|
24
|
+
* **A11y**:
|
|
25
|
+
* - `<main>` landmark wraps the content area.
|
|
26
|
+
* - `<header>` / `<footer>` come for free from their HTML tags.
|
|
27
|
+
* - The mobile drawer + backdrop participate in the standard
|
|
28
|
+
* "click outside to close" pattern — `Escape` closes the drawer
|
|
29
|
+
* too (added via global keydown).
|
|
30
|
+
* - **Focus trap** (WCAG 2.4.3) — when the mobile drawer opens:
|
|
31
|
+
* 1. The previously-focused element is captured.
|
|
32
|
+
* 2. Focus moves to the first focusable element inside the drawer.
|
|
33
|
+
* 3. Tab / Shift+Tab wrap inside the drawer (cycle from
|
|
34
|
+
* last → first and first → last) — Tab can never escape
|
|
35
|
+
* to the page underneath while the drawer is open.
|
|
36
|
+
* 4. On close, focus returns to the captured element (typically
|
|
37
|
+
* the hamburger toggle the user pressed to open the drawer).
|
|
38
|
+
* This pattern matches WAI-ARIA APG's modal dialog guidance even
|
|
39
|
+
* though the drawer isn't strictly a dialog — same focus
|
|
40
|
+
* management makes keyboard users' experience predictable.
|
|
41
|
+
* - **`role="dialog"` + `aria-modal="true"`** are applied to the
|
|
42
|
+
* drawer when open so screen readers announce it as a modal
|
|
43
|
+
* overlay rather than just an aside.
|
|
44
|
+
*/
|
|
45
|
+
export declare function AppShell(props: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
//# sourceMappingURL=AppShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/AppShell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA0BzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAsK5C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { AppShellVariants } from './appShell.variants.js';
|
|
3
|
+
export interface AppShellSlotProps {
|
|
4
|
+
root?: {
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
header?: {
|
|
8
|
+
className?: string;
|
|
9
|
+
};
|
|
10
|
+
nav?: {
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
navMobile?: {
|
|
14
|
+
className?: string;
|
|
15
|
+
};
|
|
16
|
+
main?: {
|
|
17
|
+
className?: string;
|
|
18
|
+
};
|
|
19
|
+
footer?: {
|
|
20
|
+
className?: string;
|
|
21
|
+
};
|
|
22
|
+
backdrop?: {
|
|
23
|
+
className?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Props for `<AppShell>`.
|
|
28
|
+
*
|
|
29
|
+
* Top-level layout orchestrator with 4 named slots:
|
|
30
|
+
*
|
|
31
|
+
* - `header` (top, sticky)
|
|
32
|
+
* - `nav` (left side, fixed-width on desktop, drawer on mobile)
|
|
33
|
+
* - `footer` (bottom, non-sticky)
|
|
34
|
+
* - `children` (main content, scrolls independently)
|
|
35
|
+
*
|
|
36
|
+
* Responsive behavior:
|
|
37
|
+
* - **≥ md (768px)**: nav is rendered inline at the left.
|
|
38
|
+
* - **< md**: nav slides in as an overlay drawer when
|
|
39
|
+
* `navOpen={true}` (controlled).
|
|
40
|
+
*
|
|
41
|
+
* The shell is router-agnostic — pass any nav/header content. Typical
|
|
42
|
+
* pairing is `<LeftNav>` + `<TopBar>` (with a hamburger button in
|
|
43
|
+
* `TopBar.start` that flips `navOpen`).
|
|
44
|
+
*/
|
|
45
|
+
export interface AppShellProps extends AppShellVariants {
|
|
46
|
+
header?: ReactNode;
|
|
47
|
+
nav?: ReactNode;
|
|
48
|
+
footer?: ReactNode;
|
|
49
|
+
children?: ReactNode;
|
|
50
|
+
/**
|
|
51
|
+
* Mobile drawer open state. Controlled — provide
|
|
52
|
+
* `onNavOpenChange` to update. When `undefined`, the mobile drawer
|
|
53
|
+
* is always closed (consumer hasn't wired up the toggle yet).
|
|
54
|
+
*/
|
|
55
|
+
navOpen?: boolean;
|
|
56
|
+
onNavOpenChange?: (open: boolean) => void;
|
|
57
|
+
/** Root className shortcut. */
|
|
58
|
+
sx?: string;
|
|
59
|
+
/** Per-slot className overrides. */
|
|
60
|
+
slotProps?: AppShellSlotProps;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=appShell.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appShell.types.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/appShell.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type VariantProps } from 'tailwind-variants';
|
|
2
|
+
/**
|
|
3
|
+
* Tailwind-variants recipe for `<AppShell>`.
|
|
4
|
+
*
|
|
5
|
+
* Slots:
|
|
6
|
+
* - `root` — outer flex column (full viewport)
|
|
7
|
+
* - `header` — top region
|
|
8
|
+
* - `body` — flex row holding nav + main
|
|
9
|
+
* - `nav` — desktop nav rail (md+)
|
|
10
|
+
* - `navMobile` — mobile drawer (slide-in)
|
|
11
|
+
* - `main` — scrollable content area
|
|
12
|
+
* - `footer` — bottom region
|
|
13
|
+
* - `backdrop` — semi-opaque overlay behind the mobile drawer
|
|
14
|
+
*/
|
|
15
|
+
export declare const appShellVariants: import("tailwind-variants").TVReturnType<{
|
|
16
|
+
navOpen: {
|
|
17
|
+
true: {
|
|
18
|
+
navMobile: string;
|
|
19
|
+
backdrop: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
}, {
|
|
23
|
+
root: string;
|
|
24
|
+
header: string;
|
|
25
|
+
body: string;
|
|
26
|
+
nav: string;
|
|
27
|
+
navMobile: string[];
|
|
28
|
+
main: string;
|
|
29
|
+
footer: string;
|
|
30
|
+
backdrop: string[];
|
|
31
|
+
}, undefined, {
|
|
32
|
+
navOpen: {
|
|
33
|
+
true: {
|
|
34
|
+
navMobile: string;
|
|
35
|
+
backdrop: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
}, {
|
|
39
|
+
root: string;
|
|
40
|
+
header: string;
|
|
41
|
+
body: string;
|
|
42
|
+
nav: string;
|
|
43
|
+
navMobile: string[];
|
|
44
|
+
main: string;
|
|
45
|
+
footer: string;
|
|
46
|
+
backdrop: string[];
|
|
47
|
+
}, import("tailwind-variants").TVReturnType<{
|
|
48
|
+
navOpen: {
|
|
49
|
+
true: {
|
|
50
|
+
navMobile: string;
|
|
51
|
+
backdrop: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}, {
|
|
55
|
+
root: string;
|
|
56
|
+
header: string;
|
|
57
|
+
body: string;
|
|
58
|
+
nav: string;
|
|
59
|
+
navMobile: string[];
|
|
60
|
+
main: string;
|
|
61
|
+
footer: string;
|
|
62
|
+
backdrop: string[];
|
|
63
|
+
}, undefined, unknown, unknown, undefined>>;
|
|
64
|
+
export type AppShellVariants = VariantProps<typeof appShellVariants>;
|
|
65
|
+
//# sourceMappingURL=appShell.variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appShell.variants.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/appShell.variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAoC3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AspectRatioProps } from './aspectRatio.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* `<AspectRatio>` — locks the aspect ratio of its child container,
|
|
4
|
+
* regardless of width. The classic use is responsive images and
|
|
5
|
+
* embedded media: an `<img>` that takes 100% of the available width
|
|
6
|
+
* but always renders at 16:9 (or 1:1, or whatever the source ratio is)
|
|
7
|
+
* — no jumping layouts during image load, no whitespace below the
|
|
8
|
+
* media, no JS measurement.
|
|
9
|
+
*
|
|
10
|
+
* Implementation: native CSS `aspect-ratio` property. Supported in
|
|
11
|
+
* every browser shipped from 2021 onward (Chrome 88, Firefox 89,
|
|
12
|
+
* Safari 15, Edge 88). No padding-bottom hack — that workaround
|
|
13
|
+
* predates the native property and brings ugly absolute-positioning
|
|
14
|
+
* requirements on the child.
|
|
15
|
+
*
|
|
16
|
+
* Why a component if it's "just one CSS property"?
|
|
17
|
+
* Two reasons:
|
|
18
|
+
* 1. Discoverability — `<AspectRatio ratio={16/9}>` documents the
|
|
19
|
+
* intent at the call site. `style={{ aspectRatio: '16/9' }}` is
|
|
20
|
+
* the same thing functionally, but harder to spot in a 200-line
|
|
21
|
+
* component file.
|
|
22
|
+
* 2. Composition — pairs naturally with `sx="rounded-xl overflow-hidden"`
|
|
23
|
+
* for the canonical "rounded clipped media" pattern. Forgetting
|
|
24
|
+
* the `overflow-hidden` is the #1 mistake we want to prevent
|
|
25
|
+
* through documentation (it's in this component's MDX, at the
|
|
26
|
+
* top of the Notes).
|
|
27
|
+
*
|
|
28
|
+
* Child contract:
|
|
29
|
+
* The single child is expected to fill the container — typically
|
|
30
|
+
* `<img>` / `<video>` with `className="w-full h-full object-cover"`.
|
|
31
|
+
* We don't force this via CSS (the consumer might want a centered
|
|
32
|
+
* icon instead of a filling image) — but it's the 99% case, and the
|
|
33
|
+
* docs show it first.
|
|
34
|
+
*/
|
|
35
|
+
export declare const AspectRatio: import("react").ForwardRefExoticComponent<AspectRatioProps & import("react").RefAttributes<HTMLElement>>;
|
|
36
|
+
//# sourceMappingURL=AspectRatio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AspectRatio.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/AspectRatio.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,WAAW,0GAiCvB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ElementType, HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Props for `<AspectRatio>` — content-shape primitive that locks the
|
|
4
|
+
* aspect ratio of its child regardless of width.
|
|
5
|
+
*
|
|
6
|
+
* Implementation: uses the native CSS `aspect-ratio` property
|
|
7
|
+
* (supported in all current browsers since 2021 — Chrome 88+, Firefox 89+,
|
|
8
|
+
* Safari 15+, Edge 88+). No padding-bottom hack, no JS measurement.
|
|
9
|
+
*
|
|
10
|
+
* `ratio` accepts:
|
|
11
|
+
* • A number — width / height. `16/9` is 1.7777…, `1` is square,
|
|
12
|
+
* `4/3` is 1.333…, `21/9` is ultrawide cinema.
|
|
13
|
+
* • A string with the CSS `aspect-ratio` syntax, e.g. `'16 / 9'`,
|
|
14
|
+
* `'4 / 3'`. Useful when you want the source ratio to read clearly
|
|
15
|
+
* in the JSX (`ratio="16 / 9"` is more legible than `ratio={16/9}`).
|
|
16
|
+
*
|
|
17
|
+
* The component renders a single element with `aspect-ratio: X` and
|
|
18
|
+
* `width: 100%`. The child is expected to fill it — typically an
|
|
19
|
+
* `<img>` or `<video>` with `className="w-full h-full object-cover"`.
|
|
20
|
+
*
|
|
21
|
+
* Why not a TV recipe?
|
|
22
|
+
* The ratio is arbitrary (`16/9`, `1`, `2.35`, anything). Tailwind
|
|
23
|
+
* has `aspect-square` / `aspect-video` / `aspect-[16/9]` arbitrary
|
|
24
|
+
* values, but enumerating every conceivable ratio in TV would be
|
|
25
|
+
* pointless. We set `style={{ aspectRatio }}` directly — pure CSS
|
|
26
|
+
* property, no class purge concerns.
|
|
27
|
+
*/
|
|
28
|
+
export interface AspectRatioProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {
|
|
29
|
+
/**
|
|
30
|
+
* Aspect ratio as width/height. Number (`16/9`) or CSS string
|
|
31
|
+
* (`'16 / 9'`). Default `1` (square).
|
|
32
|
+
*/
|
|
33
|
+
ratio?: number | string;
|
|
34
|
+
/**
|
|
35
|
+
* The child that fills the locked-ratio container. Typically an
|
|
36
|
+
* `<img>` or `<video>` with `className="w-full h-full object-cover"`.
|
|
37
|
+
*/
|
|
38
|
+
children?: ReactNode;
|
|
39
|
+
/**
|
|
40
|
+
* Override the rendered HTML tag. Defaults to `'div'`.
|
|
41
|
+
*/
|
|
42
|
+
as?: ElementType;
|
|
43
|
+
/**
|
|
44
|
+
* Utility classes appended to the base. Resolved via `tailwind-merge`.
|
|
45
|
+
* Common overrides: `sx="rounded-xl overflow-hidden"` to clip the
|
|
46
|
+
* child's overflow (image bleeds otherwise).
|
|
47
|
+
*/
|
|
48
|
+
sx?: string;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=aspectRatio.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aspectRatio.types.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/aspectRatio.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC;IACzD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IAEjB;;;;OAIG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;CACb"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AutocompleteOption, AutocompleteProps } from './autocomplete.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Dashforge TW Autocomplete — bridge-integrated single-select combobox.
|
|
4
|
+
*
|
|
5
|
+
* **Implementation note (F5-A, rev. 2)**
|
|
6
|
+
*
|
|
7
|
+
* The first revision wrapped `react-aria-components`' `<ComboBox>` to get
|
|
8
|
+
* AAA-grade a11y for free. In practice React Aria's internal state
|
|
9
|
+
* machine fought every controlled-state pattern we tried (the input text
|
|
10
|
+
* would not clear when `selectedKey` went to `null`, even with a forced
|
|
11
|
+
* remount via `key` bumping). To get deterministic behaviour we own all
|
|
12
|
+
* of the state ourselves:
|
|
13
|
+
*
|
|
14
|
+
* - `inputValue` — the visible text in the `<input>`
|
|
15
|
+
* - `isOpen` — popover visibility
|
|
16
|
+
* - `highlightedIndex` — keyboard navigation cursor
|
|
17
|
+
*
|
|
18
|
+
* A11y is still solid:
|
|
19
|
+
* - `role="combobox"` + `aria-autocomplete="list"` on the input
|
|
20
|
+
* - `aria-expanded`, `aria-controls`, `aria-activedescendant`
|
|
21
|
+
* - `role="listbox"` / `role="option"` with `aria-selected`
|
|
22
|
+
* - Full keyboard nav (↑/↓ navigate, Enter selects, Escape closes,
|
|
23
|
+
* Home/End jump, Tab closes, click-outside closes)
|
|
24
|
+
* - Required field gets `aria-required="true"`
|
|
25
|
+
*
|
|
26
|
+
* F5-A scope: single-select, static options, contains-substring filter
|
|
27
|
+
* (case-insensitive). Multi-select, free-solo text, generic option
|
|
28
|
+
* shapes, and async runtime options (`optionsFromFieldData`) are
|
|
29
|
+
* deferred to F5-A-bis.
|
|
30
|
+
*/
|
|
31
|
+
export declare function Autocomplete<TOption = AutocompleteOption>(props: AutocompleteProps<TOption>): import("react/jsx-runtime").JSX.Element | null;
|
|
32
|
+
//# sourceMappingURL=Autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autocomplete.d.ts","sourceRoot":"","sources":["../../../src/components/Autocomplete/Autocomplete.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,yBAAyB,CAAC;AA8FjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAG,kBAAkB,EACvD,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,kDAy5BlC"}
|