@astryxdesign/core 0.1.0 → 0.1.1-canary.080d887

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 (170) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +119 -1
  3. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
  4. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  5. package/dist/AvatarGroup/AvatarGroupOverflow.js +4 -1
  6. package/dist/Banner/Banner.d.ts +7 -0
  7. package/dist/Banner/Banner.d.ts.map +1 -1
  8. package/dist/Banner/Banner.js +9 -2
  9. package/dist/Button/Button.d.ts +12 -2
  10. package/dist/Button/Button.d.ts.map +1 -1
  11. package/dist/Button/Button.js +51 -13
  12. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  13. package/dist/Chat/ChatLayoutScrollButton.js +5 -1
  14. package/dist/ContextMenu/ContextMenu.js +2 -2
  15. package/dist/DropdownMenu/DropdownMenu.js +2 -2
  16. package/dist/DropdownMenu/{renderXDSDropdownItems.d.ts → renderDropdownItems.d.ts} +3 -3
  17. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -0
  18. package/dist/DropdownMenu/{renderXDSDropdownItems.js → renderDropdownItems.js} +2 -2
  19. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  20. package/dist/EmptyState/EmptyState.js +7 -1
  21. package/dist/HoverCard/HoverCard.d.ts +2 -2
  22. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  23. package/dist/HoverCard/HoverCard.js +18 -6
  24. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  25. package/dist/HoverCard/useHoverCard.js +6 -3
  26. package/dist/Kbd/Kbd.d.ts.map +1 -1
  27. package/dist/Kbd/Kbd.js +1 -1
  28. package/dist/Layer/useLayer.d.ts +13 -0
  29. package/dist/Layer/useLayer.d.ts.map +1 -1
  30. package/dist/Layer/useLayer.js +7 -2
  31. package/dist/Layout/Layout.d.ts +10 -1
  32. package/dist/Layout/Layout.d.ts.map +1 -1
  33. package/dist/Layout/Layout.js +5 -1
  34. package/dist/Markdown/Markdown.d.ts.map +1 -1
  35. package/dist/Markdown/Markdown.js +13 -3
  36. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  37. package/dist/MobileNav/MobileNav.js +13 -0
  38. package/dist/Outline/Outline.d.ts +3 -2
  39. package/dist/Outline/Outline.d.ts.map +1 -1
  40. package/dist/Outline/Outline.js +23 -4
  41. package/dist/Outline/useScrollSpy.d.ts +14 -1
  42. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  43. package/dist/Outline/useScrollSpy.js +161 -50
  44. package/dist/Pagination/Pagination.d.ts.map +1 -1
  45. package/dist/Pagination/Pagination.js +31 -27
  46. package/dist/Resizable/useResizable.d.ts.map +1 -1
  47. package/dist/Resizable/useResizable.js +1 -5
  48. package/dist/Selector/Selector.d.ts.map +1 -1
  49. package/dist/Selector/Selector.js +1 -1
  50. package/dist/Slider/Slider.js +2 -2
  51. package/dist/Table/BaseTable.d.ts.map +1 -1
  52. package/dist/Table/BaseTable.js +26 -8
  53. package/dist/Table/Table.d.ts.map +1 -1
  54. package/dist/Table/Table.js +30 -7
  55. package/dist/Table/index.d.ts +3 -1
  56. package/dist/Table/index.d.ts.map +1 -1
  57. package/dist/Table/index.js +1 -0
  58. package/dist/Table/plugins/stickyColumns/index.d.ts +3 -0
  59. package/dist/Table/plugins/stickyColumns/index.d.ts.map +1 -0
  60. package/dist/Table/plugins/stickyColumns/index.js +3 -0
  61. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +25 -0
  62. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -0
  63. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +376 -0
  64. package/dist/Table/types.d.ts +90 -5
  65. package/dist/Table/types.d.ts.map +1 -1
  66. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  67. package/dist/Table/useBaseTablePlugins.js +1 -1
  68. package/dist/Timestamp/Timestamp.d.ts +1 -1
  69. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  70. package/dist/Timestamp/Timestamp.js +28 -3
  71. package/dist/ToggleButton/ToggleButton.d.ts +10 -5
  72. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  73. package/dist/ToggleButton/ToggleButton.js +40 -17
  74. package/dist/astryx.css +20 -0
  75. package/dist/astryx.umd.js +147 -0
  76. package/dist/astryx.umd.js.map +7 -0
  77. package/dist/theme/Theme.js +1 -1
  78. package/dist/theme/defineTheme.d.ts +1 -1
  79. package/dist/theme/defineTheme.d.ts.map +1 -1
  80. package/dist/theme/defineTheme.js +1 -1
  81. package/dist/theme/index.d.ts +1 -1
  82. package/dist/theme/index.d.ts.map +1 -1
  83. package/dist/theme/index.js +1 -1
  84. package/dist/theme/syntax/defineSyntaxTheme.js +1 -1
  85. package/dist/theme/tokens.d.ts +1 -1
  86. package/dist/theme/tokens.js +4 -4
  87. package/dist/theme/useTheme.d.ts +2 -2
  88. package/dist/utils/dateParser.d.ts.map +1 -1
  89. package/dist/utils/dateParser.js +15 -2
  90. package/package.json +7 -3
  91. package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -0
  92. package/src/Banner/Banner.test.tsx +16 -7
  93. package/src/Banner/Banner.tsx +9 -2
  94. package/src/Button/Button.doc.mjs +6 -0
  95. package/src/Button/Button.test.tsx +105 -11
  96. package/src/Button/Button.tsx +73 -5
  97. package/src/Chat/ChatLayoutScrollButton.tsx +7 -1
  98. package/src/Collapsible/useCollapsible.doc.mjs +2 -2
  99. package/src/ContextMenu/ContextMenu.tsx +2 -2
  100. package/src/DateInput/DateInput.test.tsx +68 -20
  101. package/src/Divider/Divider.doc.mjs +1 -1
  102. package/src/DropdownMenu/DropdownMenu.tsx +2 -2
  103. package/src/DropdownMenu/{renderXDSDropdownItems.tsx → renderDropdownItems.tsx} +2 -2
  104. package/src/EmptyState/EmptyState.test.tsx +4 -2
  105. package/src/EmptyState/EmptyState.tsx +6 -2
  106. package/src/FormLayout/FormLayout.doc.mjs +3 -3
  107. package/src/HoverCard/HoverCard.doc.mjs +3 -0
  108. package/src/HoverCard/HoverCard.test.tsx +178 -2
  109. package/src/HoverCard/HoverCard.tsx +20 -16
  110. package/src/HoverCard/useHoverCard.tsx +12 -10
  111. package/src/Icon/Icon.doc.mjs +12 -4
  112. package/src/Item/Item.doc.mjs +2 -2
  113. package/src/Kbd/Kbd.tsx +2 -9
  114. package/src/Layer/useLayer.doc.mjs +7 -2
  115. package/src/Layer/useLayer.tsx +19 -2
  116. package/src/Layout/Layout.doc.mjs +2 -1
  117. package/src/Layout/Layout.tsx +15 -1
  118. package/src/Layout/__tests__/childrenAsContent.test.tsx +59 -0
  119. package/src/Lightbox/Lightbox.doc.mjs +0 -2
  120. package/src/Link/Link.doc.mjs +3 -3
  121. package/src/Link/LinkProvider.doc.mjs +3 -3
  122. package/src/Markdown/Markdown.doc.mjs +6 -4
  123. package/src/Markdown/Markdown.test.tsx +17 -26
  124. package/src/Markdown/Markdown.tsx +16 -6
  125. package/src/MobileNav/MobileNav.doc.mjs +8 -8
  126. package/src/MobileNav/MobileNav.tsx +13 -0
  127. package/src/MobileNav/MobileNavReopen.test.tsx +118 -0
  128. package/src/Outline/Outline.doc.mjs +1 -1
  129. package/src/Outline/Outline.test.tsx +76 -38
  130. package/src/Outline/Outline.tsx +23 -4
  131. package/src/Outline/useScrollSpy.ts +196 -63
  132. package/src/Pagination/Pagination.test.tsx +137 -13
  133. package/src/Pagination/Pagination.tsx +33 -28
  134. package/src/Resizable/Resizable.doc.mjs +3 -3
  135. package/src/Resizable/useResizable.ts +1 -7
  136. package/src/Selector/Selector.doc.mjs +4 -0
  137. package/src/Selector/Selector.tsx +5 -6
  138. package/src/Skeleton/Skeleton.doc.mjs +11 -1
  139. package/src/Slider/Slider.doc.mjs +4 -0
  140. package/src/Slider/Slider.test.tsx +3 -16
  141. package/src/Slider/Slider.tsx +1 -1
  142. package/src/Table/BaseTable.tsx +50 -24
  143. package/src/Table/Table.doc.mjs +15 -3
  144. package/src/Table/Table.tsx +22 -1
  145. package/src/Table/index.ts +3 -0
  146. package/src/Table/plugins/stickyColumns/index.ts +4 -0
  147. package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +163 -0
  148. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +414 -0
  149. package/src/Table/types.ts +96 -4
  150. package/src/Table/useBaseTablePlugins.ts +1 -0
  151. package/src/Text/Heading.doc.mjs +13 -0
  152. package/src/Timestamp/Timestamp.test.tsx +44 -18
  153. package/src/Timestamp/Timestamp.tsx +30 -10
  154. package/src/ToggleButton/ToggleButton.doc.mjs +4 -4
  155. package/src/ToggleButton/ToggleButton.test.tsx +172 -9
  156. package/src/ToggleButton/ToggleButton.tsx +57 -31
  157. package/src/Toolbar/Toolbar.doc.mjs +1 -1
  158. package/src/hooks/useEntryAnimation.doc.mjs +3 -3
  159. package/src/hooks/useMediaQuery.doc.mjs +2 -2
  160. package/src/hooks/useStreamingText.doc.mjs +3 -3
  161. package/src/theme/Theme.doc.mjs +2 -2
  162. package/src/theme/Theme.tsx +1 -1
  163. package/src/theme/defineTheme.ts +1 -1
  164. package/src/theme/index.ts +1 -1
  165. package/src/theme/syntax/defineSyntaxTheme.ts +1 -1
  166. package/src/theme/tokens.ts +4 -4
  167. package/src/theme/useTheme.ts +2 -2
  168. package/src/utils/dateParser.test.ts +26 -0
  169. package/src/utils/dateParser.ts +16 -2
  170. package/dist/DropdownMenu/renderXDSDropdownItems.d.ts.map +0 -1
