@infomaximum/ui-kit 0.10.1 → 0.11.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.
Files changed (46) hide show
  1. package/dist/components/Avatar/index.d.ts +1 -1
  2. package/dist/components/Dropdown/Dropdown.js +1 -0
  3. package/dist/components/Dropdown/Dropdown.types.d.ts +0 -1
  4. package/dist/components/Dropdown/Dropdown.utils.d.ts +1 -1
  5. package/dist/components/Dropdown/Dropdown.utils.js +1 -2
  6. package/dist/components/Dropdown/components/Group/Group.js +5 -7
  7. package/dist/components/Dropdown/components/Menu/Menu.js +4 -6
  8. package/dist/components/Dropdown/hooks/useSelectedKeysController.d.ts +2 -1
  9. package/dist/components/Dropdown/hooks/useSelectedKeysController.js +2 -1
  10. package/dist/components/Popconfirm/components/PopconfirmFloatingElement/PopconfirmFloatingElement.styles.d.ts +1 -1
  11. package/dist/components/Popconfirm/components/PopconfirmFloatingElement/PopconfirmFloatingElement.styles.js +1 -1
  12. package/dist/components/Tabs/Tabs.d.ts +3 -0
  13. package/dist/components/Tabs/Tabs.js +60 -0
  14. package/dist/components/Tabs/Tabs.styles.d.ts +6 -0
  15. package/dist/components/Tabs/Tabs.styles.js +9 -0
  16. package/dist/components/Tabs/Tabs.tokens.d.ts +14 -0
  17. package/dist/components/Tabs/Tabs.tokens.js +15 -0
  18. package/dist/components/Tabs/Tabs.types.d.ts +28 -0
  19. package/dist/components/Tabs/components/TabBar/TabBar.d.ts +3 -0
  20. package/dist/components/Tabs/components/TabBar/TabBar.js +88 -0
  21. package/dist/components/Tabs/components/TabBar/TabBar.styles.d.ts +46 -0
  22. package/dist/components/Tabs/components/TabBar/TabBar.styles.js +70 -0
  23. package/dist/components/Tabs/components/TabBar/TabBar.types.d.ts +14 -0
  24. package/dist/components/Tabs/components/TabItem/TabItem.d.ts +3 -0
  25. package/dist/components/Tabs/components/TabItem/TabItem.js +94 -0
  26. package/dist/components/Tabs/components/TabItem/TabItem.styles.d.ts +38 -0
  27. package/dist/components/Tabs/components/TabItem/TabItem.styles.js +67 -0
  28. package/dist/components/Tabs/components/TabItem/TabItem.types.d.ts +32 -0
  29. package/dist/components/Tabs/forStories/items.d.ts +50 -0
  30. package/dist/components/Tabs/hooks/useMoreTabsController.d.ts +17 -0
  31. package/dist/components/Tabs/hooks/useMoreTabsController.js +68 -0
  32. package/dist/components/Tabs/hooks/useTabsDndController.d.ts +10 -0
  33. package/dist/components/Tabs/hooks/useTabsDndController.js +36 -0
  34. package/dist/components/Tabs/index.d.ts +2 -0
  35. package/dist/index.d.ts +3 -1
  36. package/dist/index.js +2 -0
  37. package/package.json +10 -3
  38. package/dist/docComponents/Demonstration/Demonstration.d.ts +0 -4
  39. package/dist/docComponents/Demonstration/Demonstration.styles.d.ts +0 -9
  40. package/dist/docComponents/Demonstration/Demonstration.types.d.ts +0 -5
  41. package/dist/docComponents/Description/Description.d.ts +0 -5
  42. package/dist/docComponents/Description/Description.style.d.ts +0 -26
  43. package/dist/docComponents/Doc/Doc.d.ts +0 -4
  44. package/dist/docComponents/Doc/Doc.style.d.ts +0 -13
  45. package/dist/docComponents/Example/Example.d.ts +0 -4
  46. package/dist/docComponents/Example/Example.styles.d.ts +0 -9
