@dashforge/tw 0.6.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 (90) hide show
  1. package/CHANGELOG.md +258 -0
  2. package/THEME-AUDIT.md +175 -0
  3. package/dist/index.esm.js +973 -69
  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.types.d.ts +8 -0
  19. package/dist/src/components/Table/table.types.d.ts.map +1 -1
  20. package/dist/src/components/Tabs/tabs.variants.d.ts.map +1 -1
  21. package/dist/src/components/Tooltip/tooltip.variants.d.ts.map +1 -1
  22. package/dist/src/components/Typography/typography.variants.d.ts.map +1 -1
  23. package/dist/src/components/_shared/data/getNestedValue.d.ts.map +1 -0
  24. package/dist/src/components/{Table/_internal → _shared/data}/useColumnAutoDetect.d.ts +1 -1
  25. package/dist/src/components/_shared/data/useColumnAutoDetect.d.ts.map +1 -0
  26. package/dist/src/components/_shared/data/useControllableState.d.ts.map +1 -0
  27. package/dist/src/components/_shared/data/useDebouncedValue.d.ts.map +1 -0
  28. package/dist/src/components/{Table/_internal → _shared/data}/useTableFilter.d.ts +1 -1
  29. package/dist/src/components/_shared/data/useTableFilter.d.ts.map +1 -0
  30. package/dist/src/components/{Table/_internal → _shared/data}/useTableSearch.d.ts +1 -1
  31. package/dist/src/components/_shared/data/useTableSearch.d.ts.map +1 -0
  32. package/dist/src/components/{Table/_internal → _shared/data}/useTableSelection.d.ts +1 -1
  33. package/dist/src/components/_shared/data/useTableSelection.d.ts.map +1 -0
  34. package/dist/src/components/{Table/_internal → _shared/data}/useTableSort.d.ts +1 -1
  35. package/dist/src/components/_shared/data/useTableSort.d.ts.map +1 -0
  36. package/dist/src/components/_shared/data/useVirtualizer.d.ts +107 -0
  37. package/dist/src/components/_shared/data/useVirtualizer.d.ts.map +1 -0
  38. package/dist/src/index.d.ts +5 -2
  39. package/dist/src/index.d.ts.map +1 -1
  40. package/package.json +3 -3
  41. package/src/components/Accordion/accordion.variants.ts +5 -3
  42. package/src/components/Box/Box.test.tsx +32 -11
  43. package/src/components/Box/box.variants.ts +23 -4
  44. package/src/components/DataGrid/DataGrid.test.tsx +496 -0
  45. package/src/components/DataGrid/DataGrid.tsx +831 -0
  46. package/src/components/DataGrid/dataGrid.types.ts +189 -0
  47. package/src/components/DataGrid/dataGrid.variants.ts +144 -0
  48. package/src/components/Dialog/dialog.variants.ts +10 -6
  49. package/src/components/Divider/Divider.test.tsx +3 -1
  50. package/src/components/Divider/Divider.tsx +1 -1
  51. package/src/components/Divider/divider.variants.ts +2 -1
  52. package/src/components/Pagination/Pagination.tsx +3 -1
  53. package/src/components/Pagination/pagination.variants.ts +19 -13
  54. package/src/components/Popover/popover.variants.ts +10 -4
  55. package/src/components/Skeleton/skeleton.variants.ts +2 -1
  56. package/src/components/Table/Table.tsx +8 -8
  57. package/src/components/Table/table.types.ts +9 -0
  58. package/src/components/Tabs/tabs.variants.ts +19 -8
  59. package/src/components/Tooltip/tooltip.variants.ts +12 -2
  60. package/src/components/Typography/Typography.test.tsx +3 -1
  61. package/src/components/Typography/typography.variants.ts +6 -2
  62. package/src/components/{Table/_internal → _shared/data}/useColumnAutoDetect.test.ts +1 -1
  63. package/src/components/{Table/_internal → _shared/data}/useColumnAutoDetect.ts +1 -1
  64. package/src/components/{Table/_internal → _shared/data}/useTableFilter.ts +1 -1
  65. package/src/components/{Table/_internal → _shared/data}/useTableSearch.test.ts +1 -1
  66. package/src/components/{Table/_internal → _shared/data}/useTableSearch.ts +1 -1
  67. package/src/components/{Table/_internal → _shared/data}/useTableSelection.ts +1 -1
  68. package/src/components/{Table/_internal → _shared/data}/useTableSort.test.ts +1 -1
  69. package/src/components/{Table/_internal → _shared/data}/useTableSort.ts +1 -1
  70. package/src/components/_shared/data/useVirtualizer.test.ts +158 -0
  71. package/src/components/_shared/data/useVirtualizer.ts +199 -0
  72. package/src/components/_shared/themeIdentity.test.ts +113 -0
  73. package/src/index.ts +18 -2
  74. package/dist/src/components/Table/_internal/getNestedValue.d.ts.map +0 -1
  75. package/dist/src/components/Table/_internal/useColumnAutoDetect.d.ts.map +0 -1
  76. package/dist/src/components/Table/_internal/useControllableState.d.ts.map +0 -1
  77. package/dist/src/components/Table/_internal/useDebouncedValue.d.ts.map +0 -1
  78. package/dist/src/components/Table/_internal/useTableFilter.d.ts.map +0 -1
  79. package/dist/src/components/Table/_internal/useTableSearch.d.ts.map +0 -1
  80. package/dist/src/components/Table/_internal/useTableSelection.d.ts.map +0 -1
  81. package/dist/src/components/Table/_internal/useTableSort.d.ts.map +0 -1
  82. package/src/components/Table/_internal/themeIdentity.test.ts +0 -84
  83. /package/dist/src/components/{Table/_internal → _shared/data}/getNestedValue.d.ts +0 -0
  84. /package/dist/src/components/{Table/_internal → _shared/data}/useControllableState.d.ts +0 -0
  85. /package/dist/src/components/{Table/_internal → _shared/data}/useDebouncedValue.d.ts +0 -0
  86. /package/src/components/{Table/_internal → _shared/data}/getNestedValue.test.ts +0 -0
  87. /package/src/components/{Table/_internal → _shared/data}/getNestedValue.ts +0 -0
  88. /package/src/components/{Table/_internal → _shared/data}/useControllableState.ts +0 -0
  89. /package/src/components/{Table/_internal → _shared/data}/useDebouncedValue.ts +0 -0
  90. /package/src/components/{Table/_internal → _shared/data}/useTableSelection.test.ts +0 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Window descriptor — which slice of the row array is currently
