@kimdw-rtk/ui 0.1.17 → 0.1.18

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.
Files changed (37) hide show
  1. package/dist/components/Tabs/Tabs.cjs +14 -3
  2. package/dist/components/Tabs/Tabs.css.d.ts +14 -0
  3. package/dist/components/Tabs/Tabs.css.d.ts.map +1 -0
  4. package/dist/components/Tabs/Tabs.css.ts.vanilla.css +15 -0
  5. package/dist/components/Tabs/Tabs.css.vanilla.cjs +11 -0
  6. package/dist/components/Tabs/Tabs.css.vanilla.js +9 -0
  7. package/dist/components/Tabs/Tabs.d.ts +2 -1
  8. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  9. package/dist/components/Tabs/Tabs.js +14 -3
  10. package/dist/components/Tabs/TabsIndicator.cjs +13 -0
  11. package/dist/components/Tabs/TabsIndicator.css.d.ts +2 -0
  12. package/dist/components/Tabs/TabsIndicator.css.d.ts.map +1 -0
  13. package/dist/components/Tabs/TabsIndicator.css.ts.vanilla.css +15 -0
  14. package/dist/components/Tabs/TabsIndicator.css.vanilla.cjs +11 -0
  15. package/dist/components/Tabs/TabsIndicator.css.vanilla.js +9 -0
  16. package/dist/components/Tabs/TabsIndicator.d.ts +4 -0
  17. package/dist/components/Tabs/TabsIndicator.d.ts.map +1 -0
  18. package/dist/components/Tabs/TabsIndicator.js +11 -0
  19. package/dist/components/Tabs/TabsList.cjs +34 -1
  20. package/dist/components/Tabs/TabsList.css.d.ts +1 -0
  21. package/dist/components/Tabs/TabsList.css.d.ts.map +1 -1
  22. package/dist/components/Tabs/TabsList.css.ts.vanilla.css +3 -2
  23. package/dist/components/Tabs/TabsList.css.vanilla.cjs +3 -1
  24. package/dist/components/Tabs/TabsList.css.vanilla.js +3 -2
  25. package/dist/components/Tabs/TabsList.d.ts.map +1 -1
  26. package/dist/components/Tabs/TabsList.js +37 -4
  27. package/dist/components/Tabs/TabsProvider.cjs +11 -2
  28. package/dist/components/Tabs/TabsProvider.d.ts +11 -4
  29. package/dist/components/Tabs/TabsProvider.d.ts.map +1 -1
  30. package/dist/components/Tabs/TabsProvider.js +11 -2
  31. package/dist/components/Tabs/TabsTrigger.cjs +6 -4
  32. package/dist/components/Tabs/TabsTrigger.css.d.ts +0 -2
  33. package/dist/components/Tabs/TabsTrigger.css.d.ts.map +1 -1
  34. package/dist/components/Tabs/TabsTrigger.css.ts.vanilla.css +1 -3
  35. package/dist/components/Tabs/TabsTrigger.d.ts.map +1 -1
  36. package/dist/components/Tabs/TabsTrigger.js +7 -5
  37. package/package.json +1 -1
@@ -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 [value, setValue] = react.useReducer(TabsProvider.tabsReducer, defaultValue);
12
- return (jsxRuntime.jsx(TabsProvider.TabsContext.Provider, { value: { value, setValue }, children: jsxRuntime.jsx("div", { ref: ref, className: clsx.clsx(className, sx.sx(propSx)), style: { width: '100%' }, ...props, children: children }) }));
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,14 @@
1
+ export declare const tabs: import("@vanilla-extract/recipes").RuntimeFn<{
2
+ size: {
3
+ sm: {
4
+ fontSize: "0.875rem";
5
+ };
6
+ md: {
7
+ fontSize: "1rem";
8
+ };
9
+ lg: {
10
+ fontSize: "1.125rem";
11
+ };
12
+ };
13
+ }>;
14
+ //# sourceMappingURL=Tabs.css.d.ts.map
@@ -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
- interface TabsProps extends UIComponent<'div'> {
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;AAI1C,UAAU,SAAU,SAAQ,WAAW,CAAC,KAAK,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,IAAI,mHAiBhB,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 [value, setValue] = useReducer(tabsReducer, defaultValue);
10
- return (jsx(TabsContext.Provider, { value: { value, setValue }, children: jsx("div", { ref: ref, className: clsx(className, sx(propSx)), style: { width: '100%' }, ...props, children: children }) }));
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,2 @@
1
+ export declare const indicator: string;
2
+ //# sourceMappingURL=TabsIndicator.css.d.ts.map
@@ -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 };
@@ -2,12 +2,45 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
+ var utils = require('@kimdw-rtk/utils');
5
6
  var clsx = require('../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.cjs');