@@ -0,0 +1,70 @@
1
+ import { getTabsTokens } from "../../Tabs.tokens.js";
2
+ const getTabsGap = (tabsTokens, iconOnly, isMiddleSize) => {
3
+ if (iconOnly) {
4
+ return 0;
5
+ }
6
+ if (isMiddleSize) {
7
+ return tabsTokens.tabsGapM;
8
+ }
9
+ return tabsTokens.tabsGapS;
10
+ };
11
+ const getTabBarStyle = (size, border, iconOnly, isDragging) => {
12
+ const isMiddleSize = size === "middle";
13
+ return {
14
+ wrapper: (theme) => {
15
+ const tabsTokens = getTabsTokens(theme);
16
+ return {
17
+ position: "relative",
18
+ display: "flex",
19
+ gap: isMiddleSize ? tabsTokens.tabsGapM : tabsTokens.tabsGapS,
20
+ flex: "1 1 auto",
21
+ alignItems: "center",
22
+ "::before": {
23
+ content: border ? "''" : "unset",
24
+ position: "absolute",
25
+ width: "100%",
26
+ borderBottom: `1px solid ${tabsTokens.tabsBorder}`,
27
+ bottom: 0,
28
+ zIndex: 0
29
+ }
30
+ };
31
+ },
32
+ content: () => ({
33
+ display: "flex",
34
+ flex: "1 1 auto",
35
+ overflowX: "hidden"
36
+ }),
37
+ tabs: (theme) => {
38
+ const tabsTokens = getTabsTokens(theme);
39
+ return {
40
+ display: "flex",
41
+ gap: getTabsGap(tabsTokens, iconOnly, isMiddleSize),
42
+ flex: "1 1 auto",
43
+ zIndex: 1,
44
+ overflowY: "hidden",
45
+ overflowX: isDragging ? "hidden" : "scroll",
46
+ "::-webkit-scrollbar": {
47
+ display: "none"
48
+ }
49
+ };
50
+ },
51
+ more: (theme) => {
52
+ const tabsTokens = getTabsTokens(theme);
53
+ const moreItemSize = isMiddleSize ? tabsTokens.tabsSizeM : tabsTokens.tabsSizeM;
54
+ return {
55
+ height: moreItemSize,
56
+ width: moreItemSize,
57
+ display: "flex",
58
+ alignItems: "center",
59
+ justifyContent: "center",
60
+ flex: "0 0 auto",
61
+ svg: {
62
+ cursor: "pointer"
63
+ }
64
+ };
65
+ }
66
+ };
67
+ };
68
+ export {
69
+ getTabBarStyle
70
+ };
@@ -0,0 +1,14 @@
1
+ import { Interpolation } from '@emotion/react';
2
+ import { TabsProps } from 'components/Tabs/Tabs.types';
3
+ import { Theme } from 'themes';
4
+ import { TabItemProps } from '../TabItem/TabItem.types';
5
+ export interface TabBarProps extends Omit<TabsProps, "activeKey" | "defaultActiveKey" | "styles" | "renderTabBar"> {
6
+ currentActiveKey: string | undefined;
7
+ contentWrapper: HTMLDivElement | null;
8
+ styles?: {
9
+ wrapper?: (theme: Theme) => Interpolation;
10
+ tabs?: (theme: Theme) => Interpolation;
11
+ tabItem?: TabItemProps["styles"];
12
+ };
13
+ changeActiveKey: (key: string) => void;
14
+ }
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+ import { TabItemProps } from './TabItem.types';
3
+ export declare const TabItem: FC<TabItemProps>;
@@ -0,0 +1,94 @@
1
+ import { jsxs, jsx } from "@emotion/react/jsx-runtime";
2
+ import { memo, useRef, useEffect, useCallback } from "react";
3
+ import { isUndefined } from "lodash-es";
4
+ import { getTabItemStyle } from "./TabItem.styles.js";
5
+ import { createPortal } from "react-dom";
6
+ import { useInView } from "react-intersection-observer";
7
+ import { CSS } from "@dnd-kit/utilities";
8
+ import { useSortable } from "@dnd-kit/sortable";
9
+ import { useTheme } from "../../../../hooks/useTheme/useTheme.js";
10
+ const TabItem = memo(({
11
+ icon,
12
+ label,
13
+ iconOnly,
14
+ disabled = false,
15
+ size = "middle",
16
+ itemKey,
17
+ selected,
18
+ forceRender,
19
+ contentWrapper,
20
+ children,
21
+ styles,
22
+ changeActiveKey,
23
+ addHiddenTab,
24
+ deleteHiddenTab,
25
+ setCurrentTabElement,
26
+ scrollToTab,
27
+ onChange,
28
+ onTabClick
29
+ }) => {
30
+ var _a, _b, _c, _d;
31
+ const theme = useTheme();
32
+ const itemRef = useRef(null);
33
+ const {
34
+ ref,
35
+ inView
36
+ } = useInView({
37
+ threshold: 0.95
38
+ });
39
+ const {
40
+ isDragging,
41
+ attributes,
42
+ listeners,
43
+ setNodeRef,
44
+ transform,
45
+ transition
46
+ } = useSortable({
47
+ id: itemKey
48
+ });
49
+ const style = {
50
+ transform: CSS.Translate.toString(transform),
51
+ transition
52
+ };
53
+ useEffect(() => {
54
+ if (inView) {
55
+ deleteHiddenTab(itemKey);
56
+ } else {
57
+ addHiddenTab(itemKey);
58
+ }
59
+ }, [addHiddenTab, deleteHiddenTab, inView, itemKey]);
60
+ useEffect(() => {
61
+ if (!selected || isUndefined(itemRef.current)) {
62
+ return;
63
+ }
64
+ setCurrentTabElement(itemRef.current);
65
+ if (inView) {
66
+ return;
67
+ }
68
+ scrollToTab(itemRef.current);
69
+ }, [selected]);
70
+ const handleClick = useCallback((e) => {
71
+ onTabClick == null ? void 0 : onTabClick(itemKey, e);
72
+ if (disabled || selected) {
73
+ return;
74
+ }
75
+ onChange == null ? void 0 : onChange(itemKey);
76
+ changeActiveKey(itemKey);
77
+ }, [changeActiveKey, disabled, itemKey, onChange, onTabClick, selected]);
78
+ const consolidatedRef = (node) => {
79
+ ref(node);
80
+ itemRef.current = node;
81
+ setNodeRef(node);
82
+ };
83
+ const withIconOnly = iconOnly || isUndefined(label);
84
+ const withContent = (selected || forceRender) && contentWrapper && children;
85
+ const tabItemStyle = getTabItemStyle(withIconOnly, disabled, selected, size, isDragging);
86
+ return /* @__PURE__ */ jsxs("div", { ref: consolidatedRef, style, ...listeners, ...attributes, css: [tabItemStyle.wrapper(theme), (_a = styles == null ? void 0 : styles.wrapper) == null ? void 0 : _a.call(styles, theme), process.env.NODE_ENV === "production" ? "" : ";label:TabItem;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvZnJvbnRlbmQvbGlicy91aS1raXQvc3JjL2NvbXBvbmVudHMvVGFicy9jb21wb25lbnRzL1RhYkl0ZW0vVGFiSXRlbS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0dRIiwiZmlsZSI6Ii9idWlsZHMvZnJvbnRlbmQvbGlicy91aS1raXQvc3JjL2NvbXBvbmVudHMvVGFicy9jb21wb25lbnRzL1RhYkl0ZW0vVGFiSXRlbS50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtZW1vLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYsIHR5cGUgRkMsIHR5cGUgTW91c2VFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBUYWJJdGVtUHJvcHMgfSBmcm9tIFwiLi9UYWJJdGVtLnR5cGVzXCI7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IGdldFRhYkl0ZW1TdHlsZSB9IGZyb20gXCIuL1RhYkl0ZW0uc3R5bGVzXCI7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gXCJob29rcy91c2VUaGVtZVwiO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgdXNlSW5WaWV3IH0gZnJvbSBcInJlYWN0LWludGVyc2VjdGlvbi1vYnNlcnZlclwiO1xuaW1wb3J0IHsgQ1NTIH0gZnJvbSBcIkBkbmQta2l0L3V0aWxpdGllc1wiO1xuaW1wb3J0IHsgdXNlU29ydGFibGUgfSBmcm9tIFwiQGRuZC1raXQvc29ydGFibGVcIjtcblxuZXhwb3J0IGNvbnN0IFRhYkl0ZW06IEZDPFRhYkl0ZW1Qcm9wcz4gPSBtZW1vKFxuICAoe1xuICAgIGljb24sXG4gICAgbGFiZWwsXG4gICAgaWNvbk9ubHksXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBzaXplID0gXCJtaWRkbGVcIixcbiAgICBpdGVtS2V5LFxuICAgIHNlbGVjdGVkLFxuICAgIGZvcmNlUmVuZGVyLFxuICAgIGNvbnRlbnRXcmFwcGVyLFxuICAgIGNoaWxkcmVuLFxuICAgIHN0eWxlcyxcbiAgICBjaGFuZ2VBY3RpdmVLZXksXG4gICAgYWRkSGlkZGVuVGFiLFxuICAgIGRlbGV0ZUhpZGRlblRhYixcbiAgICBzZXRDdXJyZW50VGFiRWxlbWVudCxcbiAgICBzY3JvbGxUb1RhYixcbiAgICBvbkNoYW5nZSxcbiAgICBvblRhYkNsaWNrLFxuICB9KSA9PiB7XG4gICAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICAgIGNvbnN0IGl0ZW1SZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICAgIGNvbnN0IHsgcmVmLCBpblZpZXcgfSA9IHVzZUluVmlldyh7IHRocmVzaG9sZDogMC45NSB9KTtcblxuICAgIGNvbnN0IHsgaXNEcmFnZ2luZywgYXR0cmlidXRlcywgbGlzdGVuZXJzLCBzZXROb2RlUmVmLCB0cmFuc2Zvcm0sIHRyYW5zaXRpb24gfSA9IHVzZVNvcnRhYmxlKHtcbiAgICAgIGlkOiBpdGVtS2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICB0cmFuc2Zvcm06IENTUy5UcmFuc2xhdGUudG9TdHJpbmcodHJhbnNmb3JtKSxcbiAgICAgIHRyYW5zaXRpb24sXG4gICAgfTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoaW5WaWV3KSB7XG4gICAgICAgIGRlbGV0ZUhpZGRlblRhYihpdGVtS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZEhpZGRlblRhYihpdGVtS2V5KTtcbiAgICAgIH1cbiAgICB9LCBbYWRkSGlkZGVuVGFiLCBkZWxldGVIaWRkZW5UYWIsIGluVmlldywgaXRlbUtleV0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghc2VsZWN0ZWQgfHwgaXNVbmRlZmluZWQoaXRlbVJlZi5jdXJyZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldEN1cnJlbnRUYWJFbGVtZW50KGl0ZW1SZWYuY3VycmVudCk7XG5cbiAgICAgIGlmIChpblZpZXcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxUb1RhYihpdGVtUmVmLmN1cnJlbnQpO1xuICAgIH0sIFtzZWxlY3RlZF0pO1xuXG4gICAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAgIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIG9uVGFiQ2xpY2s/LihpdGVtS2V5LCBlKTtcblxuICAgICAgICBpZiAoZGlzYWJsZWQgfHwgc2VsZWN0ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvbkNoYW5nZT8uKGl0ZW1LZXkpO1xuICAgICAgICBjaGFuZ2VBY3RpdmVLZXkoaXRlbUtleSk7XG4gICAgICB9LFxuICAgICAgW2NoYW5nZUFjdGl2ZUtleSwgZGlzYWJsZWQsIGl0ZW1LZXksIG9uQ2hhbmdlLCBvblRhYkNsaWNrLCBzZWxlY3RlZF1cbiAgICApO1xuXG4gICAgY29uc3QgY29uc29saWRhdGVkUmVmID0gKG5vZGU6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgcmVmKG5vZGUpO1xuICAgICAgaXRlbVJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIHNldE5vZGVSZWYobm9kZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdpdGhJY29uT25seSA9IGljb25Pbmx5IHx8IGlzVW5kZWZpbmVkKGxhYmVsKTtcbiAgICBjb25zdCB3aXRoQ29udGVudCA9IChzZWxlY3RlZCB8fCBmb3JjZVJlbmRlcikgJiYgY29udGVudFdyYXBwZXIgJiYgY2hpbGRyZW47XG5cbiAgICBjb25zdCB0YWJJdGVtU3R5bGUgPSBnZXRUYWJJdGVtU3R5bGUod2l0aEljb25Pbmx5LCBkaXNhYmxlZCwgc2VsZWN0ZWQsIHNpemUsIGlzRHJhZ2dpbmcpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXtjb25zb2xpZGF0ZWRSZWZ9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgey4uLmxpc3RlbmVyc31cbiAgICAgICAgey4uLmF0dHJpYnV0ZXN9XG4gICAgICAgIGNzcz17W3RhYkl0ZW1TdHlsZS53cmFwcGVyKHRoZW1lKSwgc3R5bGVzPy53cmFwcGVyPy4odGhlbWUpXX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICA+XG4gICAgICAgIHtpY29uICYmIChcbiAgICAgICAgICA8c3BhbiBjc3M9e1t0YWJJdGVtU3R5bGUuaWNvbldyYXBwZXIodGhlbWUpLCBzdHlsZXM/Lmljb25XcmFwcGVyPy4odGhlbWUpXX0+e2ljb259PC9zcGFuPlxuICAgICAgICApfVxuICAgICAgICB7IWljb25Pbmx5ICYmIGxhYmVsICYmIChcbiAgICAgICAgICA8c3BhbiBjc3M9e1t0YWJJdGVtU3R5bGUubGFiZWxXcmFwcGVyKHRoZW1lKSwgc3R5bGVzPy5sYWJlbFdyYXBwZXI/Lih0aGVtZSldfT5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICl9XG4gICAgICAgIHt3aXRoQ29udGVudCAmJlxuICAgICAgICAgIGNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxkaXYgY3NzPXtbdGFiSXRlbVN0eWxlLmNoaWxkcmVuV3JhcHBlcigpLCBzdHlsZXM/LmNoaWxkcmVuV3JhcHBlcj8uKHRoZW1lKV19PlxuICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICBjb250ZW50V3JhcHBlclxuICAgICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4pO1xuIl19 */"], onClick: handleClick, children: [
87
+ icon && /* @__PURE__ */ jsx("span", { css: [tabItemStyle.iconWrapper(theme), (_b = styles == null ? void 0 : styles.iconWrapper) == null ? void 0 : _b.call(styles, theme), process.env.NODE_ENV === "production" ? "" : ";label:TabItem;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvZnJvbnRlbmQvbGlicy91aS1raXQvc3JjL2NvbXBvbmVudHMvVGFicy9jb21wb25lbnRzL1RhYkl0ZW0vVGFiSXRlbS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0dnQiIsImZpbGUiOiIvYnVpbGRzL2Zyb250ZW5kL2xpYnMvdWkta2l0L3NyYy9jb21wb25lbnRzL1RhYnMvY29tcG9uZW50cy9UYWJJdGVtL1RhYkl0ZW0udHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmLCB0eXBlIEZDLCB0eXBlIE1vdXNlRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgVGFiSXRlbVByb3BzIH0gZnJvbSBcIi4vVGFiSXRlbS50eXBlc1wiO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBnZXRUYWJJdGVtU3R5bGUgfSBmcm9tIFwiLi9UYWJJdGVtLnN0eWxlc1wiO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tIFwiaG9va3MvdXNlVGhlbWVcIjtcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IHVzZUluVmlldyB9IGZyb20gXCJyZWFjdC1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXJcIjtcbmltcG9ydCB7IENTUyB9IGZyb20gXCJAZG5kLWtpdC91dGlsaXRpZXNcIjtcbmltcG9ydCB7IHVzZVNvcnRhYmxlIH0gZnJvbSBcIkBkbmQta2l0L3NvcnRhYmxlXCI7XG5cbmV4cG9ydCBjb25zdCBUYWJJdGVtOiBGQzxUYWJJdGVtUHJvcHM+ID0gbWVtbyhcbiAgKHtcbiAgICBpY29uLFxuICAgIGxhYmVsLFxuICAgIGljb25Pbmx5LFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgc2l6ZSA9IFwibWlkZGxlXCIsXG4gICAgaXRlbUtleSxcbiAgICBzZWxlY3RlZCxcbiAgICBmb3JjZVJlbmRlcixcbiAgICBjb250ZW50V3JhcHBlcixcbiAgICBjaGlsZHJlbixcbiAgICBzdHlsZXMsXG4gICAgY2hhbmdlQWN0aXZlS2V5LFxuICAgIGFkZEhpZGRlblRhYixcbiAgICBkZWxldGVIaWRkZW5UYWIsXG4gICAgc2V0Q3VycmVudFRhYkVsZW1lbnQsXG4gICAgc2Nyb2xsVG9UYWIsXG4gICAgb25DaGFuZ2UsXG4gICAgb25UYWJDbGljayxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgICBjb25zdCBpdGVtUmVmID0gdXNlUmVmPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgICBjb25zdCB7IHJlZiwgaW5WaWV3IH0gPSB1c2VJblZpZXcoeyB0aHJlc2hvbGQ6IDAuOTUgfSk7XG5cbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIGF0dHJpYnV0ZXMsIGxpc3RlbmVycywgc2V0Tm9kZVJlZiwgdHJhbnNmb3JtLCB0cmFuc2l0aW9uIH0gPSB1c2VTb3J0YWJsZSh7XG4gICAgICBpZDogaXRlbUtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgdHJhbnNmb3JtOiBDU1MuVHJhbnNsYXRlLnRvU3RyaW5nKHRyYW5zZm9ybSksXG4gICAgICB0cmFuc2l0aW9uLFxuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGluVmlldykge1xuICAgICAgICBkZWxldGVIaWRkZW5UYWIoaXRlbUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRIaWRkZW5UYWIoaXRlbUtleSk7XG4gICAgICB9XG4gICAgfSwgW2FkZEhpZGRlblRhYiwgZGVsZXRlSGlkZGVuVGFiLCBpblZpZXcsIGl0ZW1LZXldKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkIHx8IGlzVW5kZWZpbmVkKGl0ZW1SZWYuY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRDdXJyZW50VGFiRWxlbWVudChpdGVtUmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaW5WaWV3KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsVG9UYWIoaXRlbVJlZi5jdXJyZW50KTtcbiAgICB9LCBbc2VsZWN0ZWRdKTtcblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBvblRhYkNsaWNrPy4oaXRlbUtleSwgZSk7XG5cbiAgICAgICAgaWYgKGRpc2FibGVkIHx8IHNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2U/LihpdGVtS2V5KTtcbiAgICAgICAgY2hhbmdlQWN0aXZlS2V5KGl0ZW1LZXkpO1xuICAgICAgfSxcbiAgICAgIFtjaGFuZ2VBY3RpdmVLZXksIGRpc2FibGVkLCBpdGVtS2V5LCBvbkNoYW5nZSwgb25UYWJDbGljaywgc2VsZWN0ZWRdXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnNvbGlkYXRlZFJlZiA9IChub2RlOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIHJlZihub2RlKTtcbiAgICAgIGl0ZW1SZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBzZXROb2RlUmVmKG5vZGUpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aXRoSWNvbk9ubHkgPSBpY29uT25seSB8fCBpc1VuZGVmaW5lZChsYWJlbCk7XG4gICAgY29uc3Qgd2l0aENvbnRlbnQgPSAoc2VsZWN0ZWQgfHwgZm9yY2VSZW5kZXIpICYmIGNvbnRlbnRXcmFwcGVyICYmIGNoaWxkcmVuO1xuXG4gICAgY29uc3QgdGFiSXRlbVN0eWxlID0gZ2V0VGFiSXRlbVN0eWxlKHdpdGhJY29uT25seSwgZGlzYWJsZWQsIHNlbGVjdGVkLCBzaXplLCBpc0RyYWdnaW5nKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17Y29uc29saWRhdGVkUmVmfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIHsuLi5saXN0ZW5lcnN9XG4gICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICBjc3M9e1t0YWJJdGVtU3R5bGUud3JhcHBlcih0aGVtZSksIHN0eWxlcz8ud3JhcHBlcj8uKHRoZW1lKV19XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgPlxuICAgICAgICB7aWNvbiAmJiAoXG4gICAgICAgICAgPHNwYW4gY3NzPXtbdGFiSXRlbVN0eWxlLmljb25XcmFwcGVyKHRoZW1lKSwgc3R5bGVzPy5pY29uV3JhcHBlcj8uKHRoZW1lKV19PntpY29ufTwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgICAgeyFpY29uT25seSAmJiBsYWJlbCAmJiAoXG4gICAgICAgICAgPHNwYW4gY3NzPXtbdGFiSXRlbVN0eWxlLmxhYmVsV3JhcHBlcih0aGVtZSksIHN0eWxlcz8ubGFiZWxXcmFwcGVyPy4odGhlbWUpXX0+XG4gICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgICB7d2l0aENvbnRlbnQgJiZcbiAgICAgICAgICBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2IGNzcz17W3RhYkl0ZW1TdHlsZS5jaGlsZHJlbldyYXBwZXIoKSwgc3R5bGVzPy5jaGlsZHJlbldyYXBwZXI/Lih0aGVtZSldfT5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgY29udGVudFdyYXBwZXJcbiAgICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuKTtcbiJdfQ== */"], children: icon }),
88
+ !iconOnly && label && /* @__PURE__ */ jsx("span", { css: [tabItemStyle.labelWrapper(theme), (_c = styles == null ? void 0 : styles.labelWrapper) == null ? void 0 : _c.call(styles, theme), process.env.NODE_ENV === "production" ? "" : ";label:TabItem;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvZnJvbnRlbmQvbGlicy91aS1raXQvc3JjL2NvbXBvbmVudHMvVGFicy9jb21wb25lbnRzL1RhYkl0ZW0vVGFiSXRlbS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUdnQiIsImZpbGUiOiIvYnVpbGRzL2Zyb250ZW5kL2xpYnMvdWkta2l0L3NyYy9jb21wb25lbnRzL1RhYnMvY29tcG9uZW50cy9UYWJJdGVtL1RhYkl0ZW0udHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmLCB0eXBlIEZDLCB0eXBlIE1vdXNlRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgVGFiSXRlbVByb3BzIH0gZnJvbSBcIi4vVGFiSXRlbS50eXBlc1wiO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBnZXRUYWJJdGVtU3R5bGUgfSBmcm9tIFwiLi9UYWJJdGVtLnN0eWxlc1wiO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tIFwiaG9va3MvdXNlVGhlbWVcIjtcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IHVzZUluVmlldyB9IGZyb20gXCJyZWFjdC1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXJcIjtcbmltcG9ydCB7IENTUyB9IGZyb20gXCJAZG5kLWtpdC91dGlsaXRpZXNcIjtcbmltcG9ydCB7IHVzZVNvcnRhYmxlIH0gZnJvbSBcIkBkbmQta2l0L3NvcnRhYmxlXCI7XG5cbmV4cG9ydCBjb25zdCBUYWJJdGVtOiBGQzxUYWJJdGVtUHJvcHM+ID0gbWVtbyhcbiAgKHtcbiAgICBpY29uLFxuICAgIGxhYmVsLFxuICAgIGljb25Pbmx5LFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgc2l6ZSA9IFwibWlkZGxlXCIsXG4gICAgaXRlbUtleSxcbiAgICBzZWxlY3RlZCxcbiAgICBmb3JjZVJlbmRlcixcbiAgICBjb250ZW50V3JhcHBlcixcbiAgICBjaGlsZHJlbixcbiAgICBzdHlsZXMsXG4gICAgY2hhbmdlQWN0aXZlS2V5LFxuICAgIGFkZEhpZGRlblRhYixcbiAgICBkZWxldGVIaWRkZW5UYWIsXG4gICAgc2V0Q3VycmVudFRhYkVsZW1lbnQsXG4gICAgc2Nyb2xsVG9UYWIsXG4gICAgb25DaGFuZ2UsXG4gICAgb25UYWJDbGljayxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgICBjb25zdCBpdGVtUmVmID0gdXNlUmVmPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgICBjb25zdCB7IHJlZiwgaW5WaWV3IH0gPSB1c2VJblZpZXcoeyB0aHJlc2hvbGQ6IDAuOTUgfSk7XG5cbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIGF0dHJpYnV0ZXMsIGxpc3RlbmVycywgc2V0Tm9kZVJlZiwgdHJhbnNmb3JtLCB0cmFuc2l0aW9uIH0gPSB1c2VTb3J0YWJsZSh7XG4gICAgICBpZDogaXRlbUtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgdHJhbnNmb3JtOiBDU1MuVHJhbnNsYXRlLnRvU3RyaW5nKHRyYW5zZm9ybSksXG4gICAgICB0cmFuc2l0aW9uLFxuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGluVmlldykge1xuICAgICAgICBkZWxldGVIaWRkZW5UYWIoaXRlbUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRIaWRkZW5UYWIoaXRlbUtleSk7XG4gICAgICB9XG4gICAgfSwgW2FkZEhpZGRlblRhYiwgZGVsZXRlSGlkZGVuVGFiLCBpblZpZXcsIGl0ZW1LZXldKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkIHx8IGlzVW5kZWZpbmVkKGl0ZW1SZWYuY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRDdXJyZW50VGFiRWxlbWVudChpdGVtUmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaW5WaWV3KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsVG9UYWIoaXRlbVJlZi5jdXJyZW50KTtcbiAgICB9LCBbc2VsZWN0ZWRdKTtcblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBvblRhYkNsaWNrPy4oaXRlbUtleSwgZSk7XG5cbiAgICAgICAgaWYgKGRpc2FibGVkIHx8IHNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2U/LihpdGVtS2V5KTtcbiAgICAgICAgY2hhbmdlQWN0aXZlS2V5KGl0ZW1LZXkpO1xuICAgICAgfSxcbiAgICAgIFtjaGFuZ2VBY3RpdmVLZXksIGRpc2FibGVkLCBpdGVtS2V5LCBvbkNoYW5nZSwgb25UYWJDbGljaywgc2VsZWN0ZWRdXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnNvbGlkYXRlZFJlZiA9IChub2RlOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIHJlZihub2RlKTtcbiAgICAgIGl0ZW1SZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBzZXROb2RlUmVmKG5vZGUpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aXRoSWNvbk9ubHkgPSBpY29uT25seSB8fCBpc1VuZGVmaW5lZChsYWJlbCk7XG4gICAgY29uc3Qgd2l0aENvbnRlbnQgPSAoc2VsZWN0ZWQgfHwgZm9yY2VSZW5kZXIpICYmIGNvbnRlbnRXcmFwcGVyICYmIGNoaWxkcmVuO1xuXG4gICAgY29uc3QgdGFiSXRlbVN0eWxlID0gZ2V0VGFiSXRlbVN0eWxlKHdpdGhJY29uT25seSwgZGlzYWJsZWQsIHNlbGVjdGVkLCBzaXplLCBpc0RyYWdnaW5nKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17Y29uc29saWRhdGVkUmVmfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIHsuLi5saXN0ZW5lcnN9XG4gICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICBjc3M9e1t0YWJJdGVtU3R5bGUud3JhcHBlcih0aGVtZSksIHN0eWxlcz8ud3JhcHBlcj8uKHRoZW1lKV19XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgPlxuICAgICAgICB7aWNvbiAmJiAoXG4gICAgICAgICAgPHNwYW4gY3NzPXtbdGFiSXRlbVN0eWxlLmljb25XcmFwcGVyKHRoZW1lKSwgc3R5bGVzPy5pY29uV3JhcHBlcj8uKHRoZW1lKV19PntpY29ufTwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgICAgeyFpY29uT25seSAmJiBsYWJlbCAmJiAoXG4gICAgICAgICAgPHNwYW4gY3NzPXtbdGFiSXRlbVN0eWxlLmxhYmVsV3JhcHBlcih0aGVtZSksIHN0eWxlcz8ubGFiZWxXcmFwcGVyPy4odGhlbWUpXX0+XG4gICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgICB7d2l0aENvbnRlbnQgJiZcbiAgICAgICAgICBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2IGNzcz17W3RhYkl0ZW1TdHlsZS5jaGlsZHJlbldyYXBwZXIoKSwgc3R5bGVzPy5jaGlsZHJlbldyYXBwZXI/Lih0aGVtZSldfT5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgY29udGVudFdyYXBwZXJcbiAgICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuKTtcbiJdfQ== */"], children: label }),
89
+ withContent && createPortal(/* @__PURE__ */ jsx("div", { css: [tabItemStyle.childrenWrapper(), (_d = styles == null ? void 0 : styles.childrenWrapper) == null ? void 0 : _d.call(styles, theme), process.env.NODE_ENV === "production" ? "" : ";label:TabItem;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvZnJvbnRlbmQvbGlicy91aS1raXQvc3JjL2NvbXBvbmVudHMvVGFicy9jb21wb25lbnRzL1RhYkl0ZW0vVGFiSXRlbS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0dpQiIsImZpbGUiOiIvYnVpbGRzL2Zyb250ZW5kL2xpYnMvdWkta2l0L3NyYy9jb21wb25lbnRzL1RhYnMvY29tcG9uZW50cy9UYWJJdGVtL1RhYkl0ZW0udHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmLCB0eXBlIEZDLCB0eXBlIE1vdXNlRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgVGFiSXRlbVByb3BzIH0gZnJvbSBcIi4vVGFiSXRlbS50eXBlc1wiO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBnZXRUYWJJdGVtU3R5bGUgfSBmcm9tIFwiLi9UYWJJdGVtLnN0eWxlc1wiO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tIFwiaG9va3MvdXNlVGhlbWVcIjtcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IHVzZUluVmlldyB9IGZyb20gXCJyZWFjdC1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXJcIjtcbmltcG9ydCB7IENTUyB9IGZyb20gXCJAZG5kLWtpdC91dGlsaXRpZXNcIjtcbmltcG9ydCB7IHVzZVNvcnRhYmxlIH0gZnJvbSBcIkBkbmQta2l0L3NvcnRhYmxlXCI7XG5cbmV4cG9ydCBjb25zdCBUYWJJdGVtOiBGQzxUYWJJdGVtUHJvcHM+ID0gbWVtbyhcbiAgKHtcbiAgICBpY29uLFxuICAgIGxhYmVsLFxuICAgIGljb25Pbmx5LFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgc2l6ZSA9IFwibWlkZGxlXCIsXG4gICAgaXRlbUtleSxcbiAgICBzZWxlY3RlZCxcbiAgICBmb3JjZVJlbmRlcixcbiAgICBjb250ZW50V3JhcHBlcixcbiAgICBjaGlsZHJlbixcbiAgICBzdHlsZXMsXG4gICAgY2hhbmdlQWN0aXZlS2V5LFxuICAgIGFkZEhpZGRlblRhYixcbiAgICBkZWxldGVIaWRkZW5UYWIsXG4gICAgc2V0Q3VycmVudFRhYkVsZW1lbnQsXG4gICAgc2Nyb2xsVG9UYWIsXG4gICAgb25DaGFuZ2UsXG4gICAgb25UYWJDbGljayxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgICBjb25zdCBpdGVtUmVmID0gdXNlUmVmPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgICBjb25zdCB7IHJlZiwgaW5WaWV3IH0gPSB1c2VJblZpZXcoeyB0aHJlc2hvbGQ6IDAuOTUgfSk7XG5cbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIGF0dHJpYnV0ZXMsIGxpc3RlbmVycywgc2V0Tm9kZVJlZiwgdHJhbnNmb3JtLCB0cmFuc2l0aW9uIH0gPSB1c2VTb3J0YWJsZSh7XG4gICAgICBpZDogaXRlbUtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgdHJhbnNmb3JtOiBDU1MuVHJhbnNsYXRlLnRvU3RyaW5nKHRyYW5zZm9ybSksXG4gICAgICB0cmFuc2l0aW9uLFxuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGluVmlldykge1xuICAgICAgICBkZWxldGVIaWRkZW5UYWIoaXRlbUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRIaWRkZW5UYWIoaXRlbUtleSk7XG4gICAgICB9XG4gICAgfSwgW2FkZEhpZGRlblRhYiwgZGVsZXRlSGlkZGVuVGFiLCBpblZpZXcsIGl0ZW1LZXldKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkIHx8IGlzVW5kZWZpbmVkKGl0ZW1SZWYuY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRDdXJyZW50VGFiRWxlbWVudChpdGVtUmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaW5WaWV3KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsVG9UYWIoaXRlbVJlZi5jdXJyZW50KTtcbiAgICB9LCBbc2VsZWN0ZWRdKTtcblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBvblRhYkNsaWNrPy4oaXRlbUtleSwgZSk7XG5cbiAgICAgICAgaWYgKGRpc2FibGVkIHx8IHNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2U/LihpdGVtS2V5KTtcbiAgICAgICAgY2hhbmdlQWN0aXZlS2V5KGl0ZW1LZXkpO1xuICAgICAgfSxcbiAgICAgIFtjaGFuZ2VBY3RpdmVLZXksIGRpc2FibGVkLCBpdGVtS2V5LCBvbkNoYW5nZSwgb25UYWJDbGljaywgc2VsZWN0ZWRdXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnNvbGlkYXRlZFJlZiA9IChub2RlOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIHJlZihub2RlKTtcbiAgICAgIGl0ZW1SZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBzZXROb2RlUmVmKG5vZGUpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aXRoSWNvbk9ubHkgPSBpY29uT25seSB8fCBpc1VuZGVmaW5lZChsYWJlbCk7XG4gICAgY29uc3Qgd2l0aENvbnRlbnQgPSAoc2VsZWN0ZWQgfHwgZm9yY2VSZW5kZXIpICYmIGNvbnRlbnRXcmFwcGVyICYmIGNoaWxkcmVuO1xuXG4gICAgY29uc3QgdGFiSXRlbVN0eWxlID0gZ2V0VGFiSXRlbVN0eWxlKHdpdGhJY29uT25seSwgZGlzYWJsZWQsIHNlbGVjdGVkLCBzaXplLCBpc0RyYWdnaW5nKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17Y29uc29saWRhdGVkUmVmfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIHsuLi5saXN0ZW5lcnN9XG4gICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICBjc3M9e1t0YWJJdGVtU3R5bGUud3JhcHBlcih0aGVtZSksIHN0eWxlcz8ud3JhcHBlcj8uKHRoZW1lKV19XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgPlxuICAgICAgICB7aWNvbiAmJiAoXG4gICAgICAgICAgPHNwYW4gY3NzPXtbdGFiSXRlbVN0eWxlLmljb25XcmFwcGVyKHRoZW1lKSwgc3R5bGVzPy5pY29uV3JhcHBlcj8uKHRoZW1lKV19PntpY29ufTwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgICAgeyFpY29uT25seSAmJiBsYWJlbCAmJiAoXG4gICAgICAgICAgPHNwYW4gY3NzPXtbdGFiSXRlbVN0eWxlLmxhYmVsV3JhcHBlcih0aGVtZSksIHN0eWxlcz8ubGFiZWxXcmFwcGVyPy4odGhlbWUpXX0+XG4gICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgICB7d2l0aENvbnRlbnQgJiZcbiAgICAgICAgICBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2IGNzcz17W3RhYkl0ZW1TdHlsZS5jaGlsZHJlbldyYXBwZXIoKSwgc3R5bGVzPy5jaGlsZHJlbldyYXBwZXI/Lih0aGVtZSldfT5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgY29udGVudFdyYXBwZXJcbiAgICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuKTtcbiJdfQ== */"], children }), contentWrapper)
90
+ ] });
91
+ });
92
+ export {
93
+ TabItem
94
+ };
@@ -0,0 +1,38 @@
1
+ import { TabsSizeType } from 'components/Tabs/Tabs.types';
2
+ import { Theme } from 'themes';
3
+ export declare const getTabItemStyle: (iconOnly: boolean, disabled: boolean, selected: boolean, size: TabsSizeType, isDragging: boolean) => {
4
+ wrapper: (theme: Theme) => {
5
+ readonly display: "flex";
6
+ readonly flexWrap: "nowrap";
7
+ readonly alignItems: "center";
8
+ readonly justifyContent: "unset" | "center";
9
+ readonly gap: 4;
10
+ readonly padding: `4px 0 ${number}px` | `8px 0 ${number}px`;
11
+ readonly color: "#262626" | "#595959" | "#8C8C8C" | "#BFBFBF";
12
+ readonly height: number;
13
+ readonly width: number | "fit-content";
14
+ readonly boxSizing: "border-box";
15
+ readonly cursor: "default" | "pointer" | "move";
16
+ readonly borderBottom: "2px solid #0CB3B3" | "2px solid transparent";
17
+ readonly ":hover": {
18
+ readonly color: "#262626" | "#595959" | "#8C8C8C" | "#BFBFBF";
19
+ };
20
+ };
21
+ iconWrapper: (theme: Theme) => {
22
+ display: string;
23
+ alignItems: string;
24
+ justifyContent: string;
25
+ fontSize: 16;
26
+ };
27
+ labelWrapper: (theme: Theme) => {
28
+ whiteSpace: string;
29
+ fontFamily: "Roboto";
30
+ fontSize: 14;
31
+ lineHeight: "20px";
32
+ };
33
+ childrenWrapper: () => {
34
+ readonly padding: "12px 0";
35
+ readonly visibility: "hidden" | "visible";
36
+ readonly position: "absolute" | "relative";
37
+ };
38
+ };
@@ -0,0 +1,67 @@
1
+ import { getTabsTokens } from "../../Tabs.tokens.js";
2
+ const getColor = (tabsTokens, disabled, selected, isHover = false) => {
3
+ if (disabled) {
4
+ return tabsTokens.tabsTextDisabled;
5
+ }
6
+ if (selected) {
7
+ return tabsTokens.tabsTextSelected;
8
+ }
9
+ if (isHover) {
10
+ return tabsTokens.tabsTextHover;
11
+ }
12
+ return tabsTokens.tabsText;
13
+ };
14
+ const getCursor = (isDragging, disabled, selected) => {
15
+ if (isDragging) {
16
+ return "move";
17
+ }
18
+ if (disabled || selected) {
19
+ return "default";
20
+ }
21
+ return "pointer";
22
+ };
23
+ const getTabItemStyle = (iconOnly, disabled, selected, size, isDragging) => {
24
+ const isMiddleSize = size === "middle";
25
+ return {
26
+ wrapper: (theme) => {
27
+ const tabsTokens = getTabsTokens(theme);
28
+ const tabBarSize = isMiddleSize ? tabsTokens.tabsSizeM : tabsTokens.tabsSizeS;
29
+ const tabPadding = isMiddleSize ? theme.paddingM : theme.paddingXS;
30
+ return {
31
+ display: "flex",
32
+ flexWrap: "nowrap",
33
+ alignItems: "center",
34
+ justifyContent: iconOnly ? "center" : "unset",
35
+ gap: theme.marginXS,
36
+ padding: `${tabPadding}px 0 ${tabPadding - 2}px`,
37
+ color: getColor(tabsTokens, disabled, selected),
38
+ height: tabBarSize,
39
+ width: iconOnly ? tabBarSize : "fit-content",
40
+ boxSizing: "border-box",
41
+ cursor: getCursor(isDragging, disabled, selected),
42
+ borderBottom: `2px solid ${selected ? tabsTokens.tabsIndicator : "transparent"}`,
43
+ ":hover": {
44
+ color: getColor(tabsTokens, disabled, selected, true)
45
+ }
46
+ };
47
+ },
48
+ iconWrapper: (theme) => ({
49
+ display: "flex",
50
+ alignItems: "center",
51
+ justifyContent: "center",
52
+ fontSize: theme.iconM
53
+ }),
54
+ labelWrapper: (theme) => ({
55
+ ...theme.typography.body2,
56
+ whiteSpace: "nowrap"
57
+ }),
58
+ childrenWrapper: () => ({
59
+ padding: "12px 0",
60
+ visibility: selected ? "visible" : "hidden",
61
+ position: selected ? "relative" : "absolute"
62
+ })
63
+ };
64
+ };
65
+ export {
66
+ getTabItemStyle
67
+ };
@@ -0,0 +1,32 @@
1
+ import { Interpolation } from '@emotion/react';
2
+ import { TabsSizeType } from 'components/Tabs/Tabs.types';
3
+ import { MouseEvent, ReactNode } from 'react';
4
+ import { Theme } from 'themes';
5
+ export interface TabItem {
6
+ key: string;
7
+ disabled?: boolean;
8
+ forceRender?: boolean;
9
+ label?: ReactNode;
10
+ icon?: ReactNode;
11
+ children?: ReactNode;
12
+ }
13
+ export interface TabItemProps extends Omit<TabItem, "key"> {
14
+ itemKey: string;
15
+ selected: boolean;
16
+ contentWrapper: HTMLDivElement | null;
17
+ changeActiveKey: (key: string) => void;
18
+ addHiddenTab: (itemKey: string) => void;
19
+ deleteHiddenTab: (itemKey: string) => void;
20
+ setCurrentTabElement: (tab: HTMLElement | null) => void;
21
+ scrollToTab: (element: HTMLElement | null) => void;
22
+ size?: TabsSizeType;
23
+ iconOnly?: boolean;
24
+ styles?: {
25
+ wrapper?: (theme: Theme) => Interpolation;
26
+ iconWrapper?: (theme: Theme) => Interpolation;
27
+ labelWrapper?: (theme: Theme) => Interpolation;
28
+ childrenWrapper?: (theme: Theme) => Interpolation;
29
+ };
30
+ onChange?: (activeKey: string) => void;
31
+ onTabClick?: (activeKey: string, event: MouseEvent) => void;
32
+ }
@@ -0,0 +1,50 @@
1
+ export declare const baseItems: {
2
+ key: string;
3
+ label: string;
4
+ children: string;
5
+ }[];
6
+ export declare const disabledItems: ({
7
+ key: string;
8
+ label: string;
9
+ disabled?: undefined;
10
+ } | {
11
+ key: string;
12
+ label: string;
13
+ disabled: boolean;
14
+ })[];
15
+ export declare const iconItems: ({
16
+ key: string;
17
+ label: string;
18
+ icon: import("@emotion/react/jsx-runtime").JSX.Element;
19
+ disabled?: undefined;
20
+ } | {
21
+ key: string;
22
+ label: string;
23
+ icon: import("@emotion/react/jsx-runtime").JSX.Element;
24
+ disabled: boolean;
25
+ })[];
26
+ export declare const iconOnlyItems: {
27
+ key: string;
28
+ label: string;
29
+ icon: import("@emotion/react/jsx-runtime").JSX.Element;
30
+ }[];
31
+ export declare const moreTabsItems: {
32
+ key: string;
33
+ label: string;
34
+ }[];
35
+ export declare const extraContentItems: {
36
+ key: string;
37
+ label: string;
38
+ }[];
39
+ export declare const sizeItems: {
40
+ key: string;
41
+ label: string;
42
+ }[];
43
+ export declare const sizeItemsIcon: {
44
+ key: string;
45
+ icon: import("@emotion/react/jsx-runtime").JSX.Element;
46
+ }[];
47
+ export declare const borderItems: {
48
+ key: string;
49
+ label: string;
50
+ }[];
@@ -0,0 +1,17 @@
1
+ import { MouseEvent } from 'react';
2
+ import { TabItem } from '../components/TabItem/TabItem.types';
3
+ import { ItemType, MenuItem } from 'components/Dropdown/Dropdown.types';
4
+ export declare const useMoreTabsController: (items: TabItem[], currentActiveKey: string | undefined, currentTabElement: HTMLElement | null, onTabClick: ((activeKey: string, event: MouseEvent) => void) | undefined, onChange: ((activeKey: string) => void) | undefined, changeActiveKey: (key: string) => void) => {
5
+ tabsRef: import('react').MutableRefObject<HTMLDivElement | null>;
6
+ dropdownMenu: {
7
+ items: MenuItem[];
8
+ onClick: (props: {
9
+ item: ItemType;
10
+ key: string;
11
+ e: MouseEvent;
12
+ }) => void;
13
+ };
14
+ addHiddenTab: (itemKey: string) => void;
15
+ deleteHiddenTab: (itemKey: string) => void;
16
+ scrollToTab: (element: HTMLElement | null) => void;
17
+ };
@@ -0,0 +1,68 @@
1
+ import { useState, useRef, useCallback, useMemo } from "react";
2
+ import { isMenuItem } from "../../Dropdown/Dropdown.types.js";
3
+ const useMoreTabsController = (items, currentActiveKey, currentTabElement, onTabClick, onChange, changeActiveKey) => {
4
+ const [hiddenTabs, setHiddenTabs] = useState([]);
5
+ const tabsRef = useRef(null);
6
+ const addHiddenTab = useCallback((itemKey) => {
7
+ setHiddenTabs((prev) => [...prev, itemKey]);
8
+ }, []);
9
+ const deleteHiddenTab = useCallback((itemKey) => {
10
+ setHiddenTabs((prev) => prev.filter((item) => item !== itemKey));
11
+ }, []);
12
+ const dropdownItems = useMemo(() => {
13
+ return items.reduce((acc, item) => {
14
+ if (!hiddenTabs.includes(item.key)) {
15
+ return acc;
16
+ }
17
+ const dropdownItem = {
18
+ key: item.key,
19
+ icon: item.icon,
20
+ label: item.label,
21
+ disabled: item.disabled
22
+ };
23
+ return [...acc, dropdownItem];
24
+ }, []);
25
+ }, [hiddenTabs, items]);
26
+ const scrollToTab = useCallback((element) => {
27
+ if (tabsRef.current && element) {
28
+ const leftPos = element.offsetLeft + element.offsetWidth < tabsRef.current.offsetWidth ? element.offsetLeft : element.offsetLeft - tabsRef.current.offsetWidth + element.offsetWidth;
29
+ tabsRef.current.scrollTo({
30
+ left: leftPos
31
+ });
32
+ }
33
+ }, []);
34
+ const handleDropdownItemClick = useCallback((props) => {
35
+ const {
36
+ item,
37
+ key,
38
+ e
39
+ } = props;
40
+ const selected = key === currentActiveKey;
41
+ onTabClick == null ? void 0 : onTabClick(key, e);
42
+ if (isMenuItem(item) && (item == null ? void 0 : item.disabled)) {
43
+ return;
44
+ }
45
+ if (selected) {
46
+ scrollToTab(currentTabElement);
47
+ return;
48
+ }
49
+ onChange == null ? void 0 : onChange(key);
50
+ changeActiveKey(key);
51
+ }, [changeActiveKey, currentActiveKey, currentTabElement, onChange, onTabClick, scrollToTab]);
52
+ const dropdownMenu = useMemo(() => {
53
+ return {
54
+ items: dropdownItems,
55
+ onClick: handleDropdownItemClick
56
+ };
57
+ }, [dropdownItems, handleDropdownItemClick]);
58
+ return {
59
+ tabsRef,
60
+ dropdownMenu,
61
+ addHiddenTab,
62
+ deleteHiddenTab,
63
+ scrollToTab
64
+ };
65
+ };
66
+ export {
67
+ useMoreTabsController
68
+ };
@@ -0,0 +1,10 @@
1
+ import { TabItem } from '../components/TabItem/TabItem.types';
2
+ import { DragEndEvent } from '@dnd-kit/core';
3
+ export declare const useTabsDndController: (items: TabItem[]) => {
4
+ tabsOrder: string[];
5
+ isDragging: boolean;
6
+ dndEvents: {
7
+ onDragStart: () => void;
8
+ onDragEnd: (e: DragEndEvent) => void;
9
+ };
10
+ };
@@ -0,0 +1,36 @@
1
+ import { useState, useCallback } from "react";
2
+ import { arrayMove } from "@dnd-kit/sortable";
3
+ const useTabsDndController = (items) => {
4
+ const [tabsOrder, setTabsOrder] = useState(items.map((item) => item.key));
5
+ const [isDragging, setIsDragging] = useState(false);
6
+ const handleDragStart = useCallback(() => {
7
+ setIsDragging(true);
8
+ }, []);
9
+ const handleDragEnd = useCallback((e) => {
10
+ const {
11
+ active,
12
+ over
13
+ } = e;
14
+ setIsDragging(false);
15
+ if (active.id === (over == null ? void 0 : over.id)) {
16
+ return;
17
+ }
18
+ setTabsOrder((prev) => {
19
+ const activeIndex = prev.findIndex((key) => key === active.id);
20
+ const overIndex = prev.findIndex((key) => key === (over == null ? void 0 : over.id));
21
+ return arrayMove(prev, activeIndex, overIndex);
22
+ });
23
+ }, []);
24
+ const dndEvents = {
25
+ onDragStart: handleDragStart,
26
+ onDragEnd: handleDragEnd
27
+ };
28
+ return {
29
+ tabsOrder,
30
+ isDragging,
31
+ dndEvents
32
+ };
33
+ };
34
+ export {
35
+ useTabsDndController
36
+ };
@@ -0,0 +1,2 @@
1
+ export { Tabs } from './Tabs';
2
+ export type { TabsProps } from './Tabs.types';
package/dist/index.d.ts CHANGED
@@ -33,7 +33,9 @@ export { Dropdown } from './components/Dropdown';
33
33
  export type { DropdownProps, DropdownMenu } from './components/Dropdown';
