@kimdw-rtk/ui 0.1.17 → 0.1.19
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/dist/components/Tabs/Tabs.cjs +14 -3
- package/dist/components/Tabs/Tabs.css.d.ts +14 -0
- package/dist/components/Tabs/Tabs.css.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.css.ts.vanilla.css +15 -0
- package/dist/components/Tabs/Tabs.css.vanilla.cjs +11 -0
- package/dist/components/Tabs/Tabs.css.vanilla.js +9 -0
- package/dist/components/Tabs/Tabs.d.ts +2 -1
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +14 -3
- package/dist/components/Tabs/TabsIndicator.cjs +13 -0
- package/dist/components/Tabs/TabsIndicator.css.d.ts +2 -0
- package/dist/components/Tabs/TabsIndicator.css.d.ts.map +1 -0
- package/dist/components/Tabs/TabsIndicator.css.ts.vanilla.css +15 -0
- package/dist/components/Tabs/TabsIndicator.css.vanilla.cjs +11 -0
- package/dist/components/Tabs/TabsIndicator.css.vanilla.js +9 -0
- package/dist/components/Tabs/TabsIndicator.d.ts +4 -0
- package/dist/components/Tabs/TabsIndicator.d.ts.map +1 -0
- package/dist/components/Tabs/TabsIndicator.js +11 -0
- package/dist/components/Tabs/TabsList.cjs +35 -1
- package/dist/components/Tabs/TabsList.css.d.ts +1 -0
- package/dist/components/Tabs/TabsList.css.d.ts.map +1 -1
- package/dist/components/Tabs/TabsList.css.ts.vanilla.css +3 -2
- package/dist/components/Tabs/TabsList.css.vanilla.cjs +3 -1
- package/dist/components/Tabs/TabsList.css.vanilla.js +3 -2
- package/dist/components/Tabs/TabsList.d.ts.map +1 -1
- package/dist/components/Tabs/TabsList.js +38 -4
- package/dist/components/Tabs/TabsProvider.cjs +11 -2
- package/dist/components/Tabs/TabsProvider.d.ts +11 -4
- package/dist/components/Tabs/TabsProvider.d.ts.map +1 -1
- package/dist/components/Tabs/TabsProvider.js +11 -2
- package/dist/components/Tabs/TabsTrigger.cjs +6 -4
- package/dist/components/Tabs/TabsTrigger.css.d.ts +0 -2
- package/dist/components/Tabs/TabsTrigger.css.d.ts.map +1 -1
- package/dist/components/Tabs/TabsTrigger.css.ts.vanilla.css +1 -3
- package/dist/components/Tabs/TabsTrigger.d.ts.map +1 -1
- package/dist/components/Tabs/TabsTrigger.js +7 -5
- package/package.json +3 -3
|
@@ -4,12 +4,23 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var clsx = require('../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.cjs');
|
|
7
|
+
var Tabs_css = require('./Tabs.css.vanilla.cjs');
|
|
7
8
|
var TabsProvider = require('./TabsProvider.cjs');
|
|
8
9
|
var sx = require('../../styles/sx.cjs');
|
|
9
10
|
|
|
10
|
-
const Tabs = react.forwardRef(({ children, defaultValue, className, sx: propSx, ...props }, ref) => {
|
|
11
|
-
const [
|
|
12
|
-
|
|
11
|
+
const Tabs = react.forwardRef(({ children, defaultValue, className, sx: propSx, size = 'md', ...props }, ref) => {
|
|
12
|
+
const [state, dispatch] = react.useReducer(TabsProvider.tabsReducer, {
|
|
13
|
+
value: defaultValue,
|
|
14
|
+
selectedElement: undefined,
|
|
15
|
+
});
|
|
16
|
+
const selectTab = (value, selectedElement) => {
|
|
17
|
+
dispatch({ type: 'SELECT_TAB', value, selectedElement });
|
|
18
|
+
};
|
|
19
|
+
return (jsxRuntime.jsx(TabsProvider.TabsContext.Provider, { value: {
|
|
20
|
+
value: state.value,
|
|
21
|
+
selectedElement: state.selectedElement,
|
|
22
|
+
selectTab,
|
|
23
|
+
}, children: jsxRuntime.jsx("div", { ref: ref, className: clsx.clsx(Tabs_css.tabs({ size }), className, sx.sx(propSx)), ...props, children: children }) }));
|
|
13
24
|
});
|
|
14
25
|
Tabs.displayName = 'Tabs';
|
|
15
26
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/Tabs.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI;;;;;;;;;;;;EAmBf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@layer components;
|
|
2
|
+
@layer components {
|
|
3
|
+
.Tabs_layeredBase__sdjk9u0 {
|
|
4
|
+
width: 100%;
|
|
5
|
+
}
|
|
6
|
+
.Tabs_styleWithLayer__sdjk9u1 {
|
|
7
|
+
font-size: 0.875rem;
|
|
8
|
+
}
|
|
9
|
+
.Tabs_styleWithLayer__sdjk9u2 {
|
|
10
|
+
font-size: 1rem;
|
|
11
|
+
}
|
|
12
|
+
.Tabs_styleWithLayer__sdjk9u3 {
|
|
13
|
+
font-size: 1.125rem;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('./../../styles/layers.css.ts.vanilla.css');
|
|
4
|
+
require('./../../styles/sprinkles.css.ts.vanilla.css');
|
|
5
|
+
require('./../../styles/globalStyle.css.ts.vanilla.css');
|
|
6
|
+
require('./Tabs.css.ts.vanilla.css');
|
|
7
|
+
var createRuntimeFn62c9670f_esm = require('../../node_modules/.pnpm/@vanilla-extract_recipes@0.5.7_@vanilla-extract_css@1.17.4_babel-plugin-macros@3.1.0_/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.cjs');
|
|
8
|
+
|
|
9
|
+
var tabs = createRuntimeFn62c9670f_esm.c({defaultClassName:'Tabs__sdjk9u4 Tabs_layeredBase__sdjk9u0',variantClassNames:{size:{sm:'Tabs_styleWithLayer__sdjk9u1',md:'Tabs_styleWithLayer__sdjk9u2',lg:'Tabs_styleWithLayer__sdjk9u3'}},defaultVariants:{},compoundVariants:[]});
|
|
10
|
+
|
|
11
|
+
exports.tabs = tabs;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import './../../styles/layers.css.ts.vanilla.css';
|
|
2
|
+
import './../../styles/sprinkles.css.ts.vanilla.css';
|
|
3
|
+
import './../../styles/globalStyle.css.ts.vanilla.css';
|
|
4
|
+
import './Tabs.css.ts.vanilla.css';
|
|
5
|
+
import { c as createRuntimeFn } from '../../node_modules/.pnpm/@vanilla-extract_recipes@0.5.7_@vanilla-extract_css@1.17.4_babel-plugin-macros@3.1.0_/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js';
|
|
6
|
+
|
|
7
|
+
var tabs = createRuntimeFn({defaultClassName:'Tabs__sdjk9u4 Tabs_layeredBase__sdjk9u0',variantClassNames:{size:{sm:'Tabs_styleWithLayer__sdjk9u1',md:'Tabs_styleWithLayer__sdjk9u2',lg:'Tabs_styleWithLayer__sdjk9u3'}},defaultVariants:{},compoundVariants:[]});
|
|
8
|
+
|
|
9
|
+
export { tabs };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { UIComponent } from '#types';
|
|
2
|
-
|
|
2
|
+
import * as s from './Tabs.css';
|
|
3
|
+
interface TabsProps extends UIComponent<'div', typeof s.tabs> {
|
|
3
4
|
defaultValue?: number | string;
|
|
4
5
|
}
|
|
5
6
|
export declare const Tabs: import("react").ForwardRefExoticComponent<Omit<TabsProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/Tabs.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/Tabs.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAGhC,UAAU,SAAU,SAAQ,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,IAAI,mHAmChB,CAAC"}
|
|
@@ -2,12 +2,23 @@
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { forwardRef, useReducer } from 'react';
|
|
4
4
|
import { clsx } from '../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js';
|
|
5
|
+
import { tabs } from './Tabs.css.vanilla.js';
|
|
5
6
|
import { tabsReducer, TabsContext } from './TabsProvider.js';
|
|
6
7
|
import { sx } from '../../styles/sx.js';
|
|
7
8
|
|
|
8
|
-
const Tabs = forwardRef(({ children, defaultValue, className, sx: propSx, ...props }, ref) => {
|
|
9
|
-
const [
|
|
10
|
-
|
|
9
|
+
const Tabs = forwardRef(({ children, defaultValue, className, sx: propSx, size = 'md', ...props }, ref) => {
|
|
10
|
+
const [state, dispatch] = useReducer(tabsReducer, {
|
|
11
|
+
value: defaultValue,
|
|
12
|
+
selectedElement: undefined,
|
|
13
|
+
});
|
|
14
|
+
const selectTab = (value, selectedElement) => {
|
|
15
|
+
dispatch({ type: 'SELECT_TAB', value, selectedElement });
|
|
16
|
+
};
|
|
17
|
+
return (jsx(TabsContext.Provider, { value: {
|
|
18
|
+
value: state.value,
|
|
19
|
+
selectedElement: state.selectedElement,
|
|
20
|
+
selectTab,
|
|
21
|
+
}, children: jsx("div", { ref: ref, className: clsx(tabs({ size }), className, sx(propSx)), ...props, children: children }) }));
|
|
11
22
|
});
|
|
12
23
|
Tabs.displayName = 'Tabs';
|
|
13
24
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var clsx = require('../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.cjs');
|
|
6
|
+
var TabsIndicator_css = require('./TabsIndicator.css.vanilla.cjs');
|
|
7
|
+
|
|
8
|
+
const TabsIndicator = react.forwardRef(({ className, ...rest }, ref) => {
|
|
9
|
+
return jsxRuntime.jsx("div", { ref: ref, className: clsx.clsx(TabsIndicator_css.indicator, className), ...rest });
|
|
10
|
+
});
|
|
11
|
+
TabsIndicator.displayName = 'TabsIndicator';
|
|
12
|
+
|
|
13
|
+
exports.TabsIndicator = TabsIndicator;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabsIndicator.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsIndicator.css.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,QAiBpB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@layer components;
|
|
2
|
+
@layer components {
|
|
3
|
+
.TabsIndicator_styleWithLayer__1ogqhc0 {
|
|
4
|
+
position: absolute;
|
|
5
|
+
left: 0;
|
|
6
|
+
bottom: 0;
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: calc((1em - 0.625rem) / 2);
|
|
9
|
+
background-color: rgb(var(--color-primary__n6e2fs7));
|
|
10
|
+
transition: transform 0.25s ease;
|
|
11
|
+
}
|
|
12
|
+
.TabsList_isAnimated__9gciwt0 .TabsIndicator_styleWithLayer__1ogqhc0 {
|
|
13
|
+
display: none;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('./../../styles/layers.css.ts.vanilla.css');
|
|
4
|
+
require('./../../styles/sprinkles.css.ts.vanilla.css');
|
|
5
|
+
require('./../../styles/globalStyle.css.ts.vanilla.css');
|
|
6
|
+
require('./TabsList.css.ts.vanilla.css');
|
|
7
|
+
require('./TabsIndicator.css.ts.vanilla.css');
|
|
8
|
+
|
|
9
|
+
var indicator = 'TabsIndicator_styleWithLayer__1ogqhc0';
|
|
10
|
+
|
|
11
|
+
exports.indicator = indicator;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import './../../styles/layers.css.ts.vanilla.css';
|
|
2
|
+
import './../../styles/sprinkles.css.ts.vanilla.css';
|
|
3
|
+
import './../../styles/globalStyle.css.ts.vanilla.css';
|
|
4
|
+
import './TabsList.css.ts.vanilla.css';
|
|
5
|
+
import './TabsIndicator.css.ts.vanilla.css';
|
|
6
|
+
|
|
7
|
+
var indicator = 'TabsIndicator_styleWithLayer__1ogqhc0';
|
|
8
|
+
|
|
9
|
+
export { indicator };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const TabsIndicator: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
2
|
+
ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
3
|
+
}, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
4
|
+
//# sourceMappingURL=TabsIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabsIndicator.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsIndicator.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa;;0DAKxB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { clsx } from '../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js';
|
|
4
|
+
import { indicator } from './TabsIndicator.css.vanilla.js';
|
|
5
|
+
|
|
6
|
+
const TabsIndicator = forwardRef(({ className, ...rest }, ref) => {
|
|
7
|
+
return jsx("div", { ref: ref, className: clsx(indicator, className), ...rest });
|
|
8
|
+
});
|
|
9
|
+
TabsIndicator.displayName = 'TabsIndicator';
|
|
10
|
+
|
|
11
|
+
export { TabsIndicator };
|
|
@@ -1,13 +1,47 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
'use strict';
|
|
2
3
|
|
|
3
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
5
|
var react = require('react');
|
|
6
|
+
var utils = require('@kimdw-rtk/utils');
|
|
5
7
|
var clsx = require('../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.cjs');
|
|
8
|
+
var TabsIndicator = require('./TabsIndicator.cjs');
|
|
6
9
|
var TabsList_css = require('./TabsList.css.vanilla.cjs');
|
|
10
|
+
var TabsProvider = require('./TabsProvider.cjs');
|
|
7
11
|
var sx = require('../../styles/sx.cjs');
|
|
8
12
|
|
|
13
|
+
const baseWidth = 100;
|
|
9
14
|
const TabsList = react.forwardRef(({ children, className, sx: propSx, ...props }, ref) => {
|
|
10
|
-
|
|
15
|
+
const tabsContext = react.useContext(TabsProvider.TabsContext);
|
|
16
|
+
const indicatorRef = react.useRef(null);
|
|
17
|
+
const tabsListRef = utils.useCombinedRefs(ref);
|
|
18
|
+
if (tabsContext === undefined) {
|
|
19
|
+
throw new Error('TabsList must be used within a Tabs.');
|
|
20
|
+
}
|
|
21
|
+
react.useLayoutEffect(() => {
|
|
22
|
+
const element = tabsContext.selectedElement, indicator = indicatorRef.current, tabsList = tabsListRef.current;
|
|
23
|
+
if (!element || !indicator || !tabsList) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const animatedIndicator = () => {
|
|
27
|
+
const left = element.offsetLeft, width = element.offsetWidth;
|
|
28
|
+
indicator.style.transformOrigin = '0';
|
|
29
|
+
indicator.style.transform = `translateX(${left}px) scaleX(${width / baseWidth})`;
|
|
30
|
+
};
|
|
31
|
+
indicator.style.display = 'block';
|
|
32
|
+
animatedIndicator();
|
|
33
|
+
const handleTransitionEnd = () => {
|
|
34
|
+
indicator.style.display = 'none';
|
|
35
|
+
tabsList.classList.remove(TabsList_css.isAnimated);
|
|
36
|
+
};
|
|
37
|
+
tabsList.classList.add(TabsList_css.isAnimated);
|
|
38
|
+
indicator.addEventListener('transitionend', handleTransitionEnd);
|
|
39
|
+
return () => {
|
|
40
|
+
animatedIndicator();
|
|
41
|
+
indicator.removeEventListener('transitionend', handleTransitionEnd);
|
|
42
|
+
};
|
|
43
|
+
}, [tabsContext.selectedElement, tabsListRef]);
|
|
44
|
+
return (jsxRuntime.jsxs("div", { ref: tabsListRef, className: clsx.clsx(className, TabsList_css.container, sx.sx(propSx)), ...props, children: [children, jsxRuntime.jsx(TabsIndicator.TabsIndicator, { ref: indicatorRef, style: { display: 'none', width: `${baseWidth}px` } })] }));
|
|
11
45
|
});
|
|
12
46
|
TabsList.displayName = 'TabsList';
|
|
13
47
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsList.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsList.css.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TabsList.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsList.css.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,QAAY,CAAC;AAEpC,eAAO,MAAM,SAAS,QAQpB,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
@layer components;
|
|
2
2
|
@layer components {
|
|
3
|
-
.
|
|
3
|
+
.TabsList_styleWithLayer__9gciwt1 {
|
|
4
4
|
display: flex;
|
|
5
|
+
position: relative;
|
|
5
6
|
height: 2.5em;
|
|
6
|
-
box-shadow: inset 0 -0.
|
|
7
|
+
box-shadow: inset 0 -0.1875em 0 rgb(var(--color-muted__n6e2fsb));
|
|
7
8
|
background-color: rgb(var(--color-background__n6e2fs1));
|
|
8
9
|
}
|
|
9
10
|
}
|
|
@@ -5,6 +5,8 @@ require('./../../styles/sprinkles.css.ts.vanilla.css');
|
|
|
5
5
|
require('./../../styles/globalStyle.css.ts.vanilla.css');
|
|
6
6
|
require('./TabsList.css.ts.vanilla.css');
|
|
7
7
|
|
|
8
|
-
var container = '
|
|
8
|
+
var container = 'TabsList_styleWithLayer__9gciwt1';
|
|
9
|
+
var isAnimated = 'TabsList_isAnimated__9gciwt0';
|
|
9
10
|
|
|
10
11
|
exports.container = container;
|
|
12
|
+
exports.isAnimated = isAnimated;
|
|
@@ -3,6 +3,7 @@ import './../../styles/sprinkles.css.ts.vanilla.css';
|
|
|
3
3
|
import './../../styles/globalStyle.css.ts.vanilla.css';
|
|
4
4
|
import './TabsList.css.ts.vanilla.css';
|
|
5
5
|
|
|
6
|
-
var container = '
|
|
6
|
+
var container = 'TabsList_styleWithLayer__9gciwt1';
|
|
7
|
+
var isAnimated = 'TabsList_isAnimated__9gciwt0';
|
|
7
8
|
|
|
8
|
-
export { container };
|
|
9
|
+
export { container, isAnimated };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsList.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TabsList.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsList.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAM1C,KAAK,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;AAIxC,eAAO,MAAM,QAAQ,uHAyDpB,CAAC"}
|
|
@@ -1,11 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { forwardRef, useContext, useRef, useLayoutEffect } from 'react';
|
|
4
|
+
import { useCombinedRefs } from '@kimdw-rtk/utils';
|
|
3
5
|
import { clsx } from '../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js';
|
|
4
|
-
import {
|
|
6
|
+
import { TabsIndicator } from './TabsIndicator.js';
|
|
7
|
+
import { isAnimated, container } from './TabsList.css.vanilla.js';
|
|
8
|
+
import { TabsContext } from './TabsProvider.js';
|
|
5
9
|
import { sx } from '../../styles/sx.js';
|
|
6
10
|
|
|
11
|
+
const baseWidth = 100;
|
|
7
12
|
const TabsList = forwardRef(({ children, className, sx: propSx, ...props }, ref) => {
|
|
8
|
-
|
|
13
|
+
const tabsContext = useContext(TabsContext);
|
|
14
|
+
const indicatorRef = useRef(null);
|
|
15
|
+
const tabsListRef = useCombinedRefs(ref);
|
|
16
|
+
if (tabsContext === undefined) {
|
|
17
|
+
throw new Error('TabsList must be used within a Tabs.');
|
|
18
|
+
}
|
|
19
|
+
useLayoutEffect(() => {
|
|
20
|
+
const element = tabsContext.selectedElement, indicator = indicatorRef.current, tabsList = tabsListRef.current;
|
|
21
|
+
if (!element || !indicator || !tabsList) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const animatedIndicator = () => {
|
|
25
|
+
const left = element.offsetLeft, width = element.offsetWidth;
|
|
26
|
+
indicator.style.transformOrigin = '0';
|
|
27
|
+
indicator.style.transform = `translateX(${left}px) scaleX(${width / baseWidth})`;
|
|
28
|
+
};
|
|
29
|
+
indicator.style.display = 'block';
|
|
30
|
+
animatedIndicator();
|
|
31
|
+
const handleTransitionEnd = () => {
|
|
32
|
+
indicator.style.display = 'none';
|
|
33
|
+
tabsList.classList.remove(isAnimated);
|
|
34
|
+
};
|
|
35
|
+
tabsList.classList.add(isAnimated);
|
|
36
|
+
indicator.addEventListener('transitionend', handleTransitionEnd);
|
|
37
|
+
return () => {
|
|
38
|
+
animatedIndicator();
|
|
39
|
+
indicator.removeEventListener('transitionend', handleTransitionEnd);
|
|
40
|
+
};
|
|
41
|
+
}, [tabsContext.selectedElement, tabsListRef]);
|
|
42
|
+
return (jsxs("div", { ref: tabsListRef, className: clsx(className, container, sx(propSx)), ...props, children: [children, jsx(TabsIndicator, { ref: indicatorRef, style: { display: 'none', width: `${baseWidth}px` } })] }));
|
|
9
43
|
});
|
|
10
44
|
TabsList.displayName = 'TabsList';
|
|
11
45
|
|
|
@@ -4,8 +4,17 @@
|
|
|
4
4
|
var react = require('react');
|
|
5
5
|
|
|
6
6
|
const TabsContext = react.createContext(undefined);
|
|
7
|
-
const tabsReducer = (
|
|
8
|
-
|
|
7
|
+
const tabsReducer = (state, action) => {
|
|
8
|
+
switch (action.type) {
|
|
9
|
+
case 'SELECT_TAB':
|
|
10
|
+
return {
|
|
11
|
+
...state,
|
|
12
|
+
value: action.value,
|
|
13
|
+
selectedElement: action.selectedElement,
|
|
14
|
+
};
|
|
15
|
+
default:
|
|
16
|
+
return state;
|
|
17
|
+
}
|
|
9
18
|
};
|
|
10
19
|
|
|
11
20
|
exports.TabsContext = TabsContext;
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
interface TabsContext {
|
|
1
|
+
export interface TabsState {
|
|
3
2
|
value: number | string | undefined;
|
|
4
|
-
|
|
3
|
+
selectedElement: HTMLElement | undefined;
|
|
4
|
+
}
|
|
5
|
+
type TabsAction = {
|
|
6
|
+
type: 'SELECT_TAB';
|
|
7
|
+
value: TabsState['value'];
|
|
8
|
+
selectedElement: TabsState['selectedElement'];
|
|
9
|
+
};
|
|
10
|
+
interface TabsContext extends TabsState {
|
|
11
|
+
selectTab: (value: TabsState['value'], selectedElement: TabsState['selectedElement']) => void;
|
|
5
12
|
}
|
|
6
13
|
export declare const TabsContext: import("react").Context<TabsContext | undefined>;
|
|
7
|
-
export declare const tabsReducer: (
|
|
14
|
+
export declare const tabsReducer: (state: TabsState, action: TabsAction) => TabsState;
|
|
8
15
|
export {};
|
|
9
16
|
//# sourceMappingURL=TabsProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsProvider.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TabsProvider.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsProvider.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,EAAE,WAAW,GAAG,SAAS,CAAC;CAC1C;AAED,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,eAAe,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;CAC/C,CAAC;AAEF,UAAU,WAAY,SAAQ,SAAS;IACrC,SAAS,EAAE,CACT,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EACzB,eAAe,EAAE,SAAS,CAAC,iBAAiB,CAAC,KAC1C,IAAI,CAAC;CACX;AAED,eAAO,MAAM,WAAW,kDAAoD,CAAC;AAE7E,eAAO,MAAM,WAAW,GACtB,OAAO,SAAS,EAChB,QAAQ,UAAU,KACjB,SAWF,CAAC"}
|
|
@@ -2,8 +2,17 @@
|
|
|
2
2
|
import { createContext } from 'react';
|
|
3
3
|
|
|
4
4
|
const TabsContext = createContext(undefined);
|
|
5
|
-
const tabsReducer = (
|
|
6
|
-
|
|
5
|
+
const tabsReducer = (state, action) => {
|
|
6
|
+
switch (action.type) {
|
|
7
|
+
case 'SELECT_TAB':
|
|
8
|
+
return {
|
|
9
|
+
...state,
|
|
10
|
+
value: action.value,
|
|
11
|
+
selectedElement: action.selectedElement,
|
|
12
|
+
};
|
|
13
|
+
default:
|
|
14
|
+
return state;
|
|
15
|
+
}
|
|
7
16
|
};
|
|
8
17
|
|
|
9
18
|
export { TabsContext, tabsReducer };
|
|
@@ -4,20 +4,22 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var clsx = require('../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.cjs');
|
|
7
|
+
var TabsIndicator = require('./TabsIndicator.cjs');
|
|
7
8
|
var TabsProvider = require('./TabsProvider.cjs');
|
|
8
9
|
var TabsTrigger_css = require('./TabsTrigger.css.vanilla.cjs');
|
|
9
10
|
var sx = require('../../styles/sx.cjs');
|
|
10
11
|
|
|
11
|
-
const TabsTrigger = react.forwardRef(({ children, value, className, sx: propSx, ...props }, ref) => {
|
|
12
|
+
const TabsTrigger = react.forwardRef(({ children, value, className, sx: propSx, onClick, ...props }, ref) => {
|
|
12
13
|
const tabsContext = react.useContext(TabsProvider.TabsContext);
|
|
13
14
|
if (tabsContext === undefined) {
|
|
14
15
|
throw new Error('TabsTrigger must be used within a Tabs.');
|
|
15
16
|
}
|
|
16
17
|
const isSelected = tabsContext.value === value;
|
|
17
|
-
const handleClick = () => {
|
|
18
|
-
tabsContext.
|
|
18
|
+
const handleClick = (event) => {
|
|
19
|
+
tabsContext.selectTab(value, event.currentTarget);
|
|
20
|
+
onClick?.(event);
|
|
19
21
|
};
|
|
20
|
-
return (jsxRuntime.
|
|
22
|
+
return (jsxRuntime.jsxs("button", { ref: ref, className: clsx.clsx(className, TabsTrigger_css.container({ isSelected }), sx.sx(propSx)), ...props, onClick: handleClick, children: [children, isSelected && jsxRuntime.jsx(TabsIndicator.TabsIndicator, {})] }));
|
|
21
23
|
});
|
|
22
24
|
TabsTrigger.displayName = 'TabsTrigger';
|
|
23
25
|
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
export declare const container: import("@vanilla-extract/recipes").RuntimeFn<{
|
|
2
2
|
isSelected: {
|
|
3
3
|
true: {
|
|
4
|
-
borderBottomColor: `rgb(var(--${string}))`;
|
|
5
4
|
color: `rgb(var(--${string}))`;
|
|
6
5
|
};
|
|
7
6
|
false: {
|
|
8
|
-
borderBottomColor: "transparent";
|
|
9
7
|
color: `rgb(var(--${string}))`;
|
|
10
8
|
};
|
|
11
9
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsTrigger.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsTrigger.css.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"TabsTrigger.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsTrigger.css.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS;;;;;;;;;EA8BpB,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
@layer components;
|
|
2
2
|
@layer components {
|
|
3
3
|
.TabsTrigger_layeredBase__rk5ejr0 {
|
|
4
|
+
position: relative;
|
|
4
5
|
overflow: hidden;
|
|
5
6
|
height: 100%;
|
|
6
7
|
padding: 0 0.75em;
|
|
7
8
|
border: 0;
|
|
8
|
-
border-bottom: 0.125rem solid;
|
|
9
9
|
background-color: transparent;
|
|
10
10
|
font-size: 1em;
|
|
11
11
|
text-overflow: ellipsis;
|
|
@@ -14,11 +14,9 @@
|
|
|
14
14
|
cursor: pointer;
|
|
15
15
|
}
|
|
16
16
|
.TabsTrigger_styleWithLayer__rk5ejr1 {
|
|
17
|
-
border-bottom-color: rgb(var(--color-foreground__n6e2fs2));
|
|
18
17
|
color: rgb(var(--color-foreground__n6e2fs2));
|
|
19
18
|
}
|
|
20
19
|
.TabsTrigger_styleWithLayer__rk5ejr2 {
|
|
21
|
-
border-bottom-color: transparent;
|
|
22
20
|
color: rgb(var(--color-muted-foreground__n6e2fsc));
|
|
23
21
|
}
|
|
24
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsTrigger.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsTrigger.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"TabsTrigger.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsTrigger.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAM1C,UAAU,gBAAiB,SAAQ,WAAW,CAAC,QAAQ,CAAC;IACtD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,6HA2BvB,CAAC"}
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { forwardRef, useContext } from 'react';
|
|
4
4
|
import { clsx } from '../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js';
|
|
5
|
+
import { TabsIndicator } from './TabsIndicator.js';
|
|
5
6
|
import { TabsContext } from './TabsProvider.js';
|
|
6
7
|
import { container } from './TabsTrigger.css.vanilla.js';
|
|
7
8
|
import { sx } from '../../styles/sx.js';
|
|
8
9
|
|
|
9
|
-
const TabsTrigger = forwardRef(({ children, value, className, sx: propSx, ...props }, ref) => {
|
|
10
|
+
const TabsTrigger = forwardRef(({ children, value, className, sx: propSx, onClick, ...props }, ref) => {
|
|
10
11
|
const tabsContext = useContext(TabsContext);
|
|
11
12
|
if (tabsContext === undefined) {
|
|
12
13
|
throw new Error('TabsTrigger must be used within a Tabs.');
|
|
13
14
|
}
|
|
14
15
|
const isSelected = tabsContext.value === value;
|
|
15
|
-
const handleClick = () => {
|
|
16
|
-
tabsContext.
|
|
16
|
+
const handleClick = (event) => {
|
|
17
|
+
tabsContext.selectTab(value, event.currentTarget);
|
|
18
|
+
onClick?.(event);
|
|
17
19
|
};
|
|
18
|
-
return (
|
|
20
|
+
return (jsxs("button", { ref: ref, className: clsx(className, container({ isSelected }), sx(propSx)), ...props, onClick: handleClick, children: [children, isSelected && jsx(TabsIndicator, {})] }));
|
|
19
21
|
});
|
|
20
22
|
TabsTrigger.displayName = 'TabsTrigger';
|
|
21
23
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kimdw-rtk/ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"imports": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"react": "^18.0.0 || ^19.0.0",
|
|
41
41
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
42
|
-
"@kimdw-rtk/
|
|
43
|
-
"@kimdw-rtk/
|
|
42
|
+
"@kimdw-rtk/utils": "0.1.6",
|
|
43
|
+
"@kimdw-rtk/animation": "^0.1.5"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@babel/preset-env": "^7.26.9",
|