From 5f167e1d269fbb30625e4ac17ea5478f9ca26a98 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EC=A0=95=ED=98=84=EC=88=98?=
<54893898+junghyeonsu@users.noreply.github.com>
Date: Wed, 4 Dec 2024 16:37:12 +0900
Subject: [PATCH] =?UTF-8?q?feat(headless:tabs):=20isSwipeable=20prop?=
=?UTF-8?q?=EC=9D=B4=20false=EB=A9=B4=20dragProp=EC=9D=84=20spread?=
=?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B2=8C=20=EB=B3=80=EA=B2=BD?=
=?UTF-8?q?=ED=95=B4=EC=9A=94=20(#488)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: tabs overflow to visible
* chore: stylesheet bump
* chore: bump
* chore: useSwipeable bump
---
docs/components/example/index.json | 2 +-
docs/package.json | 6 +++---
docs/public/__registry__/ui/tabs.json | 8 +++++---
docs/registry/ui/tabs.tsx | 19 ++++++++-----------
examples/stackflow-spa/package.json | 6 +++---
packages/react-headless/tabs/CHANGELOG.md | 6 ++++++
packages/react-headless/tabs/package.json | 2 +-
.../react-headless/tabs/src/useSwipeable.ts | 5 ++++-
packages/recipe/CHANGELOG.md | 12 ++++++++++++
packages/recipe/package.json | 2 +-
packages/stylesheet/CHANGELOG.md | 12 ++++++++++++
packages/stylesheet/package.json | 2 +-
yarn.lock | 18 +++++++++---------
13 files changed, 66 insertions(+), 34 deletions(-)
diff --git a/docs/components/example/index.json b/docs/components/example/index.json
index 4fb15c75d..65fd6d222 100644
--- a/docs/components/example/index.json
+++ b/docs/components/example/index.json
@@ -123,7 +123,7 @@
"tabs-alert": "import {\n Tabs,\n TabContent,\n TabContentList,\n TabTrigger,\n TabTriggerList,\n} from \"seed-design/ui/tabs\";\n\nexport default function TabsAlert() {\n return (\n
\n \n \n 라벨1\n \n 라벨2\n \n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren) => {\n return (\n \n {props.children}\n
\n );\n};",
"tabs-disabled": "import { Tabs, TabContent, TabContentList, TabTrigger, TabTriggerList } from \"seed-design/ui/tabs\";\n\nexport default function TabsDisabled() {\n return (\n \n \n \n 라벨1\n \n 라벨2\n \n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren) => {\n return (\n \n {props.children}\n
\n );\n};",
"tabs-dynamic-height": "import { Tabs, TabContent, TabContentList, TabTrigger, TabTriggerList } from \"seed-design/ui/tabs\";\n\nexport default function TabsDynamicHeight() {\n return (\n \n
\n \n 라벨1\n 라벨2\n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
아래 컨텐츠
\n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren<{ height: string }>) => {\n const { height, children } = props;\n return (\n \n {children}\n
\n );\n};",
- "tabs-fix-trigger-list": "import { Tabs, TabContent, TabContentList, TabTrigger, TabTriggerList } from \"seed-design/ui/tabs\";\n\nexport default function TabsFixTriggerList() {\n return (\n // 600은 화면 높이라고 가정합니다.\n \n \n \n 라벨1\n 라벨2\n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren<{ height: string }>) => {\n const { height, children } = props;\n return (\n \n {children}\n
\n );\n};",
+ "tabs-fix-trigger-list": "import { Tabs, TabContent, TabContentList, TabTrigger, TabTriggerList } from \"seed-design/ui/tabs\";\n\nexport default function TabsFixTriggerList() {\n return (\n // 600은 화면 높이라고 가정합니다.\n \n \n \n 라벨1\n 라벨2\n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren<{ height: string }>) => {\n const { height, children } = props;\n return (\n \n {children}\n
\n );\n};",
"tabs-layout-fill": "import {\n Tabs,\n TabContent,\n TabContentList,\n TabTrigger,\n TabTriggerList,\n} from \"seed-design/ui/tabs\";\n\nexport default function TabsLayoutFill() {\n return (\n \n \n \n 라벨1\n 라벨2\n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren) => {\n return (\n \n {props.children}\n
\n );\n};",
"tabs-layout-hug": "import { Tabs, TabContent, TabContentList, TabTrigger, TabTriggerList } from \"seed-design/ui/tabs\";\n\nexport default function TabsLayoutHug() {\n return (\n \n \n \n 라벨1\n 라벨2\n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren) => {\n return (\n \n {props.children}\n
\n );\n};",
"tabs-preview": "import { Tabs, TabContent, TabContentList, TabTrigger, TabTriggerList } from \"seed-design/ui/tabs\";\n\nexport default function TabsPreview() {\n return (\n \n \n \n 라벨1\n 라벨2\n 라벨3\n \n \n \n Content 1\n \n \n Content 2\n \n \n Content 3\n \n \n \n
\n );\n}\n\nconst Content = (props: React.PropsWithChildren) => {\n return (\n \n {props.children}\n
\n );\n};",
diff --git a/docs/package.json b/docs/package.json
index 5f3ba523d..a29ad62eb 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -26,11 +26,11 @@
"@seed-design/react-radio-group": "0.0.0-alpha-20241030023710",
"@seed-design/react-segmented-control": "workspace:^",
"@seed-design/react-switch": "0.0.0-alpha-20241030023710",
- "@seed-design/react-tabs": "0.0.0-alpha-20241203133940",
- "@seed-design/recipe": "0.0.0-alpha-20241203133940",
+ "@seed-design/react-tabs": "0.0.0-alpha-20241204061301",
+ "@seed-design/recipe": "0.0.0-alpha-20241204032829",
"@seed-design/rootage-cli": "0.0.0",
"@seed-design/rootage-core": "0.0.0",
- "@seed-design/stylesheet": "3.0.0-alpha-20241203133940",
+ "@seed-design/stylesheet": "3.0.0-alpha-20241204032654",
"@stackflow/config": "^1.2.0",
"@stackflow/core": "^1.1.0",
"@stackflow/plugin-basic-ui": "^1.10.0",
diff --git a/docs/public/__registry__/ui/tabs.json b/docs/public/__registry__/ui/tabs.json
index 96e4b3369..6fc3caf28 100644
--- a/docs/public/__registry__/ui/tabs.json
+++ b/docs/public/__registry__/ui/tabs.json
@@ -1,11 +1,13 @@
{
"name": "tabs",
- "dependencies": ["@seed-design/react-tabs@alpha"],
+ "dependencies": [
+ "@seed-design/react-tabs@alpha"
+ ],
"registries": [
{
"name": "tabs.tsx",
"type": "ui",
- "content": "\"use client\";\n\nimport clsx from \"clsx\";\nimport * as React from \"react\";\nimport {\n useTabs,\n useSwipeable,\n type UseTabsProps,\n type TriggerProps,\n type ContentProps,\n useLazyContents,\n type UseLazyContentsProps,\n} from \"@seed-design/react-tabs\";\nimport { tabs } from \"@seed-design/recipe/tabs\";\nimport { tab } from \"@seed-design/recipe/tab\";\n\nimport \"@seed-design/stylesheet/tabs.css\";\nimport \"@seed-design/stylesheet/tab.css\";\n\ntype Assign = Omit & U;\n\ninterface TabsContextValue {\n api: ReturnType & ReturnType;\n classNames: ReturnType;\n shouldRender: (value: string) => boolean;\n\n /**\n * @default false\n */\n isSwipeable: boolean;\n\n layout: \"fill\" | \"hug\";\n size: \"small\" | \"medium\";\n}\n\nconst TabsContext = React.createContext(null);\n\nconst useTabsContext = () => {\n const context = React.useContext(TabsContext);\n if (!context) {\n throw new Error(\"Tabs cannot be rendered outside the Tabs\");\n }\n return context;\n};\n\nexport interface TabsProps\n extends Assign, UseTabsProps>,\n Omit {\n /**\n * @default \"hug\"\n */\n layout?: \"fill\" | \"hug\";\n\n /**\n * @default \"small\"\n */\n size?: \"small\" | \"medium\";\n\n /**\n * @default false\n */\n fixTriggerList?: boolean;\n}\n\nexport const Tabs = React.forwardRef(\n (props, ref) => {\n const {\n className,\n lazyMode,\n isLazy,\n isSwipeable = false,\n layout = \"hug\",\n size = \"small\",\n fixTriggerList = false,\n } = props;\n const useTabsProps = useTabs(props);\n const useSwipeableProps = useSwipeable({\n isSwipeable,\n onSwipeLeftToRight: useTabsProps.movePrev,\n onSwipeRightToLeft: useTabsProps.moveNext,\n });\n const classNames = tabs({\n layout,\n size,\n fixTriggerList,\n });\n const { rootProps, value } = useTabsProps;\n const { shouldRender } = useLazyContents({\n currentValue: value,\n lazyMode,\n isLazy,\n });\n const api = {\n ...useTabsProps,\n ...useSwipeableProps,\n };\n\n return (\n \n \n {props.children}\n \n
\n );\n },\n);\nTabs.displayName = \"Tabs\";\n\nexport const TabTriggerList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, children, ...otherProps }, ref) => {\n const { api, classNames } = useTabsContext();\n const { tabTriggerListProps, triggerSize } = api;\n const { left } = triggerSize;\n const { triggerList } = classNames;\n\n const containerRef = React.useRef(null);\n React.useImperativeHandle(ref, () => containerRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (containerRef.current) {\n containerRef.current?.scrollTo({\n // NOTE: 27px is half of tab's min-width\n left: left - 27,\n behavior: \"smooth\",\n });\n }\n }, [left]);\n\n return (\n \n {children}\n \n
\n );\n});\nTabTriggerList.displayName = \"TabTriggerList\";\n\nexport interface TabTriggerProps\n extends Assign, TriggerProps> {\n /**\n * @default false\n */\n alert?: boolean;\n}\n\nexport const TabTrigger = React.forwardRef(\n (\n { className, children, value, isDisabled, alert = false, ...otherProps },\n ref,\n ) => {\n const { api, layout, size } = useTabsContext();\n const { getTabTriggerProps } = api;\n const { label, notification, root } = tab({\n size,\n layout,\n });\n const { rootProps, notificationProps, labelProps } = getTabTriggerProps({\n value,\n isDisabled,\n });\n\n return (\n \n );\n },\n);\nTabTrigger.displayName = \"TabTrigger\";\n\nexport const TabContentList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, children, ...otherProps }, ref) => {\n const { api, classNames, isSwipeable } = useTabsContext();\n const {\n tabContentListProps,\n tabContentCameraProps,\n getDragProps,\n currentTabEnabledIndex,\n swipeMoveX,\n swipeStatus,\n tabEnabledCount,\n } = api;\n const { contentList, contentCamera } = classNames;\n const dragProps = getDragProps();\n\n const getCameraTranslateX = () => {\n const MODIFIER = 5;\n\n const isSide =\n currentTabEnabledIndex === 0 ||\n currentTabEnabledIndex === tabEnabledCount - 1;\n const swipeOffset = isSide ? swipeMoveX / MODIFIER : swipeMoveX;\n\n return `calc(var(--seed-design-tabs-current-tab-enabled-index) * var(--seed-design-tabs-tab-camera-width) * -1px + ${swipeOffset}px)`;\n };\n\n return (\n \n );\n});\nTabContentList.displayName = \"TabContentList\";\n\nexport const TabContent = React.forwardRef<\n HTMLDivElement,\n Assign, ContentProps>\n>(({ className, children, value, ...otherProps }, ref) => {\n const { api, classNames, shouldRender } = useTabsContext();\n const { getTabContentProps } = api;\n const { content } = classNames;\n const tabContentProps = getTabContentProps({ value });\n const isRender = shouldRender(value);\n\n return (\n \n {isRender && children}\n
\n );\n});\nTabContent.displayName = \"TabContent\";\n\nconst TabIndicator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, ...otherProps }, ref) => {\n const { api, classNames } = useTabsContext();\n const { tabIndicatorProps } = api;\n const { indicator } = classNames;\n\n return (\n \n );\n});\nTabIndicator.displayName = \"TabIndicator\";\n"
+ "content": "\"use client\";\n\nimport clsx from \"clsx\";\nimport * as React from \"react\";\nimport {\n useTabs,\n useSwipeable,\n type UseTabsProps,\n type TriggerProps,\n type ContentProps,\n useLazyContents,\n type UseLazyContentsProps,\n} from \"@seed-design/react-tabs\";\nimport { tabs } from \"@seed-design/recipe/tabs\";\nimport { tab } from \"@seed-design/recipe/tab\";\n\nimport \"@seed-design/stylesheet/tabs.css\";\nimport \"@seed-design/stylesheet/tab.css\";\n\ntype Assign = Omit & U;\n\ninterface TabsContextValue {\n api: ReturnType;\n classNames: ReturnType;\n shouldRender: (value: string) => boolean;\n\n /**\n * @default false\n */\n isSwipeable: boolean;\n\n layout: \"fill\" | \"hug\";\n size: \"small\" | \"medium\";\n}\n\nconst TabsContext = React.createContext(null);\n\nconst useTabsContext = () => {\n const context = React.useContext(TabsContext);\n if (!context) {\n throw new Error(\"Tabs cannot be rendered outside the Tabs\");\n }\n return context;\n};\n\nexport interface TabsProps\n extends Assign, UseTabsProps>,\n Omit {\n /**\n * @default \"hug\"\n */\n layout?: \"fill\" | \"hug\";\n\n /**\n * @default \"small\"\n */\n size?: \"small\" | \"medium\";\n\n /**\n * @default false\n */\n fixTriggerList?: boolean;\n}\n\nexport const Tabs = React.forwardRef(\n (props, ref) => {\n const {\n className,\n lazyMode,\n isLazy,\n isSwipeable = false,\n layout = \"hug\",\n size = \"small\",\n fixTriggerList = false,\n } = props;\n const useTabsProps = useTabs(props);\n const classNames = tabs({\n layout,\n size,\n fixTriggerList,\n });\n const { rootProps, value } = useTabsProps;\n const { shouldRender } = useLazyContents({\n currentValue: value,\n lazyMode,\n isLazy,\n });\n const api = {\n ...useTabsProps,\n };\n\n return (\n \n \n {props.children}\n \n
\n );\n },\n);\nTabs.displayName = \"Tabs\";\n\nexport const TabTriggerList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, children, ...otherProps }, ref) => {\n const { api, classNames } = useTabsContext();\n const { tabTriggerListProps, triggerSize } = api;\n const { left } = triggerSize;\n const { triggerList } = classNames;\n\n const containerRef = React.useRef(null);\n React.useImperativeHandle(ref, () => containerRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (containerRef.current) {\n containerRef.current?.scrollTo({\n // NOTE: 27px is half of tab's min-width\n left: left - 27,\n behavior: \"smooth\",\n });\n }\n }, [left]);\n\n return (\n \n {children}\n \n
\n );\n});\nTabTriggerList.displayName = \"TabTriggerList\";\n\nexport interface TabTriggerProps\n extends Assign, TriggerProps> {\n /**\n * @default false\n */\n alert?: boolean;\n}\n\nexport const TabTrigger = React.forwardRef(\n (\n { className, children, value, isDisabled, alert = false, ...otherProps },\n ref,\n ) => {\n const { api, layout, size } = useTabsContext();\n const { getTabTriggerProps } = api;\n const { label, notification, root } = tab({\n size,\n layout,\n });\n const { rootProps, notificationProps, labelProps } = getTabTriggerProps({\n value,\n isDisabled,\n });\n\n return (\n \n );\n },\n);\nTabTrigger.displayName = \"TabTrigger\";\n\nexport const TabContentList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, children, ...otherProps }, ref) => {\n const { api, classNames, isSwipeable } = useTabsContext();\n const {\n tabContentListProps,\n tabContentCameraProps,\n currentTabEnabledIndex,\n tabEnabledCount,\n moveNext,\n movePrev,\n } = api;\n const { contentList, contentCamera } = classNames;\n const { dragProps, swipeMoveX, swipeStatus } = useSwipeable({\n isSwipeable,\n onSwipeLeftToRight: movePrev,\n onSwipeRightToLeft: moveNext,\n });\n\n const getCameraTranslateX = () => {\n const MODIFIER = 5;\n\n const isSide =\n currentTabEnabledIndex === 0 ||\n currentTabEnabledIndex === tabEnabledCount - 1;\n const swipeOffset = isSide ? swipeMoveX / MODIFIER : swipeMoveX;\n\n return `calc(var(--seed-design-tabs-current-tab-enabled-index) * var(--seed-design-tabs-tab-camera-width) * -1px + ${swipeOffset}px)`;\n };\n\n return (\n \n );\n});\nTabContentList.displayName = \"TabContentList\";\n\nexport const TabContent = React.forwardRef<\n HTMLDivElement,\n Assign, ContentProps>\n>(({ className, children, value, ...otherProps }, ref) => {\n const { api, classNames, shouldRender } = useTabsContext();\n const { getTabContentProps } = api;\n const { content } = classNames;\n const tabContentProps = getTabContentProps({ value });\n const isRender = shouldRender(value);\n\n return (\n \n {isRender && children}\n
\n );\n});\nTabContent.displayName = \"TabContent\";\n\nconst TabIndicator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, ...otherProps }, ref) => {\n const { api, classNames } = useTabsContext();\n const { tabIndicatorProps } = api;\n const { indicator } = classNames;\n\n return (\n \n );\n});\nTabIndicator.displayName = \"TabIndicator\";\n"
}
]
-}
+}
\ No newline at end of file
diff --git a/docs/registry/ui/tabs.tsx b/docs/registry/ui/tabs.tsx
index f77b536fc..1cbcd670c 100644
--- a/docs/registry/ui/tabs.tsx
+++ b/docs/registry/ui/tabs.tsx
@@ -20,7 +20,7 @@ import "@seed-design/stylesheet/tab.css";
type Assign = Omit & U;
interface TabsContextValue {
- api: ReturnType & ReturnType;
+ api: ReturnType;
classNames: ReturnType;
shouldRender: (value: string) => boolean;
@@ -74,11 +74,6 @@ export const Tabs = React.forwardRef(
fixTriggerList = false,
} = props;
const useTabsProps = useTabs(props);
- const useSwipeableProps = useSwipeable({
- isSwipeable,
- onSwipeLeftToRight: useTabsProps.movePrev,
- onSwipeRightToLeft: useTabsProps.moveNext,
- });
const classNames = tabs({
layout,
size,
@@ -92,7 +87,6 @@ export const Tabs = React.forwardRef(
});
const api = {
...useTabsProps,
- ...useSwipeableProps,
};
return (
@@ -205,14 +199,17 @@ export const TabContentList = React.forwardRef<
const {
tabContentListProps,
tabContentCameraProps,
- getDragProps,
currentTabEnabledIndex,
- swipeMoveX,
- swipeStatus,
tabEnabledCount,
+ moveNext,
+ movePrev,
} = api;
const { contentList, contentCamera } = classNames;
- const dragProps = getDragProps();
+ const { dragProps, swipeMoveX, swipeStatus } = useSwipeable({
+ isSwipeable,
+ onSwipeLeftToRight: movePrev,
+ onSwipeRightToLeft: moveNext,
+ });
const getCameraTranslateX = () => {
const MODIFIER = 5;
diff --git a/examples/stackflow-spa/package.json b/examples/stackflow-spa/package.json
index b2af533d7..1d4c604ba 100644
--- a/examples/stackflow-spa/package.json
+++ b/examples/stackflow-spa/package.json
@@ -13,10 +13,10 @@
"@seed-design/react-popover": "0.0.0-alpha-20241030023710",
"@seed-design/react-radio-group": "0.0.0-alpha-20241030023710",
"@seed-design/react-switch": "0.0.0-alpha-20241030023710",
- "@seed-design/react-tabs": "0.0.0-alpha-20241203133940",
+ "@seed-design/react-tabs": "0.0.0-alpha-20241204061301",
"@seed-design/react-text-field": "0.0.0-alpha-20241030023710",
- "@seed-design/recipe": "0.0.0-alpha-20241203133940",
- "@seed-design/stylesheet": "3.0.0-alpha-20241203133940",
+ "@seed-design/recipe": "0.0.0-alpha-20241204032829",
+ "@seed-design/stylesheet": "3.0.0-alpha-20241204032654",
"@seed-design/vars": "0.0.0",
"@stackflow/core": "^1.1.0",
"@stackflow/plugin-basic-ui": "^1.10.1",
diff --git a/packages/react-headless/tabs/CHANGELOG.md b/packages/react-headless/tabs/CHANGELOG.md
index 9f421bf2d..1255948e2 100644
--- a/packages/react-headless/tabs/CHANGELOG.md
+++ b/packages/react-headless/tabs/CHANGELOG.md
@@ -1,5 +1,11 @@
# @seed-design/react-tabs
+## 0.0.0-alpha-20241204061301
+
+### Patch Changes
+
+- useSwipeable dragProps
+
## 0.0.0-alpha-20241203133940
### Patch Changes
diff --git a/packages/react-headless/tabs/package.json b/packages/react-headless/tabs/package.json
index dbc45cc05..9149263d9 100644
--- a/packages/react-headless/tabs/package.json
+++ b/packages/react-headless/tabs/package.json
@@ -1,6 +1,6 @@
{
"name": "@seed-design/react-tabs",
- "version": "0.0.0-alpha-20241203133940",
+ "version": "0.0.0-alpha-20241204061301",
"repository": {
"type": "git",
"url": "git+https://github.com/daangn/seed-design.git",
diff --git a/packages/react-headless/tabs/src/useSwipeable.ts b/packages/react-headless/tabs/src/useSwipeable.ts
index 37bb11cfa..dc8d4cef6 100644
--- a/packages/react-headless/tabs/src/useSwipeable.ts
+++ b/packages/react-headless/tabs/src/useSwipeable.ts
@@ -94,6 +94,7 @@ export const useSwipeable = (props: UseSwipeableProps) => {
},
{
drag: {
+ filterTaps: false,
preventScrollAxis: "y",
preventDefault: true,
swipe: {
@@ -105,9 +106,11 @@ export const useSwipeable = (props: UseSwipeableProps) => {
},
);
+ const dragProps = isSwipeable ? getDragProps() : {};
+
return {
swipeMoveX,
swipeStatus,
- getDragProps,
+ dragProps,
};
};
diff --git a/packages/recipe/CHANGELOG.md b/packages/recipe/CHANGELOG.md
index d96721b56..3788a7b75 100644
--- a/packages/recipe/CHANGELOG.md
+++ b/packages/recipe/CHANGELOG.md
@@ -1,5 +1,17 @@
# @seed-design/recipe
+## 0.0.0-alpha-20241204032829
+
+### Patch Changes
+
+- revert tabs overflowX (to hidden)
+
+## 0.0.0-alpha-20241204031604
+
+### Patch Changes
+
+- tabs overflowX to visible
+
## 0.0.0-alpha-20241203133940
### Patch Changes
diff --git a/packages/recipe/package.json b/packages/recipe/package.json
index 5965c4552..e5f943360 100644
--- a/packages/recipe/package.json
+++ b/packages/recipe/package.json
@@ -1,6 +1,6 @@
{
"name": "@seed-design/recipe",
- "version": "0.0.0-alpha-20241203133940",
+ "version": "0.0.0-alpha-20241204032829",
"repository": {
"type": "git",
"url": "git+https://github.com/daangn/seed-design.git",
diff --git a/packages/stylesheet/CHANGELOG.md b/packages/stylesheet/CHANGELOG.md
index 25b64fe51..0c651edef 100644
--- a/packages/stylesheet/CHANGELOG.md
+++ b/packages/stylesheet/CHANGELOG.md
@@ -1,5 +1,17 @@
# @seed-design/stylesheet
+## 3.0.0-alpha-20241204032654
+
+### Patch Changes
+
+- revert tabs overflowX (to hidden)
+
+## 3.0.0-alpha-20241204032110
+
+### Patch Changes
+
+- tabs overflowX to visible
+
## 3.0.0-alpha-20241203133940
### Patch Changes
diff --git a/packages/stylesheet/package.json b/packages/stylesheet/package.json
index e85c5ac8a..781c264bb 100644
--- a/packages/stylesheet/package.json
+++ b/packages/stylesheet/package.json
@@ -1,6 +1,6 @@
{
"name": "@seed-design/stylesheet",
- "version": "3.0.0-alpha-20241203133940",
+ "version": "3.0.0-alpha-20241204032654",
"repository": {
"type": "git",
"url": "git+https://github.com/daangn/seed-design.git",
diff --git a/yarn.lock b/yarn.lock
index c91833a37..af7d50c74 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6426,7 +6426,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@seed-design/react-tabs@0.0.0-alpha-20241203133940, @seed-design/react-tabs@workspace:packages/react-headless/tabs":
+"@seed-design/react-tabs@0.0.0-alpha-20241204061301, @seed-design/react-tabs@workspace:packages/react-headless/tabs":
version: 0.0.0-use.local
resolution: "@seed-design/react-tabs@workspace:packages/react-headless/tabs"
dependencies:
@@ -6514,7 +6514,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@seed-design/recipe@0.0.0-alpha-20241203133940, @seed-design/recipe@workspace:packages/recipe":
+"@seed-design/recipe@0.0.0-alpha-20241204032829, @seed-design/recipe@workspace:packages/recipe":
version: 0.0.0-use.local
resolution: "@seed-design/recipe@workspace:packages/recipe"
dependencies:
@@ -6568,10 +6568,10 @@ __metadata:
"@seed-design/react-popover": 0.0.0-alpha-20241030023710
"@seed-design/react-radio-group": 0.0.0-alpha-20241030023710
"@seed-design/react-switch": 0.0.0-alpha-20241030023710
- "@seed-design/react-tabs": 0.0.0-alpha-20241203133940
+ "@seed-design/react-tabs": 0.0.0-alpha-20241204061301
"@seed-design/react-text-field": 0.0.0-alpha-20241030023710
- "@seed-design/recipe": 0.0.0-alpha-20241203133940
- "@seed-design/stylesheet": 3.0.0-alpha-20241203133940
+ "@seed-design/recipe": 0.0.0-alpha-20241204032829
+ "@seed-design/stylesheet": 3.0.0-alpha-20241204032654
"@seed-design/vars": 0.0.0
"@stackflow/core": ^1.1.0
"@stackflow/plugin-basic-ui": ^1.10.1
@@ -6594,7 +6594,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@seed-design/stylesheet@3.0.0-alpha-20241203133940, @seed-design/stylesheet@workspace:packages/stylesheet":
+"@seed-design/stylesheet@3.0.0-alpha-20241204032654, @seed-design/stylesheet@workspace:packages/stylesheet":
version: 0.0.0-use.local
resolution: "@seed-design/stylesheet@workspace:packages/stylesheet"
dependencies:
@@ -10818,11 +10818,11 @@ __metadata:
"@seed-design/react-radio-group": 0.0.0-alpha-20241030023710
"@seed-design/react-segmented-control": "workspace:^"
"@seed-design/react-switch": 0.0.0-alpha-20241030023710
- "@seed-design/react-tabs": 0.0.0-alpha-20241203133940
- "@seed-design/recipe": 0.0.0-alpha-20241203133940
+ "@seed-design/react-tabs": 0.0.0-alpha-20241204061301
+ "@seed-design/recipe": 0.0.0-alpha-20241204032829
"@seed-design/rootage-cli": 0.0.0
"@seed-design/rootage-core": 0.0.0
- "@seed-design/stylesheet": 3.0.0-alpha-20241203133940
+ "@seed-design/stylesheet": 3.0.0-alpha-20241204032654
"@stackflow/config": ^1.2.0
"@stackflow/core": ^1.1.0
"@stackflow/plugin-basic-ui": ^1.10.0