@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.
Files changed (105) hide show
  1. package/CHANGELOG.md +526 -0
  2. package/THEME-AUDIT.md +175 -0
  3. package/dist/index.esm.js +2504 -51
  4. package/dist/src/components/Accordion/accordion.variants.d.ts.map +1 -1
  5. package/dist/src/components/Box/box.variants.d.ts.map +1 -1
  6. package/dist/src/components/DataGrid/DataGrid.d.ts +29 -0
  7. package/dist/src/components/DataGrid/DataGrid.d.ts.map +1 -0
  8. package/dist/src/components/DataGrid/dataGrid.types.d.ts +171 -0
  9. package/dist/src/components/DataGrid/dataGrid.types.d.ts.map +1 -0
  10. package/dist/src/components/DataGrid/dataGrid.variants.d.ts +216 -0
  11. package/dist/src/components/DataGrid/dataGrid.variants.d.ts.map +1 -0
  12. package/dist/src/components/Dialog/dialog.variants.d.ts.map +1 -1
  13. package/dist/src/components/Divider/divider.variants.d.ts.map +1 -1
  14. package/dist/src/components/Pagination/Pagination.d.ts.map +1 -1
  15. package/dist/src/components/Pagination/pagination.variants.d.ts.map +1 -1
  16. package/dist/src/components/Popover/popover.variants.d.ts.map +1 -1
  17. package/dist/src/components/Skeleton/skeleton.variants.d.ts.map +1 -1
  18. package/dist/src/components/Table/Table.d.ts +24 -0
  19. package/dist/src/components/Table/Table.d.ts.map +1 -0
  20. package/dist/src/components/Table/cells/RenderButton.d.ts +13 -0
  21. package/dist/src/components/Table/cells/RenderButton.d.ts.map +1 -0
  22. package/dist/src/components/Table/cells/RenderChip.d.ts +80 -0
  23. package/dist/src/components/Table/cells/RenderChip.d.ts.map +1 -0
  24. package/dist/src/components/Table/cells/RenderText.d.ts +21 -0
  25. package/dist/src/components/Table/cells/RenderText.d.ts.map +1 -0
  26. package/dist/src/components/Table/cells/RenderTwoLine.d.ts +20 -0
  27. package/dist/src/components/Table/cells/RenderTwoLine.d.ts.map +1 -0
  28. package/dist/src/components/Table/cells/RowActionsMenu.d.ts +36 -0
  29. package/dist/src/components/Table/cells/RowActionsMenu.d.ts.map +1 -0
  30. package/dist/src/components/Table/cells/index.d.ts +11 -0
  31. package/dist/src/components/Table/cells/index.d.ts.map +1 -0
  32. package/dist/src/components/Table/table.types.d.ts +312 -0
  33. package/dist/src/components/Table/table.types.d.ts.map +1 -0
  34. package/dist/src/components/Table/table.variants.d.ts +285 -0
  35. package/dist/src/components/Table/table.variants.d.ts.map +1 -0
  36. package/dist/src/components/Tabs/tabs.variants.d.ts.map +1 -1
  37. package/dist/src/components/Tooltip/tooltip.variants.d.ts.map +1 -1
  38. package/dist/src/components/Typography/typography.variants.d.ts.map +1 -1
  39. package/dist/src/components/_shared/data/getNestedValue.d.ts +20 -0
  40. package/dist/src/components/_shared/data/getNestedValue.d.ts.map +1 -0
  41. package/dist/src/components/_shared/data/useColumnAutoDetect.d.ts +45 -0
  42. package/dist/src/components/_shared/data/useColumnAutoDetect.d.ts.map +1 -0
  43. package/dist/src/components/_shared/data/useControllableState.d.ts +23 -0
  44. package/dist/src/components/_shared/data/useControllableState.d.ts.map +1 -0
  45. package/dist/src/components/_shared/data/useDebouncedValue.d.ts +10 -0
  46. package/dist/src/components/_shared/data/useDebouncedValue.d.ts.map +1 -0
  47. package/dist/src/components/_shared/data/useTableFilter.d.ts +13 -0
  48. package/dist/src/components/_shared/data/useTableFilter.d.ts.map +1 -0
  49. package/dist/src/components/_shared/data/useTableSearch.d.ts +23 -0
  50. package/dist/src/components/_shared/data/useTableSearch.d.ts.map +1 -0
  51. package/dist/src/components/_shared/data/useTableSelection.d.ts +25 -0
  52. package/dist/src/components/_shared/data/useTableSelection.d.ts.map +1 -0
  53. package/dist/src/components/_shared/data/useTableSort.d.ts +20 -0
  54. package/dist/src/components/_shared/data/useTableSort.d.ts.map +1 -0
  55. package/dist/src/components/_shared/data/useVirtualizer.d.ts +107 -0
  56. package/dist/src/components/_shared/data/useVirtualizer.d.ts.map +1 -0
  57. package/dist/src/index.d.ts +10 -1
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/package.json +3 -3
  60. package/src/components/Accordion/accordion.variants.ts +5 -3
  61. package/src/components/Box/Box.test.tsx +32 -11
  62. package/src/components/Box/box.variants.ts +23 -4
  63. package/src/components/DataGrid/DataGrid.test.tsx +496 -0
  64. package/src/components/DataGrid/DataGrid.tsx +831 -0
  65. package/src/components/DataGrid/dataGrid.types.ts +189 -0
  66. package/src/components/DataGrid/dataGrid.variants.ts +144 -0
  67. package/src/components/Dialog/dialog.variants.ts +10 -6
  68. package/src/components/Divider/Divider.test.tsx +3 -1
  69. package/src/components/Divider/Divider.tsx +1 -1
  70. package/src/components/Divider/divider.variants.ts +2 -1
  71. package/src/components/Pagination/Pagination.tsx +3 -1
  72. package/src/components/Pagination/pagination.variants.ts +19 -13
  73. package/src/components/Popover/popover.variants.ts +10 -4
  74. package/src/components/Skeleton/skeleton.variants.ts +2 -1
  75. package/src/components/Table/Table.test.tsx +603 -0
  76. package/src/components/Table/Table.tsx +816 -0
  77. package/src/components/Table/cells/RenderButton.tsx +23 -0
  78. package/src/components/Table/cells/RenderChip.tsx +103 -0
  79. package/src/components/Table/cells/RenderText.tsx +37 -0
  80. package/src/components/Table/cells/RenderTwoLine.tsx +34 -0
  81. package/src/components/Table/cells/RowActionsMenu.tsx +147 -0
  82. package/src/components/Table/cells/index.ts +14 -0
  83. package/src/components/Table/table.types.ts +346 -0
  84. package/src/components/Table/table.variants.ts +207 -0
  85. package/src/components/Tabs/tabs.variants.ts +19 -8
  86. package/src/components/Tooltip/tooltip.variants.ts +12 -2
  87. package/src/components/Typography/Typography.test.tsx +3 -1
  88. package/src/components/Typography/typography.variants.ts +6 -2
  89. package/src/components/_shared/data/getNestedValue.test.ts +50 -0
  90. package/src/components/_shared/data/getNestedValue.ts +32 -0
  91. package/src/components/_shared/data/useColumnAutoDetect.test.ts +123 -0
  92. package/src/components/_shared/data/useColumnAutoDetect.ts +100 -0
  93. package/src/components/_shared/data/useControllableState.ts +48 -0
  94. package/src/components/_shared/data/useDebouncedValue.ts +24 -0
  95. package/src/components/_shared/data/useTableFilter.ts +37 -0
  96. package/src/components/_shared/data/useTableSearch.test.ts +115 -0
  97. package/src/components/_shared/data/useTableSearch.ts +66 -0
  98. package/src/components/_shared/data/useTableSelection.test.ts +100 -0
  99. package/src/components/_shared/data/useTableSelection.ts +100 -0
  100. package/src/components/_shared/data/useTableSort.test.ts +150 -0
  101. package/src/components/_shared/data/useTableSort.ts +141 -0
  102. package/src/components/_shared/data/useVirtualizer.test.ts +158 -0
  103. package/src/components/_shared/data/useVirtualizer.ts +199 -0
  104. package/src/components/_shared/themeIdentity.test.ts +113 -0
  105. 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).