@astryxdesign/core 0.4.7-canary.2ce1983 → 0.4.7-canary.405f1ee
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/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +34 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +5 -0
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +4 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/package.json +2 -2
- package/src/Avatar/Avatar.doc.mjs +2 -1
- package/src/DateInput/DateInputTouch.test.tsx +36 -0
- package/src/DateInput/TouchDateField.tsx +35 -1
- package/src/MultiSelector/MultiSelector.test.tsx +21 -0
- package/src/MultiSelector/MultiSelector.tsx +10 -1
- package/src/Selector/Selector.test.tsx +21 -0
- package/src/Selector/Selector.tsx +11 -1
- package/src/Table/BaseTable.tsx +6 -3
- package/src/Table/Table.test.tsx +35 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TouchDateField.d.ts","sourceRoot":"","sources":["../../src/DateInput/TouchDateField.tsx"],"names":[],"mappings":"AA4DA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAichD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,eAAe,EACf,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAiB,EACjB,GAAG,EACH,GAAG,EACH,eAAe,EACf,WAAW,EAAE,oBAAoB,EACjC,IAAI,EAAE,QAAQ,EACd,MAAM,EACN,aAA0B,EAC1B,YAAY,EACZ,QAAgB,EAIhB,cAAc,EAAE,eAAe,EAC/B,YAAY,EAAE,gBAAoB,EAClC,MAAoB,EACpB,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+
|
|
1
|
+
{"version":3,"file":"TouchDateField.d.ts","sourceRoot":"","sources":["../../src/DateInput/TouchDateField.tsx"],"names":[],"mappings":"AA4DA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAichD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,eAAe,EACf,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAiB,EACjB,GAAG,EACH,GAAG,EACH,eAAe,EACf,WAAW,EAAE,oBAAoB,EACjC,IAAI,EAAE,QAAQ,EACd,MAAM,EACN,aAA0B,EAC1B,YAAY,EACZ,QAAgB,EAIhB,cAAc,EAAE,eAAe,EAC/B,YAAY,EAAE,gBAAoB,EAClC,MAAoB,EACpB,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAosBhB;yBAruBe,cAAc"}
|
|
@@ -274,6 +274,13 @@ export function TouchDateField({
|
|
|
274
274
|
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
275
275
|
const [isWheelOpen, setIsWheelOpen] = useState(false);
|
|
276
276
|
const scrollerHandleRef = useRef(null);
|
|
277
|
+
// Pending focus handoff from the clear button; see handleClear.
|
|
278
|
+
const clearFocusTimerRef = useRef(null);
|
|
279
|
+
useEffect(() => () => {
|
|
280
|
+
if (clearFocusTimerRef.current != null) {
|
|
281
|
+
clearTimeout(clearFocusTimerRef.current);
|
|
282
|
+
}
|
|
283
|
+
}, []);
|
|
277
284
|
const today = useMemo(() => plainDateToday(), []);
|
|
278
285
|
const selectedDate = useMemo(() => optimisticValue != null && /^\d{4}-\d{2}-\d{2}$/.test(optimisticValue) ? plainDateFromISO(optimisticValue) : null, [optimisticValue]);
|
|
279
286
|
|
|
@@ -350,7 +357,33 @@ export function TouchDateField({
|
|
|
350
357
|
}, [isEffectivelyDisabled]);
|
|
351
358
|
const handleClear = useCallback(() => {
|
|
352
359
|
fireChange(undefined);
|
|
353
|
-
|
|
360
|
+
// Focus goes back to the field on the NEXT task, not synchronously.
|
|
361
|
+
//
|
|
362
|
+
// Clearing unmounts this button (it only renders while there is a value),
|
|
363
|
+
// and focusing another element in the same task as that unmount makes iOS
|
|
364
|
+
// Safari scroll the whole document to the top — the user is thrown from
|
|
365
|
+
// wherever the field sat to the start of the page. Measured on the iOS 26
|
|
366
|
+
// simulator against the live docsite, field at scrollY 2055: synchronous
|
|
367
|
+
// focus lands at 0, deferred focus stays at 2055.
|
|
368
|
+
//
|
|
369
|
+
// `preventScroll` alone does NOT fix it (verified: still 0) — this is not
|
|
370
|
+
// the browser's ordinary scroll-the-focused-element-into-view step, so the
|
|
371
|
+
// deferral is the load-bearing half. It is kept because the reveal scroll
|
|
372
|
+
// is real too, and unwanted for the same reason: the field the user just
|
|
373
|
+
// tapped is already on screen (+12px on a plain page without it).
|
|
374
|
+
//
|
|
375
|
+
// Skipping the focus entirely would also stop the scroll, but then focus
|
|
376
|
+
// dies with the unmounting button and lands on <body>.
|
|
377
|
+
const field = inputRef.current;
|
|
378
|
+
if (field == null) {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
clearFocusTimerRef.current = window.setTimeout(() => {
|
|
382
|
+
clearFocusTimerRef.current = null;
|
|
383
|
+
field.focus({
|
|
384
|
+
preventScroll: true
|
|
385
|
+
});
|
|
386
|
+
}, 0);
|
|
354
387
|
}, [fireChange]);
|
|
355
388
|
|
|
356
389
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelector.d.ts","sourceRoot":"","sources":["../../src/MultiSelector/MultiSelector.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MultiSelector.d.ts","sourceRoot":"","sources":["../../src/MultiSelector/MultiSelector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -827,7 +827,13 @@ export function MultiSelector({
|
|
|
827
827
|
// A standalone divider between groups would orphan itself once its
|
|
828
828
|
// neighbors are filtered out, so skip it while searching.
|
|
829
829
|
if (!isSearching) {
|
|
830
|
+
// role="listbox" only permits option/group children; the divider
|
|
831
|
+
// carries no information the options don't, so it's hidden from
|
|
832
|
+
// the accessibility tree entirely rather than exposing
|
|
833
|
+
// role="separator" as a disallowed listbox child (axe
|
|
834
|
+
// aria-required-children).
|
|
830
835
|
elements.push(/*#__PURE__*/_jsx(Divider, {
|
|
836
|
+
"aria-hidden": "true",
|
|
831
837
|
xstyle: styles.divider
|
|
832
838
|
}, `divider-${i}`));
|
|
833
839
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Selector.d.ts","sourceRoot":"","sources":["../../src/Selector/Selector.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Selector.d.ts","sourceRoot":"","sources":["../../src/Selector/Selector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -756,7 +756,12 @@ export function Selector(props) {
|
|
|
756
756
|
if (isSearching) {
|
|
757
757
|
continue;
|
|
758
758
|
}
|
|
759
|
+
// role="listbox" only permits option/group children; the divider
|
|
760
|
+
// carries no information the options don't, so it's hidden from the
|
|
761
|
+
// accessibility tree entirely rather than exposing role="separator"
|
|
762
|
+
// as a disallowed listbox child (axe aria-required-children).
|
|
759
763
|
elements.push(/*#__PURE__*/_jsx(Divider, {
|
|
764
|
+
"aria-hidden": "true",
|
|
760
765
|
xstyle: styles.divider
|
|
761
766
|
}, `divider-${i}`));
|
|
762
767
|
} else if (isSection(option)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseTable.d.ts","sourceRoot":"","sources":["../../src/Table/BaseTable.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAkB,KAAK,GAAG,EAAC,MAAM,OAAO,CAAC;AAGhF,OAAO,KAAK,EACV,cAAc,EAYf,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseTable.d.ts","sourceRoot":"","sources":["../../src/Table/BaseTable.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAkB,KAAK,GAAG,EAAC,MAAM,OAAO,CAAC;AAGhF,OAAO,KAAK,EACV,cAAc,EAYf,MAAM,SAAS,CAAC;AAsmBjB;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,EAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3E,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;CAAC,KACrD,YAAY,CAAC"}
|
package/dist/Table/BaseTable.js
CHANGED
|
@@ -124,7 +124,10 @@ function TableRowInner({
|
|
|
124
124
|
};
|
|
125
125
|
const cellRenderProps = applyPlugins(plugins, p => p.transformBodyCell, initialBodyCellRenderProps, col, item, columnIndex, columns);
|
|
126
126
|
const isDefaultRenderer = !col.renderCell;
|
|
127
|
-
|
|
127
|
+
let rawContent = null;
|
|
128
|
+
if (!cellRenderProps.isContentSuppressed) {
|
|
129
|
+
rawContent = isDefaultRenderer ? defaultCellRenderer(item, col.key) : col.renderCell?.(item) ?? null;
|
|
130
|
+
}
|
|
128
131
|
|
|
129
132
|
// In truncate mode, wrap default-rendered string content in
|
|
130
133
|
// <Text maxLines={1}> for smart tooltips that only appear
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableGroupedRows.d.ts","sourceRoot":"","sources":["../../../../src/Table/plugins/groupedRows/useTableGroupedRows.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAAuB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAQ3D,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAqD7C,qDAAqD;AACrD,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1E,8BAA8B;IAC9B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,8EAA8E;IAC9E,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC7B,6CAA6C;IAC7C,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,0DAA0D;IAC1D,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,KACf,SAAS,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAChC,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1E,iDAAiD;IACjD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0EAA0E;IAC1E,IAAI,EAAE,CAAC,EAAE,CAAC;IACV;;;;OAIG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CAC5B;AAiFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACnC,yBAAyB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"useTableGroupedRows.d.ts","sourceRoot":"","sources":["../../../../src/Table/plugins/groupedRows/useTableGroupedRows.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAAuB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAQ3D,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAqD7C,qDAAqD;AACrD,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1E,8BAA8B;IAC9B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,8EAA8E;IAC9E,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC7B,6CAA6C;IAC7C,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,0DAA0D;IAC1D,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,KACf,SAAS,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAChC,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1E,iDAAiD;IACjD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0EAA0E;IAC1E,IAAI,EAAE,CAAC,EAAE,CAAC;IACV;;;;OAIG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CAC5B;AAiFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACnC,yBAAyB,CAAC,CAAC,CAAC,CAkK9B"}
|
|
@@ -26,8 +26,11 @@ function isGroupHeader(item) {
|
|
|
26
26
|
return typeof item === 'object' && item !== null && item[GROUP_HEADER] === true;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
// Proxy handler: any field access beyond the marker fields resolves to `''
|
|
30
|
-
//
|
|
29
|
+
// Proxy handler: any field access beyond the marker fields resolves to `''`,
|
|
30
|
+
// which keeps anything that reads a header's data — the sortable and filtering
|
|
31
|
+
// plugins, a consumer's own row handler — off `undefined`. Cell renderers are
|
|
32
|
+
// handled at render time instead (see `transformBodyCell` below); the Proxy
|
|
33
|
+
// never protected them, because `''` fails a lookup exactly as `undefined` does.
|
|
31
34
|
const HEADER_PROXY_HANDLER = {
|
|
32
35
|
// eslint-disable-next-line @typescript-eslint/promise-function-async -- Proxy get trap, not a promise-returning fn
|
|
33
36
|
get(t, prop) {
|
|
@@ -39,12 +42,9 @@ const HEADER_PROXY_HANDLER = {
|
|
|
39
42
|
};
|
|
40
43
|
|
|
41
44
|
/**
|
|
42
|
-
* Build a synthetic header row wrapped in a Proxy so
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* row (including synthetic headers) before `transformBodyRow` can replace the
|
|
46
|
-
* row's cells. `transformBodyRow` then discards those cells and renders a
|
|
47
|
-
* single full-width header cell.
|
|
45
|
+
* Build a synthetic header row wrapped in a Proxy so field access resolves to
|
|
46
|
+
* `''` instead of `undefined`. `transformBodyRow` then discards the row's
|
|
47
|
+
* cells and renders a single full-width header cell.
|
|
48
48
|
*/
|
|
49
49
|
function makeHeader(groupKey, count) {
|
|
50
50
|
const target = {
|
|
@@ -183,6 +183,18 @@ export function useTableGroupedRows(config) {
|
|
|
183
183
|
return String(positionByItem?.get(item) ?? -1);
|
|
184
184
|
}, [getRowKeyProp, positionByItem]);
|
|
185
185
|
const plugin = useMemo(() => ({
|
|
186
|
+
// A header row is not one of the caller's rows, so running a cell
|
|
187
|
+
// renderer against it can only misread it or throw — and the cells are
|
|
188
|
+
// discarded by `transformBodyRow` below regardless.
|
|
189
|
+
transformBodyCell(props, _column, item) {
|
|
190
|
+
if (!isGroupHeader(item)) {
|
|
191
|
+
return props;
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
...props,
|
|
195
|
+
isContentSuppressed: true
|
|
196
|
+
};
|
|
197
|
+
},
|
|
186
198
|
// Replace a header row's pre-rendered cells with one full-width cell.
|
|
187
199
|
transformBodyRow(props, item) {
|
|
188
200
|
if (!isGroupHeader(item)) {
|
|
@@ -32,6 +32,22 @@ export interface UseTableSelectionConfig<T extends Record<string, unknown>> {
|
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
34
|
getRowLabel?: (item: T) => string;
|
|
35
|
+
/**
|
|
36
|
+
* Paint checked rows with the accent wash. Set false when the surrounding
|
|
37
|
+
* UI already uses row background to mean something else — a row that is
|
|
38
|
+
* open in a detail panel, for instance. The wash is an inline style, so
|
|
39
|
+
* it cannot be overridden from userland; this flag is the way off it.
|
|
40
|
+
*
|
|
41
|
+
* Only the background is dropped. `aria-selected` is still set on checked
|
|
42
|
+
* rows either way, so the selection stays legible to screen readers.
|
|
43
|
+
*
|
|
44
|
+
* @default true
|
|
45
|
+
* @example
|
|
46
|
+
* ```
|
|
47
|
+
* useTableSelection({...config, hasRowHighlight: false})
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
hasRowHighlight?: boolean;
|
|
35
51
|
}
|
|
36
52
|
export declare function useTableSelection<T extends Record<string, unknown>>(config: UseTableSelectionConfig<T>): TablePlugin<T>;
|
|
37
53
|
//# sourceMappingURL=useTableSelection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableSelection.d.ts","sourceRoot":"","sources":["../../../../src/Table/plugins/selection/useTableSelection.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useTableSelection.d.ts","sourceRoot":"","sources":["../../../../src/Table/plugins/selection/useTableSelection.tsx"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAC,WAAW,EAAkC,MAAM,aAAa,CAAC;AAQ9E,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxE,uCAAuC;IACvC,iBAAiB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IACxC,6EAA6E;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE;QAAC,IAAI,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI,CAAC;IAC9D,kDAAkD;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE;QAAC,aAAa,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI,CAAC;IACvD,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;IACnC,+FAA+F;IAC/F,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IACxC;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAClC;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA6ND,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC,GACjC,WAAW,CAAC,CAAC,CAAC,CA2FhB"}
|
|
@@ -26,7 +26,13 @@
|
|
|
26
26
|
* DOM elements and no central element tracking. Each subscription
|
|
27
27
|
* self-cleans when the row disconnects.
|
|
28
28
|
*
|
|
29
|
+
* Because the background is an inline style, it outranks anything
|
|
30
|
+
* userland can layer on with StyleX. `hasRowHighlight: false` is the
|
|
31
|
+
* supported way to reclaim the row background; `aria-selected` is
|
|
32
|
+
* unaffected by it.
|
|
33
|
+
*
|
|
29
34
|
* SYNC: When modified, update these files to stay in sync:
|
|
35
|
+
* - /packages/core/src/Table/useTableSelection.doc.mjs (config prop table)
|
|
30
36
|
* - /packages/core/src/Table/Table.doc.mjs (selection documentation)
|
|
31
37
|
* - /packages/core/src/Table/index.ts (exports)
|
|
32
38
|
*/
|
|
@@ -72,15 +78,19 @@ function createSelectionStore(configRef) {
|
|
|
72
78
|
|
|
73
79
|
/**
|
|
74
80
|
* Apply or remove selection styling on a <tr> element.
|
|
81
|
+
*
|
|
82
|
+
* `aria-selected` tracks selection on its own: it is the semantic half of
|
|
83
|
+
* the state and stays correct whether or not the row is painted.
|
|
75
84
|
*/
|
|
76
|
-
function applyRowSelectionStyle(el, isSelected) {
|
|
85
|
+
function applyRowSelectionStyle(el, isSelected, hasRowHighlight) {
|
|
77
86
|
if (isSelected) {
|
|
78
87
|
el.setAttribute('aria-selected', 'true');
|
|
79
|
-
el.style.backgroundColor = selectedBgColor;
|
|
80
88
|
} else {
|
|
81
89
|
el.removeAttribute('aria-selected');
|
|
82
|
-
el.style.backgroundColor = '';
|
|
83
90
|
}
|
|
91
|
+
// Written on every pass, not just when painting: the flag can flip while a
|
|
92
|
+
// row is already selected, and the wash has to come back off.
|
|
93
|
+
el.style.backgroundColor = isSelected && hasRowHighlight ? selectedBgColor : '';
|
|
84
94
|
}
|
|
85
95
|
|
|
86
96
|
// =============================================================================
|
|
@@ -269,15 +279,19 @@ export function useTableSelection(config) {
|
|
|
269
279
|
if (!el) {
|
|
270
280
|
return;
|
|
271
281
|
}
|
|
282
|
+
const applyStyle = () => {
|
|
283
|
+
const config = store.getConfig();
|
|
284
|
+
applyRowSelectionStyle(el, config.getIsItemSelected(item), config.hasRowHighlight ?? true);
|
|
285
|
+
};
|
|
272
286
|
// Apply initial style
|
|
273
|
-
|
|
287
|
+
applyStyle();
|
|
274
288
|
// Subscribe for future changes
|
|
275
289
|
const unsub = store.subscribe(() => {
|
|
276
290
|
if (!el.isConnected) {
|
|
277
291
|
unsub();
|
|
278
292
|
return;
|
|
279
293
|
}
|
|
280
|
-
|
|
294
|
+
applyStyle();
|
|
281
295
|
});
|
|
282
296
|
return () => {
|
|
283
297
|
unsub();
|
package/dist/Table/types.d.ts
CHANGED
|
@@ -276,6 +276,19 @@ export interface BodyCellRenderProps {
|
|
|
276
276
|
* sticky offsets. Optional for backward compatibility.
|
|
277
277
|
*/
|
|
278
278
|
columns?: ReadonlyArray<TableColumn<Record<string, unknown>>>;
|
|
279
|
+
/**
|
|
280
|
+
* When true, the cell renders empty: BaseTable calls neither the column's
|
|
281
|
+
* `renderCell` nor the default renderer. Set it for a row whose cells a
|
|
282
|
+
* plugin is going to replace wholesale in `transformBodyRow` (a grouped-rows
|
|
283
|
+
* section header, a summary row) — the row is not one the consumer supplied,
|
|
284
|
+
* so their renderer can only misread it or throw, and its output is
|
|
285
|
+
* discarded moments later anyway.
|
|
286
|
+
*
|
|
287
|
+
* Applies to this cell only, and is decided per render against the final
|
|
288
|
+
* column list, so it covers columns other plugins contributed regardless of
|
|
289
|
+
* where in the pipeline this plugin sits.
|
|
290
|
+
*/
|
|
291
|
+
isContentSuppressed?: boolean;
|
|
279
292
|
}
|
|
280
293
|
/**
|
|
281
294
|
* Props passed through the plugin pipeline for the scroll-wrapper region — the
|
|
@@ -355,13 +368,18 @@ export type TableContextActions = TableContextAction[] | (() => TableContextActi
|
|
|
355
368
|
*
|
|
356
369
|
* 1. `transformColumns` — filter, reorder, or inject columns before rendering
|
|
357
370
|
* 2. `transformTable` — transform the root `<table>` element props
|
|
358
|
-
* 3. `
|
|
359
|
-
* 4. `
|
|
360
|
-
* 5. `
|
|
361
|
-
* 6. `
|
|
371
|
+
* 3. `transformHeaderCell` — transform each `<th>` props
|
|
372
|
+
* 4. `transformHeaderRow` — transform the header `<tr>` props
|
|
373
|
+
* 5. `transformBodyCell` — transform each body `<td>` props
|
|
374
|
+
* 6. `transformBodyRow` — transform each body `<tr>` props
|
|
362
375
|
* 7. `transformScrollWrapper` — transform the scroll-container wrapper around the table
|
|
363
376
|
* 8. `transformTableContext` — wrap the table output in context providers
|
|
364
377
|
*
|
|
378
|
+
* A row's cells are built before its row transform runs, and reach it as
|
|
379
|
+
* `children`: the cell hook is the earliest per-cell interception point, and a
|
|
380
|
+
* row transform can discard cells but cannot stop them being built (see
|
|
381
|
+
* `isContentSuppressed` on `BodyCellRenderProps` for that).
|
|
382
|
+
*
|
|
365
383
|
* Plugins may also contribute right-click menu actions by appending to
|
|
366
384
|
* `contextMenuActions` in `transformHeaderCell` / `transformBodyCell`
|
|
367
385
|
* (aggregated into one menu per header cell / row).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Table/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Table/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBaseTablePlugins.d.ts","sourceRoot":"","sources":["../../src/Table/useBaseTablePlugins.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"useBaseTablePlugins.d.ts","sourceRoot":"","sources":["../../src/Table/useBaseTablePlugins.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAuHzC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GACtD,WAAW,CAAC,CAAC,CAAC,EAAE,CA2ClB"}
|
|
@@ -44,6 +44,11 @@ import { devWarn } from "../utils/devWarning.js";
|
|
|
44
44
|
* Canonical ordering for first-party plugin names.
|
|
45
45
|
* Plugins are sorted by their position in this array.
|
|
46
46
|
* Unknown names are appended after the known set.
|
|
47
|
+
*
|
|
48
|
+
* This decides LAYOUT — which column lands left of which, who wraps whom. It
|
|
49
|
+
* must never decide whether the table works: a plugin that renders in one
|
|
50
|
+
* order and crashes in the other is broken, and adding it here buys a lucky
|
|
51
|
+
* order rather than a fix.
|
|
47
52
|
*/
|
|
48
53
|
const PLUGIN_ORDER = ['columnSettings', 'sort', 'tree', 'selection', 'pagination'];
|
|
49
54
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astryxdesign/core",
|
|
3
|
-
"version": "0.4.7-canary.
|
|
3
|
+
"version": "0.4.7-canary.405f1ee",
|
|
4
4
|
"displayName": "Astryx Core",
|
|
5
5
|
"description": "The component library. Accessible, themeable React components with built-in spacing, dark mode, and StyleX styling.",
|
|
6
6
|
"author": "Meta Open Source",
|
|
@@ -656,7 +656,7 @@
|
|
|
656
656
|
"react-dom": ">=19.0.0"
|
|
657
657
|
},
|
|
658
658
|
"devDependencies": {
|
|
659
|
-
"@astryxdesign/cli": "0.4.7-canary.
|
|
659
|
+
"@astryxdesign/cli": "0.4.7-canary.405f1ee",
|
|
660
660
|
"@babel/cli": "^8.0.4",
|
|
661
661
|
"@babel/core": "^7.29.7",
|
|
662
662
|
"@babel/preset-react": "^8.0.1",
|
|
@@ -148,7 +148,8 @@ export const docsDense = {
|
|
|
148
148
|
{guidance: true, description: 'Match size to context: xsm/sm inline, md/lg in lists, xl for profiles.'},
|
|
149
149
|
{guidance: true, description: 'Add a status dot in chat or team views where availability matters.'},
|
|
150
150
|
{guidance: true, description: 'When wrapping Avatar in your own Tooltip or HoverCard, set tooltip={false} so the built-in name tooltip does not overlap yours.'},
|
|
151
|
-
{guidance: true, description: 'Interactive avatars (href/onClick) need name or alt; without one they warn in development.
|
|
151
|
+
{guidance: true, description: 'Interactive avatars (href/onClick) need name or alt; without one they warn in development.'},
|
|
152
|
+
{guidance: false, description: 'Rely on a status label to name an interactive avatar. "Online" says nothing about where the link goes.'},
|
|
152
153
|
{guidance: false, description: 'Use for logos or product images. Use an image or icon instead.'},
|
|
153
154
|
{guidance: false, description: 'Force a square or custom shape. Avatars are always circular.'},
|
|
154
155
|
],
|
|
@@ -419,6 +419,42 @@ describe('DateInput — field parity', () => {
|
|
|
419
419
|
expect(onChange).toHaveBeenCalledWith(undefined);
|
|
420
420
|
});
|
|
421
421
|
|
|
422
|
+
it('returns focus to the field without letting the page scroll', async () => {
|
|
423
|
+
// Clearing unmounts the clear button, and focusing another element in the
|
|
424
|
+
// same task as that unmount makes iOS Safari scroll the document to the
|
|
425
|
+
// top. Measured on the iOS 26 simulator against the live docsite, field at
|
|
426
|
+
// scrollY 2055: synchronous focus lands at 0, deferred focus stays at
|
|
427
|
+
// 2055. `preventScroll` alone does not fix it, so both halves are
|
|
428
|
+
// asserted: the focus is deferred past the unmount, and it is passed
|
|
429
|
+
// preventScroll. jsdom implements no scrolling, so the guard is asserted
|
|
430
|
+
// at the call.
|
|
431
|
+
vi.useFakeTimers();
|
|
432
|
+
try {
|
|
433
|
+
render(
|
|
434
|
+
<DateInput
|
|
435
|
+
label="Ship date"
|
|
436
|
+
value="2026-03-21"
|
|
437
|
+
hasClear
|
|
438
|
+
onChange={() => {}}
|
|
439
|
+
/>,
|
|
440
|
+
);
|
|
441
|
+
const input = field();
|
|
442
|
+
const focus = vi.spyOn(input, 'focus');
|
|
443
|
+
|
|
444
|
+
fireEvent.click(screen.getByRole('button', {name: /Clear Ship date/}));
|
|
445
|
+
|
|
446
|
+
// Not synchronous — that is the whole point.
|
|
447
|
+
expect(focus).not.toHaveBeenCalled();
|
|
448
|
+
|
|
449
|
+
vi.runAllTimers();
|
|
450
|
+
|
|
451
|
+
expect(focus).toHaveBeenCalledWith({preventScroll: true});
|
|
452
|
+
focus.mockRestore();
|
|
453
|
+
} finally {
|
|
454
|
+
vi.useRealTimers();
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
|
|
422
458
|
it('does not open the picker until the field is tapped', () => {
|
|
423
459
|
withLayout(() => {
|
|
424
460
|
render(<DateInput label="Ship date" onChange={() => {}} />);
|
|
@@ -599,6 +599,16 @@ export function TouchDateField({
|
|
|
599
599
|
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
600
600
|
const [isWheelOpen, setIsWheelOpen] = useState(false);
|
|
601
601
|
const scrollerHandleRef = useRef<MonthScrollerHandle | null>(null);
|
|
602
|
+
// Pending focus handoff from the clear button; see handleClear.
|
|
603
|
+
const clearFocusTimerRef = useRef<number | null>(null);
|
|
604
|
+
useEffect(
|
|
605
|
+
() => () => {
|
|
606
|
+
if (clearFocusTimerRef.current != null) {
|
|
607
|
+
clearTimeout(clearFocusTimerRef.current);
|
|
608
|
+
}
|
|
609
|
+
},
|
|
610
|
+
[],
|
|
611
|
+
);
|
|
602
612
|
|
|
603
613
|
const today = useMemo(() => plainDateToday(), []);
|
|
604
614
|
const selectedDate = useMemo(
|
|
@@ -708,7 +718,31 @@ export function TouchDateField({
|
|
|
708
718
|
|
|
709
719
|
const handleClear = useCallback(() => {
|
|
710
720
|
fireChange(undefined);
|
|
711
|
-
|
|
721
|
+
// Focus goes back to the field on the NEXT task, not synchronously.
|
|
722
|
+
//
|
|
723
|
+
// Clearing unmounts this button (it only renders while there is a value),
|
|
724
|
+
// and focusing another element in the same task as that unmount makes iOS
|
|
725
|
+
// Safari scroll the whole document to the top — the user is thrown from
|
|
726
|
+
// wherever the field sat to the start of the page. Measured on the iOS 26
|
|
727
|
+
// simulator against the live docsite, field at scrollY 2055: synchronous
|
|
728
|
+
// focus lands at 0, deferred focus stays at 2055.
|
|
729
|
+
//
|
|
730
|
+
// `preventScroll` alone does NOT fix it (verified: still 0) — this is not
|
|
731
|
+
// the browser's ordinary scroll-the-focused-element-into-view step, so the
|
|
732
|
+
// deferral is the load-bearing half. It is kept because the reveal scroll
|
|
733
|
+
// is real too, and unwanted for the same reason: the field the user just
|
|
734
|
+
// tapped is already on screen (+12px on a plain page without it).
|
|
735
|
+
//
|
|
736
|
+
// Skipping the focus entirely would also stop the scroll, but then focus
|
|
737
|
+
// dies with the unmounting button and lands on <body>.
|
|
738
|
+
const field = inputRef.current;
|
|
739
|
+
if (field == null) {
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
clearFocusTimerRef.current = window.setTimeout(() => {
|
|
743
|
+
clearFocusTimerRef.current = null;
|
|
744
|
+
field.focus({preventScroll: true});
|
|
745
|
+
}, 0);
|
|
712
746
|
}, [fireChange]);
|
|
713
747
|
|
|
714
748
|
/**
|
|
@@ -1981,6 +1981,27 @@ describe('MultiSelector list structure', () => {
|
|
|
1981
1981
|
Node.DOCUMENT_POSITION_FOLLOWING,
|
|
1982
1982
|
).toBeTruthy();
|
|
1983
1983
|
});
|
|
1984
|
+
|
|
1985
|
+
it('hides a standalone divider from the accessibility tree (#4994)', async () => {
|
|
1986
|
+
const user = userEvent.setup();
|
|
1987
|
+
render(
|
|
1988
|
+
<MultiSelector
|
|
1989
|
+
label="Fruit"
|
|
1990
|
+
options={['Apple', {type: 'divider'}, 'Banana']}
|
|
1991
|
+
value={[]}
|
|
1992
|
+
onChange={() => {}}
|
|
1993
|
+
/>,
|
|
1994
|
+
);
|
|
1995
|
+
await user.click(screen.getByRole('combobox'));
|
|
1996
|
+
|
|
1997
|
+
// role="listbox" only permits option/group children. The divider still
|
|
1998
|
+
// renders role="separator" (unchanged visual/DOM), but must be excluded
|
|
1999
|
+
// from the accessibility tree so it never reaches the listbox's exposed
|
|
2000
|
+
// children (axe aria-required-children).
|
|
2001
|
+
const divider = document.querySelector('[role="separator"]');
|
|
2002
|
+
expect(divider).toBeTruthy();
|
|
2003
|
+
expect(divider).toHaveAttribute('aria-hidden', 'true');
|
|
2004
|
+
});
|
|
1984
2005
|
});
|
|
1985
2006
|
|
|
1986
2007
|
describe('MultiSelector search affordances', () => {
|
|
@@ -1420,8 +1420,17 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1420
1420
|
// A standalone divider between groups would orphan itself once its
|
|
1421
1421
|
// neighbors are filtered out, so skip it while searching.
|
|
1422
1422
|
if (!isSearching) {
|
|
1423
|
+
// role="listbox" only permits option/group children; the divider
|
|
1424
|
+
// carries no information the options don't, so it's hidden from
|
|
1425
|
+
// the accessibility tree entirely rather than exposing
|
|
1426
|
+
// role="separator" as a disallowed listbox child (axe
|
|
1427
|
+
// aria-required-children).
|
|
1423
1428
|
elements.push(
|
|
1424
|
-
<Divider
|
|
1429
|
+
<Divider
|
|
1430
|
+
key={`divider-${i}`}
|
|
1431
|
+
aria-hidden="true"
|
|
1432
|
+
xstyle={styles.divider}
|
|
1433
|
+
/>,
|
|
1425
1434
|
);
|
|
1426
1435
|
}
|
|
1427
1436
|
} else if (isSection(option)) {
|
|
@@ -2484,6 +2484,27 @@ describe('Selector section headings', () => {
|
|
|
2484
2484
|
// visible heading must not announce it a second time.
|
|
2485
2485
|
expect(heading).toHaveAttribute('aria-hidden', 'true');
|
|
2486
2486
|
});
|
|
2487
|
+
|
|
2488
|
+
it('hides a standalone divider from the accessibility tree (#4994)', async () => {
|
|
2489
|
+
const user = userEvent.setup();
|
|
2490
|
+
render(
|
|
2491
|
+
<Selector
|
|
2492
|
+
label="Fruit"
|
|
2493
|
+
options={['Apple', {type: 'divider'}, 'Banana']}
|
|
2494
|
+
value={undefined}
|
|
2495
|
+
onChange={() => {}}
|
|
2496
|
+
/>,
|
|
2497
|
+
);
|
|
2498
|
+
await user.click(screen.getByRole('combobox'));
|
|
2499
|
+
|
|
2500
|
+
// role="listbox" only permits option/group children. The divider still
|
|
2501
|
+
// renders role="separator" (unchanged visual/DOM), but must be excluded
|
|
2502
|
+
// from the accessibility tree so it never reaches the listbox's exposed
|
|
2503
|
+
// children (axe aria-required-children).
|
|
2504
|
+
const divider = document.querySelector('[role="separator"]');
|
|
2505
|
+
expect(divider).toBeTruthy();
|
|
2506
|
+
expect(divider).toHaveAttribute('aria-hidden', 'true');
|
|
2507
|
+
});
|
|
2487
2508
|
});
|
|
2488
2509
|
|
|
2489
2510
|
describe('Selector search focus ring', () => {
|
|
@@ -1344,7 +1344,17 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1344
1344
|
if (isSearching) {
|
|
1345
1345
|
continue;
|
|
1346
1346
|
}
|
|
1347
|
-
|
|
1347
|
+
// role="listbox" only permits option/group children; the divider
|
|
1348
|
+
// carries no information the options don't, so it's hidden from the
|
|
1349
|
+
// accessibility tree entirely rather than exposing role="separator"
|
|
1350
|
+
// as a disallowed listbox child (axe aria-required-children).
|
|
1351
|
+
elements.push(
|
|
1352
|
+
<Divider
|
|
1353
|
+
key={`divider-${i}`}
|
|
1354
|
+
aria-hidden="true"
|
|
1355
|
+
xstyle={styles.divider}
|
|
1356
|
+
/>,
|
|
1357
|
+
);
|
|
1348
1358
|
} else if (isSection(option)) {
|
|
1349
1359
|
const sectionItems: ReactNode[] = [];
|
|
1350
1360
|
for (const opt of option.options) {
|
package/src/Table/BaseTable.tsx
CHANGED
|
@@ -183,9 +183,12 @@ function TableRowInner<T extends Record<string, unknown>>({
|
|
|
183
183
|
);
|
|
184
184
|
|
|
185
185
|
const isDefaultRenderer = !col.renderCell;
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
let rawContent: ReactNode = null;
|
|
187
|
+
if (!cellRenderProps.isContentSuppressed) {
|
|
188
|
+
rawContent = isDefaultRenderer
|
|
189
|
+
? defaultCellRenderer(item, col.key)
|
|
190
|
+
: (col.renderCell?.(item) ?? null);
|
|
191
|
+
}
|
|
189
192
|
|
|
190
193
|
// In truncate mode, wrap default-rendered string content in
|
|
191
194
|
// <Text maxLines={1}> for smart tooltips that only appear
|