uiplex 1.0.2 → 1.1.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.
- package/dist/Tabs/Tabs.d.ts +44 -0
- package/dist/Tabs/Tabs.d.ts.map +1 -0
- package/dist/Tabs/index.d.ts +3 -0
- package/dist/Tabs/index.d.ts.map +1 -0
- package/dist/index.cjs +125 -0
- package/dist/index.css +390 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -1
- package/package.json +1 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./Tabs.css";
|
|
3
|
+
export interface TabsProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
defaultIndex?: number;
|
|
6
|
+
index?: number;
|
|
7
|
+
onChange?: (index: number) => void;
|
|
8
|
+
variant?: "line" | "enclosed" | "soft-rounded";
|
|
9
|
+
size?: "sm" | "md" | "lg";
|
|
10
|
+
colorScheme?: "blue" | "green" | "red" | "yellow" | "purple" | "gray";
|
|
11
|
+
orientation?: "horizontal" | "vertical";
|
|
12
|
+
className?: string;
|
|
13
|
+
style?: React.CSSProperties;
|
|
14
|
+
}
|
|
15
|
+
export declare const Tabs: React.FC<TabsProps>;
|
|
16
|
+
export interface TabListProps {
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
className?: string;
|
|
19
|
+
style?: React.CSSProperties;
|
|
20
|
+
}
|
|
21
|
+
export declare const TabList: React.FC<TabListProps>;
|
|
22
|
+
export interface TabProps {
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
index?: number;
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
icon?: React.ReactNode;
|
|
27
|
+
className?: string;
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
export declare const Tab: React.FC<TabProps>;
|
|
31
|
+
export interface TabPanelsProps {
|
|
32
|
+
children: React.ReactNode;
|
|
33
|
+
className?: string;
|
|
34
|
+
style?: React.CSSProperties;
|
|
35
|
+
}
|
|
36
|
+
export declare const TabPanels: React.FC<TabPanelsProps>;
|
|
37
|
+
export interface TabPanelProps {
|
|
38
|
+
children: React.ReactNode;
|
|
39
|
+
index?: number;
|
|
40
|
+
className?: string;
|
|
41
|
+
style?: React.CSSProperties;
|
|
42
|
+
}
|
|
43
|
+
export declare const TabPanel: React.FC<TabPanelProps>;
|
|
44
|
+
//# sourceMappingURL=Tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/Tabs/Tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmE,MAAM,OAAO,CAAC;AACxF,OAAO,YAAY,CAAC;AAuBpB,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,cAAc,CAAC;IAC/C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtE,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAmDpC,CAAC;AAGF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAoB1C,CAAC;AAGF,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CA6FlC,CAAC;AAGF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAU9C,CAAC;AAGF,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA6B5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,OAAO,EACP,GAAG,EACH,SAAS,EACT,QAAQ,GACT,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,QAAQ,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1067,6 +1067,126 @@ const ToastContainerGlobal = () => {
|
|
|
1067
1067
|
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: positionsWithToasts.map((position) => (jsxRuntime.jsx(ToastContainer, { toasts: toastsByPosition[position], position: position, onClose: handleClose }, position))) }));
|
|
1068
1068
|
};
|
|
1069
1069
|
|
|
1070
|
+
const TabContext = React.createContext(undefined);
|
|
1071
|
+
const useTabContext = () => {
|
|
1072
|
+
const context = React.useContext(TabContext);
|
|
1073
|
+
if (!context) {
|
|
1074
|
+
throw new Error("Tab components must be used within a Tabs component");
|
|
1075
|
+
}
|
|
1076
|
+
return context;
|
|
1077
|
+
};
|
|
1078
|
+
const Tabs = ({ children, defaultIndex = 0, index: controlledIndex, onChange, variant = "line", size = "md", colorScheme = "blue", orientation = "horizontal", className = "", style, }) => {
|
|
1079
|
+
const [uncontrolledIndex, setUncontrolledIndex] = React.useState(defaultIndex);
|
|
1080
|
+
const isControlled = controlledIndex !== undefined;
|
|
1081
|
+
const activeIndex = isControlled ? controlledIndex : uncontrolledIndex;
|
|
1082
|
+
const setActiveIndex = React.useCallback((newIndex) => {
|
|
1083
|
+
if (!isControlled) {
|
|
1084
|
+
setUncontrolledIndex(newIndex);
|
|
1085
|
+
}
|
|
1086
|
+
onChange?.(newIndex);
|
|
1087
|
+
}, [isControlled, onChange]);
|
|
1088
|
+
const contextValue = {
|
|
1089
|
+
activeIndex,
|
|
1090
|
+
setActiveIndex,
|
|
1091
|
+
variant,
|
|
1092
|
+
size,
|
|
1093
|
+
colorScheme,
|
|
1094
|
+
orientation,
|
|
1095
|
+
};
|
|
1096
|
+
const tabsClasses = [
|
|
1097
|
+
"ui-tabs",
|
|
1098
|
+
`ui-tabs--${orientation}`,
|
|
1099
|
+
`ui-tabs--${variant}`,
|
|
1100
|
+
className,
|
|
1101
|
+
]
|
|
1102
|
+
.filter(Boolean)
|
|
1103
|
+
.join(" ");
|
|
1104
|
+
return (jsxRuntime.jsx(TabContext.Provider, { value: contextValue, children: jsxRuntime.jsx("div", { className: tabsClasses, style: style, role: "tablist", children: children }) }));
|
|
1105
|
+
};
|
|
1106
|
+
const TabList = ({ children, className = "", style, }) => {
|
|
1107
|
+
const { orientation } = useTabContext();
|
|
1108
|
+
const tabListClasses = [
|
|
1109
|
+
"ui-tab-list",
|
|
1110
|
+
`ui-tab-list--${orientation}`,
|
|
1111
|
+
className,
|
|
1112
|
+
]
|
|
1113
|
+
.filter(Boolean)
|
|
1114
|
+
.join(" ");
|
|
1115
|
+
return (jsxRuntime.jsx("div", { className: tabListClasses, style: style, role: "tablist", children: children }));
|
|
1116
|
+
};
|
|
1117
|
+
const Tab = ({ children, index = 0, disabled = false, icon, className = "", style, }) => {
|
|
1118
|
+
const { activeIndex, setActiveIndex, variant, size, colorScheme } = useTabContext();
|
|
1119
|
+
const tabRef = React.useRef(null);
|
|
1120
|
+
const isActive = activeIndex === index;
|
|
1121
|
+
const handleClick = () => {
|
|
1122
|
+
if (!disabled) {
|
|
1123
|
+
setActiveIndex(index);
|
|
1124
|
+
}
|
|
1125
|
+
};
|
|
1126
|
+
const handleKeyDown = (e) => {
|
|
1127
|
+
if (disabled)
|
|
1128
|
+
return;
|
|
1129
|
+
const tabs = Array.from(document.querySelectorAll(`.ui-tab-list [role="tab"]:not([aria-disabled="true"])`));
|
|
1130
|
+
const currentTabIndex = tabs.findIndex((tab) => tab === tabRef.current);
|
|
1131
|
+
let nextIndex = currentTabIndex;
|
|
1132
|
+
switch (e.key) {
|
|
1133
|
+
case "ArrowRight":
|
|
1134
|
+
case "ArrowDown":
|
|
1135
|
+
e.preventDefault();
|
|
1136
|
+
nextIndex = (currentTabIndex + 1) % tabs.length;
|
|
1137
|
+
break;
|
|
1138
|
+
case "ArrowLeft":
|
|
1139
|
+
case "ArrowUp":
|
|
1140
|
+
e.preventDefault();
|
|
1141
|
+
nextIndex = currentTabIndex - 1 < 0 ? tabs.length - 1 : currentTabIndex - 1;
|
|
1142
|
+
break;
|
|
1143
|
+
case "Home":
|
|
1144
|
+
e.preventDefault();
|
|
1145
|
+
nextIndex = 0;
|
|
1146
|
+
break;
|
|
1147
|
+
case "End":
|
|
1148
|
+
e.preventDefault();
|
|
1149
|
+
nextIndex = tabs.length - 1;
|
|
1150
|
+
break;
|
|
1151
|
+
default:
|
|
1152
|
+
return;
|
|
1153
|
+
}
|
|
1154
|
+
const nextTab = tabs[nextIndex];
|
|
1155
|
+
if (nextTab) {
|
|
1156
|
+
const tabIndex = parseInt(nextTab.getAttribute("data-tab-index") || "0", 10);
|
|
1157
|
+
setActiveIndex(tabIndex);
|
|
1158
|
+
nextTab.focus();
|
|
1159
|
+
}
|
|
1160
|
+
};
|
|
1161
|
+
const tabClasses = [
|
|
1162
|
+
"ui-tab",
|
|
1163
|
+
`ui-tab--${variant}`,
|
|
1164
|
+
`ui-tab--${size}`,
|
|
1165
|
+
`ui-tab--${colorScheme}`,
|
|
1166
|
+
isActive && "ui-tab--active",
|
|
1167
|
+
disabled && "ui-tab--disabled",
|
|
1168
|
+
className,
|
|
1169
|
+
]
|
|
1170
|
+
.filter(Boolean)
|
|
1171
|
+
.join(" ");
|
|
1172
|
+
return (jsxRuntime.jsxs("button", { ref: tabRef, role: "tab", "aria-selected": isActive, "aria-disabled": disabled, "aria-controls": `tabpanel-${index}`, id: `tab-${index}`, "data-tab-index": index, tabIndex: isActive ? 0 : -1, className: tabClasses, onClick: handleClick, onKeyDown: handleKeyDown, disabled: disabled, style: style, children: [icon && jsxRuntime.jsx("span", { className: "ui-tab__icon", children: icon }), jsxRuntime.jsx("span", { className: "ui-tab__label", children: children })] }));
|
|
1173
|
+
};
|
|
1174
|
+
const TabPanels = ({ children, className = "", style, }) => {
|
|
1175
|
+
return (jsxRuntime.jsx("div", { className: `ui-tab-panels ${className}`, style: style, children: children }));
|
|
1176
|
+
};
|
|
1177
|
+
const TabPanel = ({ children, index = 0, className = "", style, }) => {
|
|
1178
|
+
const { activeIndex } = useTabContext();
|
|
1179
|
+
const isActive = activeIndex === index;
|
|
1180
|
+
const tabPanelClasses = [
|
|
1181
|
+
"ui-tab-panel",
|
|
1182
|
+
isActive && "ui-tab-panel--active",
|
|
1183
|
+
className,
|
|
1184
|
+
]
|
|
1185
|
+
.filter(Boolean)
|
|
1186
|
+
.join(" ");
|
|
1187
|
+
return (jsxRuntime.jsx("div", { role: "tabpanel", id: `tabpanel-${index}`, "aria-labelledby": `tab-${index}`, hidden: !isActive, className: tabPanelClasses, style: style, children: children }));
|
|
1188
|
+
};
|
|
1189
|
+
|
|
1070
1190
|
const useDisclosure = (defaultIsOpen = false) => {
|
|
1071
1191
|
const [isOpen, setIsOpen] = React.useState(defaultIsOpen);
|
|
1072
1192
|
const onOpen = React.useCallback(() => {
|
|
@@ -1307,6 +1427,11 @@ exports.PopoverHeader = PopoverHeader;
|
|
|
1307
1427
|
exports.Radio = Radio;
|
|
1308
1428
|
exports.RadioGroup = RadioGroup;
|
|
1309
1429
|
exports.Select = Select;
|
|
1430
|
+
exports.Tab = Tab;
|
|
1431
|
+
exports.TabList = TabList;
|
|
1432
|
+
exports.TabPanel = TabPanel;
|
|
1433
|
+
exports.TabPanels = TabPanels;
|
|
1434
|
+
exports.Tabs = Tabs;
|
|
1310
1435
|
exports.Text = Text;
|
|
1311
1436
|
exports.Textarea = Textarea;
|
|
1312
1437
|
exports.ThemeProvider = ThemeProvider;
|
package/dist/index.css
CHANGED
|
@@ -2693,6 +2693,396 @@
|
|
|
2693
2693
|
}
|
|
2694
2694
|
|
|
2695
2695
|
|
|
2696
|
+
/* Tabs Container */
|
|
2697
|
+
.ui-tabs {
|
|
2698
|
+
width: 100%;
|
|
2699
|
+
font-family: inherit;
|
|
2700
|
+
}
|
|
2701
|
+
|
|
2702
|
+
.ui-tabs--horizontal {
|
|
2703
|
+
display: flex;
|
|
2704
|
+
flex-direction: column;
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
.ui-tabs--vertical {
|
|
2708
|
+
display: flex;
|
|
2709
|
+
flex-direction: row;
|
|
2710
|
+
gap: 1rem;
|
|
2711
|
+
}
|
|
2712
|
+
|
|
2713
|
+
/* Tab List */
|
|
2714
|
+
.ui-tab-list {
|
|
2715
|
+
display: flex;
|
|
2716
|
+
gap: 0.5rem;
|
|
2717
|
+
border-bottom: 1px solid var(--border-primary, #d1d5db);
|
|
2718
|
+
margin-bottom: 1rem;
|
|
2719
|
+
}
|
|
2720
|
+
|
|
2721
|
+
.ui-tabs--vertical .ui-tab-list {
|
|
2722
|
+
flex-direction: column;
|
|
2723
|
+
border-bottom: none;
|
|
2724
|
+
border-right: 1px solid var(--border-primary, #d1d5db);
|
|
2725
|
+
margin-bottom: 0;
|
|
2726
|
+
margin-right: 1rem;
|
|
2727
|
+
min-width: 150px;
|
|
2728
|
+
}
|
|
2729
|
+
|
|
2730
|
+
.ui-tabs--enclosed .ui-tab-list {
|
|
2731
|
+
border: 1px solid var(--border-primary, #d1d5db);
|
|
2732
|
+
border-radius: 0.375rem;
|
|
2733
|
+
padding: 0.25rem;
|
|
2734
|
+
background-color: var(--bg-secondary, #f3f4f6);
|
|
2735
|
+
border-bottom: 1px solid var(--border-primary, #d1d5db);
|
|
2736
|
+
}
|
|
2737
|
+
|
|
2738
|
+
.ui-tabs--soft-rounded .ui-tab-list {
|
|
2739
|
+
border-bottom: none;
|
|
2740
|
+
gap: 0.25rem;
|
|
2741
|
+
}
|
|
2742
|
+
|
|
2743
|
+
/* Tab Button */
|
|
2744
|
+
.ui-tab {
|
|
2745
|
+
display: inline-flex;
|
|
2746
|
+
align-items: center;
|
|
2747
|
+
justify-content: center;
|
|
2748
|
+
gap: 0.5rem;
|
|
2749
|
+
padding: 0.5rem 1rem;
|
|
2750
|
+
font-weight: 500;
|
|
2751
|
+
font-size: 0.875rem;
|
|
2752
|
+
color: var(--text-secondary, #6b7280);
|
|
2753
|
+
background-color: transparent;
|
|
2754
|
+
border: none;
|
|
2755
|
+
border-bottom: 2px solid transparent;
|
|
2756
|
+
cursor: pointer;
|
|
2757
|
+
transition: all 0.2s ease-in-out;
|
|
2758
|
+
outline: none;
|
|
2759
|
+
position: relative;
|
|
2760
|
+
white-space: nowrap;
|
|
2761
|
+
font-family: inherit;
|
|
2762
|
+
}
|
|
2763
|
+
|
|
2764
|
+
.ui-tab:hover:not(:disabled) {
|
|
2765
|
+
color: var(--text-primary, #111827);
|
|
2766
|
+
background-color: var(--bg-secondary, #f9fafb);
|
|
2767
|
+
}
|
|
2768
|
+
|
|
2769
|
+
.ui-tab:focus-visible {
|
|
2770
|
+
outline: 2px solid var(--accent-primary, #bb00ed);
|
|
2771
|
+
outline-offset: 2px;
|
|
2772
|
+
border-radius: 0.25rem;
|
|
2773
|
+
}
|
|
2774
|
+
|
|
2775
|
+
.ui-tab--active {
|
|
2776
|
+
color: var(--text-primary, #111827);
|
|
2777
|
+
border-bottom-color: var(--accent-primary, #bb00ed);
|
|
2778
|
+
}
|
|
2779
|
+
|
|
2780
|
+
.ui-tabs--enclosed .ui-tab {
|
|
2781
|
+
border: none;
|
|
2782
|
+
border-radius: 0.25rem;
|
|
2783
|
+
border-bottom: none;
|
|
2784
|
+
}
|
|
2785
|
+
|
|
2786
|
+
.ui-tabs--enclosed .ui-tab--active {
|
|
2787
|
+
background-color: var(--bg-primary, #ffffff);
|
|
2788
|
+
color: var(--text-primary, #111827);
|
|
2789
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
2790
|
+
}
|
|
2791
|
+
|
|
2792
|
+
.ui-tabs--soft-rounded .ui-tab {
|
|
2793
|
+
border: none;
|
|
2794
|
+
border-radius: 0.5rem;
|
|
2795
|
+
border-bottom: none;
|
|
2796
|
+
}
|
|
2797
|
+
|
|
2798
|
+
.ui-tabs--soft-rounded .ui-tab--active {
|
|
2799
|
+
background-color: var(--bg-secondary, #f3f4f6);
|
|
2800
|
+
color: var(--text-primary, #111827);
|
|
2801
|
+
}
|
|
2802
|
+
|
|
2803
|
+
.ui-tabs--vertical .ui-tab {
|
|
2804
|
+
justify-content: flex-start;
|
|
2805
|
+
border-bottom: none;
|
|
2806
|
+
border-right: 2px solid transparent;
|
|
2807
|
+
border-radius: 0;
|
|
2808
|
+
padding-left: 0.75rem;
|
|
2809
|
+
padding-right: 0.75rem;
|
|
2810
|
+
}
|
|
2811
|
+
|
|
2812
|
+
.ui-tabs--vertical .ui-tab--active {
|
|
2813
|
+
border-right-color: var(--accent-primary, #bb00ed);
|
|
2814
|
+
border-bottom-color: transparent;
|
|
2815
|
+
}
|
|
2816
|
+
|
|
2817
|
+
.ui-tab--disabled {
|
|
2818
|
+
opacity: 0.5;
|
|
2819
|
+
cursor: not-allowed;
|
|
2820
|
+
pointer-events: none;
|
|
2821
|
+
}
|
|
2822
|
+
|
|
2823
|
+
/* Color Schemes */
|
|
2824
|
+
.ui-tab--blue.ui-tab--active {
|
|
2825
|
+
border-bottom-color: #3b82f6;
|
|
2826
|
+
color: #3b82f6;
|
|
2827
|
+
}
|
|
2828
|
+
|
|
2829
|
+
.ui-tabs--enclosed .ui-tab--blue.ui-tab--active {
|
|
2830
|
+
background-color: #dbeafe;
|
|
2831
|
+
color: #1e40af;
|
|
2832
|
+
}
|
|
2833
|
+
|
|
2834
|
+
.ui-tabs--soft-rounded .ui-tab--blue.ui-tab--active {
|
|
2835
|
+
background-color: #dbeafe;
|
|
2836
|
+
color: #1e40af;
|
|
2837
|
+
}
|
|
2838
|
+
|
|
2839
|
+
.ui-tabs--vertical .ui-tab--blue.ui-tab--active {
|
|
2840
|
+
border-right-color: #3b82f6;
|
|
2841
|
+
color: #3b82f6;
|
|
2842
|
+
}
|
|
2843
|
+
|
|
2844
|
+
.ui-tab--green.ui-tab--active {
|
|
2845
|
+
border-bottom-color: #10b981;
|
|
2846
|
+
color: #10b981;
|
|
2847
|
+
}
|
|
2848
|
+
|
|
2849
|
+
.ui-tabs--enclosed .ui-tab--green.ui-tab--active {
|
|
2850
|
+
background-color: #d1fae5;
|
|
2851
|
+
color: #065f46;
|
|
2852
|
+
}
|
|
2853
|
+
|
|
2854
|
+
.ui-tabs--soft-rounded .ui-tab--green.ui-tab--active {
|
|
2855
|
+
background-color: #d1fae5;
|
|
2856
|
+
color: #065f46;
|
|
2857
|
+
}
|
|
2858
|
+
|
|
2859
|
+
.ui-tabs--vertical .ui-tab--green.ui-tab--active {
|
|
2860
|
+
border-right-color: #10b981;
|
|
2861
|
+
color: #10b981;
|
|
2862
|
+
}
|
|
2863
|
+
|
|
2864
|
+
.ui-tab--red.ui-tab--active {
|
|
2865
|
+
border-bottom-color: #ef4444;
|
|
2866
|
+
color: #ef4444;
|
|
2867
|
+
}
|
|
2868
|
+
|
|
2869
|
+
.ui-tabs--enclosed .ui-tab--red.ui-tab--active {
|
|
2870
|
+
background-color: #fee2e2;
|
|
2871
|
+
color: #991b1b;
|
|
2872
|
+
}
|
|
2873
|
+
|
|
2874
|
+
.ui-tabs--soft-rounded .ui-tab--red.ui-tab--active {
|
|
2875
|
+
background-color: #fee2e2;
|
|
2876
|
+
color: #991b1b;
|
|
2877
|
+
}
|
|
2878
|
+
|
|
2879
|
+
.ui-tabs--vertical .ui-tab--red.ui-tab--active {
|
|
2880
|
+
border-right-color: #ef4444;
|
|
2881
|
+
color: #ef4444;
|
|
2882
|
+
}
|
|
2883
|
+
|
|
2884
|
+
.ui-tab--yellow.ui-tab--active {
|
|
2885
|
+
border-bottom-color: #f59e0b;
|
|
2886
|
+
color: #f59e0b;
|
|
2887
|
+
}
|
|
2888
|
+
|
|
2889
|
+
.ui-tabs--enclosed .ui-tab--yellow.ui-tab--active {
|
|
2890
|
+
background-color: #fef3c7;
|
|
2891
|
+
color: #92400e;
|
|
2892
|
+
}
|
|
2893
|
+
|
|
2894
|
+
.ui-tabs--soft-rounded .ui-tab--yellow.ui-tab--active {
|
|
2895
|
+
background-color: #fef3c7;
|
|
2896
|
+
color: #92400e;
|
|
2897
|
+
}
|
|
2898
|
+
|
|
2899
|
+
.ui-tabs--vertical .ui-tab--yellow.ui-tab--active {
|
|
2900
|
+
border-right-color: #f59e0b;
|
|
2901
|
+
color: #f59e0b;
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2904
|
+
.ui-tab--purple.ui-tab--active {
|
|
2905
|
+
border-bottom-color: #8b5cf6;
|
|
2906
|
+
color: #8b5cf6;
|
|
2907
|
+
}
|
|
2908
|
+
|
|
2909
|
+
.ui-tabs--enclosed .ui-tab--purple.ui-tab--active {
|
|
2910
|
+
background-color: #ede9fe;
|
|
2911
|
+
color: #5b21b6;
|
|
2912
|
+
}
|
|
2913
|
+
|
|
2914
|
+
.ui-tabs--soft-rounded .ui-tab--purple.ui-tab--active {
|
|
2915
|
+
background-color: #ede9fe;
|
|
2916
|
+
color: #5b21b6;
|
|
2917
|
+
}
|
|
2918
|
+
|
|
2919
|
+
.ui-tabs--vertical .ui-tab--purple.ui-tab--active {
|
|
2920
|
+
border-right-color: #8b5cf6;
|
|
2921
|
+
color: #8b5cf6;
|
|
2922
|
+
}
|
|
2923
|
+
|
|
2924
|
+
.ui-tab--gray.ui-tab--active {
|
|
2925
|
+
border-bottom-color: #6b7280;
|
|
2926
|
+
color: #6b7280;
|
|
2927
|
+
}
|
|
2928
|
+
|
|
2929
|
+
.ui-tabs--enclosed .ui-tab--gray.ui-tab--active {
|
|
2930
|
+
background-color: #f3f4f6;
|
|
2931
|
+
color: #374151;
|
|
2932
|
+
}
|
|
2933
|
+
|
|
2934
|
+
.ui-tabs--soft-rounded .ui-tab--gray.ui-tab--active {
|
|
2935
|
+
background-color: #f3f4f6;
|
|
2936
|
+
color: #374151;
|
|
2937
|
+
}
|
|
2938
|
+
|
|
2939
|
+
.ui-tabs--vertical .ui-tab--gray.ui-tab--active {
|
|
2940
|
+
border-right-color: #6b7280;
|
|
2941
|
+
color: #6b7280;
|
|
2942
|
+
}
|
|
2943
|
+
|
|
2944
|
+
/* Tab Icon */
|
|
2945
|
+
.ui-tab__icon {
|
|
2946
|
+
display: flex;
|
|
2947
|
+
align-items: center;
|
|
2948
|
+
justify-content: center;
|
|
2949
|
+
font-size: 1rem;
|
|
2950
|
+
}
|
|
2951
|
+
|
|
2952
|
+
.ui-tab__label {
|
|
2953
|
+
display: flex;
|
|
2954
|
+
align-items: center;
|
|
2955
|
+
}
|
|
2956
|
+
|
|
2957
|
+
/* Sizes */
|
|
2958
|
+
.ui-tab--sm {
|
|
2959
|
+
padding: 0.375rem 0.75rem;
|
|
2960
|
+
font-size: 0.75rem;
|
|
2961
|
+
min-height: 2rem;
|
|
2962
|
+
}
|
|
2963
|
+
|
|
2964
|
+
.ui-tab--md {
|
|
2965
|
+
padding: 0.5rem 1rem;
|
|
2966
|
+
font-size: 0.875rem;
|
|
2967
|
+
min-height: 2.5rem;
|
|
2968
|
+
}
|
|
2969
|
+
|
|
2970
|
+
.ui-tab--lg {
|
|
2971
|
+
padding: 0.75rem 1.5rem;
|
|
2972
|
+
font-size: 1rem;
|
|
2973
|
+
min-height: 3rem;
|
|
2974
|
+
}
|
|
2975
|
+
|
|
2976
|
+
/* Tab Panels */
|
|
2977
|
+
.ui-tab-panels {
|
|
2978
|
+
width: 100%;
|
|
2979
|
+
}
|
|
2980
|
+
|
|
2981
|
+
/* Tab Panel */
|
|
2982
|
+
.ui-tab-panel {
|
|
2983
|
+
display: none;
|
|
2984
|
+
padding: 1rem 0;
|
|
2985
|
+
animation: fadeIn 0.2s ease-in-out;
|
|
2986
|
+
}
|
|
2987
|
+
|
|
2988
|
+
.ui-tab-panel--active {
|
|
2989
|
+
display: block;
|
|
2990
|
+
}
|
|
2991
|
+
|
|
2992
|
+
@keyframes fadeIn {
|
|
2993
|
+
from {
|
|
2994
|
+
opacity: 0;
|
|
2995
|
+
transform: translateY(4px);
|
|
2996
|
+
}
|
|
2997
|
+
to {
|
|
2998
|
+
opacity: 1;
|
|
2999
|
+
transform: translateY(0);
|
|
3000
|
+
}
|
|
3001
|
+
}
|
|
3002
|
+
|
|
3003
|
+
/* Dark mode support */
|
|
3004
|
+
[data-theme="dark"] .ui-tab-list {
|
|
3005
|
+
border-color: var(--border-primary, #374151);
|
|
3006
|
+
}
|
|
3007
|
+
|
|
3008
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab-list {
|
|
3009
|
+
background-color: var(--bg-secondary, #1f2937);
|
|
3010
|
+
border-color: var(--border-primary, #374151);
|
|
3011
|
+
}
|
|
3012
|
+
|
|
3013
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--active {
|
|
3014
|
+
background-color: var(--bg-primary, #111827);
|
|
3015
|
+
}
|
|
3016
|
+
|
|
3017
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--active {
|
|
3018
|
+
background-color: var(--bg-secondary, #1f2937);
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
[data-theme="dark"] .ui-tab:hover:not(:disabled) {
|
|
3022
|
+
background-color: var(--bg-secondary, #1f2937);
|
|
3023
|
+
}
|
|
3024
|
+
|
|
3025
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--blue.ui-tab--active {
|
|
3026
|
+
background-color: #1e3a8a;
|
|
3027
|
+
color: #93c5fd;
|
|
3028
|
+
}
|
|
3029
|
+
|
|
3030
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--blue.ui-tab--active {
|
|
3031
|
+
background-color: #1e3a8a;
|
|
3032
|
+
color: #93c5fd;
|
|
3033
|
+
}
|
|
3034
|
+
|
|
3035
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--green.ui-tab--active {
|
|
3036
|
+
background-color: #064e3b;
|
|
3037
|
+
color: #6ee7b7;
|
|
3038
|
+
}
|
|
3039
|
+
|
|
3040
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--green.ui-tab--active {
|
|
3041
|
+
background-color: #064e3b;
|
|
3042
|
+
color: #6ee7b7;
|
|
3043
|
+
}
|
|
3044
|
+
|
|
3045
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--red.ui-tab--active {
|
|
3046
|
+
background-color: #7f1d1d;
|
|
3047
|
+
color: #fca5a5;
|
|
3048
|
+
}
|
|
3049
|
+
|
|
3050
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--red.ui-tab--active {
|
|
3051
|
+
background-color: #7f1d1d;
|
|
3052
|
+
color: #fca5a5;
|
|
3053
|
+
}
|
|
3054
|
+
|
|
3055
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--yellow.ui-tab--active {
|
|
3056
|
+
background-color: #78350f;
|
|
3057
|
+
color: #fde68a;
|
|
3058
|
+
}
|
|
3059
|
+
|
|
3060
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--yellow.ui-tab--active {
|
|
3061
|
+
background-color: #78350f;
|
|
3062
|
+
color: #fde68a;
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--purple.ui-tab--active {
|
|
3066
|
+
background-color: #4c1d95;
|
|
3067
|
+
color: #c4b5fd;
|
|
3068
|
+
}
|
|
3069
|
+
|
|
3070
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--purple.ui-tab--active {
|
|
3071
|
+
background-color: #4c1d95;
|
|
3072
|
+
color: #c4b5fd;
|
|
3073
|
+
}
|
|
3074
|
+
|
|
3075
|
+
[data-theme="dark"] .ui-tabs--enclosed .ui-tab--gray.ui-tab--active {
|
|
3076
|
+
background-color: var(--bg-secondary, #1f2937);
|
|
3077
|
+
color: var(--text-primary, #f9fafb);
|
|
3078
|
+
}
|
|
3079
|
+
|
|
3080
|
+
[data-theme="dark"] .ui-tabs--soft-rounded .ui-tab--gray.ui-tab--active {
|
|
3081
|
+
background-color: var(--bg-secondary, #1f2937);
|
|
3082
|
+
color: var(--text-primary, #f9fafb);
|
|
3083
|
+
}
|
|
3084
|
+
|
|
3085
|
+
|
|
2696
3086
|
/* Uiplex Theme Variables */
|
|
2697
3087
|
|
|
2698
3088
|
:root {
|
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ import './CircularProgress/CircularProgress.css';
|
|
|
16
16
|
import './Tooltip/Tooltip.css';
|
|
17
17
|
import './Toast/Toast.css';
|
|
18
18
|
import './Popover/Popover.css';
|
|
19
|
+
import './Tabs/Tabs.css';
|
|
19
20
|
import './Theme/theme.css';
|
|
20
21
|
export { Button } from './Button';
|
|
21
22
|
export type { ButtonProps } from './Button';
|
|
@@ -53,6 +54,8 @@ export { Popover, PopoverContent, PopoverHeader, PopoverBody, PopoverFooter, Pop
|
|
|
53
54
|
export type { PopoverProps, PopoverPlacement, PopoverContentProps, PopoverHeaderProps, PopoverBodyProps, PopoverFooterProps, PopoverCloseButtonProps, } from './Popover';
|
|
54
55
|
export { Toast, ToastComponent, ToastContainer, ToastContainerGlobal } from './Toast';
|
|
55
56
|
export type { ToastProps, ToastVariant, ToastPosition, ToastContainerProps, ToastOptions } from './Toast';
|
|
57
|
+
export { Tabs, TabList, Tab, TabPanels, TabPanel } from './Tabs';
|
|
58
|
+
export type { TabsProps, TabListProps, TabProps, TabPanelsProps, TabPanelProps } from './Tabs';
|
|
56
59
|
export { useDisclosure } from './hooks';
|
|
57
60
|
export type { UseDisclosureReturn } from './hooks';
|
|
58
61
|
export { useOutsideClick } from './hooks';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1066,6 +1066,126 @@ const ToastContainerGlobal = () => {
|
|
|
1066
1066
|
return (jsx(Fragment, { children: positionsWithToasts.map((position) => (jsx(ToastContainer, { toasts: toastsByPosition[position], position: position, onClose: handleClose }, position))) }));
|
|
1067
1067
|
};
|
|
1068
1068
|
|
|
1069
|
+
const TabContext = createContext(undefined);
|
|
1070
|
+
const useTabContext = () => {
|
|
1071
|
+
const context = useContext(TabContext);
|
|
1072
|
+
if (!context) {
|
|
1073
|
+
throw new Error("Tab components must be used within a Tabs component");
|
|
1074
|
+
}
|
|
1075
|
+
return context;
|
|
1076
|
+
};
|
|
1077
|
+
const Tabs = ({ children, defaultIndex = 0, index: controlledIndex, onChange, variant = "line", size = "md", colorScheme = "blue", orientation = "horizontal", className = "", style, }) => {
|
|
1078
|
+
const [uncontrolledIndex, setUncontrolledIndex] = useState(defaultIndex);
|
|
1079
|
+
const isControlled = controlledIndex !== undefined;
|
|
1080
|
+
const activeIndex = isControlled ? controlledIndex : uncontrolledIndex;
|
|
1081
|
+
const setActiveIndex = useCallback((newIndex) => {
|
|
1082
|
+
if (!isControlled) {
|
|
1083
|
+
setUncontrolledIndex(newIndex);
|
|
1084
|
+
}
|
|
1085
|
+
onChange?.(newIndex);
|
|
1086
|
+
}, [isControlled, onChange]);
|
|
1087
|
+
const contextValue = {
|
|
1088
|
+
activeIndex,
|
|
1089
|
+
setActiveIndex,
|
|
1090
|
+
variant,
|
|
1091
|
+
size,
|
|
1092
|
+
colorScheme,
|
|
1093
|
+
orientation,
|
|
1094
|
+
};
|
|
1095
|
+
const tabsClasses = [
|
|
1096
|
+
"ui-tabs",
|
|
1097
|
+
`ui-tabs--${orientation}`,
|
|
1098
|
+
`ui-tabs--${variant}`,
|
|
1099
|
+
className,
|
|
1100
|
+
]
|
|
1101
|
+
.filter(Boolean)
|
|
1102
|
+
.join(" ");
|
|
1103
|
+
return (jsx(TabContext.Provider, { value: contextValue, children: jsx("div", { className: tabsClasses, style: style, role: "tablist", children: children }) }));
|
|
1104
|
+
};
|
|
1105
|
+
const TabList = ({ children, className = "", style, }) => {
|
|
1106
|
+
const { orientation } = useTabContext();
|
|
1107
|
+
const tabListClasses = [
|
|
1108
|
+
"ui-tab-list",
|
|
1109
|
+
`ui-tab-list--${orientation}`,
|
|
1110
|
+
className,
|
|
1111
|
+
]
|
|
1112
|
+
.filter(Boolean)
|
|
1113
|
+
.join(" ");
|
|
1114
|
+
return (jsx("div", { className: tabListClasses, style: style, role: "tablist", children: children }));
|
|
1115
|
+
};
|
|
1116
|
+
const Tab = ({ children, index = 0, disabled = false, icon, className = "", style, }) => {
|
|
1117
|
+
const { activeIndex, setActiveIndex, variant, size, colorScheme } = useTabContext();
|
|
1118
|
+
const tabRef = useRef(null);
|
|
1119
|
+
const isActive = activeIndex === index;
|
|
1120
|
+
const handleClick = () => {
|
|
1121
|
+
if (!disabled) {
|
|
1122
|
+
setActiveIndex(index);
|
|
1123
|
+
}
|
|
1124
|
+
};
|
|
1125
|
+
const handleKeyDown = (e) => {
|
|
1126
|
+
if (disabled)
|
|
1127
|
+
return;
|
|
1128
|
+
const tabs = Array.from(document.querySelectorAll(`.ui-tab-list [role="tab"]:not([aria-disabled="true"])`));
|
|
1129
|
+
const currentTabIndex = tabs.findIndex((tab) => tab === tabRef.current);
|
|
1130
|
+
let nextIndex = currentTabIndex;
|
|
1131
|
+
switch (e.key) {
|
|
1132
|
+
case "ArrowRight":
|
|
1133
|
+
case "ArrowDown":
|
|
1134
|
+
e.preventDefault();
|
|
1135
|
+
nextIndex = (currentTabIndex + 1) % tabs.length;
|
|
1136
|
+
break;
|
|
1137
|
+
case "ArrowLeft":
|
|
1138
|
+
case "ArrowUp":
|
|
1139
|
+
e.preventDefault();
|
|
1140
|
+
nextIndex = currentTabIndex - 1 < 0 ? tabs.length - 1 : currentTabIndex - 1;
|
|
1141
|
+
break;
|
|
1142
|
+
case "Home":
|
|
1143
|
+
e.preventDefault();
|
|
1144
|
+
nextIndex = 0;
|
|
1145
|
+
break;
|
|
1146
|
+
case "End":
|
|
1147
|
+
e.preventDefault();
|
|
1148
|
+
nextIndex = tabs.length - 1;
|
|
1149
|
+
break;
|
|
1150
|
+
default:
|
|
1151
|
+
return;
|
|
1152
|
+
}
|
|
1153
|
+
const nextTab = tabs[nextIndex];
|
|
1154
|
+
if (nextTab) {
|
|
1155
|
+
const tabIndex = parseInt(nextTab.getAttribute("data-tab-index") || "0", 10);
|
|
1156
|
+
setActiveIndex(tabIndex);
|
|
1157
|
+
nextTab.focus();
|
|
1158
|
+
}
|
|
1159
|
+
};
|
|
1160
|
+
const tabClasses = [
|
|
1161
|
+
"ui-tab",
|
|
1162
|
+
`ui-tab--${variant}`,
|
|
1163
|
+
`ui-tab--${size}`,
|
|
1164
|
+
`ui-tab--${colorScheme}`,
|
|
1165
|
+
isActive && "ui-tab--active",
|
|
1166
|
+
disabled && "ui-tab--disabled",
|
|
1167
|
+
className,
|
|
1168
|
+
]
|
|
1169
|
+
.filter(Boolean)
|
|
1170
|
+
.join(" ");
|
|
1171
|
+
return (jsxs("button", { ref: tabRef, role: "tab", "aria-selected": isActive, "aria-disabled": disabled, "aria-controls": `tabpanel-${index}`, id: `tab-${index}`, "data-tab-index": index, tabIndex: isActive ? 0 : -1, className: tabClasses, onClick: handleClick, onKeyDown: handleKeyDown, disabled: disabled, style: style, children: [icon && jsx("span", { className: "ui-tab__icon", children: icon }), jsx("span", { className: "ui-tab__label", children: children })] }));
|
|
1172
|
+
};
|
|
1173
|
+
const TabPanels = ({ children, className = "", style, }) => {
|
|
1174
|
+
return (jsx("div", { className: `ui-tab-panels ${className}`, style: style, children: children }));
|
|
1175
|
+
};
|
|
1176
|
+
const TabPanel = ({ children, index = 0, className = "", style, }) => {
|
|
1177
|
+
const { activeIndex } = useTabContext();
|
|
1178
|
+
const isActive = activeIndex === index;
|
|
1179
|
+
const tabPanelClasses = [
|
|
1180
|
+
"ui-tab-panel",
|
|
1181
|
+
isActive && "ui-tab-panel--active",
|
|
1182
|
+
className,
|
|
1183
|
+
]
|
|
1184
|
+
.filter(Boolean)
|
|
1185
|
+
.join(" ");
|
|
1186
|
+
return (jsx("div", { role: "tabpanel", id: `tabpanel-${index}`, "aria-labelledby": `tab-${index}`, hidden: !isActive, className: tabPanelClasses, style: style, children: children }));
|
|
1187
|
+
};
|
|
1188
|
+
|
|
1069
1189
|
const useDisclosure = (defaultIsOpen = false) => {
|
|
1070
1190
|
const [isOpen, setIsOpen] = useState(defaultIsOpen);
|
|
1071
1191
|
const onOpen = useCallback(() => {
|
|
@@ -1277,4 +1397,4 @@ const ThemeScript = ({ storageKey = "uiplex-theme", defaultTheme = "system" }) =
|
|
|
1277
1397
|
} }));
|
|
1278
1398
|
};
|
|
1279
1399
|
|
|
1280
|
-
export { Box, Button, CircularProgress, CircularProgressLabel, Flex, FormControl, FormErrorMessage, FormLabel, Grid, IconButton, Input, Link, Loader, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Popover, PopoverBody, PopoverCloseButton, PopoverContent, PopoverFooter, PopoverHeader, Radio, RadioGroup, Select, Text, Textarea, ThemeProvider, ThemeScript, ThemeToggle, ToastStatic as Toast, Toast as ToastComponent, ToastContainer, ToastContainerGlobal, Tooltip, useDisclosure, useOutsideClick, useTheme };
|
|
1400
|
+
export { Box, Button, CircularProgress, CircularProgressLabel, Flex, FormControl, FormErrorMessage, FormLabel, Grid, IconButton, Input, Link, Loader, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Popover, PopoverBody, PopoverCloseButton, PopoverContent, PopoverFooter, PopoverHeader, Radio, RadioGroup, Select, Tab, TabList, TabPanel, TabPanels, Tabs, Text, Textarea, ThemeProvider, ThemeScript, ThemeToggle, ToastStatic as Toast, Toast as ToastComponent, ToastContainer, ToastContainerGlobal, Tooltip, useDisclosure, useOutsideClick, useTheme };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uiplex",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A modern React component library with TypeScript support, featuring Button, Loader, Radio components and a comprehensive theme system",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|