@cdx-ui/components 0.2.3 → 0.2.5
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/AGENTS.md +24 -0
- package/README.md +2 -0
- package/coverage.svg +1 -1
- package/docs/components/accordion/content.md +538 -0
- package/docs/components/alert/content.md +203 -0
- package/docs/components/alert-dialog/content.md +319 -0
- package/docs/components/avatar/content.md +368 -0
- package/docs/components/avatar/design.md +202 -0
- package/docs/components/badge/content.md +225 -0
- package/docs/components/bottom-sheet/content.md +353 -0
- package/docs/components/bottom-sheet/design.md +249 -0
- package/docs/components/box/content.md +141 -0
- package/docs/components/breadcrumbs/content.md +169 -0
- package/docs/components/button/content.md +398 -0
- package/docs/components/button/design.md +258 -0
- package/docs/components/calendar/content.md +137 -0
- package/docs/components/card/content.md +283 -0
- package/docs/components/carousel/content.md +417 -0
- package/docs/components/checkbox/content.md +236 -0
- package/docs/components/checkbox/design.md +214 -0
- package/docs/components/chip/content.md +439 -0
- package/docs/components/chip/design.md +418 -0
- package/docs/components/color-area/content.md +84 -0
- package/docs/components/color-field/content.md +132 -0
- package/docs/components/color-picker/content.md +209 -0
- package/docs/components/color-slider/content.md +118 -0
- package/docs/components/color-swatch/content.md +62 -0
- package/docs/components/color-swatch-picker/content.md +124 -0
- package/docs/components/content.md +98 -0
- package/docs/components/currency-input/content.md +205 -0
- package/docs/components/data-grid/content.md +521 -0
- package/docs/components/date-field/content.md +147 -0
- package/docs/components/date-picker/content.md +360 -0
- package/docs/components/date-range-picker/content.md +301 -0
- package/docs/components/date-time-field/content.md +157 -0
- package/docs/components/date-time-list/content.md +105 -0
- package/docs/components/date-time-picker/content.md +272 -0
- package/docs/components/dialog/content.md +436 -0
- package/docs/components/dialog/design.md +192 -0
- package/docs/components/divider/content.md +112 -0
- package/docs/components/drawer/content.md +428 -0
- package/docs/components/field/content.md +277 -0
- package/docs/components/form/content.md +62 -0
- package/docs/components/full-screen-dialog/content.md +881 -0
- package/docs/components/heading/content.md +55 -0
- package/docs/components/icon/content.md +190 -0
- package/docs/components/icon-button/content.md +200 -0
- package/docs/components/icon-button/design.md +165 -0
- package/docs/components/image/content.md +104 -0
- package/docs/components/input/content.md +346 -0
- package/docs/components/input/design.md +389 -0
- package/docs/components/insurance-disclosure/content.md +103 -0
- package/docs/components/link/content.md +180 -0
- package/docs/components/link/design.md +160 -0
- package/docs/components/list-item/content.md +695 -0
- package/docs/components/menu/content.md +1254 -0
- package/docs/components/month-calendar/content.md +84 -0
- package/docs/components/month-picker/content.md +273 -0
- package/docs/components/otp-input/content.md +327 -0
- package/docs/components/progress-bar/content.md +87 -0
- package/docs/components/progress-circle/content.md +176 -0
- package/docs/components/progress-segmented/content.md +119 -0
- package/docs/components/quick-action-button/content.md +154 -0
- package/docs/components/quick-action-button/design.md +170 -0
- package/docs/components/radio/content.md +224 -0
- package/docs/components/range-calendar/content.md +123 -0
- package/docs/components/reorderable-list/content.md +311 -0
- package/docs/components/scoped-theme/content.md +47 -0
- package/docs/components/scroll-shadow/content.md +693 -0
- package/docs/components/select/content.md +473 -0
- package/docs/components/select/design.md +301 -0
- package/docs/components/skeleton/content.md +104 -0
- package/docs/components/slider/content.md +423 -0
- package/docs/components/stack/content.md +161 -0
- package/docs/components/switch/content.md +150 -0
- package/docs/components/switch/design.md +208 -0
- package/docs/components/table/content.md +548 -0
- package/docs/components/table-pagination/content.md +177 -0
- package/docs/components/tabs/content.md +297 -0
- package/docs/components/text/content.md +142 -0
- package/docs/components/textarea/content.md +222 -0
- package/docs/components/tile/content.md +702 -0
- package/docs/components/toast/content.md +456 -0
- package/docs/components/toggle-button/content.md +505 -0
- package/docs/components/tooltip/content.md +350 -0
- package/docs/components/virtualized-list/content.md +250 -0
- package/docs/foundations/content.md +9 -0
- package/docs/foundations/expressions/icons/content.md +19 -0
- package/docs/foundations/styles/tokens/all-tokens/content.md +192 -0
- package/docs/foundations/styles/tokens/what-are-tokens/content.md +33 -0
- package/docs/foundations/styles/tokens/what-are-tokens/design.md +33 -0
- package/docs/getting-started/content.md +4 -0
- package/docs/getting-started/designers/content.md +13 -0
- package/docs/getting-started/designers/design.md +13 -0
- package/docs/getting-started/developers/accessibility/content.md +31 -0
- package/docs/getting-started/developers/content.md +612 -0
- package/docs/getting-started/developers/styling/content.md +195 -0
- package/docs/llms.txt +195 -0
- package/docs/patterns/account-management/content.md +75 -0
- package/docs/patterns/authentication/content.md +50 -0
- package/docs/patterns/content.md +10 -0
- package/docs/patterns/dashboard/content.md +34 -0
- package/docs/patterns/empty-states/content.md +32 -0
- package/docs/patterns/forms/content.md +108 -0
- package/docs/patterns/onboarding/content.md +69 -0
- package/docs/patterns/payments/content.md +35 -0
- package/docs/patterns/settings/content.md +72 -0
- package/docs/resources/content.md +9 -0
- package/docs/resources/figma-libraries/content.md +42 -0
- package/docs/resources/release-notes/0.0.1-beta.118/content.md +27 -0
- package/docs/resources/release-notes/0.0.1-beta.122/content.md +21 -0
- package/docs/resources/release-notes/0.0.1-beta.124/content.md +16 -0
- package/docs/resources/release-notes/0.0.1-beta.126/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.127/content.md +14 -0
- package/docs/resources/release-notes/0.0.1-beta.128/content.md +9 -0
- package/docs/resources/release-notes/0.0.1-beta.129/content.md +18 -0
- package/docs/resources/release-notes/0.0.1-beta.130/content.md +18 -0
- package/docs/resources/release-notes/0.0.1-beta.133/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.134/content.md +17 -0
- package/docs/resources/release-notes/0.0.1-beta.136/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.137/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.138/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.139/content.md +13 -0
- package/docs/resources/release-notes/0.0.1-beta.140/content.md +26 -0
- package/docs/resources/release-notes/0.0.1-beta.141/content.md +63 -0
- package/docs/resources/release-notes/0.0.1-beta.142/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.143/content.md +12 -0
- package/docs/resources/release-notes/0.0.1-beta.144/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.145/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.147/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.149/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.150/content.md +13 -0
- package/docs/resources/release-notes/0.0.1-beta.152/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.154/content.md +15 -0
- package/docs/resources/release-notes/0.0.1-beta.156/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.158/content.md +9 -0
- package/docs/resources/release-notes/0.0.1-beta.159/content.md +11 -0
- package/docs/resources/release-notes/0.0.1-beta.160/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.161/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.163/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.164/content.md +9 -0
- package/docs/resources/release-notes/0.0.1-beta.166/content.md +17 -0
- package/docs/resources/release-notes/0.0.1-beta.167/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.168/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.169/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.171/content.md +16 -0
- package/docs/resources/release-notes/0.0.1-beta.172/content.md +24 -0
- package/docs/resources/release-notes/0.0.1-beta.173/content.md +15 -0
- package/docs/resources/release-notes/0.0.1-beta.174/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.176/content.md +32 -0
- package/docs/resources/release-notes/0.0.1-beta.179/content.md +11 -0
- package/docs/resources/release-notes/0.0.1-beta.182/content.md +13 -0
- package/docs/resources/release-notes/0.0.1-beta.185/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.187/content.md +27 -0
- package/docs/resources/release-notes/0.1.1/content.md +23 -0
- package/docs/resources/release-notes/0.1.2/content.md +7 -0
- package/docs/resources/release-notes/0.1.4/content.md +19 -0
- package/docs/resources/release-notes/0.1.5/content.md +7 -0
- package/docs/resources/release-notes/0.1.6/content.md +7 -0
- package/docs/resources/release-notes/0.2.0/content.md +31 -0
- package/docs/resources/release-notes/0.2.1/content.md +17 -0
- package/docs/resources/release-notes/0.2.2/content.md +11 -0
- package/docs/resources/release-notes/0.2.3/content.md +15 -0
- package/docs/resources/release-notes/0.2.4/content.md +17 -0
- package/docs/resources/release-notes/content.md +65 -0
- package/lib/commonjs/components/Box/Box.js +9 -1
- package/lib/commonjs/components/Box/Box.js.map +1 -1
- package/lib/commonjs/components/Breadcrumbs/index.js +28 -3
- package/lib/commonjs/components/Breadcrumbs/index.js.map +1 -1
- package/lib/commonjs/components/Breadcrumbs/styles.js +27 -0
- package/lib/commonjs/components/Breadcrumbs/styles.js.map +1 -1
- package/lib/commonjs/components/DateTimeList/index.js +11 -26
- package/lib/commonjs/components/DateTimeList/index.js.map +1 -1
- package/lib/commonjs/components/DateTimeList/styles.js +2 -12
- package/lib/commonjs/components/DateTimeList/styles.js.map +1 -1
- package/lib/commonjs/components/ListItem/index.js.map +1 -1
- package/lib/commonjs/components/ListItem/styles.js +2 -1
- package/lib/commonjs/components/ListItem/styles.js.map +1 -1
- package/lib/commonjs/components/Menu/index.js +11 -5
- package/lib/commonjs/components/Menu/index.js.map +1 -1
- package/lib/commonjs/components/ScrollShadow/gradient.js +29 -0
- package/lib/commonjs/components/ScrollShadow/gradient.js.map +1 -0
- package/lib/commonjs/components/ScrollShadow/index.js +171 -44
- package/lib/commonjs/components/ScrollShadow/index.js.map +1 -1
- package/lib/commonjs/components/ScrollShadow/styles.js +58 -14
- package/lib/commonjs/components/ScrollShadow/styles.js.map +1 -1
- package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js +63 -0
- package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
- package/lib/commonjs/components/ScrollShadow/useScrollShadow.js +48 -8
- package/lib/commonjs/components/ScrollShadow/useScrollShadow.js.map +1 -1
- package/lib/commonjs/components/Stack/HStack.js +6 -2
- package/lib/commonjs/components/Stack/HStack.js.map +1 -1
- package/lib/commonjs/components/Stack/VStack.js +6 -2
- package/lib/commonjs/components/Stack/VStack.js.map +1 -1
- package/lib/commonjs/components/Tabs/index.js +16 -23
- package/lib/commonjs/components/Tabs/index.js.map +1 -1
- package/lib/commonjs/components/Tabs/styles.js +1 -10
- package/lib/commonjs/components/Tabs/styles.js.map +1 -1
- package/lib/commonjs/figma/ListItem.SectionHeader.figma.js +20 -5
- package/lib/commonjs/figma/ListItem.SectionHeader.figma.js.map +1 -1
- package/lib/commonjs/index.js +10 -10
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/components/Box/Box.js +9 -1
- package/lib/module/components/Box/Box.js.map +1 -1
- package/lib/module/components/Breadcrumbs/index.js +29 -4
- package/lib/module/components/Breadcrumbs/index.js.map +1 -1
- package/lib/module/components/Breadcrumbs/styles.js +26 -0
- package/lib/module/components/Breadcrumbs/styles.js.map +1 -1
- package/lib/module/components/DateTimeList/index.js +12 -27
- package/lib/module/components/DateTimeList/index.js.map +1 -1
- package/lib/module/components/DateTimeList/styles.js +1 -11
- package/lib/module/components/DateTimeList/styles.js.map +1 -1
- package/lib/module/components/ListItem/index.js.map +1 -1
- package/lib/module/components/ListItem/styles.js +2 -1
- package/lib/module/components/ListItem/styles.js.map +1 -1
- package/lib/module/components/Menu/index.js +11 -5
- package/lib/module/components/Menu/index.js.map +1 -1
- package/lib/module/components/ScrollShadow/gradient.js +24 -0
- package/lib/module/components/ScrollShadow/gradient.js.map +1 -0
- package/lib/module/components/ScrollShadow/index.js +170 -48
- package/lib/module/components/ScrollShadow/index.js.map +1 -1
- package/lib/module/components/ScrollShadow/styles.js +57 -13
- package/lib/module/components/ScrollShadow/styles.js.map +1 -1
- package/lib/module/components/ScrollShadow/useComposedScrollHandler.js +57 -0
- package/lib/module/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
- package/lib/module/components/ScrollShadow/useScrollShadow.js +46 -8
- package/lib/module/components/ScrollShadow/useScrollShadow.js.map +1 -1
- package/lib/module/components/Stack/HStack.js +6 -2
- package/lib/module/components/Stack/HStack.js.map +1 -1
- package/lib/module/components/Stack/VStack.js +6 -2
- package/lib/module/components/Stack/VStack.js.map +1 -1
- package/lib/module/components/Tabs/index.js +17 -24
- package/lib/module/components/Tabs/index.js.map +1 -1
- package/lib/module/components/Tabs/styles.js +0 -9
- package/lib/module/components/Tabs/styles.js.map +1 -1
- package/lib/module/figma/ListItem.SectionHeader.figma.js +20 -5
- package/lib/module/figma/ListItem.SectionHeader.figma.js.map +1 -1
- package/lib/module/index.js +6 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/animation/hooks/usePopupDialogContentAnimation.d.ts +2 -2
- package/lib/typescript/animation/hooks/usePopupOverlayAnimation.d.ts +2 -2
- package/lib/typescript/components/Box/Box.d.ts +4 -0
- package/lib/typescript/components/Box/Box.d.ts.map +1 -1
- package/lib/typescript/components/Breadcrumbs/index.d.ts +3 -1
- package/lib/typescript/components/Breadcrumbs/index.d.ts.map +1 -1
- package/lib/typescript/components/Breadcrumbs/styles.d.ts +2 -0
- package/lib/typescript/components/Breadcrumbs/styles.d.ts.map +1 -1
- package/lib/typescript/components/DateTimeList/index.d.ts.map +1 -1
- package/lib/typescript/components/DateTimeList/styles.d.ts +1 -4
- package/lib/typescript/components/DateTimeList/styles.d.ts.map +1 -1
- package/lib/typescript/components/ListItem/index.d.ts +5 -4
- package/lib/typescript/components/ListItem/index.d.ts.map +1 -1
- package/lib/typescript/components/ListItem/styles.d.ts +1 -1
- package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
- package/lib/typescript/components/Menu/index.d.ts.map +1 -1
- package/lib/typescript/components/ScrollShadow/gradient.d.ts +7 -0
- package/lib/typescript/components/ScrollShadow/gradient.d.ts.map +1 -0
- package/lib/typescript/components/ScrollShadow/index.d.ts +57 -15
- package/lib/typescript/components/ScrollShadow/index.d.ts.map +1 -1
- package/lib/typescript/components/ScrollShadow/styles.d.ts +8 -2
- package/lib/typescript/components/ScrollShadow/styles.d.ts.map +1 -1
- package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts +13 -0
- package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts.map +1 -0
- package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts +15 -2
- package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts.map +1 -1
- package/lib/typescript/components/Stack/HStack.d.ts +3 -2
- package/lib/typescript/components/Stack/HStack.d.ts.map +1 -1
- package/lib/typescript/components/Stack/VStack.d.ts +3 -2
- package/lib/typescript/components/Stack/VStack.d.ts.map +1 -1
- package/lib/typescript/components/Tabs/index.d.ts.map +1 -1
- package/lib/typescript/components/Tabs/styles.d.ts +0 -7
- package/lib/typescript/components/Tabs/styles.d.ts.map +1 -1
- package/lib/typescript/components/Toast/animation.d.ts +3 -3
- package/lib/typescript/components/Toast/animation.d.ts.map +1 -1
- package/lib/typescript/figma/ListItem.SectionHeader.figma.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +6 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +11 -9
- package/src/components/Box/Box.tsx +18 -4
- package/src/components/Breadcrumbs/index.tsx +28 -4
- package/src/components/Breadcrumbs/styles.ts +30 -0
- package/src/components/DateTimeList/index.tsx +13 -26
- package/src/components/DateTimeList/styles.ts +1 -10
- package/src/components/ListItem/index.tsx +5 -4
- package/src/components/ListItem/styles.ts +1 -0
- package/src/components/Menu/index.tsx +11 -8
- package/src/components/ScrollShadow/gradient.ts +48 -0
- package/src/components/ScrollShadow/index.tsx +300 -69
- package/src/components/ScrollShadow/styles.ts +45 -28
- package/src/components/ScrollShadow/useComposedScrollHandler.ts +58 -0
- package/src/components/ScrollShadow/useScrollShadow.ts +72 -10
- package/src/components/Stack/HStack.tsx +8 -4
- package/src/components/Stack/VStack.tsx +8 -4
- package/src/components/Tabs/index.tsx +25 -35
- package/src/components/Tabs/styles.ts +0 -9
- package/src/index.ts +8 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { Platform } from 'react-native';
|
|
2
3
|
import type { LayoutChangeEvent, NativeScrollEvent, NativeSyntheticEvent } from 'react-native';
|
|
3
4
|
|
|
4
5
|
export interface ScrollShadowCapability {
|
|
@@ -9,9 +10,26 @@ export interface ScrollShadowCapability {
|
|
|
9
10
|
export interface UseScrollShadowOptions {
|
|
10
11
|
orientation?: 'horizontal' | 'vertical';
|
|
11
12
|
offset?: number;
|
|
13
|
+
enabled?: boolean;
|
|
12
14
|
onCapabilityChange?: (capability: ScrollShadowCapability) => void;
|
|
13
15
|
}
|
|
14
16
|
|
|
17
|
+
export interface UseScrollShadowReturn {
|
|
18
|
+
capability: ScrollShadowCapability;
|
|
19
|
+
handleLayout: (event: LayoutChangeEvent) => void;
|
|
20
|
+
handleContentSizeChange: (width: number, height: number) => void;
|
|
21
|
+
handleScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ScrollShadowDistance {
|
|
25
|
+
before: number;
|
|
26
|
+
after: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface ScrollShadowTrackerOptions extends UseScrollShadowOptions {
|
|
30
|
+
onDistanceChange?: (distance: ScrollShadowDistance) => void;
|
|
31
|
+
}
|
|
32
|
+
|
|
15
33
|
interface ScrollMetrics {
|
|
16
34
|
scrollOffset: number;
|
|
17
35
|
viewportSize: number;
|
|
@@ -24,6 +42,20 @@ const INITIAL_METRICS: ScrollMetrics = {
|
|
|
24
42
|
contentSize: 0,
|
|
25
43
|
};
|
|
26
44
|
|
|
45
|
+
export function normalizeAxisScrollOffset(
|
|
46
|
+
rawOffset: number,
|
|
47
|
+
orientation: 'horizontal' | 'vertical',
|
|
48
|
+
maxOffset: number,
|
|
49
|
+
platform: typeof Platform.OS = Platform.OS,
|
|
50
|
+
): number {
|
|
51
|
+
// Web RTL reports a negative x and browsers do not rubber-band it. Native RTL
|
|
52
|
+
// stays positive, so a negative native offset is overscroll at the start edge.
|
|
53
|
+
const offset =
|
|
54
|
+
orientation === 'horizontal' && platform === 'web' ? Math.abs(rawOffset) : rawOffset;
|
|
55
|
+
|
|
56
|
+
return Math.min(Math.max(0, offset), Math.max(0, maxOffset));
|
|
57
|
+
}
|
|
58
|
+
|
|
27
59
|
function getScrollCapability(metrics: ScrollMetrics, offset: number): ScrollShadowCapability {
|
|
28
60
|
const { scrollOffset, viewportSize, contentSize } = metrics;
|
|
29
61
|
|
|
@@ -37,18 +69,42 @@ function getScrollCapability(metrics: ScrollMetrics, offset: number): ScrollShad
|
|
|
37
69
|
};
|
|
38
70
|
}
|
|
39
71
|
|
|
40
|
-
|
|
41
|
-
|
|
72
|
+
function getScrollDistance(metrics: ScrollMetrics, offset: number): ScrollShadowDistance {
|
|
73
|
+
const { scrollOffset, viewportSize, contentSize } = metrics;
|
|
74
|
+
|
|
75
|
+
if (viewportSize <= 0 || contentSize <= viewportSize) {
|
|
76
|
+
return { before: 0, after: 0 };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
before: Math.max(0, scrollOffset - offset),
|
|
81
|
+
after: Math.max(0, contentSize - viewportSize - scrollOffset - offset),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function useScrollShadow(options: UseScrollShadowOptions = {}): UseScrollShadowReturn {
|
|
86
|
+
return useScrollShadowTracker(options);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function useScrollShadowTracker({
|
|
90
|
+
orientation = 'vertical',
|
|
42
91
|
offset = 0,
|
|
92
|
+
enabled = true,
|
|
43
93
|
onCapabilityChange,
|
|
44
|
-
|
|
45
|
-
|
|
94
|
+
onDistanceChange,
|
|
95
|
+
}: ScrollShadowTrackerOptions = {}): UseScrollShadowReturn {
|
|
96
|
+
const metricsRef = useRef<ScrollMetrics>({ ...INITIAL_METRICS });
|
|
46
97
|
const [capability, setCapability] = useState<ScrollShadowCapability>({
|
|
47
98
|
canScrollBefore: false,
|
|
48
99
|
canScrollAfter: false,
|
|
49
100
|
});
|
|
50
101
|
|
|
51
102
|
const updateCapability = useCallback(() => {
|
|
103
|
+
if (!enabled) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
onDistanceChange?.(getScrollDistance(metricsRef.current, offset));
|
|
52
108
|
const nextCapability = getScrollCapability(metricsRef.current, offset);
|
|
53
109
|
|
|
54
110
|
setCapability((prev) => {
|
|
@@ -62,7 +118,7 @@ export function useScrollShadow({
|
|
|
62
118
|
onCapabilityChange?.(nextCapability);
|
|
63
119
|
return nextCapability;
|
|
64
120
|
});
|
|
65
|
-
}, [offset, onCapabilityChange]);
|
|
121
|
+
}, [enabled, offset, onCapabilityChange, onDistanceChange]);
|
|
66
122
|
|
|
67
123
|
useEffect(() => {
|
|
68
124
|
updateCapability();
|
|
@@ -88,13 +144,19 @@ export function useScrollShadow({
|
|
|
88
144
|
const handleScroll = useCallback(
|
|
89
145
|
(event: NativeSyntheticEvent<NativeScrollEvent>) => {
|
|
90
146
|
const { contentOffset, layoutMeasurement, contentSize } = event.nativeEvent;
|
|
147
|
+
const rawOffset = orientation === 'vertical' ? contentOffset.y : contentOffset.x;
|
|
91
148
|
|
|
92
|
-
|
|
93
|
-
orientation === 'vertical' ? contentOffset.y : contentOffset.x;
|
|
94
|
-
metricsRef.current.viewportSize =
|
|
149
|
+
const viewportSize =
|
|
95
150
|
orientation === 'vertical' ? layoutMeasurement.height : layoutMeasurement.width;
|
|
96
|
-
|
|
97
|
-
|
|
151
|
+
const axisContentSize = orientation === 'vertical' ? contentSize.height : contentSize.width;
|
|
152
|
+
|
|
153
|
+
metricsRef.current.scrollOffset = normalizeAxisScrollOffset(
|
|
154
|
+
rawOffset,
|
|
155
|
+
orientation,
|
|
156
|
+
axisContentSize - viewportSize,
|
|
157
|
+
);
|
|
158
|
+
metricsRef.current.viewportSize = viewportSize;
|
|
159
|
+
metricsRef.current.contentSize = axisContentSize;
|
|
98
160
|
|
|
99
161
|
updateCapability();
|
|
100
162
|
},
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { ForwardedRef } from 'react';
|
|
2
2
|
import { forwardRef } from 'react';
|
|
3
|
-
import { View
|
|
3
|
+
import type { View } from 'react-native';
|
|
4
|
+
import { dataAttributes, mergeDataAttributes } from '@cdx-ui/primitives';
|
|
4
5
|
import { cn } from '@cdx-ui/utils';
|
|
6
|
+
import { Box, type BoxProps } from '../Box';
|
|
5
7
|
import { hStackRootVariants, type StackSpace } from './styles';
|
|
6
8
|
|
|
7
|
-
export interface HStackProps extends
|
|
9
|
+
export interface HStackProps extends Omit<BoxProps, 'asChild'> {
|
|
8
10
|
className?: string;
|
|
9
11
|
/** Token-based gap between children. */
|
|
10
12
|
space?: StackSpace;
|
|
@@ -22,14 +24,16 @@ export const HStack = forwardRef<View, HStackProps>(
|
|
|
22
24
|
ref: ForwardedRef<View>,
|
|
23
25
|
) => {
|
|
24
26
|
return (
|
|
25
|
-
<
|
|
27
|
+
<Box
|
|
26
28
|
ref={ref}
|
|
27
29
|
className={cn(hStackRootVariants({ reversed, space }), className)}
|
|
28
30
|
style={style}
|
|
29
31
|
{...restProps}
|
|
32
|
+
// Caller-supplied data attributes win so components composed on HStack keep their own slot.
|
|
33
|
+
{...mergeDataAttributes(dataAttributes({ slot: 'hstack' }), restProps)}
|
|
30
34
|
>
|
|
31
35
|
{children}
|
|
32
|
-
</
|
|
36
|
+
</Box>
|
|
33
37
|
);
|
|
34
38
|
},
|
|
35
39
|
);
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { ForwardedRef } from 'react';
|
|
2
2
|
import { forwardRef } from 'react';
|
|
3
|
-
import { View
|
|
3
|
+
import type { View } from 'react-native';
|
|
4
|
+
import { dataAttributes, mergeDataAttributes } from '@cdx-ui/primitives';
|
|
4
5
|
import { cn } from '@cdx-ui/utils';
|
|
6
|
+
import { Box, type BoxProps } from '../Box';
|
|
5
7
|
import { vStackRootVariants, type StackSpace } from './styles';
|
|
6
8
|
|
|
7
|
-
export interface VStackProps extends
|
|
9
|
+
export interface VStackProps extends Omit<BoxProps, 'asChild'> {
|
|
8
10
|
className?: string;
|
|
9
11
|
/** Token-based gap between children. */
|
|
10
12
|
space?: StackSpace;
|
|
@@ -22,14 +24,16 @@ export const VStack = forwardRef<View, VStackProps>(
|
|
|
22
24
|
ref: ForwardedRef<View>,
|
|
23
25
|
) => {
|
|
24
26
|
return (
|
|
25
|
-
<
|
|
27
|
+
<Box
|
|
26
28
|
ref={ref}
|
|
27
29
|
className={cn(vStackRootVariants({ reversed, space }), className)}
|
|
28
30
|
style={style}
|
|
29
31
|
{...restProps}
|
|
32
|
+
// Caller-supplied data attributes win so components composed on VStack keep their own slot.
|
|
33
|
+
{...mergeDataAttributes(dataAttributes({ slot: 'vstack' }), restProps)}
|
|
30
34
|
>
|
|
31
35
|
{children}
|
|
32
|
-
</
|
|
36
|
+
</Box>
|
|
33
37
|
);
|
|
34
38
|
},
|
|
35
39
|
);
|
|
@@ -58,8 +58,6 @@ import {
|
|
|
58
58
|
tabsTabLabelVariants,
|
|
59
59
|
tabsTabVariants,
|
|
60
60
|
TABS_INDICATOR_TRANSITION_MS,
|
|
61
|
-
TABS_SOLID_SCROLL_FADE_SIZE,
|
|
62
|
-
TABS_SCROLL_FADE_SIZE,
|
|
63
61
|
OUTLINE_INDICATOR_THICKNESS,
|
|
64
62
|
type TabsVariant,
|
|
65
63
|
} from './styles';
|
|
@@ -178,7 +176,6 @@ const TabsList = forwardRef<ComponentRef<typeof View>, TabsListProps>(
|
|
|
178
176
|
const { value, orientation, getTabs } = useTabsContext();
|
|
179
177
|
const { variant } = useTabsVariantContext();
|
|
180
178
|
const isHorizontalScroll = orientation === 'horizontal' && scrollable;
|
|
181
|
-
const isWebHorizontalScroll = isHorizontalScroll && Platform.OS === 'web';
|
|
182
179
|
const shouldAutoScrollActiveTab = isHorizontalScroll && Platform.OS !== 'web';
|
|
183
180
|
|
|
184
181
|
const layoutsRef = useRef<Map<string, TabLayout>>(new Map());
|
|
@@ -478,23 +475,26 @@ const TabsList = forwardRef<ComponentRef<typeof View>, TabsListProps>(
|
|
|
478
475
|
);
|
|
479
476
|
};
|
|
480
477
|
|
|
481
|
-
const
|
|
478
|
+
const horizontalScroll = (
|
|
479
|
+
<ScrollShadow
|
|
480
|
+
hideScrollBar={Platform.OS === 'web'}
|
|
481
|
+
orientation="horizontal"
|
|
482
|
+
surface={isSolidHorizontalScroll ? 'secondary' : 'background'}
|
|
483
|
+
size={isSolidHorizontalScroll ? 'default' : 'small'}
|
|
484
|
+
edgeClassName={isSolidHorizontalScroll ? undefined : 'opacity-85'}
|
|
485
|
+
onCapabilityChange={setScrollCapability}
|
|
486
|
+
>
|
|
487
|
+
{horizontalScrollView}
|
|
488
|
+
</ScrollShadow>
|
|
489
|
+
);
|
|
490
|
+
|
|
491
|
+
const webHorizontalScroll = isSolidHorizontalScroll ? (
|
|
482
492
|
<View className="relative min-w-0 w-full">
|
|
483
|
-
|
|
484
|
-
hideScrollBar
|
|
485
|
-
orientation="horizontal"
|
|
486
|
-
size={TABS_SOLID_SCROLL_FADE_SIZE}
|
|
487
|
-
fadeFromClassName="from-surface-secondary"
|
|
488
|
-
onCapabilityChange={setScrollCapability}
|
|
489
|
-
>
|
|
490
|
-
{horizontalScrollView}
|
|
491
|
-
</ScrollShadow>
|
|
493
|
+
{horizontalScroll}
|
|
492
494
|
{renderSolidScrollChevron('start', -1)}
|
|
493
495
|
{renderSolidScrollChevron('end', 1)}
|
|
494
496
|
</View>
|
|
495
|
-
)
|
|
496
|
-
|
|
497
|
-
const outlineWebHorizontalScroll = (
|
|
497
|
+
) : (
|
|
498
498
|
<View className="w-full min-w-0 flex-row items-stretch">
|
|
499
499
|
{scrollCapability.canScrollBefore ? (
|
|
500
500
|
<Pressable
|
|
@@ -507,17 +507,7 @@ const TabsList = forwardRef<ComponentRef<typeof View>, TabsListProps>(
|
|
|
507
507
|
<Icon as={ChevronLeft} className="size-4 text-content-secondary" />
|
|
508
508
|
</Pressable>
|
|
509
509
|
) : null}
|
|
510
|
-
<View className="min-w-0 flex-1">
|
|
511
|
-
<ScrollShadow
|
|
512
|
-
hideScrollBar
|
|
513
|
-
orientation="horizontal"
|
|
514
|
-
size={TABS_SCROLL_FADE_SIZE}
|
|
515
|
-
fadeFromClassName="from-background/85"
|
|
516
|
-
onCapabilityChange={setScrollCapability}
|
|
517
|
-
>
|
|
518
|
-
{horizontalScrollView}
|
|
519
|
-
</ScrollShadow>
|
|
520
|
-
</View>
|
|
510
|
+
<View className="min-w-0 flex-1">{horizontalScroll}</View>
|
|
521
511
|
{scrollCapability.canScrollAfter ? (
|
|
522
512
|
<Pressable
|
|
523
513
|
accessibilityLabel="Scroll tabs right"
|
|
@@ -542,14 +532,14 @@ const TabsList = forwardRef<ComponentRef<typeof View>, TabsListProps>(
|
|
|
542
532
|
{...props}
|
|
543
533
|
{...mergeDataAttributes(props, dataAttributes({ slot: 'tabs-list' }))}
|
|
544
534
|
>
|
|
545
|
-
{
|
|
546
|
-
|
|
547
|
-
{
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
535
|
+
{isHorizontalScroll ? (
|
|
536
|
+
Platform.OS === 'web' ? (
|
|
537
|
+
<View className={cn(tabsListScrollContainerVariants())}>
|
|
538
|
+
{wrapSolidScrollShell(webHorizontalScroll)}
|
|
539
|
+
</View>
|
|
540
|
+
) : (
|
|
541
|
+
wrapSolidScrollShell(horizontalScroll)
|
|
542
|
+
)
|
|
553
543
|
) : (
|
|
554
544
|
listTrack
|
|
555
545
|
)}
|
|
@@ -37,15 +37,6 @@ export const OUTLINE_INDICATOR_THICKNESS = 2;
|
|
|
37
37
|
*/
|
|
38
38
|
export const TABS_INDICATOR_TRANSITION_MS = 150;
|
|
39
39
|
|
|
40
|
-
/** Outline horizontal scroll — narrow fade reads cleanly against the page background. */
|
|
41
|
-
export const TABS_SCROLL_FADE_SIZE = 32;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Solid horizontal scroll — wider fade so tabs dissolve smoothly into the track (and under the
|
|
45
|
-
* overlay chevron) instead of ending in a hard clip at the scroll viewport edge.
|
|
46
|
-
*/
|
|
47
|
-
export const TABS_SOLID_SCROLL_FADE_SIZE = 40;
|
|
48
|
-
|
|
49
40
|
/**
|
|
50
41
|
* Room reserved on the left/right sides inside the horizontal-scroll clip rect for ink that
|
|
51
42
|
* paints past a tab's own box: `shadow-sm` (`0px 1px 3px`, solid only) and the web focus ring
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/// <reference types="uniwind/types" preserve="true" />
|
|
2
|
+
import { View as RNView } from 'react-native';
|
|
3
|
+
|
|
2
4
|
export * from './components';
|
|
3
5
|
export * from './hooks';
|
|
4
6
|
export * from './navigation';
|
|
@@ -6,5 +8,10 @@ export { ToastProvider, useToast } from './providers/toast';
|
|
|
6
8
|
export type * from './providers/toast';
|
|
7
9
|
export { ForgeDesignProvider } from './providers/forge-design';
|
|
8
10
|
export type { ForgeDesignConfig, ForgeDesignProviderProps } from './providers/forge-design';
|
|
9
|
-
export {
|
|
11
|
+
export { ScrollView, KeyboardAvoidingView } from 'react-native';
|
|
10
12
|
export { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
13
|
+
|
|
14
|
+
/** @deprecated Use `Box` instead. */
|
|
15
|
+
export const View = RNView;
|
|
16
|
+
/** @deprecated Use `BoxRef` for refs and `BoxProps` for props instead. */
|
|
17
|
+
export type View = RNView;
|