@seed-design/lynx-react 0.7.1 → 0.9.0
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/lib/components/Accordion/Accordion.jsx +2 -2
- package/lib/components/ActionButton/ActionButton.jsx +1 -1
- package/lib/components/AlertDialog/AlertDialog.d.ts +64 -0
- package/lib/components/AlertDialog/AlertDialog.d.ts.map +1 -0
- package/lib/components/AlertDialog/AlertDialog.jsx +138 -0
- package/lib/components/AlertDialog/AlertDialog.namespace.d.ts +2 -0
- package/lib/components/AlertDialog/AlertDialog.namespace.d.ts.map +1 -0
- package/lib/components/AlertDialog/AlertDialog.namespace.js +17 -0
- package/lib/components/AlertDialog/index.d.ts +3 -0
- package/lib/components/AlertDialog/index.d.ts.map +1 -0
- package/lib/components/AppBar/AppBar.d.ts +14 -1
- package/lib/components/AppBar/AppBar.d.ts.map +1 -1
- package/lib/components/AppBar/AppBar.jsx +42 -16
- package/lib/components/AppBar/AppBar.namespace.d.ts +1 -1
- package/lib/components/AppBar/AppBar.namespace.d.ts.map +1 -1
- package/lib/components/AppBar/context.d.ts +2 -1
- package/lib/components/AppBar/context.d.ts.map +1 -1
- package/lib/components/AppBar/index.d.ts +1 -1
- package/lib/components/AppBar/index.d.ts.map +1 -1
- package/lib/components/AppBar/useAppBar.d.ts +2 -1
- package/lib/components/AppBar/useAppBar.d.ts.map +1 -1
- package/lib/components/AppBar/useAppBar.js +17 -15
- package/lib/components/AttachmentDisplay/AttachmentDisplay.d.ts +182 -0
- package/lib/components/AttachmentDisplay/AttachmentDisplay.d.ts.map +1 -0
- package/lib/components/AttachmentDisplay/AttachmentDisplay.jsx +444 -0
- package/lib/components/AttachmentDisplay/index.d.ts +2 -0
- package/lib/components/AttachmentDisplay/index.d.ts.map +1 -0
- package/lib/components/AttachmentInput/AttachmentInput.d.ts +179 -0
- package/lib/components/AttachmentInput/AttachmentInput.d.ts.map +1 -0
- package/lib/components/AttachmentInput/AttachmentInput.jsx +520 -0
- package/lib/components/AttachmentInput/index.d.ts +2 -0
- package/lib/components/AttachmentInput/index.d.ts.map +1 -0
- package/lib/components/BottomSheet/BottomSheet.d.ts +1 -1
- package/lib/components/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/lib/components/BottomSheet/BottomSheet.jsx +1 -7
- package/lib/components/Box/Box.d.ts +3 -3
- package/lib/components/Box/Box.d.ts.map +1 -1
- package/lib/components/Callout/Callout.jsx +2 -2
- package/lib/components/Checkbox/Checkbox.jsx +2 -2
- package/lib/components/Chip/Chip.jsx +2 -2
- package/lib/components/ChipTabs/ChipTabs.d.ts +41 -0
- package/lib/components/ChipTabs/ChipTabs.d.ts.map +1 -0
- package/lib/components/ChipTabs/ChipTabs.jsx +39 -0
- package/lib/components/ChipTabs/ChipTabs.namespace.d.ts +2 -0
- package/lib/components/ChipTabs/ChipTabs.namespace.d.ts.map +1 -0
- package/lib/components/ChipTabs/ChipTabs.namespace.js +13 -0
- package/lib/components/ChipTabs/index.d.ts +3 -0
- package/lib/components/ChipTabs/index.d.ts.map +1 -0
- package/lib/components/ContextualFloatingButton/ContextualFloatingButton.d.ts +18 -0
- package/lib/components/ContextualFloatingButton/ContextualFloatingButton.d.ts.map +1 -0
- package/lib/components/ContextualFloatingButton/ContextualFloatingButton.jsx +113 -0
- package/lib/components/ContextualFloatingButton/index.d.ts +2 -0
- package/lib/components/ContextualFloatingButton/index.d.ts.map +1 -0
- package/lib/components/Dialog/Dialog.d.ts +87 -0
- package/lib/components/Dialog/Dialog.d.ts.map +1 -0
- package/lib/components/Dialog/Dialog.jsx +147 -0
- package/lib/components/Dialog/Dialog.namespace.d.ts +2 -0
- package/lib/components/Dialog/Dialog.namespace.d.ts.map +1 -0
- package/lib/components/Dialog/Dialog.namespace.js +18 -0
- package/lib/components/Dialog/index.d.ts +3 -0
- package/lib/components/Dialog/index.d.ts.map +1 -0
- package/lib/components/FloatingActionButton/FloatingActionButton.d.ts +23 -0
- package/lib/components/FloatingActionButton/FloatingActionButton.d.ts.map +1 -0
- package/lib/components/FloatingActionButton/FloatingActionButton.jsx +76 -0
- package/lib/components/FloatingActionButton/FloatingActionButton.namespace.d.ts +2 -0
- package/lib/components/FloatingActionButton/FloatingActionButton.namespace.d.ts.map +1 -0
- package/lib/components/FloatingActionButton/FloatingActionButton.namespace.js +10 -0
- package/lib/components/FloatingActionButton/index.d.ts +3 -0
- package/lib/components/FloatingActionButton/index.d.ts.map +1 -0
- package/lib/components/HelpBubble/HelpBubble.d.ts +67 -0
- package/lib/components/HelpBubble/HelpBubble.d.ts.map +1 -0
- package/lib/components/HelpBubble/HelpBubble.jsx +600 -0
- package/lib/components/HelpBubble/HelpBubble.namespace.d.ts +2 -0
- package/lib/components/HelpBubble/HelpBubble.namespace.d.ts.map +1 -0
- package/lib/components/HelpBubble/HelpBubble.namespace.js +18 -0
- package/lib/components/HelpBubble/index.d.ts +3 -0
- package/lib/components/HelpBubble/index.d.ts.map +1 -0
- package/lib/components/Icon/Icon.d.ts +1 -0
- package/lib/components/Icon/Icon.d.ts.map +1 -1
- package/lib/components/Icon/Icon.jsx +2 -1
- package/lib/components/IdentityPlaceholder/IdentityPlaceholder.d.ts +28 -0
- package/lib/components/IdentityPlaceholder/IdentityPlaceholder.d.ts.map +1 -0
- package/lib/components/IdentityPlaceholder/IdentityPlaceholder.jsx +37 -0
- package/lib/components/IdentityPlaceholder/IdentityPlaceholder.namespace.d.ts +2 -0
- package/lib/components/IdentityPlaceholder/IdentityPlaceholder.namespace.d.ts.map +1 -0
- package/lib/components/IdentityPlaceholder/IdentityPlaceholder.namespace.js +9 -0
- package/lib/components/IdentityPlaceholder/identity-placeholder-business.js +4 -0
- package/lib/components/IdentityPlaceholder/identity-placeholder-person.js +4 -0
- package/lib/components/IdentityPlaceholder/index.d.ts +3 -0
- package/lib/components/IdentityPlaceholder/index.d.ts.map +1 -0
- package/lib/components/InputButton/InputButton.d.ts +2 -0
- package/lib/components/InputButton/InputButton.d.ts.map +1 -1
- package/lib/components/InputButton/InputButton.jsx +40 -8
- package/lib/components/List/List.d.ts +1 -1
- package/lib/components/List/List.d.ts.map +1 -1
- package/lib/components/List/List.jsx +26 -12
- package/lib/components/Menu/Menu.d.ts.map +1 -1
- package/lib/components/Menu/Menu.jsx +15 -5
- package/lib/components/PageBanner/PageBanner.d.ts +3 -0
- package/lib/components/PageBanner/PageBanner.d.ts.map +1 -1
- package/lib/components/PageBanner/PageBanner.jsx +49 -11
- package/lib/components/QuantityPicker/QuantityPicker.d.ts +53 -0
- package/lib/components/QuantityPicker/QuantityPicker.d.ts.map +1 -0
- package/lib/components/QuantityPicker/QuantityPicker.jsx +282 -0
- package/lib/components/QuantityPicker/QuantityPicker.namespace.d.ts +2 -0
- package/lib/components/QuantityPicker/QuantityPicker.namespace.d.ts.map +1 -0
- package/lib/components/QuantityPicker/QuantityPicker.namespace.js +11 -0
- package/lib/components/QuantityPicker/index.d.ts +3 -0
- package/lib/components/QuantityPicker/index.d.ts.map +1 -0
- package/lib/components/RadioGroup/RadioGroup.jsx +2 -2
- package/lib/components/ReactionButton/ReactionButton.d.ts +1 -1
- package/lib/components/ReactionButton/ReactionButton.d.ts.map +1 -1
- package/lib/components/ReactionButton/ReactionButton.jsx +22 -13
- package/lib/components/ScrollFog/ScrollFog.d.ts +41 -0
- package/lib/components/ScrollFog/ScrollFog.d.ts.map +1 -0
- package/lib/components/ScrollFog/ScrollFog.jsx +65 -0
- package/lib/components/ScrollFog/index.d.ts +2 -0
- package/lib/components/ScrollFog/index.d.ts.map +1 -0
- package/lib/components/SegmentedControl/SegmentedControl.jsx +2 -2
- package/lib/components/Select/Select.d.ts +112 -0
- package/lib/components/Select/Select.d.ts.map +1 -0
- package/lib/components/Select/Select.jsx +885 -0
- package/lib/components/Select/Select.namespace.d.ts +2 -0
- package/lib/components/Select/Select.namespace.d.ts.map +1 -0
- package/lib/components/Select/Select.namespace.js +23 -0
- package/lib/components/Select/index.d.ts +3 -0
- package/lib/components/Select/index.d.ts.map +1 -0
- package/lib/components/Skeleton/Skeleton.d.ts +15 -0
- package/lib/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/lib/components/Skeleton/Skeleton.jsx +18 -0
- package/lib/components/Skeleton/index.d.ts +2 -0
- package/lib/components/Skeleton/index.d.ts.map +1 -0
- package/lib/components/Slider/Slider.d.ts +101 -0
- package/lib/components/Slider/Slider.d.ts.map +1 -0
- package/lib/components/Slider/Slider.jsx +573 -0
- package/lib/components/Slider/Slider.namespace.d.ts +2 -0
- package/lib/components/Slider/Slider.namespace.d.ts.map +1 -0
- package/lib/components/Slider/Slider.namespace.js +19 -0
- package/lib/components/Slider/Slider.utils.d.ts +19 -0
- package/lib/components/Slider/Slider.utils.d.ts.map +1 -0
- package/lib/components/Slider/Slider.utils.js +106 -0
- package/lib/components/Slider/index.d.ts +3 -0
- package/lib/components/Slider/index.d.ts.map +1 -0
- package/lib/components/Stack/Stack.d.ts +7 -9
- package/lib/components/Stack/Stack.d.ts.map +1 -1
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts.map +1 -1
- package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.jsx +22 -8
- package/lib/components/Switch/Switch.d.ts.map +1 -1
- package/lib/components/Switch/Switch.jsx +5 -3
- package/lib/components/Tabs/Tabs.d.ts +34 -2
- package/lib/components/Tabs/Tabs.d.ts.map +1 -1
- package/lib/components/Tabs/Tabs.jsx +186 -56
- package/lib/components/Tabs/Tabs.utils.d.ts +14 -1
- package/lib/components/Tabs/Tabs.utils.d.ts.map +1 -1
- package/lib/components/Tabs/Tabs.utils.js +24 -3
- package/lib/components/Tabs/index.d.ts +1 -1
- package/lib/components/Tabs/index.d.ts.map +1 -1
- package/lib/components/index.d.ts +14 -0
- package/lib/components/index.d.ts.map +1 -1
- package/lib/hooks/useControllableState.d.ts +1 -14
- package/lib/hooks/useControllableState.d.ts.map +1 -1
- package/lib/hooks/usePressTap.d.ts +1 -27
- package/lib/hooks/usePressTap.d.ts.map +1 -1
- package/lib/hooks/useSafeArea.d.ts +8 -4
- package/lib/hooks/useSafeArea.d.ts.map +1 -1
- package/lib/hooks/useSafeArea.js +22 -20
- package/lib/index.js +29 -6
- package/lib/{hooks/useControllableState.js → packages/lynx-react-headless/use-controllable-state/lib/index.js} +2 -3
- package/lib/{hooks/usePressTap.js → packages/lynx-react-headless/use-press-tap/lib/index.js} +13 -10
- package/lib/types.d.ts +1 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/utils/styled.d.ts +46 -6
- package/lib/utils/styled.d.ts.map +1 -1
- package/lib/utils/styled.js +19 -4
- package/package.json +9 -5
- package/src/components/AlertDialog/AlertDialog.namespace.ts +22 -0
- package/src/components/AlertDialog/AlertDialog.test.tsx +226 -0
- package/src/components/AlertDialog/AlertDialog.tsx +374 -0
- package/src/components/AlertDialog/index.ts +24 -0
- package/src/components/AppBar/AppBar.namespace.ts +1 -0
- package/src/components/AppBar/AppBar.test.tsx +252 -3
- package/src/components/AppBar/AppBar.tsx +108 -25
- package/src/components/AppBar/context.ts +3 -1
- package/src/components/AppBar/index.ts +1 -0
- package/src/components/AppBar/useAppBar.ts +21 -15
- package/src/components/AttachmentDisplay/AttachmentDisplay.tsx +886 -0
- package/src/components/AttachmentDisplay/index.ts +48 -0
- package/src/components/AttachmentInput/AttachmentInput.tsx +1001 -0
- package/src/components/AttachmentInput/index.ts +49 -0
- package/src/components/BottomSheet/BottomSheet.test.tsx +22 -7
- package/src/components/BottomSheet/BottomSheet.tsx +1 -19
- package/src/components/Box/Box.test.tsx +104 -0
- package/src/components/Box/Box.tsx +9 -6
- package/src/components/ChipTabs/ChipTabs.namespace.ts +14 -0
- package/src/components/ChipTabs/ChipTabs.tsx +119 -0
- package/src/components/ChipTabs/index.ts +16 -0
- package/src/components/ContextualFloatingButton/ContextualFloatingButton.test.tsx +63 -0
- package/src/components/ContextualFloatingButton/ContextualFloatingButton.tsx +232 -0
- package/src/components/ContextualFloatingButton/index.ts +4 -0
- package/src/components/Dialog/Dialog.namespace.ts +24 -0
- package/src/components/Dialog/Dialog.test.tsx +172 -0
- package/src/components/Dialog/Dialog.tsx +373 -0
- package/src/components/Dialog/index.ts +26 -0
- package/src/components/FloatingActionButton/FloatingActionButton.namespace.ts +8 -0
- package/src/components/FloatingActionButton/FloatingActionButton.test.tsx +59 -0
- package/src/components/FloatingActionButton/FloatingActionButton.tsx +207 -0
- package/src/components/FloatingActionButton/index.ts +10 -0
- package/src/components/HelpBubble/HelpBubble.namespace.ts +24 -0
- package/src/components/HelpBubble/HelpBubble.tsx +998 -0
- package/src/components/HelpBubble/index.ts +26 -0
- package/src/components/Icon/Icon.test.tsx +0 -3
- package/src/components/Icon/Icon.tsx +11 -1
- package/src/components/IdentityPlaceholder/IdentityPlaceholder.namespace.ts +6 -0
- package/src/components/IdentityPlaceholder/IdentityPlaceholder.tsx +103 -0
- package/src/components/IdentityPlaceholder/assets.d.ts +4 -0
- package/src/components/IdentityPlaceholder/identity-placeholder-business.webp +0 -0
- package/src/components/IdentityPlaceholder/identity-placeholder-person.webp +0 -0
- package/src/components/IdentityPlaceholder/index.ts +8 -0
- package/src/components/InputButton/InputButton.test.tsx +128 -1
- package/src/components/InputButton/InputButton.tsx +60 -9
- package/src/components/List/List.test.tsx +54 -2
- package/src/components/List/List.tsx +43 -10
- package/src/components/Menu/Menu.tsx +14 -4
- package/src/components/Menu/__tests__/Menu.test.tsx +34 -0
- package/src/components/PageBanner/PageBanner.test.tsx +110 -3
- package/src/components/PageBanner/PageBanner.tsx +83 -19
- package/src/components/QuantityPicker/QuantityPicker.namespace.ts +10 -0
- package/src/components/QuantityPicker/QuantityPicker.test.tsx +235 -0
- package/src/components/QuantityPicker/QuantityPicker.tsx +605 -0
- package/src/components/QuantityPicker/index.ts +14 -0
- package/src/components/ReactionButton/ReactionButton.feedback.test.tsx +50 -0
- package/src/components/ReactionButton/ReactionButton.test.tsx +5 -3
- package/src/components/ReactionButton/ReactionButton.tsx +20 -12
- package/src/components/ScrollFog/ScrollFog.test.tsx +222 -0
- package/src/components/ScrollFog/ScrollFog.tsx +172 -0
- package/src/components/ScrollFog/index.ts +1 -0
- package/src/components/Select/Select.namespace.ts +34 -0
- package/src/components/Select/Select.test.tsx +297 -0
- package/src/components/Select/Select.tsx +1483 -0
- package/src/components/Select/index.ts +39 -0
- package/src/components/Skeleton/Skeleton.test.tsx +64 -0
- package/src/components/Skeleton/Skeleton.tsx +45 -0
- package/src/components/Skeleton/index.ts +1 -0
- package/src/components/Slider/Slider.namespace.ts +26 -0
- package/src/components/Slider/Slider.test.tsx +260 -0
- package/src/components/Slider/Slider.tsx +897 -0
- package/src/components/Slider/Slider.utils.ts +167 -0
- package/src/components/Slider/index.ts +30 -0
- package/src/components/Stack/Stack.test.tsx +7 -0
- package/src/components/Stack/Stack.tsx +11 -10
- package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.test.tsx +21 -1
- package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.tsx +30 -7
- package/src/components/Switch/Switch.tsx +14 -13
- package/src/components/Tabs/Tabs.test.tsx +218 -1
- package/src/components/Tabs/Tabs.tsx +346 -75
- package/src/components/Tabs/Tabs.utils.ts +51 -1
- package/src/components/Tabs/index.ts +17 -1
- package/src/components/index.ts +14 -0
- package/src/hooks/useControllableState.ts +1 -43
- package/src/hooks/usePressTap.test.ts +23 -11
- package/src/hooks/usePressTap.ts +1 -60
- package/src/hooks/useSafeArea.test.ts +13 -1
- package/src/hooks/useSafeArea.ts +25 -23
- package/src/types.ts +1 -0
- package/src/utils/styled.ts +127 -9
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
import "@testing-library/jest-dom";
|
|
2
|
-
import
|
|
2
|
+
import * as React from "@lynx-js/react";
|
|
3
|
+
import { createEvent, fireEvent, render } from "@lynx-js/react/testing-library";
|
|
3
4
|
import { describe, expect, it, vi } from "vitest";
|
|
4
5
|
|
|
5
6
|
import * as Tabs from "./Tabs.namespace";
|
|
7
|
+
import * as ChipTabs from "../ChipTabs/ChipTabs.namespace";
|
|
6
8
|
import {
|
|
7
9
|
areTabsTransitionsEnabled,
|
|
8
10
|
getTabsLayoutWidth,
|
|
9
11
|
getTabsOrderedItems,
|
|
12
|
+
getTabsScrollOffset,
|
|
10
13
|
getTabsTriggerRects,
|
|
11
14
|
} from "./Tabs.utils";
|
|
12
15
|
|
|
16
|
+
function fireViewPagerEvent(
|
|
17
|
+
pager: Element,
|
|
18
|
+
eventName: "change" | "willchange",
|
|
19
|
+
detail: { index: number; isDragged: boolean },
|
|
20
|
+
) {
|
|
21
|
+
const init = { eventType: "bindEvent", eventName, detail };
|
|
22
|
+
const event = createEvent(`bindEvent:${eventName}`, pager, init);
|
|
23
|
+
Object.assign(event, init);
|
|
24
|
+
fireEvent(pager, event);
|
|
25
|
+
}
|
|
26
|
+
|
|
13
27
|
function BasicTabs(props: {
|
|
14
28
|
value?: string;
|
|
15
29
|
defaultValue?: string;
|
|
@@ -46,6 +60,22 @@ describe("Tabs", () => {
|
|
|
46
60
|
expect(listContent?.querySelectorAll(".seed-tabs__trigger")).toHaveLength(2);
|
|
47
61
|
});
|
|
48
62
|
|
|
63
|
+
it("passes native fading edges to the ChipTabs scroll-view", () => {
|
|
64
|
+
const { container } = render(
|
|
65
|
+
<ChipTabs.Root defaultValue="one">
|
|
66
|
+
<ChipTabs.List fading-edge-length="20px">
|
|
67
|
+
<ChipTabs.Trigger value="one">첫 번째</ChipTabs.Trigger>
|
|
68
|
+
<ChipTabs.Trigger value="two">두 번째</ChipTabs.Trigger>
|
|
69
|
+
</ChipTabs.List>
|
|
70
|
+
</ChipTabs.Root>,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
expect(container.querySelector("scroll-view")).toHaveAttribute(
|
|
74
|
+
"fading-edge-length",
|
|
75
|
+
"20px",
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
49
79
|
it("disables label and indicator transitions during the initial render", () => {
|
|
50
80
|
const { container } = render(<BasicTabs defaultValue="two" />);
|
|
51
81
|
const labels = container.querySelectorAll<HTMLElement>(".seed-tabs__triggerLabel");
|
|
@@ -140,6 +170,121 @@ describe("Tabs", () => {
|
|
|
140
170
|
expect(rects["three"]?.left).toBe(0);
|
|
141
171
|
});
|
|
142
172
|
|
|
173
|
+
it("calculates tab scroll offsets from content insets and measured widths", () => {
|
|
174
|
+
const geometry = {
|
|
175
|
+
viewportWidth: 360,
|
|
176
|
+
contentWidth: 792,
|
|
177
|
+
contentInsetStart: 16,
|
|
178
|
+
contentInsetEnd: 16,
|
|
179
|
+
triggerRect: { left: 320, width: 56 },
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
expect(getTabsScrollOffset({ ...geometry, scrollAlign: "start", currentOffset: 0 })).toBe(320);
|
|
183
|
+
expect(getTabsScrollOffset({ ...geometry, scrollAlign: "center", currentOffset: 0 })).toBe(184);
|
|
184
|
+
expect(getTabsScrollOffset({ ...geometry, scrollAlign: "end", currentOffset: 0 })).toBe(48);
|
|
185
|
+
expect(getTabsScrollOffset({ ...geometry, scrollAlign: "nearest", currentOffset: 0 })).toBe(48);
|
|
186
|
+
expect(getTabsScrollOffset({ ...geometry, scrollAlign: "nearest", currentOffset: 160 })).toBe(
|
|
187
|
+
160,
|
|
188
|
+
);
|
|
189
|
+
// A trigger can sit inside the desired 16px padding while remaining fully
|
|
190
|
+
// visible in the actual scroll viewport; nearest must not move it.
|
|
191
|
+
expect(
|
|
192
|
+
getTabsScrollOffset({
|
|
193
|
+
...geometry,
|
|
194
|
+
scrollAlign: "nearest",
|
|
195
|
+
currentOffset: 200,
|
|
196
|
+
triggerRect: { left: 192, width: 56 },
|
|
197
|
+
}),
|
|
198
|
+
).toBe(200);
|
|
199
|
+
expect(
|
|
200
|
+
getTabsScrollOffset({
|
|
201
|
+
...geometry,
|
|
202
|
+
scrollAlign: "nearest",
|
|
203
|
+
currentOffset: 240,
|
|
204
|
+
triggerRect: { left: 192, width: 56 },
|
|
205
|
+
}),
|
|
206
|
+
).toBe(192);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it("clamps tab scrolling at both content edges without moving a non-scrollable list", () => {
|
|
210
|
+
const geometry = {
|
|
211
|
+
viewportWidth: 360,
|
|
212
|
+
contentWidth: 792,
|
|
213
|
+
contentInsetStart: 16,
|
|
214
|
+
contentInsetEnd: 16,
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
expect(
|
|
218
|
+
getTabsScrollOffset({
|
|
219
|
+
...geometry,
|
|
220
|
+
scrollAlign: "end",
|
|
221
|
+
currentOffset: 0,
|
|
222
|
+
triggerRect: { left: 0, width: 56 },
|
|
223
|
+
}),
|
|
224
|
+
).toBe(0);
|
|
225
|
+
expect(
|
|
226
|
+
getTabsScrollOffset({
|
|
227
|
+
...geometry,
|
|
228
|
+
scrollAlign: "start",
|
|
229
|
+
currentOffset: 0,
|
|
230
|
+
triggerRect: { left: 704, width: 56 },
|
|
231
|
+
}),
|
|
232
|
+
).toBe(432);
|
|
233
|
+
expect(
|
|
234
|
+
getTabsScrollOffset({
|
|
235
|
+
...geometry,
|
|
236
|
+
contentWidth: 360,
|
|
237
|
+
scrollAlign: "center",
|
|
238
|
+
currentOffset: 144,
|
|
239
|
+
triggerRect: { left: 320, width: 56 },
|
|
240
|
+
}),
|
|
241
|
+
).toBe(0);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("updates large ChipTabs selection and content without activating disabled triggers", () => {
|
|
245
|
+
const onValueChange = vi.fn();
|
|
246
|
+
const { container } = render(
|
|
247
|
+
<ChipTabs.Root size="large" defaultValue="one" onValueChange={onValueChange}>
|
|
248
|
+
<ChipTabs.List>
|
|
249
|
+
<ChipTabs.Trigger value="one" notification={<text>새 알림</text>}>
|
|
250
|
+
첫 번째
|
|
251
|
+
</ChipTabs.Trigger>
|
|
252
|
+
<ChipTabs.Trigger value="two">두 번째</ChipTabs.Trigger>
|
|
253
|
+
<ChipTabs.Trigger value="three" disabled>
|
|
254
|
+
세 번째
|
|
255
|
+
</ChipTabs.Trigger>
|
|
256
|
+
</ChipTabs.List>
|
|
257
|
+
<ChipTabs.Content value="one">첫 번째 콘텐츠</ChipTabs.Content>
|
|
258
|
+
<ChipTabs.Content value="two">두 번째 콘텐츠</ChipTabs.Content>
|
|
259
|
+
<ChipTabs.Content value="three">세 번째 콘텐츠</ChipTabs.Content>
|
|
260
|
+
</ChipTabs.Root>,
|
|
261
|
+
);
|
|
262
|
+
const triggers = container.querySelectorAll<HTMLElement>(
|
|
263
|
+
'[accessibility-role-description="tab"]',
|
|
264
|
+
);
|
|
265
|
+
const contents = container.querySelectorAll<HTMLElement>(
|
|
266
|
+
'[accessibility-role-description="tabpanel"]',
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
expect(triggers[0]).toHaveAttribute("accessibility-value", "selected");
|
|
270
|
+
expect(contents[0]).toHaveAttribute("accessibility-elements-hidden", "false");
|
|
271
|
+
expect(contents[0]).toHaveTextContent("첫 번째 콘텐츠");
|
|
272
|
+
expect(container).toHaveTextContent("새 알림");
|
|
273
|
+
|
|
274
|
+
fireEvent.tap(triggers[1]);
|
|
275
|
+
|
|
276
|
+
expect(onValueChange).toHaveBeenCalledWith("two");
|
|
277
|
+
expect(triggers[1]).toHaveAttribute("accessibility-value", "selected");
|
|
278
|
+
expect(contents[1]).toHaveAttribute("accessibility-elements-hidden", "false");
|
|
279
|
+
expect(contents[1]).toHaveTextContent("두 번째 콘텐츠");
|
|
280
|
+
|
|
281
|
+
fireEvent.tap(triggers[2]);
|
|
282
|
+
|
|
283
|
+
expect(onValueChange).toHaveBeenCalledTimes(1);
|
|
284
|
+
expect(triggers[1]).toHaveAttribute("accessibility-value", "selected");
|
|
285
|
+
expect(contents[1]).toHaveAttribute("accessibility-elements-hidden", "false");
|
|
286
|
+
});
|
|
287
|
+
|
|
143
288
|
it("does not select a disabled trigger", () => {
|
|
144
289
|
const onValueChange = vi.fn();
|
|
145
290
|
const { container } = render(
|
|
@@ -190,6 +335,78 @@ describe("Tabs", () => {
|
|
|
190
335
|
expect(container.querySelector(".seed-tabs__content")).not.toBeNull();
|
|
191
336
|
});
|
|
192
337
|
|
|
338
|
+
it("starts only for native drags and closes non-changing or cancelled swipes", () => {
|
|
339
|
+
function SwipeLifecycleTabs() {
|
|
340
|
+
const [counts, setCounts] = React.useState({ starts: 0, ends: 0, settles: 0 });
|
|
341
|
+
const isSwiping = counts.starts > counts.ends;
|
|
342
|
+
|
|
343
|
+
return (
|
|
344
|
+
<Tabs.Root defaultValue="one">
|
|
345
|
+
<Tabs.List>
|
|
346
|
+
<Tabs.Trigger value="one">첫 번째</Tabs.Trigger>
|
|
347
|
+
<Tabs.Trigger value="two">두 번째</Tabs.Trigger>
|
|
348
|
+
</Tabs.List>
|
|
349
|
+
<Tabs.Carousel
|
|
350
|
+
swipeable
|
|
351
|
+
onSwipeStart={() =>
|
|
352
|
+
setCounts((current) => ({ ...current, starts: current.starts + 1 }))
|
|
353
|
+
}
|
|
354
|
+
onSwipeEnd={() => setCounts((current) => ({ ...current, ends: current.ends + 1 }))}
|
|
355
|
+
onSettle={() => setCounts((current) => ({ ...current, settles: current.settles + 1 }))}
|
|
356
|
+
>
|
|
357
|
+
<Tabs.CarouselCamera>
|
|
358
|
+
<Tabs.Content value="one">첫 번째 콘텐츠</Tabs.Content>
|
|
359
|
+
<Tabs.Content value="two">두 번째 콘텐츠</Tabs.Content>
|
|
360
|
+
</Tabs.CarouselCamera>
|
|
361
|
+
</Tabs.Carousel>
|
|
362
|
+
<text data-testid="swipe-state">{isSwiping ? "swiping" : "idle"}</text>
|
|
363
|
+
<text data-testid="swipe-counts">
|
|
364
|
+
{`${counts.starts}/${counts.ends}/${counts.settles}`}
|
|
365
|
+
</text>
|
|
366
|
+
</Tabs.Root>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const { container, getByTestId } = render(<SwipeLifecycleTabs />);
|
|
371
|
+
const pager = container.querySelector("viewpager")!;
|
|
372
|
+
|
|
373
|
+
fireEvent.touchstart(pager, {});
|
|
374
|
+
expect(getByTestId("swipe-state")).toHaveTextContent("idle");
|
|
375
|
+
fireEvent.touchend(pager, {});
|
|
376
|
+
expect(getByTestId("swipe-counts")).toHaveTextContent("0/0/0");
|
|
377
|
+
|
|
378
|
+
fireEvent.touchstart(pager, {});
|
|
379
|
+
fireViewPagerEvent(pager, "willchange", { index: 1, isDragged: true });
|
|
380
|
+
expect(getByTestId("swipe-state")).toHaveTextContent("swiping");
|
|
381
|
+
fireViewPagerEvent(pager, "change", { index: 1, isDragged: true });
|
|
382
|
+
fireEvent.touchend(pager, {});
|
|
383
|
+
|
|
384
|
+
expect(getByTestId("swipe-state")).toHaveTextContent("idle");
|
|
385
|
+
expect(getByTestId("swipe-counts")).toHaveTextContent("1/1/1");
|
|
386
|
+
|
|
387
|
+
fireEvent.touchstart(pager, {});
|
|
388
|
+
fireViewPagerEvent(pager, "willchange", { index: 1, isDragged: true });
|
|
389
|
+
fireEvent.touchend(pager, {});
|
|
390
|
+
|
|
391
|
+
expect(getByTestId("swipe-state")).toHaveTextContent("idle");
|
|
392
|
+
expect(getByTestId("swipe-counts")).toHaveTextContent("2/2/1");
|
|
393
|
+
|
|
394
|
+
fireEvent.touchstart(pager, {});
|
|
395
|
+
fireViewPagerEvent(pager, "willchange", { index: 0, isDragged: true });
|
|
396
|
+
fireViewPagerEvent(pager, "change", { index: 0, isDragged: true });
|
|
397
|
+
fireEvent.touchend(pager, {});
|
|
398
|
+
|
|
399
|
+
expect(getByTestId("swipe-state")).toHaveTextContent("idle");
|
|
400
|
+
expect(getByTestId("swipe-counts")).toHaveTextContent("3/3/2");
|
|
401
|
+
|
|
402
|
+
fireEvent.touchstart(pager, {});
|
|
403
|
+
fireViewPagerEvent(pager, "willchange", { index: 0, isDragged: true });
|
|
404
|
+
fireEvent.touchcancel(pager, {});
|
|
405
|
+
fireEvent.touchend(pager, {});
|
|
406
|
+
expect(getByTestId("swipe-state")).toHaveTextContent("idle");
|
|
407
|
+
expect(getByTestId("swipe-counts")).toHaveTextContent("4/4/2");
|
|
408
|
+
});
|
|
409
|
+
|
|
193
410
|
it("renders carousel camera contents as native viewpager items", () => {
|
|
194
411
|
const { container } = render(
|
|
195
412
|
<Tabs.Root defaultValue="one">
|