3
+ * mounted in DOM, and how much spacer height to render above and
4
+ * below the visible window so the scrollbar size matches the
5
+ * "virtual" total height.
6
+ */
7
+ export interface VirtualizerWindow {
8
+ /** First row index inside the visible window (inclusive). */
9
+ startIndex: number;
10
+ /** Last row index inside the visible window (inclusive). */
11
+ endIndex: number;
12
+ /** Pixels to render above the visible rows (spacer top). */
13
+ paddingTop: number;
14
+ /** Pixels to render below the visible rows (spacer bottom). */
15
+ paddingBottom: number;
16
+ }
17
+ export interface UseVirtualizerArgs {
18
+ /** Total number of rows in the underlying data set. */
19
+ totalCount: number;
20
+ /** Fixed row height in pixels. */
21
+ rowHeight: number;
22
+ /**
23
+ * Visible viewport height in pixels. Pass the height of the
24
+ * scroll container.
25
+ */
26
+ viewportHeight: number;
27
+ /** Current scrollTop of the scroll container. */
28
+ scrollTop: number;
29
+ /**
30
+ * How many extra rows to render above / below the visible window
31
+ * for smoother scrolling (reduces blank-flash on fast scroll).
32
+ * @default 5
33
+ */
34
+ overscan?: number;
35
+ }
36
+ /**
37
+ * Compute the visible window of rows + the spacer heights given the
38
+ * current scroll position. Pure function — exported for testability.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * computeWindow({ totalCount: 1000, rowHeight: 48, viewportHeight: 600,
43
+ * scrollTop: 0, overscan: 5 });
44
+ * // → { startIndex: 0, endIndex: 17, paddingTop: 0, paddingBottom: 47136 }
45
+ * ```
46
+ */
47
+ export declare function computeWindow(args: UseVirtualizerArgs): VirtualizerWindow;
48
+ /**
49
+ * `useVirtualizer` — viewport-based row windowing for `<DataGrid>`.
50
+ *
51
+ * Hand-rolled (no `@tanstack/react-virtual` dep — constraint memorized
52
+ * in `feedback_dashforge_preset_is_identity` companion: "no new
53
+ * external runtime deps"). Uses scroll event + `requestAnimationFrame`
54
+ * debounce + `ResizeObserver` on the container. Fixed row height
55
+ * only in v1 — variable-height with measurement cache deferred to
56
+ * v1-bis.
57
+ *
58
+ * Returns:
59
+ * - `scrollRef`: attach to the scroll container `<div>`.
60
+ * - `window`: which row indices to mount + top/bottom spacer heights
61
+ * to preserve scroll-area size.
62
+ * - `viewportHeight`: current container height (re-measured on
63
+ * `ResizeObserver` ticks).
64
+ *
65
+ * The DataGrid renders `rows.slice(window.startIndex, window.endIndex + 1)`
66
+ * between two spacer `<tr style={{ height: paddingTop }} />` elements
67
+ * (above and below). This preserves `<table>` semantics — screen
68
+ * readers see a continuous structure with `aria-hidden` spacers.
69
+ *
70
+ * @example
71
+ * ```tsx
72
+ * const { scrollRef, window } = useVirtualizer({
73
+ * totalCount: rows.length,
74
+ * rowHeight: 48,
75
+ * overscan: 5,
76
+ * });
77
+ *
78
+ * return (
79
+ * <div ref={scrollRef} style={{ height: 600, overflow: 'auto' }}>
80
+ * <table>
81
+ * <tbody>
82
+ * <tr aria-hidden="true" style={{ height: window.paddingTop }} />
83
+ * {rows.slice(window.startIndex, window.endIndex + 1).map(...)}
84
+ * <tr aria-hidden="true" style={{ height: window.paddingBottom }} />
85
+ * </tbody>
86
+ * </table>
87
+ * </div>
88
+ * );
89
+ * ```
90
+ */
91
+ export declare function useVirtualizer(args: {
92
+ totalCount: number;
93
+ rowHeight: number;
94
+ overscan?: number;
95
+ /**
96
+ * Initial viewport height — used before the ResizeObserver
97
+ * settles on first paint. Pass an explicit `height` prop value
98
+ * if you have one; otherwise the hook re-measures on layout.
99
+ * @default 400
100
+ */
101
+ initialViewportHeight?: number;
102
+ }): {
103
+ scrollRef: React.RefObject<HTMLDivElement | null>;
104
+ window: VirtualizerWindow;
105
+ viewportHeight: number;
106
+ };
107
+ //# sourceMappingURL=useVirtualizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVirtualizer.d.ts","sourceRoot":"","sources":["../../../../../src/components/_shared/data/useVirtualizer.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAmBzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG;IACF,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB,CAqEA"}
@@ -119,7 +119,10 @@ export type { TableProps, TableColumn, TableColumnInferredType, TableCellContext
119
119
  export { tableVariants } from './components/Table/table.variants.js';
120
120
  export { RenderText, RenderTwoLine, RenderChip, RenderButton, RowActionsMenu, } from './components/Table/cells/index.js';
121
121
  export type { RenderTextProps, RenderTwoLineProps, RenderChipProps, RenderButtonProps, RowActionsMenuProps, TableRowAction, } from './components/Table/cells/index.js';
122
- export { getNestedValue } from './components/Table/_internal/getNestedValue.js';
122
+ export { getNestedValue } from './components/_shared/data/getNestedValue.js';
123
+ export { DataGrid } from './components/DataGrid/DataGrid.js';
124
+ export type { DataGridProps, DataGridSlotProps, DataGridSelectAllScope, DataGridServerSideFlags, DataGridPaginationConfig, } from './components/DataGrid/dataGrid.types.js';
125
+ export { dataGridVariants } from './components/DataGrid/dataGrid.variants.js';
123
126
  export { useAccessState } from './hooks/useAccessState.js';
124
127
  export { cn } from './utils/cn.js';
125
128
  export { tv } from 'tailwind-variants';
@@ -127,5 +130,5 @@ export type { VariantProps } from 'tailwind-variants';
127
130
  /**
128
131
  * Package version (synced with `package.json` at publish time).
129
132
  */
130
- export declare const VERSION = "0.6.0-beta";
133
+ export declare const VERSION = "0.7.0-beta";
131
134
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,YAAY,EACV,cAAc,EACd,kBAAkB,GACnB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,YAAY,EACV,WAAW,EACX,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAIxE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAEpF,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAI9E,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,YAAY,EACV,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAEvF,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,GACb,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAI9E,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzE,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAI1F,OAAO,EACL,cAAc,EACd,eAAe,GAChB,MAAM,+CAA+C,CAAC;AACvD,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAIhG,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAEvF,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,YAAY,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,YAAY,EACV,WAAW,EACX,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAI9E,OAAO,EACL,qBAAqB,EACrB,UAAU,GACX,MAAM,6CAA6C,CAAC;AACrD,YAAY,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,SAAS,EACT,cAAc,EACd,eAAe,GAChB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;AAE7F,OAAO,EACL,gBAAgB,EAChB,WAAW,GACZ,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAO9E,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAEpF,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,OAAO,EACP,eAAe,GAChB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOlE,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC/E,YAAY,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAI/F,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,YAAY,EACV,WAAW,EACX,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,YAAY,EACV,SAAS,EACT,aAAa,EACb,OAAO,GACR,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,YAAY,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,YAAY,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,aAAa,GACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAIjF,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAMpF,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,YAAY,EACV,UAAU,EACV,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,WAAW,GACZ,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,cAAc,GACf,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAInC,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dashforge/tw",
3
- "version": "0.6.0-beta",
3
+ "version": "0.7.0-beta",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.esm.js",
@@ -31,8 +31,8 @@
31
31
  "tailwind-variants": "^3.1.1",
32
32
  "vitest": "*",
33
33
  "@dashforge/forms": "0.2.3-beta",
34
- "@dashforge/rbac": "0.2.3-beta",
35
- "@dashforge/ui-core": "0.2.3-beta"
34
+ "@dashforge/ui-core": "0.2.3-beta",
35
+ "@dashforge/rbac": "0.2.3-beta"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": "^18.0.0 || ^19.0.0",
@@ -3,11 +3,13 @@ import { tv, type VariantProps } from 'tailwind-variants';
3
3
  export const accordionVariants = tv({
4
4
  slots: {
5
5
  root: 'w-full',
6
- item: 'border-b border-neutral-200 dark:border-neutral-800',
6
+ // Neutral palette auto-inverts via the dashforgePreset() CSS-var
7
+ // swap — no `dark:` variant needed (would double-invert).
8
+ item: 'border-b border-neutral-200',
7
9
  header: 'flex',
8
10
  trigger: [
9
11
  'flex flex-1 items-center justify-between py-3 text-left',
10
- 'text-sm font-medium text-neutral-900 dark:text-neutral-50',
12
+ 'text-sm font-medium text-neutral-900',
11
13
  'transition-all hover:underline',
12
14
  'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:rounded',
13
15
  '[&[data-state=open]>svg]:rotate-180',
@@ -15,7 +17,7 @@ export const accordionVariants = tv({
15
17
  'motion-reduce:transition-none',
16
18
  ],
17
19
  content: [
18
- 'overflow-hidden text-sm text-neutral-700 dark:text-neutral-300',
20
+ 'overflow-hidden text-sm text-neutral-700',
19
21
  'data-[state=open]:animate-accordion-down',
20
22
  'data-[state=closed]:animate-accordion-up',
21
23
  'motion-reduce:animate-none',
@@ -46,7 +46,11 @@ describe('<Box>', () => {
46
46
  const { container } = render(<Box variant="elevated" elevation={3}>x</Box>);
47
47
  const cls = container.firstElementChild?.className ?? '';
48
48
  expect(cls).toContain('bg-white');
49
- expect(cls).toContain('dark:bg-neutral-900');
49
+ // Sprint 4.3 theme identity sweep: corrected `dark:bg-neutral-900`
50
+ // (which resolved to near-white in dark mode via inversion — broken
51
+ // elevation) to `dark:bg-neutral-100` which resolves to `#171717`,
52
+ // one elevation tier above the page surface in dark mode.
53
+ expect(cls).toContain('dark:bg-neutral-100');
50
54
  expect(cls).toContain('shadow-md');
51
55
  expect(cls).not.toContain('border ');
52
56
  });
@@ -203,11 +207,17 @@ describe('<Box>', () => {
203
207
  const { container } = render(<Box variant="outlined" color={color}>x</Box>);
204
208
  const cls = container.firstElementChild?.className ?? '';
205
209
  if (color === 'neutral') {
206
- // neutral uses the special border-neutral-200 + bg-white shape
210
+ // Sprint 4.3 identity sweep: neutral outlined uses
211
+ // `border-neutral-200` (auto-inverts via CSS-var swap; no
212
+ // `dark:` needed) + `bg-white dark:bg-neutral-100`
213
+ // (bg-white is hardcoded so `dark:` is required; target
214
+ // `dark:bg-neutral-100` = `#171717` is one tier elevated
215
+ // above the page surface in dark mode).
207
216
  expect(cls).toContain('border-neutral-200');
208
217
  expect(cls).toContain('bg-white');
209
- expect(cls).toContain('dark:border-neutral-700');
210
- expect(cls).toContain('dark:bg-neutral-900');
218
+ expect(cls).toContain('dark:bg-neutral-100');
219
+ // No more dark:border-neutral-700 (auto-inverts).
220
+ expect(cls).not.toContain('dark:border-neutral-');
211
221
  } else {
212
222
  // primary/secondary/success/warning/danger/info share the
213
223
  // border-{color}-300 + bg-{color}-50/40 + dark:* pattern
@@ -229,10 +239,12 @@ describe('<Box>', () => {
229
239
  const { container } = render(<Box variant="soft" color={color}>x</Box>);
230
240
  const cls = container.firstElementChild?.className ?? '';
231
241
  if (color === 'neutral') {
242
+ // Sprint 4.3 identity sweep: both neutral classes auto-invert
243
+ // via the dashforgePreset() CSS-var swap — no `dark:` needed.
232
244
  expect(cls).toContain('bg-neutral-100');
233
245
  expect(cls).toContain('text-neutral-900');
234
- expect(cls).toContain('dark:bg-neutral-800');
235
- expect(cls).toContain('dark:text-neutral-100');
246
+ expect(cls).not.toContain('dark:bg-neutral-');
247
+ expect(cls).not.toContain('dark:text-neutral-');
236
248
  } else {
237
249
  expect(cls).toContain(`bg-${color}-100`);
238
250
  expect(cls).toContain(`text-${color}-900`);
@@ -254,10 +266,17 @@ describe('<Box>', () => {
254
266
  const { container } = render(<Box variant="solid" color={color}>x</Box>);
255
267
  const cls = container.firstElementChild?.className ?? '';
256
268
  if (color === 'neutral') {
269
+ // Sprint 4.3 identity sweep: solid neutral now uses
270
+ // `bg-neutral-900 text-neutral-50` (both auto-invert) — the
271
+ // accent surface inverts WITH the page (dark surface in
272
+ // light mode, light surface in dark mode), consistent with
273
+ // identity rule. Previously was `text-white` (no inversion)
274
+ // forcing double-invert pattern to stay readable.
257
275
  expect(cls).toContain('bg-neutral-900');
258
- expect(cls).toContain('text-white');
259
- expect(cls).toContain('dark:bg-neutral-100');
260
- expect(cls).toContain('dark:text-neutral-900');
276
+ expect(cls).toContain('text-neutral-50');
277
+ expect(cls).not.toContain('text-white');
278
+ expect(cls).not.toContain('dark:bg-neutral-');
279
+ expect(cls).not.toContain('dark:text-neutral-');
261
280
  } else if (color === 'warning') {
262
281
  // warning uses 500/600 instead of 600/500 to keep contrast
263
282
  // legible against an already-yellow surface in light mode.
@@ -289,9 +308,11 @@ describe('<Box>', () => {
289
308
  it('elevated + color="danger" stays on the neutral surface', () => {
290
309
  const { container } = render(<Box variant="elevated" color="danger">x</Box>);
291
310
  const cls = container.firstElementChild?.className ?? '';
292
- // elevated paints bg-white / dark:bg-neutral-900 regardless of intent
311
+ // elevated paints bg-white / dark:bg-neutral-100 regardless of
312
+ // intent (Sprint 4.3 sweep: dark target corrected to
313
+ // `dark:bg-neutral-100` for proper dark elevation).
293
314
  expect(cls).toContain('bg-white');
294
- expect(cls).toContain('dark:bg-neutral-900');
315
+ expect(cls).toContain('dark:bg-neutral-100');
295
316
  expect(cls).not.toContain('bg-danger-');
296
317
  expect(cls).not.toContain('border-danger-');
297
318
  });
@@ -55,7 +55,13 @@ export const boxVariants = tv({
55
55
  variant: {
56
56
  plain: '',
57
57
  outlined: 'border',
58
- elevated: 'bg-white dark:bg-neutral-900',
58
+ // `bg-white` is hardcoded (does NOT auto-invert via CSS vars),
59
+ // so the `dark:` variant is required. Target `dark:bg-neutral-100`
60
+ // resolves to `#171717` via the inversion → one elevation tier
61
+ // above the page surface (`bg-neutral-50` = `#0a0a0a`) in dark
62
+ // mode. `dark:bg-neutral-900` was wrong (resolved to near-white
63
+ // in dark mode — overpowering elevation).
64
+ elevated: 'bg-white dark:bg-neutral-100',
59
65
  soft: '',
60
66
  solid: '',
61
67
  },
@@ -165,7 +171,11 @@ export const boxVariants = tv({
165
171
  { variant: 'outlined', color: 'info',
166
172
  class: 'border-info-300 bg-info-50/40 dark:border-info-800 dark:bg-info-950/30' },
167
173
  { variant: 'outlined', color: 'neutral',
168
- class: 'border-neutral-200 bg-white dark:border-neutral-700 dark:bg-neutral-900' },
174
+ // border-neutral-200 auto-inverts via CSS var swap (no `dark:`
175
+ // needed). bg-white is hardcoded — `dark:bg-neutral-100` keeps
176
+ // elevation tier above page surface in dark mode (NOT
177
+ // `dark:bg-neutral-900` which renders near-white).
178
+ class: 'border-neutral-200 bg-white dark:bg-neutral-100' },
169
179
 
170
180
  // ─── soft × color ─────────────────────────────────────────────────
171
181
  { variant: 'soft', color: 'primary',
@@ -181,7 +191,9 @@ export const boxVariants = tv({
181
191
  { variant: 'soft', color: 'info',
182
192
  class: 'bg-info-100 text-info-900 dark:bg-info-950/50 dark:text-info-100' },
183
193
  { variant: 'soft', color: 'neutral',
184
- class: 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100' },
194
+ // Both neutral classes auto-invert via the dashforgePreset() CSS
195
+ // var swap — no `dark:` variants needed.
196
+ class: 'bg-neutral-100 text-neutral-900' },
185
197
 
186
198
  // ─── solid × color ────────────────────────────────────────────────
187
199
  { variant: 'solid', color: 'primary',
@@ -197,7 +209,14 @@ export const boxVariants = tv({
197
209
  { variant: 'solid', color: 'info',
198
210
  class: 'bg-info-600 text-white dark:bg-info-500' },
199
211
  { variant: 'solid', color: 'neutral',
200
- class: 'bg-neutral-900 text-white dark:bg-neutral-100 dark:text-neutral-900' },
212
+ // Solid neutral is the high-emphasis "always-foreground accent"
213
+ // variant. Both classes auto-invert: dark surface + light text
214
+ // in light mode (`#171717` / `#fafafa`) flips to light surface +
215
+ // dark text in dark mode (`#f5f5f5` / `#0a0a0a`). The
216
+ // accent inverts WITH the page surface — consistent with the
217
+ // identity rule. Previously used `text-white` (no auto-invert)
218
+ // which forced double-inversion to keep readable.
219
+ class: 'bg-neutral-900 text-neutral-50' },
201
220
  ],
202
221
 
203
222
  defaultVariants: {