7
+ var TabsIndicator = require('./TabsIndicator.cjs');
6
8
  var TabsList_css = require('./TabsList.css.vanilla.cjs');
9
+ var TabsProvider = require('./TabsProvider.cjs');
7
10
  var sx = require('../../styles/sx.cjs');
8
11
 
12
+ const baseWidth = 100;
9
13
  const TabsList = react.forwardRef(({ children, className, sx: propSx, ...props }, ref) => {
10
- return (jsxRuntime.jsx("div", { ref: ref, className: clsx.clsx(className, TabsList_css.container, sx.sx(propSx)), ...props, children: children }));
14
+ const tabsContext = react.useContext(TabsProvider.TabsContext);
15
+ const indicatorRef = react.useRef(null);
16
+ const tabsListRef = utils.useCombinedRefs(ref);
17
+ if (tabsContext === undefined) {
18
+ throw new Error('TabsList must be used within a Tabs.');
19
+ }
20
+ react.useLayoutEffect(() => {
21
+ const element = tabsContext.selectedElement, indicator = indicatorRef.current, tabsList = tabsListRef.current;
22
+ if (!element || !indicator || !tabsList) {
23
+ return;
24
+ }
25
+ const animatedIndicator = () => {
26
+ const left = element.offsetLeft, width = element.offsetWidth;
27
+ indicator.style.transformOrigin = '0';
28
+ indicator.style.transform = `translateX(${left}px) scaleX(${width / baseWidth})`;
29
+ };
30
+ indicator.style.display = 'block';
31
+ animatedIndicator();
32
+ const handleTransitionEnd = () => {
33
+ indicator.style.display = 'none';
34
+ tabsList.classList.remove(TabsList_css.isAnimated);
35
+ };
36
+ tabsList.classList.add(TabsList_css.isAnimated);
37
+ indicator.addEventListener('transitionend', handleTransitionEnd);
38
+ return () => {
39
+ animatedIndicator();
40
+ indicator.removeEventListener('transitionend', handleTransitionEnd);
41
+ };
42
+ }, [tabsContext.selectedElement, tabsListRef]);
43
+ 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
44
  });
12
45
  TabsList.displayName = 'TabsList';
13
46
 
@@ -1,2 +1,3 @@
1
+ export declare const isAnimated: string;
1
2
  export declare const container: string;