34
34
  export { type ProgressProps, Progress } from './components/Progress';
35
35
  export { Avatar } from './components/Avatar';
36
- export type { AvatarProps } from './components/Avatar';
36
+ export type { AvatarProps, AvatarColorType } from './components/Avatar';
37
+ export { Tabs } from './components/Tabs';
38
+ export type { TabsProps } from './components/Tabs';
37
39
  export { Tag } from './components/Tag';
38
40
  export type { TagProps, CheckableProps } from './components/Tag';
39
41
  export { ConfigProvider, useConfig, type Locale } from './components/ConfigProvider';
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ import { Upload } from "./components/Upload/Upload.js";
21
21
  import { Dropdown } from "./components/Dropdown/Dropdown.js";
22
22
  import { Progress } from "./components/Progress/Progress.js";
23
23
  import { Avatar } from "./components/Avatar/Avatar.js";
24
+ import { Tabs } from "./components/Tabs/Tabs.js";
24
25
  import { Tag } from "./components/Tag/Tag.js";
25
26
  import { ConfigProvider } from "./components/ConfigProvider/ConfigProvider.js";
26
27
  import { useConfig } from "./components/ConfigProvider/hooks/useConfig/useConfig.js";
@@ -44,6 +45,7 @@ export {
44
45
  Radio,
45
46
  Select,
46
47
  Switch,
48
+ Tabs,
47
49
  Tag,
48
50
  ThemeProvider,
49
51
  TimePicker,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@infomaximum/ui-kit",
3
3
  "license": "Apache-2.0",
4
- "version": "0.10.1",
4
+ "version": "0.11.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -34,6 +34,9 @@
34
34
  "update-icons": "node scripts/updateIcons/updateIcons.js"
35
35
  },
