@dashforge/tw 0.5.0-beta → 0.7.0-beta
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 +526 -0
- package/THEME-AUDIT.md +175 -0
- package/dist/index.esm.js +2504 -51
- package/dist/src/components/Accordion/accordion.variants.d.ts.map +1 -1
- package/dist/src/components/Box/box.variants.d.ts.map +1 -1
- package/dist/src/components/DataGrid/DataGrid.d.ts +29 -0
- package/dist/src/components/DataGrid/DataGrid.d.ts.map +1 -0
- package/dist/src/components/DataGrid/dataGrid.types.d.ts +171 -0
- package/dist/src/components/DataGrid/dataGrid.types.d.ts.map +1 -0
- package/dist/src/components/DataGrid/dataGrid.variants.d.ts +216 -0
- package/dist/src/components/DataGrid/dataGrid.variants.d.ts.map +1 -0
- package/dist/src/components/Dialog/dialog.variants.d.ts.map +1 -1
- package/dist/src/components/Divider/divider.variants.d.ts.map +1 -1
- package/dist/src/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/src/components/Pagination/pagination.variants.d.ts.map +1 -1
- package/dist/src/components/Popover/popover.variants.d.ts.map +1 -1
- package/dist/src/components/Skeleton/skeleton.variants.d.ts.map +1 -1
- package/dist/src/components/Table/Table.d.ts +24 -0
- package/dist/src/components/Table/Table.d.ts.map +1 -0
- package/dist/src/components/Table/cells/RenderButton.d.ts +13 -0
- package/dist/src/components/Table/cells/RenderButton.d.ts.map +1 -0
- package/dist/src/components/Table/cells/RenderChip.d.ts +80 -0
- package/dist/src/components/Table/cells/RenderChip.d.ts.map +1 -0
- package/dist/src/components/Table/cells/RenderText.d.ts +21 -0
- package/dist/src/components/Table/cells/RenderText.d.ts.map +1 -0
- package/dist/src/components/Table/cells/RenderTwoLine.d.ts +20 -0
- package/dist/src/components/Table/cells/RenderTwoLine.d.ts.map +1 -0
- package/dist/src/components/Table/cells/RowActionsMenu.d.ts +36 -0
- package/dist/src/components/Table/cells/RowActionsMenu.d.ts.map +1 -0
- package/dist/src/components/Table/cells/index.d.ts +11 -0
- package/dist/src/components/Table/cells/index.d.ts.map +1 -0
- package/dist/src/components/Table/table.types.d.ts +312 -0
- package/dist/src/components/Table/table.types.d.ts.map +1 -0
- package/dist/src/components/Table/table.variants.d.ts +285 -0
- package/dist/src/components/Table/table.variants.d.ts.map +1 -0
- package/dist/src/components/Tabs/tabs.variants.d.ts.map +1 -1
- package/dist/src/components/Tooltip/tooltip.variants.d.ts.map +1 -1
- package/dist/src/components/Typography/typography.variants.d.ts.map +1 -1
- package/dist/src/components/_shared/data/getNestedValue.d.ts +20 -0
- package/dist/src/components/_shared/data/getNestedValue.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useColumnAutoDetect.d.ts +45 -0
- package/dist/src/components/_shared/data/useColumnAutoDetect.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useControllableState.d.ts +23 -0
- package/dist/src/components/_shared/data/useControllableState.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useDebouncedValue.d.ts +10 -0
- package/dist/src/components/_shared/data/useDebouncedValue.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useTableFilter.d.ts +13 -0
- package/dist/src/components/_shared/data/useTableFilter.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useTableSearch.d.ts +23 -0
- package/dist/src/components/_shared/data/useTableSearch.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useTableSelection.d.ts +25 -0
- package/dist/src/components/_shared/data/useTableSelection.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useTableSort.d.ts +20 -0
- package/dist/src/components/_shared/data/useTableSort.d.ts.map +1 -0
- package/dist/src/components/_shared/data/useVirtualizer.d.ts +107 -0
- package/dist/src/components/_shared/data/useVirtualizer.d.ts.map +1 -0
- package/dist/src/index.d.ts +10 -1
- package/dist/src/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/components/Accordion/accordion.variants.ts +5 -3
- package/src/components/Box/Box.test.tsx +32 -11
- package/src/components/Box/box.variants.ts +23 -4
- package/src/components/DataGrid/DataGrid.test.tsx +496 -0
- package/src/components/DataGrid/DataGrid.tsx +831 -0
- package/src/components/DataGrid/dataGrid.types.ts +189 -0
- package/src/components/DataGrid/dataGrid.variants.ts +144 -0
- package/src/components/Dialog/dialog.variants.ts +10 -6
- package/src/components/Divider/Divider.test.tsx +3 -1
- package/src/components/Divider/Divider.tsx +1 -1
- package/src/components/Divider/divider.variants.ts +2 -1
- package/src/components/Pagination/Pagination.tsx +3 -1
- package/src/components/Pagination/pagination.variants.ts +19 -13
- package/src/components/Popover/popover.variants.ts +10 -4
- package/src/components/Skeleton/skeleton.variants.ts +2 -1
- package/src/components/Table/Table.test.tsx +603 -0
- package/src/components/Table/Table.tsx +816 -0
- package/src/components/Table/cells/RenderButton.tsx +23 -0
- package/src/components/Table/cells/RenderChip.tsx +103 -0
- package/src/components/Table/cells/RenderText.tsx +37 -0
- package/src/components/Table/cells/RenderTwoLine.tsx +34 -0
- package/src/components/Table/cells/RowActionsMenu.tsx +147 -0
- package/src/components/Table/cells/index.ts +14 -0
- package/src/components/Table/table.types.ts +346 -0
- package/src/components/Table/table.variants.ts +207 -0
- package/src/components/Tabs/tabs.variants.ts +19 -8
- package/src/components/Tooltip/tooltip.variants.ts +12 -2
- package/src/components/Typography/Typography.test.tsx +3 -1
- package/src/components/Typography/typography.variants.ts +6 -2
- package/src/components/_shared/data/getNestedValue.test.ts +50 -0
- package/src/components/_shared/data/getNestedValue.ts +32 -0
- package/src/components/_shared/data/useColumnAutoDetect.test.ts +123 -0
- package/src/components/_shared/data/useColumnAutoDetect.ts +100 -0
- package/src/components/_shared/data/useControllableState.ts +48 -0
- package/src/components/_shared/data/useDebouncedValue.ts +24 -0
- package/src/components/_shared/data/useTableFilter.ts +37 -0
- package/src/components/_shared/data/useTableSearch.test.ts +115 -0
- package/src/components/_shared/data/useTableSearch.ts +66 -0
- package/src/components/_shared/data/useTableSelection.test.ts +100 -0
- package/src/components/_shared/data/useTableSelection.ts +100 -0
- package/src/components/_shared/data/useTableSort.test.ts +150 -0
- package/src/components/_shared/data/useTableSort.ts +141 -0
- package/src/components/_shared/data/useVirtualizer.test.ts +158 -0
- package/src/components/_shared/data/useVirtualizer.ts +199 -0
- package/src/components/_shared/themeIdentity.test.ts +113 -0
- package/src/index.ts +59 -1
package/THEME-AUDIT.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# THEME-AUDIT — @dashforge/tw catalog identity sweep
|
|
2
|
+
|
|
3
|
+
> Sprint 4.3 deliverable (2026-05-19). Audit of every `@dashforge/tw`
|
|
4
|
+
> component against the **default `dashforgePreset()` identity rule**
|
|
5
|
+
> (memory: `feedback_dashforge_preset_is_identity`).
|
|
6
|
+
>
|
|
7
|
+
> **Rule recap.** The `dashforgePreset()` CSS-variable swap
|
|
8
|
+
> auto-inverts the neutral palette:
|
|
9
|
+
> `bg-neutral-50` / `text-neutral-900` etc. resolve to the
|
|
10
|
+
> appropriate physical color via `--df-tw-color-neutral-N`. Adding a
|
|
11
|
+
> `dark:` variant on a neutral class **double-inverts** the value
|
|
12
|
+
> and breaks dark mode. The Sprint 4.1 Table fix established the
|
|
13
|
+
> canonical patterns; Sprint 4.3 applies them to the whole catalog.
|
|
14
|
+
|
|
15
|
+
## Scoring legend
|
|
16
|
+
|
|
17
|
+
- **A** — Pure double inversion. REMOVE `dark:` variant entirely.
|
|
18
|
+
- **B** — `bg-white` / `text-white` paired with a wrong `dark:`
|
|
19
|
+
target. KEEP the `dark:` variant (white doesn't auto-invert) but
|
|
20
|
+
FIX the target — `dark:bg-neutral-900` in dark mode resolves to
|
|
21
|
+
near-white (broken); use `dark:bg-neutral-100` for proper dark
|
|
22
|
+
elevated surface.
|
|
23
|
+
- **C** — Intentional `dark:` on color palette (`primary`,
|
|
24
|
+
`success`, `warning`, `danger`, `info`, `secondary`). KEEP — color
|
|
25
|
+
palettes don't auto-invert; explicit `dark:` is a design choice.
|
|
26
|
+
- **D** — Component-specific exception (e.g. Tooltip wants
|
|
27
|
+
high-contrast inversion against the page). Document why kept.
|
|
28
|
+
|
|
29
|
+
## Per-file findings
|
|
30
|
+
|
|
31
|
+
### Accordion (`accordion.variants.ts`)
|
|
32
|
+
|
|
33
|
+
| Line | Class | Category | Fix |
|
|
34
|
+
|---|---|---|---|
|
|
35
|
+
| 6 | `border-b border-neutral-200 dark:border-neutral-800` | A | `border-b border-neutral-200` |
|
|
36
|
+
| 10 | `text-sm font-medium text-neutral-900 dark:text-neutral-50` | A | `text-sm font-medium text-neutral-900` |
|
|
37
|
+
| 18 | `overflow-hidden text-sm text-neutral-700 dark:text-neutral-300` | A | drop `dark:text-neutral-300` |
|
|
38
|
+
|
|
39
|
+
### Box (`box.variants.ts`)
|
|
40
|
+
|
|
41
|
+
| Line | Class | Category | Fix |
|
|
42
|
+
|---|---|---|---|
|
|
43
|
+
| 58 | `bg-white dark:bg-neutral-900` (elevated) | B | `bg-white dark:bg-neutral-100` (dark-mode elevation tier above page surface) |
|
|
44
|
+
| 168 | `border-neutral-200 bg-white dark:border-neutral-700 dark:bg-neutral-900` (outlined) | A + B | `border-neutral-200 bg-white dark:bg-neutral-100` (border auto-inverts; bg keeps `bg-white` + corrected dark target) |
|
|
45
|
+
| 184 | `bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100` (soft) | A | `bg-neutral-100 text-neutral-900` |
|
|
46
|
+
| 200 | `bg-neutral-900 text-white dark:bg-neutral-100 dark:text-neutral-900` (solid neutral) | D | `bg-neutral-900 text-neutral-50` (auto-invert — solid neutral becomes inverted accent: dark surface in light mode, light surface in dark mode; consistent with identity rule) |
|
|
47
|
+
|
|
48
|
+
### Dialog (`dialog.variants.ts`)
|
|
49
|
+
|
|
50
|
+
| Line | Class | Category | Fix |
|
|
51
|
+
|---|---|---|---|
|
|
52
|
+
| 29 | `w-full bg-white dark:bg-neutral-900 rounded-lg shadow-xl` | B | `dark:bg-neutral-100` |
|
|
53
|
+
| 30 | `border border-neutral-200 dark:border-neutral-800` | A | drop `dark:` |
|
|
54
|
+
| 37 | `text-lg ... text-neutral-900 dark:text-neutral-50` | A | drop `dark:` |
|
|
55
|
+
| 38 | `text-sm text-neutral-600 dark:text-neutral-400` | A | drop `dark:` |
|
|
56
|
+
| 42 | `dark:text-neutral-400 dark:hover:text-neutral-50` (close button) | A | drop both `dark:` |
|
|
57
|
+
| 43 | `hover:bg-neutral-100 dark:hover:bg-neutral-800` | A | drop `dark:` |
|
|
58
|
+
|
|
59
|
+
### Divider (`divider.variants.ts` + `Divider.tsx`)
|
|
60
|
+
|
|
61
|
+
| File / Line | Class | Category | Fix |
|
|
62
|
+
|---|---|---|---|
|
|
63
|
+
| `divider.variants.ts:88` | `border-neutral-200 dark:border-neutral-800` (neutral color variant) | A | drop `dark:` |
|
|
64
|
+
| `Divider.tsx:131` | `text-sm text-neutral-500 dark:text-neutral-400` (label) | A | drop `dark:` |
|
|
65
|
+
|
|
66
|
+
### Pagination (`pagination.variants.ts` + `Pagination.tsx`)
|
|
67
|
+
|
|
68
|
+
10 violations — full sweep of borders / text / bg / hover / active-button.
|
|
69
|
+
|
|
70
|
+
| Line | Class | Category | Fix |
|
|
71
|
+
|---|---|---|---|
|
|
72
|
+
| `variants:26` summary | `text-neutral-600 dark:text-neutral-400` | A | drop |
|
|
73
|
+
| `variants:30, 44, 58` borders | `border border-neutral-300 dark:border-neutral-700` | A | drop |
|
|
74
|
+
| `variants:31, 45, 59` button/selector/input bg | `bg-white dark:bg-neutral-900` | B → drop entirely | use `bg-neutral-50` (auto-inverts; border provides separation against page) |
|
|
75
|
+
| `variants:32, 46, 55` button text | `text-neutral-700 dark:text-neutral-300` | A | drop |
|
|
76
|
+
| `variants:33, 47` button hover bg | `hover:bg-neutral-50 dark:hover:bg-neutral-800` | A | `hover:bg-neutral-100` (1 elevation tier; auto-inverts) |
|
|
77
|
+
| `variants:60` jumpInput text | `text-neutral-900 dark:text-neutral-50` | A | drop |
|
|
78
|
+
| `Pagination.tsx:241` select bg+border | `border ... dark:border-neutral-700 bg-white dark:bg-neutral-900` | B → drop | `border border-neutral-300 bg-neutral-50` |
|
|
79
|
+
|
|
80
|
+
### Popover (`popover.variants.ts`)
|
|
81
|
+
|
|
82
|
+
| Line | Class | Category | Fix |
|
|
83
|
+
|---|---|---|---|
|
|
84
|
+
| 6 | `border border-neutral-200 dark:border-neutral-800` | A | drop |
|
|
85
|
+
| 7 | `bg-white dark:bg-neutral-900 p-4 shadow-lg` | B | `dark:bg-neutral-100` |
|
|
86
|
+
| 8 | `text-sm text-neutral-900 dark:text-neutral-50` | A | drop |
|
|
87
|
+
| 14 | `fill-white dark:fill-neutral-900` (arrow) | B | `fill-white dark:fill-neutral-100` (match content bg) |
|
|
88
|
+
|
|
89
|
+
### Skeleton (`skeleton.variants.ts`)
|
|
90
|
+
|
|
91
|
+
| Line | Class | Category | Fix |
|
|
92
|
+
|---|---|---|---|
|
|
93
|
+
| 38 | `bg-neutral-200 dark:bg-neutral-800` | A | drop `dark:` (auto-inverts — skeleton placeholder slightly more visible than page surface in both modes) |
|
|
94
|
+
|
|
95
|
+
### Tabs (`tabs.variants.ts`)
|
|
96
|
+
|
|
97
|
+
| Line | Class | Category | Fix |
|
|
98
|
+
|---|---|---|---|
|
|
99
|
+
| 22 | `border-b border-neutral-200 dark:border-neutral-800` (underline list) | A | drop |
|
|
100
|
+
| 24 | `... text-neutral-600 dark:text-neutral-400` (underline trigger) | A | drop |
|
|
101
|
+
| 25 | `hover:text-neutral-900 dark:hover:text-neutral-50` | A | drop |
|
|
102
|
+
| 31 | `bg-neutral-100 dark:bg-neutral-800 p-1` (pill list) | A | drop |
|
|
103
|
+
| 33 | `... text-neutral-600 dark:text-neutral-400` (pill trigger) | A | drop |
|
|
104
|
+
| 34 | `hover:text-neutral-900 dark:hover:text-neutral-50` | A | drop |
|
|
105
|
+
| 35 | `data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-900` (pill active) | B | `dark:bg-neutral-100` |
|
|
106
|
+
| 36 | `data-[state=active]:text-neutral-900 dark:data-[state=active]:text-neutral-50` | A | drop |
|
|
107
|
+
|
|
108
|
+
### Tooltip (`tooltip.variants.ts`)
|
|
109
|
+
|
|
110
|
+
Tooltip historically used a "fixed dark surface in both modes" pattern.
|
|
111
|
+
Per the identity rule, **auto-invert** is the right behavior: dark
|
|
112
|
+
tooltip on light page (light mode), light tooltip on dark page (dark
|
|
113
|
+
mode) — the inversion **is** the high-contrast effect.
|
|
114
|
+
|
|
115
|
+
| Line | Class | Category | Fix |
|
|
116
|
+
|---|---|---|---|
|
|
117
|
+
| 8 | `bg-neutral-900 text-neutral-50` + `dark:bg-neutral-50 dark:text-neutral-900` | A | drop the `dark:` line entirely (the base classes already auto-invert and give the high-contrast effect against the page) |
|
|
118
|
+
| 14 | `fill-neutral-900 dark:fill-neutral-50` (arrow) | A | drop `dark:` (arrow auto-inverts with content bg) |
|
|
119
|
+
|
|
120
|
+
### Typography (`typography.variants.ts`)
|
|
121
|
+
|
|
122
|
+
| Line | Class | Category | Fix |
|
|
123
|
+
|---|---|---|---|
|
|
124
|
+
| 65 | `neutral: 'text-neutral-900 dark:text-neutral-100'` | A | `'text-neutral-900'` |
|
|
125
|
+
| 66 | `muted: 'text-neutral-600 dark:text-neutral-400'` | A | `'text-neutral-600'` |
|
|
126
|
+
|
|
127
|
+
### Table-side (Sprint 4.1 — already fixed)
|
|
128
|
+
|
|
129
|
+
Per-file already corrected in Sprint 4.1. Sprint 4.3 just verifies
|
|
130
|
+
the regression guard (themeIdentity test) is promoted to global so
|
|
131
|
+
the rest of the catalog is covered too.
|
|
132
|
+
|
|
133
|
+
## Summary
|
|
134
|
+
|
|
135
|
+
| Component | Violations | Fix categories |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| Accordion | 3 | A × 3 |
|
|
138
|
+
| Box | 4 | A + B + D |
|
|
139
|
+
| Dialog | 6 | A × 5 + B × 1 |
|
|
140
|
+
| Divider | 2 | A × 2 |
|
|
141
|
+
| Pagination | 10 | A × 7 + B × 3 |
|
|
142
|
+
| Popover | 4 | A × 3 + B × 1 |
|
|
143
|
+
| Skeleton | 1 | A × 1 |
|
|
144
|
+
| Tabs | 8 | A × 7 + B × 1 |
|
|
145
|
+
| Tooltip | 2 | A × 2 (was "double-inverted to preserve fixed look" — auto-invert is now the canonical choice) |
|
|
146
|
+
| Typography | 2 | A × 2 |
|
|
147
|
+
| **Total** | **42** | **31 A + 5 B + 1 D + 5 fixed already** |
|
|
148
|
+
|
|
149
|
+
## Color palettes — NOT touched
|
|
150
|
+
|
|
151
|
+
`dark:` variants on `primary`, `secondary`, `success`, `warning`,
|
|
152
|
+
`danger`, `info` palettes are **intentional** — those palettes do
|
|
153
|
+
not auto-invert (same physical color in both modes), so the
|
|
154
|
+
`dark:` shift is a design choice for tone refinement. They stay.
|
|
155
|
+
|
|
156
|
+
Affected sites (kept as-is):
|
|
157
|
+
|
|
158
|
+
- `Box` compound variants (`outlined/soft/solid` × color) for the
|
|
159
|
+
6 color palettes (lines 188-198 in `box.variants.ts`)
|
|
160
|
+
- `RenderChip` color rows (Sprint 4.1 decision)
|
|
161
|
+
- `RowActionsMenu` `text-danger-700 dark:text-danger-300` and same
|
|
162
|
+
for warning
|
|
163
|
+
|
|
164
|
+
## Sprint 4.3 deliverables
|
|
165
|
+
|
|
166
|
+
1. ✅ THEME-AUDIT.md (this file)
|
|
167
|
+
2. ⏳ Apply fixes per-file (P3)
|
|
168
|
+
3. ⏳ Promote `themeIdentity.test.ts` from `Table/_internal/` to
|
|
169
|
+
package-level scanner walking `libs/dashforge/tw/src/components/**`
|
|
170
|
+
(P2). Excludes `*.test.*` files. The test fails any future
|
|
171
|
+
`dark:*-neutral-N` reintroduction.
|
|
172
|
+
4. ⏳ Visual regression catch in `dash` (manual check in both
|
|
173
|
+
light + dark mode)
|
|
174
|
+
5. ⏳ Release `@dashforge/tw@0.7.0-beta` — expected bundle to
|
|
175
|
+
**shrink** by 1-3 KB gz (removing redundant classes).
|