2
3
  //# sourceMappingURL=TabsList.css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabsList.css.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsList.css.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,QAOpB,CAAC"}
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
- .TabsList_styleWithLayer__9gciwt0 {
3
+ .TabsList_styleWithLayer__9gciwt1 {
4
4
  display: flex;
5
+ position: relative;
5
6
  height: 2.5em;
6
- box-shadow: inset 0 -0.125em 0 rgb(var(--color-muted__n6e2fsb));
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 = 'TabsList_styleWithLayer__9gciwt0';
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 = 'TabsList_styleWithLayer__9gciwt0';
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":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI1C,KAAK,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;AAExC,eAAO,MAAM,QAAQ,uHAYpB,CAAC"}
1
+ {"version":3,"file":"TabsList.d.ts","sourceRoot":"","sources":["../../../src/components/Tabs/TabsList.tsx"],"names":[],"mappings":"AAMA,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,44 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, useContext, useRef, useLayoutEffect } from 'react';
3
+ import { useCombinedRefs } from '@kimdw-rtk/utils';
3
4
  import { clsx } from '../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js';
4
- import { container } from './TabsList.css.vanilla.js';
5
+ import { TabsIndicator } from './TabsIndicator.js';
6
+ import { isAnimated, container } from './TabsList.css.vanilla.js';
7
+ import { TabsContext } from './TabsProvider.js';
5
8
  import { sx } from '../../styles/sx.js';
6
9
 
10
+ const baseWidth = 100;
7
11
  const TabsList = forwardRef(({ children, className, sx: propSx, ...props }, ref) => {
8
- return (jsx("div", { ref: ref, className: clsx(className, container, sx(propSx)), ...props, children: children }));
12
+ const tabsContext = useContext(TabsContext);
13
+ const indicatorRef = useRef(null);
14
+ const tabsListRef = useCombinedRefs(ref);
15
+ if (tabsContext === undefined) {
16
+ throw new Error('TabsList must be used within a Tabs.');
17
+ }
18
+ useLayoutEffect(() => {
19
+ const element = tabsContext.selectedElement, indicator = indicatorRef.current, tabsList = tabsListRef.current;
20
+ if (!element || !indicator || !tabsList) {
21
+ return;
22
+ }
23
+ const animatedIndicator = () => {
24
+ const left = element.offsetLeft, width = element.offsetWidth;
25
+ indicator.style.transformOrigin = '0';
26
+ indicator.style.transform = `translateX(${left}px) scaleX(${width / baseWidth})`;
27
+ };
28
+ indicator.style.display = 'block';
29
+ animatedIndicator();
30
+ const handleTransitionEnd = () => {
31
+ indicator.style.display = 'none';
32
+ tabsList.classList.remove(isAnimated);
33
+ };
34
+ tabsList.classList.add(isAnimated);
35
+ indicator.addEventListener('transitionend', handleTransitionEnd);
36
+ return () => {
37
+ animatedIndicator();
38
+ indicator.removeEventListener('transitionend', handleTransitionEnd);
39
+ };
40
+ }, [tabsContext.selectedElement, tabsListRef]);
41
+ 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
42
  });
10
43
  TabsList.displayName = 'TabsList';
11
44
 
@@ -4,8 +4,17 @@
4
4
  var react = require('react');
5
5
 
6
6
  const TabsContext = react.createContext(undefined);
7
- const tabsReducer = (_, value) => {
8
- return value;
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
- import { type Dispatch } from 'react';
2
- interface TabsContext {
1
+ export interface TabsState {
3
2
  value: number | string | undefined;
4
- setValue: Dispatch<number | string>;
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: (_: TabsContext["value"], value: TabsContext["value"]) => string | number | undefined;
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":"AAEA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,WAAW,kDAAoD,CAAC;AAE7E,eAAO,MAAM,WAAW,GACtB,GAAG,WAAW,CAAC,OAAO,CAAC,EACvB,OAAO,WAAW,CAAC,OAAO,CAAC,gCAG5B,CAAC"}
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 = (_, value) => {
6
- return value;
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.setValue(value);
18
+ const handleClick = (event) => {
19
+ tabsContext.selectTab(value, event.currentTarget);
20
+ onClick?.(event);
19
21
  };
20
- return (jsxRuntime.jsx("button", { ref: ref, className: clsx.clsx(className, TabsTrigger_css.container({ isSelected }), sx.sx(propSx)), onClick: handleClick, ...props, children: children }));
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;;;;;;;;;;;EAkCpB,CAAC"}
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;AAK1C,UAAU,gBAAiB,SAAQ,WAAW,CAAC,QAAQ,CAAC;IACtD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,6HAyBvB,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.setValue(value);
16
+ const handleClick = (event) => {
17
+ tabsContext.selectTab(value, event.currentTarget);
18
+ onClick?.(event);
17
19
  };
18
- return (jsx("button", { ref: ref, className: clsx(className, container({ isSelected }), sx(propSx)), onClick: handleClick, ...props, children: children }));
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.17",
3
+ "version": "0.1.18",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "imports": {