@trackunit/react-components 0.1.200 → 0.1.201
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/index.cjs.js +115 -0
- package/index.esm.js +113 -1
- package/package.json +1 -1
- package/src/components/Tabs/Tab.d.ts +15 -0
- package/src/components/Tabs/TabPanel.d.ts +15 -0
- package/src/components/Tabs/Tabs.d.ts +37 -0
- package/src/components/Tabs/Tabs.variants.d.ts +12 -0
- package/src/components/index.d.ts +3 -0
package/index.cjs.js
CHANGED
|
@@ -2159,6 +2159,118 @@ const Sidebar = ({ childContainerClassName, children, breakpoint = "lg", classNa
|
|
|
2159
2159
|
}) }))) }))) : null] }));
|
|
2160
2160
|
};
|
|
2161
2161
|
|
|
2162
|
+
const cvaTab = cssClassVarianceUtilities.cvaMerge([
|
|
2163
|
+
"mb-px",
|
|
2164
|
+
"box-content",
|
|
2165
|
+
"flex",
|
|
2166
|
+
"h-12",
|
|
2167
|
+
"min-w-0",
|
|
2168
|
+
"cursor-pointer items-center",
|
|
2169
|
+
"justify-center ",
|
|
2170
|
+
"gap-2",
|
|
2171
|
+
"border-b-4",
|
|
2172
|
+
"px-1",
|
|
2173
|
+
"font-medium",
|
|
2174
|
+
"transition",
|
|
2175
|
+
"duration-200",
|
|
2176
|
+
"ease-in-out",
|
|
2177
|
+
], {
|
|
2178
|
+
variants: {
|
|
2179
|
+
isSelected: {
|
|
2180
|
+
true: "border-b-blue-600 hover:text-neutral-500",
|
|
2181
|
+
false: "border-neutral-200 text-neutral-500 hover:border-b-neutral-500",
|
|
2182
|
+
},
|
|
2183
|
+
isFullWidth: {
|
|
2184
|
+
true: "w-full",
|
|
2185
|
+
false: "",
|
|
2186
|
+
},
|
|
2187
|
+
},
|
|
2188
|
+
defaultVariants: {
|
|
2189
|
+
isSelected: false,
|
|
2190
|
+
isFullWidth: false,
|
|
2191
|
+
},
|
|
2192
|
+
});
|
|
2193
|
+
cssClassVarianceUtilities.cvaMerge(["whitespace-no-wrap", "mr-4", "overflow-hidden"]);
|
|
2194
|
+
const cvaTabs = cssClassVarianceUtilities.cvaMerge(["flex", "flex-col"]);
|
|
2195
|
+
const cvaTabsPanels = cssClassVarianceUtilities.cvaMerge(["mt-4", "flex", "h-full"]);
|
|
2196
|
+
const cvaTabsPanel = cssClassVarianceUtilities.cvaMerge([], {
|
|
2197
|
+
variants: {
|
|
2198
|
+
isSelected: {
|
|
2199
|
+
true: "flex-1",
|
|
2200
|
+
false: "grow-0",
|
|
2201
|
+
},
|
|
2202
|
+
},
|
|
2203
|
+
defaultVariants: {
|
|
2204
|
+
isSelected: false,
|
|
2205
|
+
},
|
|
2206
|
+
});
|
|
2207
|
+
const cvaTabPanel = cssClassVarianceUtilities.cvaMerge(["flex-1"]);
|
|
2208
|
+
const cvaTabsContainer = cssClassVarianceUtilities.cvaMerge([
|
|
2209
|
+
"m-0",
|
|
2210
|
+
"flex",
|
|
2211
|
+
"list-none",
|
|
2212
|
+
"items-center",
|
|
2213
|
+
"gap-x-4",
|
|
2214
|
+
"border-b",
|
|
2215
|
+
"border-solid",
|
|
2216
|
+
"border-neutral-100",
|
|
2217
|
+
"p-0",
|
|
2218
|
+
]);
|
|
2219
|
+
|
|
2220
|
+
/**
|
|
2221
|
+
*
|
|
2222
|
+
*/
|
|
2223
|
+
const Tab = ({ onTabClick, isFullWidth = false, iconName, isSelected = false, label, dataTestId, suffix, }) => {
|
|
2224
|
+
return (jsxRuntime.jsxs("li", { onClick: onTabClick, "data-testid": dataTestId, role: "tab", className: cvaTab({ isSelected, isFullWidth }), children: [iconName && jsxRuntime.jsx(Icon, { name: iconName, size: "small" }), label, suffix] }));
|
|
2225
|
+
};
|
|
2226
|
+
|
|
2227
|
+
/**
|
|
2228
|
+
*
|
|
2229
|
+
*/
|
|
2230
|
+
const TabPanel = ({ id, label, iconName, suffix, className, dataTestId, children }) => {
|
|
2231
|
+
return (jsxRuntime.jsx("div", { "data-testid": dataTestId && `${dataTestId}-panel`, className: cvaTabPanel({ className }), children: children }));
|
|
2232
|
+
};
|
|
2233
|
+
|
|
2234
|
+
/**
|
|
2235
|
+
* Represents a set of tabs used for navigating content.
|
|
2236
|
+
*/
|
|
2237
|
+
const Tabs = ({ defaultSelectedTabId, children, forceRender, className, dataTestId, fullWidth, onSelectedTabChanged, }) => {
|
|
2238
|
+
const getDefaultedSelectedTabId = () => {
|
|
2239
|
+
if (defaultSelectedTabId) {
|
|
2240
|
+
return defaultSelectedTabId;
|
|
2241
|
+
}
|
|
2242
|
+
const firstChild = React.Children.toArray(children)[0];
|
|
2243
|
+
return firstChild.props.id;
|
|
2244
|
+
};
|
|
2245
|
+
const [selectedTabId, setSelectedTabId] = React.useState(getDefaultedSelectedTabId());
|
|
2246
|
+
React.useEffect(() => {
|
|
2247
|
+
if (defaultSelectedTabId) {
|
|
2248
|
+
setSelectedTabId(defaultSelectedTabId);
|
|
2249
|
+
}
|
|
2250
|
+
}, [defaultSelectedTabId]);
|
|
2251
|
+
const isTabSelected = (panel) => {
|
|
2252
|
+
return panel.id === selectedTabId;
|
|
2253
|
+
};
|
|
2254
|
+
const handleTabClick = (panel) => {
|
|
2255
|
+
if (selectedTabId !== panel.id) {
|
|
2256
|
+
if (onSelectedTabChanged) {
|
|
2257
|
+
onSelectedTabChanged(panel.id);
|
|
2258
|
+
}
|
|
2259
|
+
setSelectedTabId(panel.id);
|
|
2260
|
+
}
|
|
2261
|
+
};
|
|
2262
|
+
return (jsxRuntime.jsxs("div", { className: cvaTabs({ className }), "data-testid": dataTestId, children: [jsxRuntime.jsx("ol", { role: "tablist", className: cvaTabsContainer(), children: React.Children.map(children, child => {
|
|
2263
|
+
const panel = child.props;
|
|
2264
|
+
return panel ? (jsxRuntime.jsx(Tab, { onTabClick: () => handleTabClick(panel), isSelected: panel.id === selectedTabId, isFullWidth: fullWidth, label: panel.label, iconName: panel.iconName, suffix: panel.suffix, dataTestId: panel.dataTestId })) : null;
|
|
2265
|
+
}) }), jsxRuntime.jsx("div", { className: cvaTabsPanels(), children: React.Children.map(children, child => {
|
|
2266
|
+
const panel = child === null || child === void 0 ? void 0 : child.props;
|
|
2267
|
+
if (!panel || (panel.id !== selectedTabId && !forceRender)) {
|
|
2268
|
+
return null;
|
|
2269
|
+
}
|
|
2270
|
+
return (jsxRuntime.jsx("div", { className: cvaTabsPanel({ isSelected: isTabSelected(panel) }), children: jsxRuntime.jsx(TabPanel, Object.assign({}, panel)) }));
|
|
2271
|
+
}) })] }));
|
|
2272
|
+
};
|
|
2273
|
+
|
|
2162
2274
|
const cvaTimeline = cssClassVarianceUtilities.cvaMerge("ml-4");
|
|
2163
2275
|
const cvaTimelineElement = cssClassVarianceUtilities.cvaMerge([
|
|
2164
2276
|
"grid",
|
|
@@ -2934,6 +3046,9 @@ exports.SkeletonLines = SkeletonLines;
|
|
|
2934
3046
|
exports.Spacer = Spacer;
|
|
2935
3047
|
exports.Spinner = Spinner;
|
|
2936
3048
|
exports.StarButton = StarButton;
|
|
3049
|
+
exports.Tab = Tab;
|
|
3050
|
+
exports.TabPanel = TabPanel;
|
|
3051
|
+
exports.Tabs = Tabs;
|
|
2937
3052
|
exports.Tag = Tag;
|
|
2938
3053
|
exports.Text = Text;
|
|
2939
3054
|
exports.Timeline = Timeline;
|
package/index.esm.js
CHANGED
|
@@ -2130,6 +2130,118 @@ const Sidebar = ({ childContainerClassName, children, breakpoint = "lg", classNa
|
|
|
2130
2130
|
}) }))) }))) : null] }));
|
|
2131
2131
|
};
|
|
2132
2132
|
|
|
2133
|
+
const cvaTab = cvaMerge([
|
|
2134
|
+
"mb-px",
|
|
2135
|
+
"box-content",
|
|
2136
|
+
"flex",
|
|
2137
|
+
"h-12",
|
|
2138
|
+
"min-w-0",
|
|
2139
|
+
"cursor-pointer items-center",
|
|
2140
|
+
"justify-center ",
|
|
2141
|
+
"gap-2",
|
|
2142
|
+
"border-b-4",
|
|
2143
|
+
"px-1",
|
|
2144
|
+
"font-medium",
|
|
2145
|
+
"transition",
|
|
2146
|
+
"duration-200",
|
|
2147
|
+
"ease-in-out",
|
|
2148
|
+
], {
|
|
2149
|
+
variants: {
|
|
2150
|
+
isSelected: {
|
|
2151
|
+
true: "border-b-blue-600 hover:text-neutral-500",
|
|
2152
|
+
false: "border-neutral-200 text-neutral-500 hover:border-b-neutral-500",
|
|
2153
|
+
},
|
|
2154
|
+
isFullWidth: {
|
|
2155
|
+
true: "w-full",
|
|
2156
|
+
false: "",
|
|
2157
|
+
},
|
|
2158
|
+
},
|
|
2159
|
+
defaultVariants: {
|
|
2160
|
+
isSelected: false,
|
|
2161
|
+
isFullWidth: false,
|
|
2162
|
+
},
|
|
2163
|
+
});
|
|
2164
|
+
cvaMerge(["whitespace-no-wrap", "mr-4", "overflow-hidden"]);
|
|
2165
|
+
const cvaTabs = cvaMerge(["flex", "flex-col"]);
|
|
2166
|
+
const cvaTabsPanels = cvaMerge(["mt-4", "flex", "h-full"]);
|
|
2167
|
+
const cvaTabsPanel = cvaMerge([], {
|
|
2168
|
+
variants: {
|
|
2169
|
+
isSelected: {
|
|
2170
|
+
true: "flex-1",
|
|
2171
|
+
false: "grow-0",
|
|
2172
|
+
},
|
|
2173
|
+
},
|
|
2174
|
+
defaultVariants: {
|
|
2175
|
+
isSelected: false,
|
|
2176
|
+
},
|
|
2177
|
+
});
|
|
2178
|
+
const cvaTabPanel = cvaMerge(["flex-1"]);
|
|
2179
|
+
const cvaTabsContainer = cvaMerge([
|
|
2180
|
+
"m-0",
|
|
2181
|
+
"flex",
|
|
2182
|
+
"list-none",
|
|
2183
|
+
"items-center",
|
|
2184
|
+
"gap-x-4",
|
|
2185
|
+
"border-b",
|
|
2186
|
+
"border-solid",
|
|
2187
|
+
"border-neutral-100",
|
|
2188
|
+
"p-0",
|
|
2189
|
+
]);
|
|
2190
|
+
|
|
2191
|
+
/**
|
|
2192
|
+
*
|
|
2193
|
+
*/
|
|
2194
|
+
const Tab = ({ onTabClick, isFullWidth = false, iconName, isSelected = false, label, dataTestId, suffix, }) => {
|
|
2195
|
+
return (jsxs("li", { onClick: onTabClick, "data-testid": dataTestId, role: "tab", className: cvaTab({ isSelected, isFullWidth }), children: [iconName && jsx(Icon, { name: iconName, size: "small" }), label, suffix] }));
|
|
2196
|
+
};
|
|
2197
|
+
|
|
2198
|
+
/**
|
|
2199
|
+
*
|
|
2200
|
+
*/
|
|
2201
|
+
const TabPanel = ({ id, label, iconName, suffix, className, dataTestId, children }) => {
|
|
2202
|
+
return (jsx("div", { "data-testid": dataTestId && `${dataTestId}-panel`, className: cvaTabPanel({ className }), children: children }));
|
|
2203
|
+
};
|
|
2204
|
+
|
|
2205
|
+
/**
|
|
2206
|
+
* Represents a set of tabs used for navigating content.
|
|
2207
|
+
*/
|
|
2208
|
+
const Tabs = ({ defaultSelectedTabId, children, forceRender, className, dataTestId, fullWidth, onSelectedTabChanged, }) => {
|
|
2209
|
+
const getDefaultedSelectedTabId = () => {
|
|
2210
|
+
if (defaultSelectedTabId) {
|
|
2211
|
+
return defaultSelectedTabId;
|
|
2212
|
+
}
|
|
2213
|
+
const firstChild = Children.toArray(children)[0];
|
|
2214
|
+
return firstChild.props.id;
|
|
2215
|
+
};
|
|
2216
|
+
const [selectedTabId, setSelectedTabId] = useState(getDefaultedSelectedTabId());
|
|
2217
|
+
useEffect(() => {
|
|
2218
|
+
if (defaultSelectedTabId) {
|
|
2219
|
+
setSelectedTabId(defaultSelectedTabId);
|
|
2220
|
+
}
|
|
2221
|
+
}, [defaultSelectedTabId]);
|
|
2222
|
+
const isTabSelected = (panel) => {
|
|
2223
|
+
return panel.id === selectedTabId;
|
|
2224
|
+
};
|
|
2225
|
+
const handleTabClick = (panel) => {
|
|
2226
|
+
if (selectedTabId !== panel.id) {
|
|
2227
|
+
if (onSelectedTabChanged) {
|
|
2228
|
+
onSelectedTabChanged(panel.id);
|
|
2229
|
+
}
|
|
2230
|
+
setSelectedTabId(panel.id);
|
|
2231
|
+
}
|
|
2232
|
+
};
|
|
2233
|
+
return (jsxs("div", { className: cvaTabs({ className }), "data-testid": dataTestId, children: [jsx("ol", { role: "tablist", className: cvaTabsContainer(), children: Children.map(children, child => {
|
|
2234
|
+
const panel = child.props;
|
|
2235
|
+
return panel ? (jsx(Tab, { onTabClick: () => handleTabClick(panel), isSelected: panel.id === selectedTabId, isFullWidth: fullWidth, label: panel.label, iconName: panel.iconName, suffix: panel.suffix, dataTestId: panel.dataTestId })) : null;
|
|
2236
|
+
}) }), jsx("div", { className: cvaTabsPanels(), children: Children.map(children, child => {
|
|
2237
|
+
const panel = child === null || child === void 0 ? void 0 : child.props;
|
|
2238
|
+
if (!panel || (panel.id !== selectedTabId && !forceRender)) {
|
|
2239
|
+
return null;
|
|
2240
|
+
}
|
|
2241
|
+
return (jsx("div", { className: cvaTabsPanel({ isSelected: isTabSelected(panel) }), children: jsx(TabPanel, Object.assign({}, panel)) }));
|
|
2242
|
+
}) })] }));
|
|
2243
|
+
};
|
|
2244
|
+
|
|
2133
2245
|
const cvaTimeline = cvaMerge("ml-4");
|
|
2134
2246
|
const cvaTimelineElement = cvaMerge([
|
|
2135
2247
|
"grid",
|
|
@@ -2866,4 +2978,4 @@ const useVisibilityChange = ({ onChange, targetState = "hidden" }) => {
|
|
|
2866
2978
|
}, [onChange, targetState]);
|
|
2867
2979
|
};
|
|
2868
2980
|
|
|
2869
|
-
export { Alert, Badge, Button, Card, CardBody, CardFooter, CardHeader, Collapse, CopyableText, DayPicker, DayPickerPopover, DayRangePicker, Drawer, EmptyState, ExternalLink, Heading, Icon, IconButton, Indicator, MenuItem, MenuList, Modal, ModalBackdrop, MoreMenu, PackageNameStoryComponent, PageHeader, Pagination, Popover, PopoverContent, PopoverTitle, PopoverTrigger, Prompt, ROLE_CARD, SectionHeader, Sidebar, SkeletonLines, Spacer, Spinner, StarButton, Tag, Text, Timeline, TimelineElement, Tip, Tooltip, ValueBar, WidgetBody, cvaButton, cvaButtonSpinner, cvaClickable, cvaIconButtonContainer, cvaIndicator, cvaIndicatorIcon, cvaIndicatorIconBackground, cvaIndicatorLabel, cvaIndicatorPing, cvaMenuItem, cvaMenuItemLabel, cvaMenuItemPrefix, cvaMenuItemSuffix, docs, getDevicePixelRatio, getValueBarColorByValue, iconColorNames, iconPalette, setLocalStorage, useClickOutside, useContainerProps, useContinuousTimeout, useDebounce, useDevicePixelRatio, useGeometry, useHover, useIsFirstRender, useIsFullscreen, useIsTextCutOff, useLocalStorage, useLocalStorageReducer, useModal, useOptionallyElevatedState, useOverflowItems, usePopoverContext, usePrompt, useResize, useSelfUpdatingRef, useTimeout, useVisibilityChange };
|
|
2981
|
+
export { Alert, Badge, Button, Card, CardBody, CardFooter, CardHeader, Collapse, CopyableText, DayPicker, DayPickerPopover, DayRangePicker, Drawer, EmptyState, ExternalLink, Heading, Icon, IconButton, Indicator, MenuItem, MenuList, Modal, ModalBackdrop, MoreMenu, PackageNameStoryComponent, PageHeader, Pagination, Popover, PopoverContent, PopoverTitle, PopoverTrigger, Prompt, ROLE_CARD, SectionHeader, Sidebar, SkeletonLines, Spacer, Spinner, StarButton, Tab, TabPanel, Tabs, Tag, Text, Timeline, TimelineElement, Tip, Tooltip, ValueBar, WidgetBody, cvaButton, cvaButtonSpinner, cvaClickable, cvaIconButtonContainer, cvaIndicator, cvaIndicatorIcon, cvaIndicatorIconBackground, cvaIndicatorLabel, cvaIndicatorPing, cvaMenuItem, cvaMenuItemLabel, cvaMenuItemPrefix, cvaMenuItemSuffix, docs, getDevicePixelRatio, getValueBarColorByValue, iconColorNames, iconPalette, setLocalStorage, useClickOutside, useContainerProps, useContinuousTimeout, useDebounce, useDevicePixelRatio, useGeometry, useHover, useIsFirstRender, useIsFullscreen, useIsTextCutOff, useLocalStorage, useLocalStorageReducer, useModal, useOptionallyElevatedState, useOverflowItems, usePopoverContext, usePrompt, useResize, useSelfUpdatingRef, useTimeout, useVisibilityChange };
|
package/package.json
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IconName } from "@trackunit/ui-icons";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
export interface TabProps {
|
|
4
|
+
onTabClick?: () => void;
|
|
5
|
+
isSelected: boolean;
|
|
6
|
+
isFullWidth?: boolean;
|
|
7
|
+
dataTestId?: string;
|
|
8
|
+
suffix?: JSX.Element;
|
|
9
|
+
iconName?: IconName;
|
|
10
|
+
label: string | React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
export declare const Tab: ({ onTabClick, isFullWidth, iconName, isSelected, label, dataTestId, suffix, }: TabProps) => JSX.Element;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IconName } from "@trackunit/ui-icons";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
export interface TabPanelProps {
|
|
4
|
+
id: string | number;
|
|
5
|
+
label: string | ReactNode;
|
|
6
|
+
iconName?: IconName;
|
|
7
|
+
suffix?: JSX.Element;
|
|
8
|
+
className?: string;
|
|
9
|
+
dataTestId?: string;
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
export declare const TabPanel: ({ id, label, iconName, suffix, className, dataTestId, children }: TabPanelProps) => JSX.Element;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
export interface TabsProps {
|
|
3
|
+
/**
|
|
4
|
+
* The ID of the tab that should be selected by default.
|
|
5
|
+
*/
|
|
6
|
+
defaultSelectedTabId?: string | number;
|
|
7
|
+
/**
|
|
8
|
+
* If set to true, forces the content of all tabs to render even if not selected.
|
|
9
|
+
*/
|
|
10
|
+
forceRender?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* If set to true, the tabs will expand to fill the width of their container.
|
|
13
|
+
*/
|
|
14
|
+
fullWidth?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The child elements to be displayed within the Tabs component.
|
|
17
|
+
*/
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
/**
|
|
20
|
+
* A custom class name to be attached to root element
|
|
21
|
+
*/
|
|
22
|
+
className?: string;
|
|
23
|
+
/**
|
|
24
|
+
* An ID that can be used in tests to locate the component.
|
|
25
|
+
*/
|
|
26
|
+
dataTestId?: string;
|
|
27
|
+
/**
|
|
28
|
+
* A callback function invoked when the selected tab changes.
|
|
29
|
+
*
|
|
30
|
+
* @param id - ID of the selected tab.
|
|
31
|
+
*/
|
|
32
|
+
onSelectedTabChanged?: (id: string | number) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Represents a set of tabs used for navigating content.
|
|
36
|
+
*/
|
|
37
|
+
export declare const Tabs: ({ defaultSelectedTabId, children, forceRender, className, dataTestId, fullWidth, onSelectedTabChanged, }: TabsProps) => JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const cvaTab: (props?: ({
|
|
2
|
+
isSelected?: boolean | null | undefined;
|
|
3
|
+
isFullWidth?: boolean | null | undefined;
|
|
4
|
+
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
5
|
+
export declare const cvaTabNoWrapContainer: (props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string;
|
|
6
|
+
export declare const cvaTabs: (props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string;
|
|
7
|
+
export declare const cvaTabsPanels: (props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string;
|
|
8
|
+
export declare const cvaTabsPanel: (props?: ({
|
|
9
|
+
isSelected?: boolean | null | undefined;
|
|
10
|
+
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
11
|
+
export declare const cvaTabPanel: (props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string;
|
|
12
|
+
export declare const cvaTabsContainer: (props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string;
|
|
@@ -23,6 +23,9 @@ export * from "./Sidebar/useOverflowItems";
|
|
|
23
23
|
export * from "./SkeletonLines";
|
|
24
24
|
export * from "./Spacer";
|
|
25
25
|
export * from "./Spinner";
|
|
26
|
+
export * from "./Tabs/Tab";
|
|
27
|
+
export * from "./Tabs/TabPanel";
|
|
28
|
+
export * from "./Tabs/Tabs";
|
|
26
29
|
export * from "./Tag";
|
|
27
30
|
export * from "./Text";
|
|
28
31
|
export * from "./Timeline/Timeline";
|