36
36
  "dependencies": {
37
+ "@dnd-kit/core": "^6.3.1",
38
+ "@dnd-kit/sortable": "^10.0.0",
39
+ "@dnd-kit/utilities": "^3.2.2",
37
40
  "@emotion/react": "^11.0.0",
38
41
  "@floating-ui/react": "^0.27.6",
39
42
  "@infomaximum/icons": "^1.3.2",
@@ -42,13 +45,17 @@
42
45
  "rc-picker": "^4.11.3",
43
46
  "rc-util": "^5.44.4",
44
47
  "react": "^18.3.1",
45
- "react-dom": "^18.3.1"
48
+ "react-dom": "^18.3.1",
49
+ "react-intersection-observer": "^9.16.0"
46
50
  },
47
51
  "peerDependencies": {
48
52
  "@emotion/react": "^11.0.0",
49
53
  "dayjs": "^1.0.0",
50
54
  "react": "^18",
51
- "react-dom": "^18"
55
+ "react-dom": "^18",
56
+ "@dnd-kit/core": "^6",
57
+ "@dnd-kit/sortable": "^10",
58
+ "@dnd-kit/utilities": "^3"
52
59
  },
53
60
  "devDependencies": {
54
61
  "@emotion/babel-plugin": "^11.13.5",
@@ -1,4 +0,0 @@
1
- import { FC, PropsWithChildren } from 'react';
2
- import { DemonstrationVerticalInnerProps } from './Demonstration.types';
3
- export declare const Demonstration: FC<PropsWithChildren>;
4
- export declare const DemonstrationVerticalInner: FC<DemonstrationVerticalInnerProps>;
@@ -1,9 +0,0 @@
1
- export declare const demonstrationStyle: {
2
- padding: string;
3
- };
4
- export declare const demonstrationVerticalInnerStyle: {
5
- readonly display: "inline-flex";
6
- readonly flexDirection: "column";
7
- readonly rowGap: 16;
8
- readonly alignItems: "start";
9
- };
@@ -1,5 +0,0 @@
1
- import { Interpolation } from '@emotion/react';
2
- import { HTMLAttributes, PropsWithChildren } from 'react';
3
- export type DemonstrationVerticalInnerProps = PropsWithChildren & {
4
- css?: Interpolation;
5
- } & Pick<HTMLAttributes<HTMLElement>, "className">;
@@ -1,5 +0,0 @@
1
- import { FC, PropsWithChildren } from 'react';
2
- export declare const DescriptionComponent: FC<PropsWithChildren>;
3
- export declare const Description: FC<{
4
- children?: import('react').ReactNode | undefined;
5
- }>;