@astryxdesign/core 0.6.1 → 0.6.2-canary.2b2113d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/dist/BottomSheet/BottomSheet.d.ts +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +3 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +56 -19
- package/dist/DateRangeInput/DateRangeInput.d.ts +3 -0
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +16 -9
- package/dist/Dialog/DialogHeader.d.ts +1 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +10 -7
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +9 -3
- package/dist/Markdown/Markdown.d.ts +10 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +58 -14
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +126 -12
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +369 -34
- package/dist/Markdown/utils.d.ts +1 -1
- package/dist/Markdown/utils.d.ts.map +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +5 -2
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +23 -15
- package/dist/astryx.css +5 -2
- package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
- package/dist/hooks/scrollKeyboardDelegation.js +146 -0
- package/dist/hooks/useScrollableArea.d.ts +6 -2
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +17 -5
- package/locales/en.json +16 -0
- package/locales/pseudo.json +12 -0
- package/package.json +7 -5
- package/scripts/agent-doc-state.mjs +1 -1
- package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
- package/src/BottomSheet/BottomSheet.spec.md +46 -20
- package/src/BottomSheet/BottomSheet.test.tsx +6 -3
- package/src/BottomSheet/BottomSheet.tsx +3 -1
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +35 -7
- package/src/DateRangeInput/DateRangeInput.spec.md +203 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +100 -4
- package/src/DateRangeInput/DateRangeInput.tsx +29 -20
- package/src/Dialog/Dialog.doc.mjs +3 -0
- package/src/Dialog/Dialog.spec.md +1 -1
- package/src/Dialog/DialogHeader.doc.mjs +38 -0
- package/src/Dialog/DialogHeader.test.tsx +49 -0
- package/src/Dialog/DialogHeader.tsx +23 -4
- package/src/Dialog/modules/DialogHeader.spec.md +152 -0
- package/src/FileInput/FileInput.doc.mjs +2 -0
- package/src/FileInput/FileInput.spec.md +199 -0
- package/src/FileInput/FileInput.test.tsx +14 -0
- package/src/FileInput/FileInput.tsx +13 -3
- package/src/Markdown/Markdown.doc.mjs +167 -42
- package/src/Markdown/Markdown.public.test.ts +157 -0
- package/src/Markdown/Markdown.spec.md +149 -70
- package/src/Markdown/Markdown.test.tsx +107 -3
- package/src/Markdown/Markdown.tsx +116 -35
- package/src/Markdown/incremental.test.ts +175 -7
- package/src/Markdown/index.ts +6 -0
- package/src/Markdown/parser.perf.test.ts +3 -1
- package/src/Markdown/parser.test.ts +122 -0
- package/src/Markdown/parser.ts +609 -81
- package/src/Markdown/utils.ts +6 -0
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
- package/src/Slider/Slider.doc.mjs +16 -0
- package/src/Slider/Slider.spec.md +61 -47
- package/src/Slider/Slider.test.tsx +18 -0
- package/src/Slider/Slider.tsx +12 -6
- package/src/Spinner/Spinner.doc.mjs +6 -3
- package/src/Spinner/Spinner.test.tsx +37 -0
- package/src/Spinner/Spinner.tsx +31 -14
- package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
- package/src/hooks/scrollKeyboardDelegation.ts +233 -0
- package/src/hooks/useScrollableArea.doc.mjs +15 -3
- package/src/hooks/useScrollableArea.test.tsx +59 -1
- package/src/hooks/useScrollableArea.ts +34 -10
- package/src/theme/derivedVarRegistry.test.ts +6 -4
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useScrollableArea.ts
|
|
7
|
-
* @input Logical scroll intent, keyboard
|
|
8
|
-
* @output Safe prop getters and stable per-axis effective scroll state
|
|
7
|
+
* @input Logical scroll intent, focus-time keyboard delegation, caller-owned viewport/content props
|
|
8
|
+
* @output Safe prop getters, native keyboard entry, and stable per-axis effective scroll state
|
|
9
9
|
* @position Canonical behavior core for ScrollableArea and structure-owning adopters
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update:
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
} from 'react';
|
|
27
27
|
import * as stylex from '@stylexjs/stylex';
|
|
28
28
|
import type {BaseProps} from '../BaseProps';
|
|
29
|
+
import {attachScrollKeyboardDelegation} from './scrollKeyboardDelegation';
|
|
29
30
|
import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
|
|
30
31
|
import {mergeProps} from '../utils/mergeProps';
|
|
31
32
|
import {mergeRefs} from '../utils/mergeRefs';
|
|
@@ -48,7 +49,12 @@ export type ScrollStickyContainment = 'whenScrollable' | 'always';
|
|
|
48
49
|
|
|
49
50
|
export type ScrollKeyboardAccess =
|
|
50
51
|
| {owner: 'content'}
|
|
51
|
-
| {owner: 'viewport'; label: string; role?: 'group' | 'region'}
|
|
52
|
+
| {owner: 'viewport'; label: string; role?: 'group' | 'region'}
|
|
53
|
+
| {
|
|
54
|
+
owner: 'contentOrViewport';
|
|
55
|
+
label: string;
|
|
56
|
+
role?: 'group' | 'region';
|
|
57
|
+
};
|
|
52
58
|
|
|
53
59
|
export interface ScrollAxisState {
|
|
54
60
|
isScrollable: boolean;
|
|
@@ -285,6 +291,8 @@ export function useScrollableArea({
|
|
|
285
291
|
content.addEventListener('transitionend', scheduleMeasure);
|
|
286
292
|
content.addEventListener('animationend', scheduleMeasure);
|
|
287
293
|
|
|
294
|
+
// Geometry invalidation is independent of keyboard eligibility. The latter
|
|
295
|
+
// is inspected only on native keyboard entry, never by these observers.
|
|
288
296
|
const mutationObserver =
|
|
289
297
|
typeof MutationObserver === 'undefined'
|
|
290
298
|
? null
|
|
@@ -346,6 +354,20 @@ export function useScrollableArea({
|
|
|
346
354
|
[axis, measured],
|
|
347
355
|
);
|
|
348
356
|
|
|
357
|
+
const hasEffectiveAxis =
|
|
358
|
+
state.inline.isScrollable || state.block.isScrollable;
|
|
359
|
+
useIsomorphicLayoutEffect(() => {
|
|
360
|
+
if (
|
|
361
|
+
keyboardAccess.owner !== 'contentOrViewport' ||
|
|
362
|
+
!hasEffectiveAxis ||
|
|
363
|
+
viewport == null ||
|
|
364
|
+
content == null
|
|
365
|
+
) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
return attachScrollKeyboardDelegation(viewport, content);
|
|
369
|
+
}, [content, hasEffectiveAxis, keyboardAccess.owner, viewport]);
|
|
370
|
+
|
|
349
371
|
const getViewportProps = useCallback(
|
|
350
372
|
<E extends HTMLElement>(
|
|
351
373
|
props: ScrollableElementProps<E> = {},
|
|
@@ -385,8 +407,9 @@ export function useScrollableArea({
|
|
|
385
407
|
),
|
|
386
408
|
),
|
|
387
409
|
) as ScrollableElementProps<E>;
|
|
410
|
+
const viewportIsKeyboardOwner = keyboardAccess.owner !== 'content';
|
|
388
411
|
const keepsProgrammaticFocus =
|
|
389
|
-
!hasEffectiveAxis &&
|
|
412
|
+
(!viewportIsKeyboardOwner || !hasEffectiveAxis) &&
|
|
390
413
|
viewport != null &&
|
|
391
414
|
typeof document !== 'undefined' &&
|
|
392
415
|
document.activeElement === viewport;
|
|
@@ -409,15 +432,16 @@ export function useScrollableArea({
|
|
|
409
432
|
}
|
|
410
433
|
|
|
411
434
|
const keyboardProps =
|
|
412
|
-
keyboardAccess.owner
|
|
435
|
+
keyboardAccess.owner !== 'content'
|
|
413
436
|
? {
|
|
414
437
|
role: keyboardAccess.role ?? 'group',
|
|
415
438
|
'aria-label': keyboardAccess.label,
|
|
416
|
-
tabIndex:
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
439
|
+
tabIndex:
|
|
440
|
+
viewportIsKeyboardOwner && hasEffectiveAxis
|
|
441
|
+
? 0
|
|
442
|
+
: keepsProgrammaticFocus
|
|
443
|
+
? -1
|
|
444
|
+
: undefined,
|
|
421
445
|
}
|
|
422
446
|
: {};
|
|
423
447
|
|
|
@@ -310,15 +310,17 @@ const VARS_WITHOUT_DERIVED_MAPPING = new Set([
|
|
|
310
310
|
// It is one component of one shadow in the list, so no standard property
|
|
311
311
|
// maps onto it either — a theme sets it beside the fill it has to contrast.
|
|
312
312
|
'--selectable-card-ring-color',
|
|
313
|
-
// The spinner's ring is drawn as an SVG circle, so none of its
|
|
313
|
+
// The spinner's ring is drawn as an SVG circle, so none of its five vars is
|
|
314
314
|
// a CSS property of the element carrying the theme target: `width` and
|
|
315
|
-
// `borderWidth` would name a box the ring is not,
|
|
316
|
-
//
|
|
317
|
-
//
|
|
315
|
+
// `borderWidth` would name a box the ring is not, a `color` mapping would
|
|
316
|
+
// take the label's text color with it, and the arc fraction is a pure
|
|
317
|
+
// dash-length multiplier with no standard property to attach to. They are
|
|
318
|
+
// public vars a theme sets directly under a size- or shade-variant key.
|
|
318
319
|
'--spinner-diameter',
|
|
319
320
|
'--spinner-stroke-width',
|
|
320
321
|
'--spinner-color',
|
|
321
322
|
'--spinner-track-color',
|
|
323
|
+
'--spinner-arc-fraction',
|
|
322
324
|
]);
|
|
323
325
|
|
|
324
326
|
// ---------------------------------------------------------------------------
|