@@ -71,6 +71,18 @@ export const docs = {
71
71
  description: 'Applies a hover highlight background to rows on pointer devices.',
72
72
  default: 'false',
73
73
  },
74
+ {
75
+ name: 'verticalAlign',
76
+ type: "'middle' | 'top' | 'bottom'",
77
+ description: 'Vertical alignment for body row cells. Controls `vertical-align` on the `<td>` elements.',
78
+ default: "'middle'",
79
+ },
80
+ {
81
+ name: 'textOverflow',
82
+ type: "'wrap' | 'truncate'",
83
+ description: "How body cell text behaves when it exceeds the column width. 'wrap' lets text wrap and the row grow taller; 'truncate' clips with an ellipsis (default-rendered cells show a tooltip on hover when truncated). Header cells always truncate.",
84
+ default: "'wrap'",
85
+ },
74
86
  {
75
87
  name: 'plugins',
76
88
  type: 'Record<string, TablePlugin<T>>',
@@ -104,7 +116,7 @@ export const docs = {
104
116
  'Table displays structured data in rows and columns with consistent dimensionality. It supports rich cell content, sorting, selection, pagination, and column management through a composable plugin system. Use Table for data sets with uniform structure; for simpler or inconsistent data, consider a list or card layout instead.',
105
117
  bestPractices: [
106
118
  { guidance: true, description: 'Use density and divider variants to match the information density and scanning needs of your data.' },
107
- { guidance: true, description: 'Compose rich cell content with XDS components like Badge, StatusDot, and Avatar via renderCell.' },
119
+ { guidance: true, description: 'Compose rich cell content with Astryx components like Badge, StatusDot, and Avatar via renderCell.' },
108
120
  { guidance: true, description: 'Set explicit width on every column using proportional() or pixel(). proportional(1) gives equal flex distribution with a 120px minimum that prevents columns from collapsing on narrow viewports. Omitting width skips the minimum.' },
109
121
  { guidance: false, description: 'Use a table for data without consistent columns. Use a list or card layout for heterogeneous content.' },
110
122
  { guidance: false, description: 'Enable every plugin at once. Add only the features your use case requires to keep the interface focused.' },
@@ -128,7 +140,7 @@ export const docsZh = {
128
140
  'Table displays structured data in rows and columns with consistent dimensionality. It supports rich cell content, sorting, selection, pagination, and column management through a composable plugin system. Use Table for data sets with uniform structure; for simpler or inconsistent data, consider a list or card layout instead.',
129
141
  bestPractices: [
130
142
  { guidance: true, description: 'Use density and divider variants to match the information density and scanning needs of your data.' },
131
- { guidance: true, description: 'Compose rich cell content with XDS components like Badge, StatusDot, and Avatar via renderCell.' },
143
+ { guidance: true, description: 'Compose rich cell content with Astryx components like Badge, StatusDot, and Avatar via renderCell.' },
132
144
  { guidance: false, description: 'Use a table for data without consistent columns. Use a list or card layout for heterogeneous content.' },
133
145
  { guidance: false, description: 'Enable every plugin at once. Add only the features your use case requires to keep the interface focused.' },
134
146
  ],
@@ -151,7 +163,7 @@ export const docsDense = {
151
163
  'Table displays structured data in rows and columns with consistent dimensionality. It supports rich cell content, sorting, selection, pagination, and column management through a composable plugin system. Use Table for data sets with uniform structure; for simpler or inconsistent data, consider a list or card layout instead.',
152
164
  bestPractices: [
153
165
  { guidance: true, description: 'Use density and divider variants to match the information density and scanning needs of your data.' },
154
- { guidance: true, description: 'Compose rich cell content with XDS components like Badge, StatusDot, and Avatar via renderCell.' },
166
+ { guidance: true, description: 'Compose rich cell content with Astryx components like Badge, StatusDot, and Avatar via renderCell.' },
155
167
  { guidance: true, description: 'Set explicit width on every column via proportional() or pixel(). proportional(1) = equal flex w/ 120px min preventing collapse on narrow viewports. Omitting width skips the minimum.' },
156
168
  { guidance: false, description: 'Use a table for data without consistent columns. Use a list or card layout for heterogeneous content.' },
157
169
  { guidance: false, description: 'Enable every plugin at once. Add only the features your use case requires to keep the interface focused.' },
@@ -30,6 +30,7 @@ import type {
30
30
  TablePlugin,
31
31
  TableRenderProps,
32
32
  } from './types';
33
+ import type {StyleXStyles} from '../theme/types';
33
34
 
34
35
  // =============================================================================
35
36
  // Table Types
@@ -131,17 +132,37 @@ const scrollWrapperStyles = stylex.create({
131
132
  },
132
133
  });
133
134
 
134
- function TableScrollWrapper({children}: {children: React.ReactNode}) {
135
+ function TableScrollWrapper({
136
+ children,
137
+ htmlProps,
138
+ styles: pluginStyles,
139
+ beforeTable,
140
+ afterTable,
141
+ }: {
142
+ children: React.ReactNode;
143
+ htmlProps?: React.HTMLAttributes<HTMLDivElement> & {
144
+ ref?: React.Ref<HTMLDivElement>;
145
+ };
146
+ styles?: StyleXStyles[];
147
+ beforeTable?: React.ReactNode;
148
+ afterTable?: React.ReactNode;
149
+ }) {
150
+ const {ref, ...restHtmlProps} = htmlProps ?? {};
135
151
  return (
136
152
  <div
153
+ ref={ref}
154
+ {...restHtmlProps}
137
155
  {...mergeProps(
138
156
  themeProps('table-scroll-wrapper'),
139
157
  stylex.props(
140
158
  scrollWrapperStyles.base,
141
159
  scrollWrapperStyles.containerBleed,
160
+ ...(pluginStyles ?? []),
142
161
  ),
143
162
  )}>
163
+ {beforeTable}
144
164
  {children}
165
+ {afterTable}
145
166
  </div>
146
167
  );
147
168
  }
@@ -27,6 +27,7 @@ export {useTablePagination, paginateData} from './plugins/pagination';
27
27
  export {useTableColumnSettings} from './plugins/columnSettings';
28
28
  export {useTableColumnSettingsState} from './plugins/columnSettings';
29
29
  export {useTableColumnResize} from './plugins/columnResize';
30
+ export {useTableStickyColumns} from './plugins/stickyColumns';
30
31
  export {
31
32
  useTableFiltering,
32
33
  useTableFilterState,
@@ -53,6 +54,7 @@ export type {
53
54
  HeaderCellRenderProps,
54
55
  BodyRowRenderProps,
55
56
  BodyCellRenderProps,
57
+ ScrollWrapperRenderProps,
56
58
  BaseTableProps,
57
59
  } from './types';
58
60
  export type {
@@ -93,6 +95,7 @@ export type {
93
95
  UseTableColumnSettingsStateReturn,
94
96
  } from './plugins/columnSettings';
95
97
  export type {UseTableColumnResizeConfig} from './plugins/columnResize';
98
+ export type {UseTableStickyColumnsConfig} from './plugins/stickyColumns';
96
99
  export type {
97
100
  UseTableFilteringConfig,
98
101
  TableFilterState,
@@ -0,0 +1,4 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ export {useTableStickyColumns} from './useTableStickyColumns';
4
+ export type {UseTableStickyColumnsConfig} from './useTableStickyColumns';
@@ -0,0 +1,163 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file useTableStickyColumns.test.tsx
5
+ * @input useTableStickyColumns, Table, React testing utilities
6
+ * @output Functional tests for the sticky-columns plugin
7
+ * @position Test file; validates pinning, cumulative offsets, edges, no-op
8
+ *
9
+ * Note: `position: sticky` and the z-index/background are applied via StyleX
10
+ * (compiled to classNames), which jsdom does not resolve to `element.style`.
11
+ * The plugin sets the per-column *offset* (`insetInlineStart`/`insetInlineEnd`)
12
+ * as an inline style, so these tests assert on those inline offsets — the
13
+ * jsdom-visible, plugin-owned signal that a column is pinned and at what offset.
14
+ */
15
+
16
+ import {describe, it, expect} from 'vitest';
17
+ import {render, screen} from '@testing-library/react';
18
+ import {Table} from '../../Table';
19
+ import {useTableStickyColumns} from './useTableStickyColumns';
20
+ import {pixel} from '../../columnUtils';
21
+ import type {TableColumn} from '../../types';
22
+
23
+ // =============================================================================
24
+ // Test Data
25
+ // =============================================================================
26
+
27
+ interface Row extends Record<string, unknown> {
28
+ id: string;
29
+ name: string;
30
+ email: string;
31
+ team: string;
32
+ status: string;
33
+ }
34
+
35
+ const data: Row[] = [
36
+ {id: '1', name: 'Alice', email: 'a@x.com', team: 'DS', status: 'Active'},
37
+ {id: '2', name: 'Bob', email: 'b@x.com', team: 'Plat', status: 'Away'},
38
+ ];
39
+
40
+ const columns: TableColumn<Row>[] = [
41
+ {key: 'name', header: 'Name', width: pixel(180)},
42
+ {key: 'email', header: 'Email', width: pixel(220)},
43
+ {key: 'team', header: 'Team', width: pixel(160)},
44
+ {key: 'status', header: 'Status', width: pixel(140)},
45
+ ];
46
+
47
+ function getHeader(name: string): HTMLElement {
48
+ return screen.getByRole('columnheader', {name});
49
+ }
50
+
51
+ // =============================================================================
52
+ // Tests
53
+ // =============================================================================
54
+
55
+ describe('useTableStickyColumns', () => {
56
+ it('pins a start column at inset-inline-start: 0', () => {
57
+ function Harness() {
58
+ const sticky = useTableStickyColumns<Row>({startKeys: ['name']});
59
+ return (
60
+ <Table
61
+ data={data}
62
+ columns={columns}
63
+ idKey="id"
64
+ plugins={{stickyColumns: sticky}}
65
+ />
66
+ );
67
+ }
68
+ render(<Harness />);
69
+ expect(getHeader('Name').style.insetInlineStart).toBe('0px');
70
+ });
71
+
72
+ it('computes cumulative start offsets for contiguous pinned columns', () => {
73
+ function Harness() {
74
+ const sticky = useTableStickyColumns<Row>({
75
+ startKeys: ['name', 'email'],
76
+ });
77
+ return (
78
+ <Table
79
+ data={data}
80
+ columns={columns}
81
+ idKey="id"
82
+ plugins={{stickyColumns: sticky}}
83
+ />
84
+ );
85
+ }
86
+ render(<Harness />);
87
+ // name is first → offset 0; email follows → offset = name width (180px)
88
+ expect(getHeader('Name').style.insetInlineStart).toBe('0px');
89
+ expect(getHeader('Email').style.insetInlineStart).toBe('180px');
90
+ });
91
+
92
+ it('pins an end column at inset-inline-end: 0', () => {
93
+ function Harness() {
94
+ const sticky = useTableStickyColumns<Row>({endKeys: ['status']});
95
+ return (
96
+ <Table
97
+ data={data}
98
+ columns={columns}
99
+ idKey="id"
100
+ plugins={{stickyColumns: sticky}}
101
+ />
102
+ );
103
+ }
104
+ render(<Harness />);
105
+ expect(getHeader('Status').style.insetInlineEnd).toBe('0px');
106
+ });
107
+
108
+ it('pins body cells, not just headers', () => {
109
+ function Harness() {
110
+ const sticky = useTableStickyColumns<Row>({startKeys: ['name']});
111
+ return (
112
+ <Table
113
+ data={data}
114
+ columns={columns}
115
+ idKey="id"
116
+ plugins={{stickyColumns: sticky}}
117
+ />
118
+ );
119
+ }
120
+ render(<Harness />);
121
+ const firstBodyCell = screen.getByText('Alice').closest('td');
122
+ expect(firstBodyCell).not.toBeNull();
123
+ expect(firstBodyCell!.style.insetInlineStart).toBe('0px');
124
+ });
125
+
126
+ it('is a no-op with an empty config — no cell gets an offset', () => {
127
+ function Harness() {
128
+ const sticky = useTableStickyColumns<Row>({});
129
+ return (
130
+ <Table
131
+ data={data}
132
+ columns={columns}
133
+ idKey="id"
134
+ plugins={{stickyColumns: sticky}}
135
+ />
136
+ );
137
+ }
138
+ render(<Harness />);
139
+ for (const header of ['Name', 'Email', 'Team', 'Status']) {
140
+ const th = getHeader(header);
141
+ expect(th.style.insetInlineStart).toBe('');
142
+ expect(th.style.insetInlineEnd).toBe('');
143
+ }
144
+ });
145
+
146
+ it('only pins configured columns, leaving others unset', () => {
147
+ function Harness() {
148
+ const sticky = useTableStickyColumns<Row>({startKeys: ['name']});
149
+ return (
150
+ <Table
151
+ data={data}
152
+ columns={columns}
153
+ idKey="id"
154
+ plugins={{stickyColumns: sticky}}
155
+ />
156
+ );
157
+ }
158
+ render(<Harness />);
159
+ expect(getHeader('Name').style.insetInlineStart).toBe('0px');
160
+ expect(getHeader('Team').style.insetInlineStart).toBe('');
161
+ expect(getHeader('Team').style.insetInlineEnd).toBe('');
162
+ });
163
+ });