@astryxdesign/core 0.6.0 → 0.6.1
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 +41 -3
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts +12 -1
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +44 -15
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +3 -7
- package/dist/Center/Center.d.ts +23 -16
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +7 -5
- package/dist/CodeBlock/CodeBlock.js +2 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +12 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +1 -0
- package/dist/Field/InputClearButton.d.ts +2 -2
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +5 -1
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +16 -4
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +12 -1
- package/dist/HoverCard/useHoverCard.js +2 -2
- package/dist/Indicator/CheckboxIndicator.js +2 -2
- package/dist/Indicator/RadioIndicator.js +2 -2
- package/dist/Layer/layerStack.d.ts +10 -0
- package/dist/Layer/layerStack.d.ts.map +1 -1
- package/dist/Layer/layerStack.js +21 -9
- package/dist/Layer/useLayerDismissal.d.ts +2 -3
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
- package/dist/Layer/useLayerDismissal.js +2 -3
- package/dist/NavIcon/NavIcon.js +2 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +12 -2
- package/dist/Popover/usePopover.d.ts +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +4 -2
- package/dist/ProgressBar/ProgressBar.js +2 -2
- package/dist/ScrollableArea/ScrollableArea.d.ts +79 -0
- package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -0
- package/dist/ScrollableArea/ScrollableArea.js +144 -0
- package/dist/ScrollableArea/index.d.ts +11 -0
- package/dist/ScrollableArea/index.d.ts.map +1 -0
- package/dist/ScrollableArea/index.js +11 -0
- package/dist/StatusDot/StatusDot.js +2 -2
- package/dist/TextArea/TextArea.js +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +19 -4
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +12 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +21 -14
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +56 -20
- package/dist/astryx.css +15 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/scrollGeometry.d.ts +24 -0
- package/dist/hooks/scrollGeometry.d.ts.map +1 -0
- package/dist/hooks/scrollGeometry.js +86 -0
- package/dist/hooks/scrollOwnerRegistry.d.ts +15 -0
- package/dist/hooks/scrollOwnerRegistry.d.ts.map +1 -0
- package/dist/hooks/scrollOwnerRegistry.js +24 -0
- package/dist/hooks/useFocusTrap.d.ts +8 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +22 -11
- package/dist/hooks/useScrollableArea.d.ts +51 -0
- package/dist/hooks/useScrollableArea.d.ts.map +1 -0
- package/dist/hooks/useScrollableArea.js +287 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/defineTheme.d.ts +2 -6
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +1 -1
- package/dist/theme/derivedVarRegistry.js +1 -1
- package/dist/theme/localTokens.d.ts +8 -11
- package/dist/theme/localTokens.d.ts.map +1 -1
- package/dist/theme/localTokens.js +17 -71
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +4 -4
- package/dist/utils/themeProps.d.ts +10 -10
- package/dist/utils/themeProps.d.ts.map +1 -1
- package/dist/utils/themeProps.js +27 -10
- package/locales/en.json +16 -0
- package/locales/pseudo.json +12 -0
- package/package.json +7 -2
- package/src/AppShell/AppShell.test.tsx +36 -0
- package/src/AppShell/AppShell.tsx +4 -1
- package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
- package/src/Banner/Banner.test.tsx +3 -1
- package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +56 -1
- package/src/BottomSheet/BottomSheetSwitcher.spec.md +211 -0
- package/src/BottomSheet/BottomSheetSwitcher.test.tsx +134 -2
- package/src/BottomSheet/BottomSheetSwitcher.tsx +43 -20
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +10 -5
- package/src/Breadcrumbs/BreadcrumbItem.spec.md +225 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +8 -13
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -2
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +49 -2
- package/src/Center/Center.doc.mjs +32 -28
- package/src/Center/Center.spec.md +225 -0
- package/src/Center/Center.test.tsx +42 -4
- package/src/Center/Center.tsx +24 -17
- package/src/Chat/ChatSystemMessage.test.tsx +2 -9
- package/src/CodeBlock/CodeBlock.doc.mjs +2 -2
- package/src/CodeBlock/CodeBlock.tsx +2 -2
- package/src/DateInput/DateInput.test.tsx +4 -4
- package/src/DateInput/DateInput.tsx +15 -4
- package/src/DateRangeInput/DateRangeInput.test.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +6 -4
- package/src/DateTimeInput/DateTimeInput.tsx +18 -7
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +4 -77
- package/src/Field/Field.test.tsx +42 -0
- package/src/Field/Field.tsx +6 -0
- package/src/Field/InputClearButton.test.tsx +35 -1
- package/src/Field/InputClearButton.tsx +7 -3
- package/src/Field/PanelSearchInput.tsx +21 -8
- package/src/FieldStatus/FieldStatus.spec.md +27 -17
- package/src/FieldStatus/FieldStatus.test.tsx +7 -5
- package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +198 -0
- package/src/FieldStatus/__tests__/StatusMessage.a11y.known-failures.ts +13 -0
- package/src/FieldStatus/__tests__/StatusMessage.a11y.renders.tsx +305 -0
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +317 -0
- package/src/FieldStatus/__tests__/StatusMessage.a11y.test.tsx +155 -0
- package/src/FileInput/FileInput.tsx +10 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -3
- package/src/HoverCard/HoverCard.doc.mjs +4 -4
- package/src/HoverCard/useHoverCard.tsx +2 -2
- package/src/Indicator/CheckboxIndicator.tsx +2 -2
- package/src/Indicator/Indicator.doc.mjs +2 -2
- package/src/Indicator/Indicator.test.tsx +1 -1
- package/src/Indicator/RadioIndicator.tsx +2 -2
- package/src/Layer/layerStack.ts +20 -9
- package/src/Layer/useLayerDismissal.ts +2 -3
- package/src/MultiSelector/MultiSelector.test.tsx +4 -4
- package/src/NavIcon/NavIcon.doc.mjs +4 -4
- package/src/NavIcon/NavIcon.tsx +2 -2
- package/src/NumberInput/NumberInput.tsx +18 -7
- package/src/Popover/Popover.doc.mjs +10 -10
- package/src/Popover/Popover.spec.md +55 -65
- package/src/Popover/Popover.test.tsx +29 -0
- package/src/Popover/usePopover.doc.mjs +4 -4
- package/src/Popover/usePopover.tsx +7 -4
- package/src/ProgressBar/ProgressBar.doc.mjs +4 -4
- package/src/ProgressBar/ProgressBar.test.tsx +1 -31
- package/src/ProgressBar/ProgressBar.tsx +2 -2
- package/src/RadioList/RadioList.test.tsx +5 -144
- package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +255 -0
- package/src/RadioList/__tests__/RadioGroup.a11y.known-failures.ts +12 -0
- package/src/RadioList/__tests__/RadioGroup.a11y.renders.tsx +232 -0
- package/src/RadioList/__tests__/RadioGroup.a11y.states.ts +503 -0
- package/src/RadioList/__tests__/RadioGroup.a11y.test.tsx +217 -0
- package/src/ScrollableArea/ScrollableArea.doc.mjs +100 -0
- package/src/ScrollableArea/ScrollableArea.spec.md +189 -0
- package/src/ScrollableArea/ScrollableArea.test.tsx +299 -0
- package/src/ScrollableArea/ScrollableArea.tsx +259 -0
- package/src/ScrollableArea/index.ts +26 -0
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +121 -0
- package/src/SegmentedControl/SegmentedControl.test.tsx +5 -172
- package/src/Selector/Selector.test.tsx +4 -4
- package/src/Spinner/Spinner.test.tsx +0 -18
- package/src/StatusDot/StatusDot.doc.mjs +4 -4
- package/src/StatusDot/StatusDot.tsx +2 -2
- package/src/TabList/TabList.test.tsx +5 -9
- package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +191 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +45 -0
- package/src/TabList/__tests__/Tabs.a11y.renders.tsx +92 -0
- package/src/TabList/__tests__/Tabs.a11y.states.ts +247 -0
- package/src/TabList/__tests__/Tabs.a11y.test.tsx +153 -0
- package/src/Table/Table.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +4 -4
- package/src/TextArea/TextArea.tsx +2 -2
- package/src/TextInput/TextInput.doc.mjs +2 -1
- package/src/TextInput/TextInput.test.tsx +94 -0
- package/src/TextInput/TextInput.tsx +22 -6
- package/src/TimeInput/TimeInput.tsx +18 -7
- package/src/Toast/ToastViewport.test.tsx +1 -39
- package/src/Typeahead/BaseTypeahead.doc.mjs +229 -33
- package/src/Typeahead/BaseTypeahead.spec.md +269 -0
- package/src/Typeahead/BaseTypeahead.test.tsx +200 -0
- package/src/Typeahead/BaseTypeahead.tsx +99 -30
- package/src/hooks/index.ts +13 -0
- package/src/hooks/scrollGeometry.ts +155 -0
- package/src/hooks/scrollOwnerRegistry.ts +47 -0
- package/src/hooks/useFocusTrap.ts +22 -11
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +4 -3
- package/src/hooks/useScrollableArea.doc.mjs +108 -0
- package/src/hooks/useScrollableArea.test.tsx +437 -0
- package/src/hooks/useScrollableArea.ts +469 -0
- package/src/index.ts +1 -0
- package/src/theme/defineTheme.test.ts +65 -105
- package/src/theme/defineTheme.ts +3 -9
- package/src/theme/derivedVarRegistry.ts +1 -1
- package/src/theme/localTokens.ts +25 -96
- package/src/theme/publicThemeHelperContract.test.ts +2 -2
- package/src/theme/themeAdaptations.test.ts +16 -42
- package/src/theme/themeAdaptations.ts +6 -9
- package/src/utils/themeProps.test.ts +29 -10
- package/src/utils/themeProps.ts +36 -17
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** Private DOM registry used by future axis-aware Sticky consumers. */
|
|
4
|
+
|
|
5
|
+
const owners = new WeakMap();
|
|
6
|
+
export function registerScrollOwner(element, state) {
|
|
7
|
+
owners.set(element, state);
|
|
8
|
+
}
|
|
9
|
+
export function unregisterScrollOwner(element) {
|
|
10
|
+
owners.delete(element);
|
|
11
|
+
}
|
|
12
|
+
export function getRegisteredScrollOwnerState(element) {
|
|
13
|
+
return owners.get(element);
|
|
14
|
+
}
|
|
15
|
+
export function findNearestScrollOwner(element, axis) {
|
|
16
|
+
let candidate = element.parentElement;
|
|
17
|
+
while (candidate != null) {
|
|
18
|
+
if (owners.get(candidate)?.[axis].isScrollable === true) {
|
|
19
|
+
return candidate;
|
|
20
|
+
}
|
|
21
|
+
candidate = candidate.parentElement;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
* stack rather than ask whether a trap exists.
|
|
9
9
|
*/
|
|
10
10
|
export declare function hasActiveFocusTrapEscape(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Keep the deprecated `hasActiveFocusTrapEscape` signal accurate for a focus
|
|
13
|
+
* trap whose Escape is coordinated by another registration in the shared
|
|
14
|
+
* stack. This hook is intentionally internal (not re-exported from `hooks`): it
|
|
15
|
+
* preserves the released read-only compatibility signal without creating a
|
|
16
|
+
* second dismissal owner.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useFocusTrapEscapeCompatibilitySignal(isActive: boolean): void;
|
|
11
19
|
/**
|
|
12
20
|
* Configuration for focus trap behavior
|
|
13
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusTrap.d.ts","sourceRoot":"","sources":["../../src/hooks/useFocusTrap.ts"],"names":[],"mappings":"AA8BA;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAgFD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACrE;;OAEG;IACH,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC9D,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"useFocusTrap.d.ts","sourceRoot":"","sources":["../../src/hooks/useFocusTrap.ts"],"names":[],"mappings":"AA8BA;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAU7E;AAgFD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACrE;;OAEG;IACH,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC9D,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAAC,CAAC,CAAC,CAkQvB"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useFocusTrap.ts
|
|
7
7
|
* @input Uses React useCallback, useEffect, useRef
|
|
8
|
-
* @output Exports useFocusTrap
|
|
9
|
-
*
|
|
8
|
+
* @output Exports useFocusTrap, the deprecated Escape-state shim, and an
|
|
9
|
+
* internal compatibility-signal hook
|
|
10
10
|
* @position Core hook; used by dialogs, modals, date pickers
|
|
11
11
|
*
|
|
12
12
|
* Based on WAI-ARIA dialog pattern:
|
|
@@ -39,6 +39,25 @@ export function hasActiveFocusTrapEscape() {
|
|
|
39
39
|
return activeEscapeTrapCount > 0;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Keep the deprecated `hasActiveFocusTrapEscape` signal accurate for a focus
|
|
44
|
+
* trap whose Escape is coordinated by another registration in the shared
|
|
45
|
+
* stack. This hook is intentionally internal (not re-exported from `hooks`): it
|
|
46
|
+
* preserves the released read-only compatibility signal without creating a
|
|
47
|
+
* second dismissal owner.
|
|
48
|
+
*/
|
|
49
|
+
export function useFocusTrapEscapeCompatibilitySignal(isActive) {
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!isActive) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
activeEscapeTrapCount += 1;
|
|
55
|
+
return () => {
|
|
56
|
+
activeEscapeTrapCount -= 1;
|
|
57
|
+
};
|
|
58
|
+
}, [isActive]);
|
|
59
|
+
}
|
|
60
|
+
|
|
42
61
|
/**
|
|
43
62
|
* Whether an element is currently perceivable/focusable — excludes ones hidden
|
|
44
63
|
* via `display:none`/`visibility:hidden` or inside an `inert`/`hidden` subtree,
|
|
@@ -185,15 +204,7 @@ export function useFocusTrap(options) {
|
|
|
185
204
|
// still resolve in the right order.
|
|
186
205
|
getContainer: () => containerRef.current
|
|
187
206
|
});
|
|
188
|
-
|
|
189
|
-
if (!isEscapeTrap) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
activeEscapeTrapCount += 1;
|
|
193
|
-
return () => {
|
|
194
|
-
activeEscapeTrapCount -= 1;
|
|
195
|
-
};
|
|
196
|
-
}, [isEscapeTrap]);
|
|
207
|
+
useFocusTrapEscapeCompatibilitySignal(isEscapeTrap);
|
|
197
208
|
|
|
198
209
|
/**
|
|
199
210
|
* Focus the first focusable element.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file useScrollableArea.ts
|
|
3
|
+
* @input Logical scroll intent, keyboard ownership, caller-owned viewport/content props
|
|
4
|
+
* @output Safe prop getters and stable per-axis effective scroll state
|
|
5
|
+
* @position Canonical behavior core for ScrollableArea and structure-owning adopters
|
|
6
|
+
*
|
|
7
|
+
* SYNC: When modified, update:
|
|
8
|
+
* - /packages/core/src/hooks/useScrollableArea.doc.mjs
|
|
9
|
+
* - /packages/core/src/hooks/useScrollableArea.test.tsx
|
|
10
|
+
* - /packages/core/src/hooks/index.ts
|
|
11
|
+
*/
|
|
12
|
+
import { type RefAttributes } from 'react';
|
|
13
|
+
import type { BaseProps } from '../BaseProps';
|
|
14
|
+
export type ScrollAxis = 'inline' | 'block' | 'both';
|
|
15
|
+
export type ScrollOverscroll = 'allow' | 'contain';
|
|
16
|
+
export type ScrollStickyContainment = 'whenScrollable' | 'always';
|
|
17
|
+
export type ScrollKeyboardAccess = {
|
|
18
|
+
owner: 'content';
|
|
19
|
+
} | {
|
|
20
|
+
owner: 'viewport';
|
|
21
|
+
label: string;
|
|
22
|
+
role?: 'group' | 'region';
|
|
23
|
+
};
|
|
24
|
+
export interface ScrollAxisState {
|
|
25
|
+
isScrollable: boolean;
|
|
26
|
+
atStart: boolean;
|
|
27
|
+
atEnd: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface ScrollableAreaState {
|
|
30
|
+
inline: ScrollAxisState;
|
|
31
|
+
block: ScrollAxisState;
|
|
32
|
+
}
|
|
33
|
+
export interface UseScrollableAreaOptions {
|
|
34
|
+
axis: ScrollAxis;
|
|
35
|
+
keyboardAccess: ScrollKeyboardAccess;
|
|
36
|
+
overscroll?: ScrollOverscroll;
|
|
37
|
+
stickyContainment?: ScrollStickyContainment;
|
|
38
|
+
}
|
|
39
|
+
export type ScrollableElementProps<E extends HTMLElement> = BaseProps<E> & RefAttributes<E>;
|
|
40
|
+
export interface UseScrollableAreaResult {
|
|
41
|
+
getViewportProps<E extends HTMLElement>(props?: ScrollableElementProps<E>): ScrollableElementProps<E>;
|
|
42
|
+
getContentProps<E extends HTMLElement>(props?: ScrollableElementProps<E>): ScrollableElementProps<E>;
|
|
43
|
+
state: ScrollableAreaState;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Adds axis-aware scroll behavior to caller-owned viewport and content boxes.
|
|
47
|
+
* The returned prop getters compose refs and preserve caller props, so spread
|
|
48
|
+
* order cannot detach measurement or override behavior-owned accessibility.
|
|
49
|
+
*/
|
|
50
|
+
export declare function useScrollableArea({ axis, keyboardAccess, overscroll, stickyContainment, }: UseScrollableAreaOptions): UseScrollableAreaResult;
|
|
51
|
+
//# sourceMappingURL=useScrollableArea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollableArea.d.ts","sourceRoot":"","sources":["../../src/hooks/useScrollableArea.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAOL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAiB5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;AACnD,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAC5B;IAAC,KAAK,EAAE,SAAS,CAAA;CAAC,GAClB;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAC,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,EAAE,oBAAoB,CAAC;IACrC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,GACtE,aAAa,CAAC,CAAC,CAAC,CAAC;AAEnB,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,CAAC,SAAS,WAAW,EACpC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAChC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC7B,eAAe,CAAC,CAAC,SAAS,WAAW,EACnC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAChC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAiGD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,cAAc,EACd,UAAoB,EACpB,iBAAoC,GACrC,EAAE,wBAAwB,GAAG,uBAAuB,CAwRpD"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useScrollableArea.ts
|
|
7
|
+
* @input Logical scroll intent, keyboard ownership, caller-owned viewport/content props
|
|
8
|
+
* @output Safe prop getters and stable per-axis effective scroll state
|
|
9
|
+
* @position Canonical behavior core for ScrollableArea and structure-owning adopters
|
|
10
|
+
*
|
|
11
|
+
* SYNC: When modified, update:
|
|
12
|
+
* - /packages/core/src/hooks/useScrollableArea.doc.mjs
|
|
13
|
+
* - /packages/core/src/hooks/useScrollableArea.test.tsx
|
|
14
|
+
* - /packages/core/src/hooks/index.ts
|
|
15
|
+
*/
|
|
16
|
+
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
17
|
+
import * as stylex from '@stylexjs/stylex';
|
|
18
|
+
import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect.js";
|
|
19
|
+
import { mergeProps } from "../utils/mergeProps.js";
|
|
20
|
+
import { mergeRefs } from "../utils/mergeRefs.js";
|
|
21
|
+
import { observeResize } from "../utils/sharedResizeObserver.js";
|
|
22
|
+
import { getLogicalAxisMapping, measureLogicalOverflowGeometry, measureLogicalScrollAxis } from "./scrollGeometry.js";
|
|
23
|
+
import { registerScrollOwner, unregisterScrollOwner } from "./scrollOwnerRegistry.js";
|
|
24
|
+
const INACTIVE_AXIS_STATE = {
|
|
25
|
+
isScrollable: false,
|
|
26
|
+
atStart: true,
|
|
27
|
+
atEnd: true
|
|
28
|
+
};
|
|
29
|
+
const INITIAL_STATE = {
|
|
30
|
+
inline: INACTIVE_AXIS_STATE,
|
|
31
|
+
block: INACTIVE_AXIS_STATE
|
|
32
|
+
};
|
|
33
|
+
const INITIAL_OVERFLOW = {
|
|
34
|
+
inline: false,
|
|
35
|
+
block: false
|
|
36
|
+
};
|
|
37
|
+
const INITIAL_MAPPING = {
|
|
38
|
+
inline: 'x',
|
|
39
|
+
block: 'y',
|
|
40
|
+
inlineReversed: false,
|
|
41
|
+
blockReversed: false
|
|
42
|
+
};
|
|
43
|
+
const styles = {
|
|
44
|
+
overflow: (overflowX, overflowY) => [{
|
|
45
|
+
kXHlph: overflowX != null ? "xyto64x" : overflowX,
|
|
46
|
+
kORKVm: overflowY != null ? "x4ncuvb" : overflowY,
|
|
47
|
+
$$css: true
|
|
48
|
+
}, {
|
|
49
|
+
"--x-overflowX": overflowX != null ? overflowX : undefined,
|
|
50
|
+
"--x-overflowY": overflowY != null ? overflowY : undefined
|
|
51
|
+
}]
|
|
52
|
+
};
|
|
53
|
+
function axisIsRequested(requested, axis) {
|
|
54
|
+
return requested === axis || requested === 'both';
|
|
55
|
+
}
|
|
56
|
+
function statesEqual(a, b) {
|
|
57
|
+
return a.inline.isScrollable === b.inline.isScrollable && a.inline.atStart === b.inline.atStart && a.inline.atEnd === b.inline.atEnd && a.block.isScrollable === b.block.isScrollable && a.block.atStart === b.block.atStart && a.block.atEnd === b.block.atEnd;
|
|
58
|
+
}
|
|
59
|
+
function overflowEqual(a, b) {
|
|
60
|
+
return a.inline === b.inline && a.block === b.block;
|
|
61
|
+
}
|
|
62
|
+
function mappingsEqual(a, b) {
|
|
63
|
+
return a.inline === b.inline && a.block === b.block && a.inlineReversed === b.inlineReversed && a.blockReversed === b.blockReversed;
|
|
64
|
+
}
|
|
65
|
+
function withoutOwnedOverflow(style) {
|
|
66
|
+
if (style == null) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const result = {
|
|
70
|
+
...style
|
|
71
|
+
};
|
|
72
|
+
delete result.overflow;
|
|
73
|
+
delete result.overflowX;
|
|
74
|
+
delete result.overflowY;
|
|
75
|
+
delete result.overflowInline;
|
|
76
|
+
delete result.overflowBlock;
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function useStableComposedRef(internalRef) {
|
|
80
|
+
const cachedExternalRef = useRef(undefined);
|
|
81
|
+
const cachedComposedRef = useRef(null);
|
|
82
|
+
return useCallback(externalRef => {
|
|
83
|
+
if (cachedComposedRef.current != null && Object.is(cachedExternalRef.current, externalRef)) {
|
|
84
|
+
return cachedComposedRef.current;
|
|
85
|
+
}
|
|
86
|
+
const composed = mergeRefs(externalRef, internalRef);
|
|
87
|
+
cachedExternalRef.current = externalRef;
|
|
88
|
+
cachedComposedRef.current = composed;
|
|
89
|
+
return composed;
|
|
90
|
+
}, [internalRef]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Adds axis-aware scroll behavior to caller-owned viewport and content boxes.
|
|
95
|
+
* The returned prop getters compose refs and preserve caller props, so spread
|
|
96
|
+
* order cannot detach measurement or override behavior-owned accessibility.
|
|
97
|
+
*/
|
|
98
|
+
export function useScrollableArea({
|
|
99
|
+
axis,
|
|
100
|
+
keyboardAccess,
|
|
101
|
+
overscroll = 'allow',
|
|
102
|
+
stickyContainment = 'whenScrollable'
|
|
103
|
+
}) {
|
|
104
|
+
const [viewport, setViewport] = useState(null);
|
|
105
|
+
const [content, setContent] = useState(null);
|
|
106
|
+
const [measured, setMeasured] = useState(INITIAL_STATE);
|
|
107
|
+
const [overflow, setOverflow] = useState(INITIAL_OVERFLOW);
|
|
108
|
+
const [mapping, setMapping] = useState(INITIAL_MAPPING);
|
|
109
|
+
const stateRef = useRef(INITIAL_STATE);
|
|
110
|
+
const viewportRef = useCallback(node => {
|
|
111
|
+
setViewport(current => current === node ? current : node);
|
|
112
|
+
}, []);
|
|
113
|
+
const contentRef = useCallback(node => {
|
|
114
|
+
setContent(current => current === node ? current : node);
|
|
115
|
+
}, []);
|
|
116
|
+
const getComposedViewportRef = useStableComposedRef(viewportRef);
|
|
117
|
+
const getComposedContentRef = useStableComposedRef(contentRef);
|
|
118
|
+
useIsomorphicLayoutEffect(() => {
|
|
119
|
+
if (viewport == null || content == null) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let frame = null;
|
|
123
|
+
let isActive = true;
|
|
124
|
+
const measure = () => {
|
|
125
|
+
frame = null;
|
|
126
|
+
const computedStyle = getComputedStyle(viewport);
|
|
127
|
+
const nextMapping = getLogicalAxisMapping(computedStyle.writingMode, computedStyle.direction);
|
|
128
|
+
const inlineOverflow = axisIsRequested(axis, 'inline') ? measureLogicalOverflowGeometry(viewport, 'inline', nextMapping) : false;
|
|
129
|
+
const blockOverflow = axisIsRequested(axis, 'block') ? measureLogicalOverflowGeometry(viewport, 'block', nextMapping) : false;
|
|
130
|
+
const inline = axisIsRequested(axis, 'inline') ? measureLogicalScrollAxis(viewport, 'inline', nextMapping) : INACTIVE_AXIS_STATE;
|
|
131
|
+
const block = axisIsRequested(axis, 'block') ? measureLogicalScrollAxis(viewport, 'block', nextMapping) : INACTIVE_AXIS_STATE;
|
|
132
|
+
|
|
133
|
+
// Hidden, disconnected, and zero-size viewports are unknown rather than
|
|
134
|
+
// fitting. Keep the last valid state until a bounded signal remeasures.
|
|
135
|
+
if (inlineOverflow == null || blockOverflow == null || inline == null || block == null) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const nextOverflow = {
|
|
139
|
+
inline: inlineOverflow,
|
|
140
|
+
block: blockOverflow
|
|
141
|
+
};
|
|
142
|
+
const nextState = {
|
|
143
|
+
inline,
|
|
144
|
+
block
|
|
145
|
+
};
|
|
146
|
+
stateRef.current = nextState;
|
|
147
|
+
registerScrollOwner(viewport, nextState);
|
|
148
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- measured DOM geometry controls whether the viewport becomes a CSS scroll container
|
|
149
|
+
setOverflow(current => overflowEqual(current, nextOverflow) ? current : nextOverflow);
|
|
150
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- measured DOM state is the hook's output
|
|
151
|
+
setMeasured(current => statesEqual(current, nextState) ? current : nextState);
|
|
152
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- writing-mode changes remap behavior-owned physical CSS
|
|
153
|
+
setMapping(current => mappingsEqual(current, nextMapping) ? current : nextMapping);
|
|
154
|
+
};
|
|
155
|
+
const scheduleMeasure = () => {
|
|
156
|
+
if (!isActive || frame != null) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
frame = window.requestAnimationFrame(measure);
|
|
160
|
+
};
|
|
161
|
+
registerScrollOwner(viewport, stateRef.current);
|
|
162
|
+
measure();
|
|
163
|
+
const stopObservingViewport = observeResize(viewport, scheduleMeasure);
|
|
164
|
+
const stopObservingContent = observeResize(content, scheduleMeasure);
|
|
165
|
+
viewport.addEventListener('scroll', scheduleMeasure, {
|
|
166
|
+
passive: true
|
|
167
|
+
});
|
|
168
|
+
window.addEventListener('resize', scheduleMeasure);
|
|
169
|
+
window.visualViewport?.addEventListener('resize', scheduleMeasure);
|
|
170
|
+
content.addEventListener('load', scheduleMeasure, true);
|
|
171
|
+
viewport.addEventListener('transitionend', scheduleMeasure);
|
|
172
|
+
viewport.addEventListener('animationend', scheduleMeasure);
|
|
173
|
+
content.addEventListener('transitionend', scheduleMeasure);
|
|
174
|
+
content.addEventListener('animationend', scheduleMeasure);
|
|
175
|
+
const mutationObserver = typeof MutationObserver === 'undefined' ? null : new MutationObserver(scheduleMeasure);
|
|
176
|
+
mutationObserver?.observe(viewport, {
|
|
177
|
+
attributes: true,
|
|
178
|
+
attributeFilter: ['class', 'dir', 'hidden', 'style']
|
|
179
|
+
});
|
|
180
|
+
mutationObserver?.observe(content, {
|
|
181
|
+
attributes: true,
|
|
182
|
+
attributeFilter: ['class', 'dir', 'hidden', 'style'],
|
|
183
|
+
characterData: true,
|
|
184
|
+
childList: true,
|
|
185
|
+
subtree: true
|
|
186
|
+
});
|
|
187
|
+
let ancestor = viewport.parentElement;
|
|
188
|
+
while (ancestor != null) {
|
|
189
|
+
mutationObserver?.observe(ancestor, {
|
|
190
|
+
attributes: true,
|
|
191
|
+
attributeFilter: ['class', 'dir', 'hidden', 'style']
|
|
192
|
+
});
|
|
193
|
+
ancestor = ancestor.parentElement;
|
|
194
|
+
}
|
|
195
|
+
const fonts = document.fonts;
|
|
196
|
+
fonts?.addEventListener?.('loadingdone', scheduleMeasure);
|
|
197
|
+
void fonts?.ready.then(scheduleMeasure);
|
|
198
|
+
return () => {
|
|
199
|
+
isActive = false;
|
|
200
|
+
unregisterScrollOwner(viewport);
|
|
201
|
+
stopObservingViewport();
|
|
202
|
+
stopObservingContent();
|
|
203
|
+
mutationObserver?.disconnect();
|
|
204
|
+
viewport.removeEventListener('scroll', scheduleMeasure);
|
|
205
|
+
window.removeEventListener('resize', scheduleMeasure);
|
|
206
|
+
window.visualViewport?.removeEventListener('resize', scheduleMeasure);
|
|
207
|
+
content.removeEventListener('load', scheduleMeasure, true);
|
|
208
|
+
viewport.removeEventListener('transitionend', scheduleMeasure);
|
|
209
|
+
viewport.removeEventListener('animationend', scheduleMeasure);
|
|
210
|
+
content.removeEventListener('transitionend', scheduleMeasure);
|
|
211
|
+
content.removeEventListener('animationend', scheduleMeasure);
|
|
212
|
+
fonts?.removeEventListener?.('loadingdone', scheduleMeasure);
|
|
213
|
+
if (frame != null) {
|
|
214
|
+
window.cancelAnimationFrame(frame);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}, [axis, content, viewport]);
|
|
218
|
+
const state = useMemo(() => ({
|
|
219
|
+
inline: axisIsRequested(axis, 'inline') ? measured.inline : INACTIVE_AXIS_STATE,
|
|
220
|
+
block: axisIsRequested(axis, 'block') ? measured.block : INACTIVE_AXIS_STATE
|
|
221
|
+
}), [axis, measured]);
|
|
222
|
+
const getViewportProps = useCallback((props = {}) => {
|
|
223
|
+
const hasEffectiveAxis = state.inline.isScrollable || state.block.isScrollable;
|
|
224
|
+
const requestedX = axisIsRequested(axis, 'inline') && mapping.inline === 'x' || axisIsRequested(axis, 'block') && mapping.block === 'x';
|
|
225
|
+
const requestedY = axisIsRequested(axis, 'inline') && mapping.inline === 'y' || axisIsRequested(axis, 'block') && mapping.block === 'y';
|
|
226
|
+
const overflowingX = overflow.inline && mapping.inline === 'x' || overflow.block && mapping.block === 'x';
|
|
227
|
+
const overflowingY = overflow.inline && mapping.inline === 'y' || overflow.block && mapping.block === 'y';
|
|
228
|
+
const containsSticky = overflowingX || overflowingY || stickyContainment === 'always';
|
|
229
|
+
const scrollsOnX = stickyContainment === 'always' ? requestedX : overflowingX;
|
|
230
|
+
const scrollsOnY = stickyContainment === 'always' ? requestedY : overflowingY;
|
|
231
|
+
const {
|
|
232
|
+
xstyle,
|
|
233
|
+
...domProps
|
|
234
|
+
} = props;
|
|
235
|
+
const callerProps = {
|
|
236
|
+
...domProps,
|
|
237
|
+
style: withoutOwnedOverflow(domProps.style)
|
|
238
|
+
};
|
|
239
|
+
const styledProps = mergeProps(callerProps, stylex.props(xstyle, styles.overflow(containsSticky ? scrollsOnX ? 'auto' : 'hidden' : 'clip', containsSticky ? scrollsOnY ? 'auto' : 'hidden' : 'clip')));
|
|
240
|
+
const keepsProgrammaticFocus = !hasEffectiveAxis && viewport != null && typeof document !== 'undefined' && document.activeElement === viewport;
|
|
241
|
+
const behaviorStyle = {
|
|
242
|
+
...styledProps.style
|
|
243
|
+
};
|
|
244
|
+
const containInline = overscroll === 'contain' && state.inline.isScrollable;
|
|
245
|
+
const containBlock = overscroll === 'contain' && state.block.isScrollable;
|
|
246
|
+
const inlinePhysical = mapping.inline;
|
|
247
|
+
const blockPhysical = mapping.block;
|
|
248
|
+
if (axisIsRequested(axis, 'inline')) {
|
|
249
|
+
behaviorStyle[inlinePhysical === 'x' ? 'overscrollBehaviorX' : 'overscrollBehaviorY'] = containInline ? 'contain' : 'auto';
|
|
250
|
+
}
|
|
251
|
+
if (axisIsRequested(axis, 'block')) {
|
|
252
|
+
behaviorStyle[blockPhysical === 'x' ? 'overscrollBehaviorX' : 'overscrollBehaviorY'] = containBlock ? 'contain' : 'auto';
|
|
253
|
+
}
|
|
254
|
+
const keyboardProps = keyboardAccess.owner === 'viewport' ? {
|
|
255
|
+
role: keyboardAccess.role ?? 'group',
|
|
256
|
+
'aria-label': keyboardAccess.label,
|
|
257
|
+
tabIndex: hasEffectiveAxis ? 0 : keepsProgrammaticFocus ? -1 : undefined
|
|
258
|
+
} : {};
|
|
259
|
+
const result = {
|
|
260
|
+
...styledProps,
|
|
261
|
+
...keyboardProps,
|
|
262
|
+
ref: getComposedViewportRef(styledProps.ref),
|
|
263
|
+
style: behaviorStyle,
|
|
264
|
+
'data-scroll-axis': axis,
|
|
265
|
+
'data-scrollable-inline': state.inline.isScrollable ? 'true' : undefined,
|
|
266
|
+
'data-scrollable-block': state.block.isScrollable ? 'true' : undefined,
|
|
267
|
+
'data-scroll-inline-start': state.inline.atStart ? 'true' : undefined,
|
|
268
|
+
'data-scroll-inline-end': state.inline.atEnd ? 'true' : undefined,
|
|
269
|
+
'data-scroll-block-start': state.block.atStart ? 'true' : undefined,
|
|
270
|
+
'data-scroll-block-end': state.block.atEnd ? 'true' : undefined
|
|
271
|
+
};
|
|
272
|
+
return result;
|
|
273
|
+
}, [axis, getComposedViewportRef, keyboardAccess, mapping, overflow, overscroll, state, stickyContainment, viewport]);
|
|
274
|
+
const getContentProps = useCallback((props = {}) => {
|
|
275
|
+
const result = {
|
|
276
|
+
...props,
|
|
277
|
+
ref: getComposedContentRef(props.ref),
|
|
278
|
+
'data-scroll-content': ''
|
|
279
|
+
};
|
|
280
|
+
return result;
|
|
281
|
+
}, [getComposedContentRef]);
|
|
282
|
+
return {
|
|
283
|
+
getViewportProps,
|
|
284
|
+
getContentProps,
|
|
285
|
+
state
|
|
286
|
+
};
|
|
287
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export * from './CheckboxList';
|
|
|
35
35
|
export * from './Collapsible';
|
|
36
36
|
export * from './RadioList';
|
|
37
37
|
export * from './Resizable';
|
|
38
|
+
export * from './ScrollableArea';
|
|
38
39
|
export * from './Divider';
|
|
39
40
|
export * from './VisuallyHidden';
|
|
40
41
|
export * from './EmptyState';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -41,6 +41,7 @@ export * from "./CheckboxList/index.js";
|
|
|
41
41
|
export * from "./Collapsible/index.js";
|
|
42
42
|
export * from "./RadioList/index.js";
|
|
43
43
|
export * from "./Resizable/index.js";
|
|
44
|
+
export * from "./ScrollableArea/index.js";
|
|
44
45
|
export * from "./Divider/index.js";
|
|
45
46
|
export * from "./VisuallyHidden/index.js";
|
|
46
47
|
export * from "./EmptyState/index.js";
|
|
@@ -247,12 +247,8 @@ export interface DefineThemeInput {
|
|
|
247
247
|
* Values can be a string or [light, dark] tuple.
|
|
248
248
|
* Only include tokens you want to override; defaults fill the rest. */
|
|
249
249
|
tokens?: Partial<Record<TokenName, TokenValue>>;
|
|
250
|
-
/**
|
|
251
|
-
*
|
|
252
|
-
* `--astryx-theme-${name}-...` spelling and values follow `TokenValue`.
|
|
253
|
-
* These names are available only to this enrolled theme lineage and do not
|
|
254
|
-
* become portable `TokenName` values.
|
|
255
|
-
*/
|
|
250
|
+
/** Theme-family-local values keyed by any valid CSS custom-property name;
|
|
251
|
+
* prefixes do not establish ownership. */
|
|
256
252
|
localTokens?: Record<string, TokenValue>;
|
|
257
253
|
/**
|
|
258
254
|
* Component style overrides — keyed by component name (lowercase).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"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"}
|
|
@@ -226,7 +226,7 @@ export function defineTheme(input) {
|
|
|
226
226
|
// media-surface value stays more specific in the authored cascade.
|
|
227
227
|
const __onDark = resolveOnMedia('dark', input.onDark, base?.__onDark);
|
|
228
228
|
const __onLight = resolveOnMedia('light', input.onLight, base?.__onLight);
|
|
229
|
-
const localTokenContract = resolveLocalTokenContract(input, base, tokens,
|
|
229
|
+
const localTokenContract = resolveLocalTokenContract(input, base, tokens, tokenDefaults);
|
|
230
230
|
|
|
231
231
|
// Adaptations inherit their breakpoint map and ordered rules. Every rule is
|
|
232
232
|
// re-resolved against this theme's effective root axes, so a child can change
|
|
@@ -126,7 +126,7 @@ export const derivedVarRegistry = {
|
|
|
126
126
|
* the old key still selects the element. Without this the rule would land but
|
|
127
127
|
* its derived vars would not expand, and the half that travels through a var
|
|
128
128
|
* (a hover card's radius, a text area's inline padding) would silently do
|
|
129
|
-
* nothing.
|
|
129
|
+
* nothing. Keep these aliases aligned with the emitted compatibility classes.
|
|
130
130
|
*/
|
|
131
131
|
const DEPRECATED_REGISTRY_KEYS = {
|
|
132
132
|
hovercard: 'hover-card',
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file localTokens.ts
|
|
3
3
|
* @input Root and adaptation theme-local token declarations and references
|
|
4
|
-
* @output Validated
|
|
5
|
-
* @position Theme-local
|
|
4
|
+
* @output Validated exact-name ownership metadata plus normalized conditional writes
|
|
5
|
+
* @position Theme-local ownership boundary; final adaptation-cycle validation is
|
|
6
6
|
* performed after the reachable ordered cascade is assembled.
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
9
|
-
import type { ResolvedOnMedia } from './onMediaTokens';
|
|
10
|
-
/** Whether a custom-property name belongs to Astryx's reserved local namespace. */
|
|
11
|
-
export declare function isReservedThemeLocalTokenName(name: string): boolean;
|
|
8
|
+
import type { DefinedTheme, TokenValue } from './defineTheme';
|
|
12
9
|
export interface ResolvedLocalTokenContract {
|
|
13
10
|
localTokens: Record<string, string>;
|
|
14
11
|
owners: Record<string, string>;
|
|
@@ -19,18 +16,18 @@ export declare function assertNoTokenCycles(tokenValues: Record<string, string>,
|
|
|
19
16
|
* Resolve and validate the opt-in theme-local token contract.
|
|
20
17
|
*
|
|
21
18
|
* Themes that omit `localTokens` and do not extend an enrolled base bypass this
|
|
22
|
-
* function's
|
|
19
|
+
* function's exact owner and lineage checks so legacy token behavior stays intact.
|
|
23
20
|
*/
|
|
24
21
|
export declare function resolveLocalTokenContract(input: {
|
|
25
22
|
name: string;
|
|
26
23
|
localTokens?: Record<string, TokenValue>;
|
|
27
|
-
}, base: DefinedTheme | undefined, tokens: Record<string, string>,
|
|
24
|
+
}, base: DefinedTheme | undefined, tokens: Record<string, string>, portableTokens: Readonly<Record<string, string>>): ResolvedLocalTokenContract | undefined;
|
|
28
25
|
/**
|
|
29
26
|
* Resolve theme-local values written by one adaptation rule.
|
|
30
27
|
*
|
|
31
28
|
* Adaptations may replace names already enrolled by the root theme lineage, but
|
|
32
|
-
* they never enroll names of their own.
|
|
33
|
-
*
|
|
29
|
+
* they never enroll names of their own. Cycle validation waits until all
|
|
30
|
+
* co-matching writes have cascaded in order.
|
|
34
31
|
*/
|
|
35
|
-
export declare function resolveAdaptationLocalTokens(themeName: string, ruleIndex: number, declarations: Record<string, TokenValue> | undefined, rootLocalTokens: Record<string, string> | undefined
|
|
32
|
+
export declare function resolveAdaptationLocalTokens(themeName: string, ruleIndex: number, declarations: Record<string, TokenValue> | undefined, rootLocalTokens: Record<string, string> | undefined): Record<string, string> | undefined;
|
|
36
33
|
//# sourceMappingURL=localTokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localTokens.d.ts","sourceRoot":"","sources":["../../src/theme/localTokens.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"localTokens.d.ts","sourceRoot":"","sources":["../../src/theme/localTokens.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,YAAY,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAY5D,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAuDD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,IAAI,CA4GN;AAwDD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC1C,EACD,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC/C,0BAA0B,GAAG,SAAS,CAgExC;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,EACpD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAClD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAwBpC"}
|