dash-ui-kit 1.0.93 → 2.0.0-dev
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/README.md +52 -0
- package/dist/react/components/accordion/index.cjs.js +193 -0
- package/dist/react/components/accordion/index.cjs.js.map +1 -0
- package/dist/react/components/accordion/index.esm.js +169 -0
- package/dist/react/components/accordion/index.esm.js.map +1 -0
- package/dist/react/components/avatar/index.cjs.js +39 -0
- package/dist/react/components/avatar/index.cjs.js.map +1 -0
- package/dist/react/components/avatar/index.esm.js +34 -0
- package/dist/react/components/avatar/index.esm.js.map +1 -0
- package/dist/react/components/badge/index.cjs.js +92 -0
- package/dist/react/components/badge/index.cjs.js.map +1 -0
- package/dist/react/components/badge/index.esm.js +87 -0
- package/dist/react/components/badge/index.esm.js.map +1 -0
- package/dist/react/components/bigNumber/index.cjs.js +100 -0
- package/dist/react/components/bigNumber/index.cjs.js.map +1 -0
- package/dist/react/components/bigNumber/index.esm.js +95 -0
- package/dist/react/components/bigNumber/index.esm.js.map +1 -0
- package/dist/react/components/button/index.cjs.js +535 -0
- package/dist/react/components/button/index.cjs.js.map +1 -0
- package/dist/react/components/button/index.d.ts +3 -1
- package/dist/react/components/button/index.esm.js +530 -0
- package/dist/react/components/button/index.esm.js.map +1 -0
- package/dist/react/components/copyButton/index.cjs.js +95 -0
- package/dist/react/components/copyButton/index.cjs.js.map +1 -0
- package/dist/react/components/copyButton/index.esm.js +71 -0
- package/dist/react/components/copyButton/index.esm.js.map +1 -0
- package/dist/react/components/dashLogo/index.cjs.js +74 -0
- package/dist/react/components/dashLogo/index.cjs.js.map +1 -0
- package/dist/react/components/dashLogo/index.esm.js +69 -0
- package/dist/react/components/dashLogo/index.esm.js.map +1 -0
- package/dist/react/components/dateBlock/index.cjs.js +120 -0
- package/dist/react/components/dateBlock/index.cjs.js.map +1 -0
- package/dist/react/components/dateBlock/index.esm.js +115 -0
- package/dist/react/components/dateBlock/index.esm.js.map +1 -0
- package/dist/react/components/dialog/index.cjs.js +292 -0
- package/dist/react/components/dialog/index.cjs.js.map +1 -0
- package/dist/react/components/dialog/index.esm.js +270 -0
- package/dist/react/components/dialog/index.esm.js.map +1 -0
- package/dist/react/components/heading/index.cjs.js +60 -0
- package/dist/react/components/heading/index.cjs.js.map +1 -0
- package/dist/react/components/heading/index.esm.js +58 -0
- package/dist/react/components/heading/index.esm.js.map +1 -0
- package/dist/react/components/icons/index.cjs.js +1173 -0
- package/dist/react/components/icons/index.cjs.js.map +1 -0
- package/dist/react/components/icons/index.d.ts +2 -0
- package/dist/react/components/icons/index.esm.js +1128 -0
- package/dist/react/components/icons/index.esm.js.map +1 -0
- package/dist/react/components/identifier/index.cjs.js +286 -0
- package/dist/react/components/identifier/index.cjs.js.map +1 -0
- package/dist/react/components/identifier/index.esm.js +282 -0
- package/dist/react/components/identifier/index.esm.js.map +1 -0
- package/dist/react/components/index.cjs.js +101 -0
- package/dist/react/components/index.cjs.js.map +1 -0
- package/dist/react/components/index.d.ts +1 -1
- package/dist/react/components/index.esm.js +29 -0
- package/dist/react/components/index.esm.js.map +1 -0
- package/dist/react/components/input/index.cjs.js +237 -0
- package/dist/react/components/input/index.cjs.js.map +1 -0
- package/dist/react/components/input/index.esm.js +232 -0
- package/dist/react/components/input/index.esm.js.map +1 -0
- package/dist/react/components/list/index.cjs.js +49 -0
- package/dist/react/components/list/index.cjs.js.map +1 -0
- package/dist/react/components/list/index.esm.js +47 -0
- package/dist/react/components/list/index.esm.js.map +1 -0
- package/dist/react/components/notActive/index.cjs.js +40 -0
- package/dist/react/components/notActive/index.cjs.js.map +1 -0
- package/dist/react/components/notActive/index.esm.js +38 -0
- package/dist/react/components/notActive/index.esm.js.map +1 -0
- package/dist/react/components/overlayMenu/index.cjs.js +425 -0
- package/dist/react/components/overlayMenu/index.cjs.js.map +1 -0
- package/dist/react/components/overlayMenu/index.esm.js +420 -0
- package/dist/react/components/overlayMenu/index.esm.js.map +1 -0
- package/dist/react/components/overlaySelect/index.cjs.js +345 -0
- package/dist/react/components/overlaySelect/index.cjs.js.map +1 -0
- package/dist/react/components/overlaySelect/index.esm.js +340 -0
- package/dist/react/components/overlaySelect/index.esm.js.map +1 -0
- package/dist/react/components/progressStepBar/index.cjs.js +49 -0
- package/dist/react/components/progressStepBar/index.cjs.js.map +1 -0
- package/dist/react/components/progressStepBar/index.d.ts +2 -1
- package/dist/react/components/progressStepBar/index.esm.js +47 -0
- package/dist/react/components/progressStepBar/index.esm.js.map +1 -0
- package/dist/react/components/select/index.cjs.js +236 -0
- package/dist/react/components/select/index.cjs.js.map +1 -0
- package/dist/react/components/select/index.esm.js +212 -0
- package/dist/react/components/select/index.esm.js.map +1 -0
- package/dist/react/components/switch/index.cjs.js +184 -0
- package/dist/react/components/switch/index.cjs.js.map +1 -0
- package/dist/react/components/switch/index.esm.js +179 -0
- package/dist/react/components/switch/index.esm.js.map +1 -0
- package/dist/react/components/tabs/index.cjs.js +178 -0
- package/dist/react/components/tabs/index.cjs.js.map +1 -0
- package/dist/react/components/tabs/index.esm.js +154 -0
- package/dist/react/components/tabs/index.esm.js.map +1 -0
- package/dist/react/components/text/index.cjs.js +120 -0
- package/dist/react/components/text/index.cjs.js.map +1 -0
- package/dist/react/components/text/index.esm.js +115 -0
- package/dist/react/components/text/index.esm.js.map +1 -0
- package/dist/react/components/textarea/index.cjs.js +256 -0
- package/dist/react/components/textarea/index.cjs.js.map +1 -0
- package/dist/react/components/textarea/index.esm.js +251 -0
- package/dist/react/components/textarea/index.esm.js.map +1 -0
- package/dist/react/components/timeDelta/index.cjs.js +93 -0
- package/dist/react/components/timeDelta/index.cjs.js.map +1 -0
- package/dist/react/components/timeDelta/index.d.ts +1 -1
- package/dist/react/components/timeDelta/index.esm.js +88 -0
- package/dist/react/components/timeDelta/index.esm.js.map +1 -0
- package/dist/react/components/transactionStatusIcon/index.cjs.js +59 -0
- package/dist/react/components/transactionStatusIcon/index.cjs.js.map +1 -0
- package/dist/react/components/transactionStatusIcon/index.esm.js +54 -0
- package/dist/react/components/transactionStatusIcon/index.esm.js.map +1 -0
- package/dist/react/components/valueCard/index.cjs.js +176 -0
- package/dist/react/components/valueCard/index.cjs.js.map +1 -0
- package/dist/react/components/valueCard/index.d.ts +1 -1
- package/dist/react/components/valueCard/index.esm.js +171 -0
- package/dist/react/components/valueCard/index.esm.js.map +1 -0
- package/dist/react/contexts/ThemeContext.cjs.js +79 -0
- package/dist/react/contexts/ThemeContext.cjs.js.map +1 -0
- package/dist/react/contexts/ThemeContext.esm.js +76 -0
- package/dist/react/contexts/ThemeContext.esm.js.map +1 -0
- package/dist/react/contexts/index.cjs.js +11 -0
- package/dist/react/contexts/index.cjs.js.map +1 -0
- package/dist/react/contexts/index.esm.js +4 -0
- package/dist/react/contexts/index.esm.js.map +1 -0
- package/dist/react/hooks/useDebounce.cjs.js +83 -0
- package/dist/react/hooks/useDebounce.cjs.js.map +1 -0
- package/dist/react/hooks/useDebounce.esm.js +78 -0
- package/dist/react/hooks/useDebounce.esm.js.map +1 -0
- package/dist/react/index.cjs.js +99 -12811
- package/dist/react/index.cjs.js.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.esm.js +27 -12725
- package/dist/react/index.esm.js.map +1 -1
- package/dist/react/shared/utils/datetime.cjs.js +59 -0
- package/dist/react/shared/utils/datetime.cjs.js.map +1 -0
- package/dist/react/shared/utils/datetime.esm.js +57 -0
- package/dist/react/shared/utils/datetime.esm.js.map +1 -0
- package/dist/react/utils/copyToClipboard.cjs.js +31 -0
- package/dist/react/utils/copyToClipboard.cjs.js.map +1 -0
- package/dist/react/utils/copyToClipboard.esm.js +26 -0
- package/dist/react/utils/copyToClipboard.esm.js.map +1 -0
- package/dist/react/utils/index.d.ts +1 -1
- package/dist/react-native/components/avatar/index.d.ts +26 -0
- package/dist/react-native/components/avatar/index.web.d.ts +24 -0
- package/dist/react-native/components/badge/index.d.ts +51 -0
- package/dist/react-native/components/bigNumber/index.d.ts +26 -0
- package/dist/react-native/components/button/index.d.ts +39 -0
- package/dist/react-native/components/copyButton/index.d.ts +22 -0
- package/dist/react-native/components/copyButton/index.web.d.ts +20 -0
- package/dist/react-native/components/dashLogo/index.d.ts +30 -0
- package/dist/react-native/components/heading/index.d.ts +25 -0
- package/dist/react-native/components/icons/index.d.ts +43 -0
- package/dist/react-native/components/identifier/index.d.ts +47 -0
- package/dist/react-native/components/index.d.ts +15 -0
- package/dist/react-native/components/input/index.d.ts +53 -0
- package/dist/react-native/components/notActive/index.d.ts +16 -0
- package/dist/react-native/components/tabs/index.d.ts +50 -0
- package/dist/react-native/components/text/index.d.ts +28 -0
- package/dist/react-native/components/transactionStatusIcon/index.d.ts +24 -0
- package/dist/react-native/components/valueCard/index.d.ts +43 -0
- package/dist/react-native/hooks/index.d.ts +1 -0
- package/dist/react-native/hooks/useDebounce.d.ts +43 -0
- package/dist/react-native/index.cjs.js +2856 -0
- package/dist/react-native/index.cjs.js.map +1 -0
- package/dist/react-native/index.d.ts +4 -0
- package/dist/react-native/index.esm.js +2808 -0
- package/dist/react-native/index.esm.js.map +1 -0
- package/dist/react-native/styles/index.d.ts +11 -0
- package/dist/react-native/styles/tokens.d.ts +308 -0
- package/dist/react-native/styles/utils.d.ts +65 -0
- package/dist/react-native/utils/clipboard.d.ts +27 -0
- package/dist/react-native/utils/index.d.ts +2 -0
- package/dist/react-native/utils/tw.d.ts +7 -0
- package/dist/shared/constants/colors.d.ts +25 -0
- package/dist/shared/constants/index.d.ts +2 -0
- package/dist/shared/constants/sizes.d.ts +49 -0
- package/dist/shared/index.cjs.js +171 -0
- package/dist/shared/index.cjs.js.map +1 -0
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.esm.js +161 -0
- package/dist/shared/index.esm.js.map +1 -0
- package/dist/shared/types/common.d.ts +33 -0
- package/dist/shared/types/index.d.ts +1 -0
- package/dist/shared/utils/index.d.ts +1 -0
- package/dist/styles.css +1 -1
- package/package.json +50 -8
- /package/dist/{react → shared}/utils/datetime.d.ts +0 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
6
|
+
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
9
|
+
var ThemeContext = require('../../contexts/ThemeContext.cjs.js');
|
|
10
|
+
|
|
11
|
+
const switchContainer = classVarianceAuthority.cva('flex transition-all duration-200 font-inter gap-2', {
|
|
12
|
+
variants: {
|
|
13
|
+
theme: {
|
|
14
|
+
light: 'bg-white border border-gray-100',
|
|
15
|
+
dark: 'bg-dash-primary-dark-blue/10 outline outline-1 outline-white/15 outline-offset-[-1px]'
|
|
16
|
+
},
|
|
17
|
+
size: {
|
|
18
|
+
sm: 'p-1 rounded-xl',
|
|
19
|
+
md: 'p-2 rounded-2xl',
|
|
20
|
+
xl: 'p-3 rounded-3xl'
|
|
21
|
+
},
|
|
22
|
+
disabled: {
|
|
23
|
+
false: '',
|
|
24
|
+
true: 'opacity-60 cursor-not-allowed'
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
compoundVariants: [
|
|
28
|
+
// Light theme shadows
|
|
29
|
+
{
|
|
30
|
+
theme: 'light',
|
|
31
|
+
size: 'sm',
|
|
32
|
+
class: 'shadow-sm'
|
|
33
|
+
}, {
|
|
34
|
+
theme: 'light',
|
|
35
|
+
size: 'md',
|
|
36
|
+
class: 'shadow-lg'
|
|
37
|
+
}, {
|
|
38
|
+
theme: 'light',
|
|
39
|
+
size: 'xl',
|
|
40
|
+
class: 'shadow-xl'
|
|
41
|
+
},
|
|
42
|
+
// Dark theme shadows with brand color
|
|
43
|
+
{
|
|
44
|
+
theme: 'dark',
|
|
45
|
+
size: 'sm',
|
|
46
|
+
class: 'shadow-sm shadow-dash-brand/10'
|
|
47
|
+
}, {
|
|
48
|
+
theme: 'dark',
|
|
49
|
+
size: 'md',
|
|
50
|
+
class: 'shadow-lg shadow-dash-brand/10'
|
|
51
|
+
}, {
|
|
52
|
+
theme: 'dark',
|
|
53
|
+
size: 'xl',
|
|
54
|
+
class: 'shadow-xl shadow-dash-brand/10'
|
|
55
|
+
}],
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
theme: 'light',
|
|
58
|
+
size: 'md',
|
|
59
|
+
disabled: false
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
const switchButton = classVarianceAuthority.cva('flex-1 text-center transition-all duration-200 font-medium whitespace-nowrap cursor-pointer font-dash-main', {
|
|
63
|
+
variants: {
|
|
64
|
+
theme: {
|
|
65
|
+
light: '',
|
|
66
|
+
dark: ''
|
|
67
|
+
},
|
|
68
|
+
size: {
|
|
69
|
+
sm: 'py-1 px-2 rounded-lg text-sm',
|
|
70
|
+
md: 'py-2 px-3 rounded-[0.625rem] text-[1rem]',
|
|
71
|
+
xl: 'py-3 px-6 rounded-2xl text-lg font-semibold'
|
|
72
|
+
},
|
|
73
|
+
selected: {
|
|
74
|
+
true: '',
|
|
75
|
+
false: ''
|
|
76
|
+
},
|
|
77
|
+
disabled: {
|
|
78
|
+
false: '',
|
|
79
|
+
true: 'cursor-not-allowed opacity-50'
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
compoundVariants: [
|
|
83
|
+
// Selected state - light theme
|
|
84
|
+
{
|
|
85
|
+
theme: 'light',
|
|
86
|
+
selected: true,
|
|
87
|
+
class: 'bg-dash-brand text-white'
|
|
88
|
+
},
|
|
89
|
+
// Selected state - dark theme
|
|
90
|
+
{
|
|
91
|
+
theme: 'dark',
|
|
92
|
+
selected: true,
|
|
93
|
+
class: 'bg-dash-brand text-white'
|
|
94
|
+
},
|
|
95
|
+
// Unselected state - light theme
|
|
96
|
+
{
|
|
97
|
+
theme: 'light',
|
|
98
|
+
selected: false,
|
|
99
|
+
disabled: false,
|
|
100
|
+
class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'
|
|
101
|
+
},
|
|
102
|
+
// Unselected state - dark theme
|
|
103
|
+
{
|
|
104
|
+
theme: 'dark',
|
|
105
|
+
selected: false,
|
|
106
|
+
disabled: false,
|
|
107
|
+
class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'
|
|
108
|
+
},
|
|
109
|
+
// Disabled state - light theme
|
|
110
|
+
{
|
|
111
|
+
theme: 'light',
|
|
112
|
+
selected: false,
|
|
113
|
+
disabled: true,
|
|
114
|
+
class: 'text-gray-400'
|
|
115
|
+
},
|
|
116
|
+
// Disabled state - dark theme
|
|
117
|
+
{
|
|
118
|
+
theme: 'dark',
|
|
119
|
+
selected: false,
|
|
120
|
+
disabled: true,
|
|
121
|
+
class: 'text-gray-500'
|
|
122
|
+
}],
|
|
123
|
+
defaultVariants: {
|
|
124
|
+
theme: 'light',
|
|
125
|
+
size: 'md',
|
|
126
|
+
selected: false,
|
|
127
|
+
disabled: false
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
/**
|
|
131
|
+
* A switch component for selecting between multiple options.
|
|
132
|
+
* Supports individual option disabling, hover states, and responsive sizing.
|
|
133
|
+
* Uses dash design system sizing and theming with automatic light/dark mode.
|
|
134
|
+
* @example
|
|
135
|
+
* // With disabled options
|
|
136
|
+
* <Switch
|
|
137
|
+
* options={[
|
|
138
|
+
* { label: 'Basic', value: 'basic' },
|
|
139
|
+
* { label: 'Pro', value: 'pro', disabled: true },
|
|
140
|
+
* { label: 'Free', value: 'free' }
|
|
141
|
+
* ]}
|
|
142
|
+
* value="basic"
|
|
143
|
+
* onChange={(value) => console.log(value)}
|
|
144
|
+
* />
|
|
145
|
+
*/
|
|
146
|
+
function Switch({
|
|
147
|
+
options,
|
|
148
|
+
value,
|
|
149
|
+
onChange,
|
|
150
|
+
size = 'md',
|
|
151
|
+
className = '',
|
|
152
|
+
disabled = false
|
|
153
|
+
}) {
|
|
154
|
+
const {
|
|
155
|
+
theme
|
|
156
|
+
} = ThemeContext.useTheme();
|
|
157
|
+
const containerClasses = switchContainer({
|
|
158
|
+
theme,
|
|
159
|
+
size,
|
|
160
|
+
disabled
|
|
161
|
+
}) + ' ' + className;
|
|
162
|
+
return jsxRuntime.jsx("div", {
|
|
163
|
+
className: containerClasses,
|
|
164
|
+
children: options.map((option, index) => {
|
|
165
|
+
const isSelected = option.value === value;
|
|
166
|
+
const isOptionDisabled = disabled || option.disabled;
|
|
167
|
+
return jsxRuntime.jsx("button", {
|
|
168
|
+
onClick: () => !isOptionDisabled && onChange(option.value),
|
|
169
|
+
disabled: isOptionDisabled,
|
|
170
|
+
className: switchButton({
|
|
171
|
+
theme,
|
|
172
|
+
size,
|
|
173
|
+
selected: isSelected,
|
|
174
|
+
disabled: isOptionDisabled
|
|
175
|
+
}),
|
|
176
|
+
children: option.label
|
|
177
|
+
}, index);
|
|
178
|
+
})
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
exports.Switch = Switch;
|
|
183
|
+
exports.default = Switch;
|
|
184
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../../src/react/components/switch/index.tsx"],"sourcesContent":["import React from 'react'\nimport { cva, VariantProps } from 'class-variance-authority'\nimport { useTheme } from '../../contexts/ThemeContext'\n\nconst switchContainer = cva(\n 'flex transition-all duration-200 font-inter gap-2',\n {\n variants: {\n theme: {\n light: 'bg-white border border-gray-100',\n dark: 'bg-dash-primary-dark-blue/10 outline outline-1 outline-white/15 outline-offset-[-1px]'\n },\n size: {\n sm: 'p-1 rounded-xl',\n md: 'p-2 rounded-2xl',\n xl: 'p-3 rounded-3xl'\n },\n disabled: {\n false: '',\n true: 'opacity-60 cursor-not-allowed'\n }\n },\n compoundVariants: [\n // Light theme shadows\n {\n theme: 'light',\n size: 'sm',\n class: 'shadow-sm'\n },\n {\n theme: 'light',\n size: 'md',\n class: 'shadow-lg'\n },\n {\n theme: 'light',\n size: 'xl',\n class: 'shadow-xl'\n },\n // Dark theme shadows with brand color\n {\n theme: 'dark',\n size: 'sm',\n class: 'shadow-sm shadow-dash-brand/10'\n },\n {\n theme: 'dark',\n size: 'md',\n class: 'shadow-lg shadow-dash-brand/10'\n },\n {\n theme: 'dark',\n size: 'xl',\n class: 'shadow-xl shadow-dash-brand/10'\n }\n ],\n defaultVariants: {\n theme: 'light',\n size: 'md',\n disabled: false\n }\n }\n)\n\nconst switchButton = cva(\n 'flex-1 text-center transition-all duration-200 font-medium whitespace-nowrap cursor-pointer font-dash-main',\n {\n variants: {\n theme: {\n light: '',\n dark: ''\n },\n size: {\n sm: 'py-1 px-2 rounded-lg text-sm',\n md: 'py-2 px-3 rounded-[0.625rem] text-[1rem]',\n xl: 'py-3 px-6 rounded-2xl text-lg font-semibold'\n },\n selected: {\n true: '',\n false: ''\n },\n disabled: {\n false: '',\n true: 'cursor-not-allowed opacity-50'\n }\n },\n compoundVariants: [\n // Selected state - light theme\n {\n theme: 'light',\n selected: true,\n class: 'bg-dash-brand text-white'\n },\n // Selected state - dark theme\n {\n theme: 'dark',\n selected: true,\n class: 'bg-dash-brand text-white'\n },\n // Unselected state - light theme\n {\n theme: 'light',\n selected: false,\n disabled: false,\n class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'\n },\n // Unselected state - dark theme\n {\n theme: 'dark',\n selected: false,\n disabled: false,\n class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'\n },\n // Disabled state - light theme\n {\n theme: 'light',\n selected: false,\n disabled: true,\n class: 'text-gray-400'\n },\n // Disabled state - dark theme\n {\n theme: 'dark',\n selected: false,\n disabled: true,\n class: 'text-gray-500'\n }\n ],\n defaultVariants: {\n theme: 'light',\n size: 'md',\n selected: false,\n disabled: false\n }\n }\n)\n\ntype SwitchVariants = VariantProps<typeof switchContainer>\n\n/**\n * Configuration object for a single switch option.\n * \n * @template T - The type of the value (string or number)\n */\nexport interface SwitchOption<T = string | number> {\n /** Display text for the option */\n label: string\n /** Unique value for the option */\n value: T\n /** Whether this specific option is disabled */\n disabled?: boolean\n}\n\n/**\n * Props for the Switch component.\n * \n * @template T - The type of the option values (string or number)\n */\nexport interface SwitchProps<T = string | number> extends Omit<SwitchVariants, 'theme' | 'disabled'> {\n /** Array of options to display */\n options: SwitchOption<T>[]\n /** Currently selected value */\n value: T\n /** Callback when selection changes */\n onChange: (value: T) => void\n /** Additional CSS classes */\n className?: string\n /** Whether the entire switch is disabled */\n disabled?: boolean\n}\n\n/**\n * A switch component for selecting between multiple options.\n * Supports individual option disabling, hover states, and responsive sizing.\n * Uses dash design system sizing and theming with automatic light/dark mode.\n * @example\n * // With disabled options\n * <Switch\n * options={[\n * { label: 'Basic', value: 'basic' },\n * { label: 'Pro', value: 'pro', disabled: true },\n * { label: 'Free', value: 'free' }\n * ]}\n * value=\"basic\"\n * onChange={(value) => console.log(value)}\n * />\n */\nexport function Switch<T = string | number>({\n options,\n value,\n onChange,\n size = 'md',\n className = '',\n disabled = false\n}: SwitchProps<T>): React.JSX.Element {\n const { theme } = useTheme()\n\n const containerClasses = switchContainer({\n theme,\n size,\n disabled\n }) + ' ' + className\n\n return (\n <div className={containerClasses}>\n {options.map((option, index) => {\n const isSelected = option.value === value\n const isOptionDisabled = disabled || option.disabled\n\n return (\n <button\n key={index}\n onClick={() => !isOptionDisabled && onChange(option.value)}\n disabled={isOptionDisabled}\n className={switchButton({\n theme,\n size,\n selected: isSelected,\n disabled: isOptionDisabled\n })}\n >\n {option.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport default Switch "],"names":["switchContainer","cva","variants","theme","light","dark","size","sm","md","xl","disabled","false","true","compoundVariants","class","defaultVariants","switchButton","selected","Switch","options","value","onChange","className","useTheme","containerClasses","_jsx","children","map","option","index","isSelected","isOptionDisabled","onClick","label"],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { useTheme } from '../../contexts/ThemeContext.esm.js';
|
|
6
|
+
|
|
7
|
+
const switchContainer = cva('flex transition-all duration-200 font-inter gap-2', {
|
|
8
|
+
variants: {
|
|
9
|
+
theme: {
|
|
10
|
+
light: 'bg-white border border-gray-100',
|
|
11
|
+
dark: 'bg-dash-primary-dark-blue/10 outline outline-1 outline-white/15 outline-offset-[-1px]'
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
sm: 'p-1 rounded-xl',
|
|
15
|
+
md: 'p-2 rounded-2xl',
|
|
16
|
+
xl: 'p-3 rounded-3xl'
|
|
17
|
+
},
|
|
18
|
+
disabled: {
|
|
19
|
+
false: '',
|
|
20
|
+
true: 'opacity-60 cursor-not-allowed'
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
compoundVariants: [
|
|
24
|
+
// Light theme shadows
|
|
25
|
+
{
|
|
26
|
+
theme: 'light',
|
|
27
|
+
size: 'sm',
|
|
28
|
+
class: 'shadow-sm'
|
|
29
|
+
}, {
|
|
30
|
+
theme: 'light',
|
|
31
|
+
size: 'md',
|
|
32
|
+
class: 'shadow-lg'
|
|
33
|
+
}, {
|
|
34
|
+
theme: 'light',
|
|
35
|
+
size: 'xl',
|
|
36
|
+
class: 'shadow-xl'
|
|
37
|
+
},
|
|
38
|
+
// Dark theme shadows with brand color
|
|
39
|
+
{
|
|
40
|
+
theme: 'dark',
|
|
41
|
+
size: 'sm',
|
|
42
|
+
class: 'shadow-sm shadow-dash-brand/10'
|
|
43
|
+
}, {
|
|
44
|
+
theme: 'dark',
|
|
45
|
+
size: 'md',
|
|
46
|
+
class: 'shadow-lg shadow-dash-brand/10'
|
|
47
|
+
}, {
|
|
48
|
+
theme: 'dark',
|
|
49
|
+
size: 'xl',
|
|
50
|
+
class: 'shadow-xl shadow-dash-brand/10'
|
|
51
|
+
}],
|
|
52
|
+
defaultVariants: {
|
|
53
|
+
theme: 'light',
|
|
54
|
+
size: 'md',
|
|
55
|
+
disabled: false
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const switchButton = cva('flex-1 text-center transition-all duration-200 font-medium whitespace-nowrap cursor-pointer font-dash-main', {
|
|
59
|
+
variants: {
|
|
60
|
+
theme: {
|
|
61
|
+
light: '',
|
|
62
|
+
dark: ''
|
|
63
|
+
},
|
|
64
|
+
size: {
|
|
65
|
+
sm: 'py-1 px-2 rounded-lg text-sm',
|
|
66
|
+
md: 'py-2 px-3 rounded-[0.625rem] text-[1rem]',
|
|
67
|
+
xl: 'py-3 px-6 rounded-2xl text-lg font-semibold'
|
|
68
|
+
},
|
|
69
|
+
selected: {
|
|
70
|
+
true: '',
|
|
71
|
+
false: ''
|
|
72
|
+
},
|
|
73
|
+
disabled: {
|
|
74
|
+
false: '',
|
|
75
|
+
true: 'cursor-not-allowed opacity-50'
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
compoundVariants: [
|
|
79
|
+
// Selected state - light theme
|
|
80
|
+
{
|
|
81
|
+
theme: 'light',
|
|
82
|
+
selected: true,
|
|
83
|
+
class: 'bg-dash-brand text-white'
|
|
84
|
+
},
|
|
85
|
+
// Selected state - dark theme
|
|
86
|
+
{
|
|
87
|
+
theme: 'dark',
|
|
88
|
+
selected: true,
|
|
89
|
+
class: 'bg-dash-brand text-white'
|
|
90
|
+
},
|
|
91
|
+
// Unselected state - light theme
|
|
92
|
+
{
|
|
93
|
+
theme: 'light',
|
|
94
|
+
selected: false,
|
|
95
|
+
disabled: false,
|
|
96
|
+
class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'
|
|
97
|
+
},
|
|
98
|
+
// Unselected state - dark theme
|
|
99
|
+
{
|
|
100
|
+
theme: 'dark',
|
|
101
|
+
selected: false,
|
|
102
|
+
disabled: false,
|
|
103
|
+
class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'
|
|
104
|
+
},
|
|
105
|
+
// Disabled state - light theme
|
|
106
|
+
{
|
|
107
|
+
theme: 'light',
|
|
108
|
+
selected: false,
|
|
109
|
+
disabled: true,
|
|
110
|
+
class: 'text-gray-400'
|
|
111
|
+
},
|
|
112
|
+
// Disabled state - dark theme
|
|
113
|
+
{
|
|
114
|
+
theme: 'dark',
|
|
115
|
+
selected: false,
|
|
116
|
+
disabled: true,
|
|
117
|
+
class: 'text-gray-500'
|
|
118
|
+
}],
|
|
119
|
+
defaultVariants: {
|
|
120
|
+
theme: 'light',
|
|
121
|
+
size: 'md',
|
|
122
|
+
selected: false,
|
|
123
|
+
disabled: false
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
/**
|
|
127
|
+
* A switch component for selecting between multiple options.
|
|
128
|
+
* Supports individual option disabling, hover states, and responsive sizing.
|
|
129
|
+
* Uses dash design system sizing and theming with automatic light/dark mode.
|
|
130
|
+
* @example
|
|
131
|
+
* // With disabled options
|
|
132
|
+
* <Switch
|
|
133
|
+
* options={[
|
|
134
|
+
* { label: 'Basic', value: 'basic' },
|
|
135
|
+
* { label: 'Pro', value: 'pro', disabled: true },
|
|
136
|
+
* { label: 'Free', value: 'free' }
|
|
137
|
+
* ]}
|
|
138
|
+
* value="basic"
|
|
139
|
+
* onChange={(value) => console.log(value)}
|
|
140
|
+
* />
|
|
141
|
+
*/
|
|
142
|
+
function Switch({
|
|
143
|
+
options,
|
|
144
|
+
value,
|
|
145
|
+
onChange,
|
|
146
|
+
size = 'md',
|
|
147
|
+
className = '',
|
|
148
|
+
disabled = false
|
|
149
|
+
}) {
|
|
150
|
+
const {
|
|
151
|
+
theme
|
|
152
|
+
} = useTheme();
|
|
153
|
+
const containerClasses = switchContainer({
|
|
154
|
+
theme,
|
|
155
|
+
size,
|
|
156
|
+
disabled
|
|
157
|
+
}) + ' ' + className;
|
|
158
|
+
return jsx("div", {
|
|
159
|
+
className: containerClasses,
|
|
160
|
+
children: options.map((option, index) => {
|
|
161
|
+
const isSelected = option.value === value;
|
|
162
|
+
const isOptionDisabled = disabled || option.disabled;
|
|
163
|
+
return jsx("button", {
|
|
164
|
+
onClick: () => !isOptionDisabled && onChange(option.value),
|
|
165
|
+
disabled: isOptionDisabled,
|
|
166
|
+
className: switchButton({
|
|
167
|
+
theme,
|
|
168
|
+
size,
|
|
169
|
+
selected: isSelected,
|
|
170
|
+
disabled: isOptionDisabled
|
|
171
|
+
}),
|
|
172
|
+
children: option.label
|
|
173
|
+
}, index);
|
|
174
|
+
})
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export { Switch, Switch as default };
|
|
179
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../../src/react/components/switch/index.tsx"],"sourcesContent":["import React from 'react'\nimport { cva, VariantProps } from 'class-variance-authority'\nimport { useTheme } from '../../contexts/ThemeContext'\n\nconst switchContainer = cva(\n 'flex transition-all duration-200 font-inter gap-2',\n {\n variants: {\n theme: {\n light: 'bg-white border border-gray-100',\n dark: 'bg-dash-primary-dark-blue/10 outline outline-1 outline-white/15 outline-offset-[-1px]'\n },\n size: {\n sm: 'p-1 rounded-xl',\n md: 'p-2 rounded-2xl',\n xl: 'p-3 rounded-3xl'\n },\n disabled: {\n false: '',\n true: 'opacity-60 cursor-not-allowed'\n }\n },\n compoundVariants: [\n // Light theme shadows\n {\n theme: 'light',\n size: 'sm',\n class: 'shadow-sm'\n },\n {\n theme: 'light',\n size: 'md',\n class: 'shadow-lg'\n },\n {\n theme: 'light',\n size: 'xl',\n class: 'shadow-xl'\n },\n // Dark theme shadows with brand color\n {\n theme: 'dark',\n size: 'sm',\n class: 'shadow-sm shadow-dash-brand/10'\n },\n {\n theme: 'dark',\n size: 'md',\n class: 'shadow-lg shadow-dash-brand/10'\n },\n {\n theme: 'dark',\n size: 'xl',\n class: 'shadow-xl shadow-dash-brand/10'\n }\n ],\n defaultVariants: {\n theme: 'light',\n size: 'md',\n disabled: false\n }\n }\n)\n\nconst switchButton = cva(\n 'flex-1 text-center transition-all duration-200 font-medium whitespace-nowrap cursor-pointer font-dash-main',\n {\n variants: {\n theme: {\n light: '',\n dark: ''\n },\n size: {\n sm: 'py-1 px-2 rounded-lg text-sm',\n md: 'py-2 px-3 rounded-[0.625rem] text-[1rem]',\n xl: 'py-3 px-6 rounded-2xl text-lg font-semibold'\n },\n selected: {\n true: '',\n false: ''\n },\n disabled: {\n false: '',\n true: 'cursor-not-allowed opacity-50'\n }\n },\n compoundVariants: [\n // Selected state - light theme\n {\n theme: 'light',\n selected: true,\n class: 'bg-dash-brand text-white'\n },\n // Selected state - dark theme\n {\n theme: 'dark',\n selected: true,\n class: 'bg-dash-brand text-white'\n },\n // Unselected state - light theme\n {\n theme: 'light',\n selected: false,\n disabled: false,\n class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'\n },\n // Unselected state - dark theme\n {\n theme: 'dark',\n selected: false,\n disabled: false,\n class: 'text-dash-brand hover:bg-dash-brand/10 active:bg-dash-brand/20'\n },\n // Disabled state - light theme\n {\n theme: 'light',\n selected: false,\n disabled: true,\n class: 'text-gray-400'\n },\n // Disabled state - dark theme\n {\n theme: 'dark',\n selected: false,\n disabled: true,\n class: 'text-gray-500'\n }\n ],\n defaultVariants: {\n theme: 'light',\n size: 'md',\n selected: false,\n disabled: false\n }\n }\n)\n\ntype SwitchVariants = VariantProps<typeof switchContainer>\n\n/**\n * Configuration object for a single switch option.\n * \n * @template T - The type of the value (string or number)\n */\nexport interface SwitchOption<T = string | number> {\n /** Display text for the option */\n label: string\n /** Unique value for the option */\n value: T\n /** Whether this specific option is disabled */\n disabled?: boolean\n}\n\n/**\n * Props for the Switch component.\n * \n * @template T - The type of the option values (string or number)\n */\nexport interface SwitchProps<T = string | number> extends Omit<SwitchVariants, 'theme' | 'disabled'> {\n /** Array of options to display */\n options: SwitchOption<T>[]\n /** Currently selected value */\n value: T\n /** Callback when selection changes */\n onChange: (value: T) => void\n /** Additional CSS classes */\n className?: string\n /** Whether the entire switch is disabled */\n disabled?: boolean\n}\n\n/**\n * A switch component for selecting between multiple options.\n * Supports individual option disabling, hover states, and responsive sizing.\n * Uses dash design system sizing and theming with automatic light/dark mode.\n * @example\n * // With disabled options\n * <Switch\n * options={[\n * { label: 'Basic', value: 'basic' },\n * { label: 'Pro', value: 'pro', disabled: true },\n * { label: 'Free', value: 'free' }\n * ]}\n * value=\"basic\"\n * onChange={(value) => console.log(value)}\n * />\n */\nexport function Switch<T = string | number>({\n options,\n value,\n onChange,\n size = 'md',\n className = '',\n disabled = false\n}: SwitchProps<T>): React.JSX.Element {\n const { theme } = useTheme()\n\n const containerClasses = switchContainer({\n theme,\n size,\n disabled\n }) + ' ' + className\n\n return (\n <div className={containerClasses}>\n {options.map((option, index) => {\n const isSelected = option.value === value\n const isOptionDisabled = disabled || option.disabled\n\n return (\n <button\n key={index}\n onClick={() => !isOptionDisabled && onChange(option.value)}\n disabled={isOptionDisabled}\n className={switchButton({\n theme,\n size,\n selected: isSelected,\n disabled: isOptionDisabled\n })}\n >\n {option.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport default Switch "],"names":["switchContainer","cva","variants","theme","light","dark","size","sm","md","xl","disabled","false","true","compoundVariants","class","defaultVariants","switchButton","selected","Switch","options","value","onChange","className","useTheme","containerClasses","_jsx","children","map","option","index","isSelected","isOptionDisabled","onClick","label"],"mappings":";;;;;;AAIA,MAAMA,eAAe,GAAGC,GAAG,CACzB,mDAAmD,EACnD;AACEC,EAAAA,QAAQ,EAAE;AACRC,IAAAA,KAAK,EAAE;AACLC,MAAAA,KAAK,EAAE,iCAAiC;AACxCC,MAAAA,IAAI,EAAE;KACP;AACDC,IAAAA,IAAI,EAAE;AACJC,MAAAA,EAAE,EAAE,gBAAgB;AACpBC,MAAAA,EAAE,EAAE,iBAAiB;AACrBC,MAAAA,EAAE,EAAE;KACL;AACDC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,KAAK,EAAE,EAAE;AACTC,MAAAA,IAAI,EAAE;AACP;GACF;AACDC,EAAAA,gBAAgB,EAAE;AAChB;AACA,EAAA;AACEV,IAAAA,KAAK,EAAE,OAAO;AACdG,IAAAA,IAAI,EAAE,IAAI;AACVQ,IAAAA,KAAK,EAAE;AACR,GAAA,EACD;AACEX,IAAAA,KAAK,EAAE,OAAO;AACdG,IAAAA,IAAI,EAAE,IAAI;AACVQ,IAAAA,KAAK,EAAE;AACR,GAAA,EACD;AACEX,IAAAA,KAAK,EAAE,OAAO;AACdG,IAAAA,IAAI,EAAE,IAAI;AACVQ,IAAAA,KAAK,EAAE;GACR;AACD;AACA,EAAA;AACEX,IAAAA,KAAK,EAAE,MAAM;AACbG,IAAAA,IAAI,EAAE,IAAI;AACVQ,IAAAA,KAAK,EAAE;AACR,GAAA,EACD;AACEX,IAAAA,KAAK,EAAE,MAAM;AACbG,IAAAA,IAAI,EAAE,IAAI;AACVQ,IAAAA,KAAK,EAAE;AACR,GAAA,EACD;AACEX,IAAAA,KAAK,EAAE,MAAM;AACbG,IAAAA,IAAI,EAAE,IAAI;AACVQ,IAAAA,KAAK,EAAE;AACR,GAAA,CACF;AACDC,EAAAA,eAAe,EAAE;AACfZ,IAAAA,KAAK,EAAE,OAAO;AACdG,IAAAA,IAAI,EAAE,IAAI;AACVI,IAAAA,QAAQ,EAAE;AACX;AACF,CAAA,CACF;AAED,MAAMM,YAAY,GAAGf,GAAG,CACtB,4GAA4G,EAC5G;AACEC,EAAAA,QAAQ,EAAE;AACRC,IAAAA,KAAK,EAAE;AACLC,MAAAA,KAAK,EAAE,EAAE;AACTC,MAAAA,IAAI,EAAE;KACP;AACDC,IAAAA,IAAI,EAAE;AACJC,MAAAA,EAAE,EAAE,8BAA8B;AAClCC,MAAAA,EAAE,EAAE,0CAA0C;AAC9CC,MAAAA,EAAE,EAAE;KACL;AACDQ,IAAAA,QAAQ,EAAE;AACRL,MAAAA,IAAI,EAAE,EAAE;AACRD,MAAAA,KAAK,EAAE;KACR;AACDD,IAAAA,QAAQ,EAAE;AACRC,MAAAA,KAAK,EAAE,EAAE;AACTC,MAAAA,IAAI,EAAE;AACP;GACF;AACDC,EAAAA,gBAAgB,EAAE;AAChB;AACA,EAAA;AACEV,IAAAA,KAAK,EAAE,OAAO;AACdc,IAAAA,QAAQ,EAAE,IAAI;AACdH,IAAAA,KAAK,EAAE;GACR;AACD;AACA,EAAA;AACEX,IAAAA,KAAK,EAAE,MAAM;AACbc,IAAAA,QAAQ,EAAE,IAAI;AACdH,IAAAA,KAAK,EAAE;GACR;AACD;AACA,EAAA;AACEX,IAAAA,KAAK,EAAE,OAAO;AACdc,IAAAA,QAAQ,EAAE,KAAK;AACfP,IAAAA,QAAQ,EAAE,KAAK;AACfI,IAAAA,KAAK,EAAE;GACR;AACD;AACA,EAAA;AACEX,IAAAA,KAAK,EAAE,MAAM;AACbc,IAAAA,QAAQ,EAAE,KAAK;AACfP,IAAAA,QAAQ,EAAE,KAAK;AACfI,IAAAA,KAAK,EAAE;GACR;AACD;AACA,EAAA;AACEX,IAAAA,KAAK,EAAE,OAAO;AACdc,IAAAA,QAAQ,EAAE,KAAK;AACfP,IAAAA,QAAQ,EAAE,IAAI;AACdI,IAAAA,KAAK,EAAE;GACR;AACD;AACA,EAAA;AACEX,IAAAA,KAAK,EAAE,MAAM;AACbc,IAAAA,QAAQ,EAAE,KAAK;AACfP,IAAAA,QAAQ,EAAE,IAAI;AACdI,IAAAA,KAAK,EAAE;AACR,GAAA,CACF;AACDC,EAAAA,eAAe,EAAE;AACfZ,IAAAA,KAAK,EAAE,OAAO;AACdG,IAAAA,IAAI,EAAE,IAAI;AACVW,IAAAA,QAAQ,EAAE,KAAK;AACfP,IAAAA,QAAQ,EAAE;AACX;AACF,CAAA,CACF;AAoCD;;;;;;;;;;;;;;;AAeG;AACG,SAAUQ,MAAMA,CAAsB;EAC1CC,OAAO;EACPC,KAAK;EACLC,QAAQ;AACRf,EAAAA,IAAI,GAAG,IAAI;AACXgB,EAAAA,SAAS,GAAG,EAAE;AACdZ,EAAAA,QAAQ,GAAG;AACI,CAAA,EAAA;EACf,MAAM;AAAEP,IAAAA;GAAO,GAAGoB,QAAQ,EAAE;EAE5B,MAAMC,gBAAgB,GAAGxB,eAAe,CAAC;IACvCG,KAAK;IACLG,IAAI;AACJI,IAAAA;AACD,GAAA,CAAC,GAAG,GAAG,GAAGY,SAAS;EAEpB,OACEG,GAAA,CAAA,KAAA,EAAA;AAAKH,IAAAA,SAAS,EAAEE,gBAAgB;IAC7BE,QAAA,EAAAP,OAAO,CAACQ,GAAG,CAAC,CAACC,MAAM,EAAEC,KAAK,KAAI;AAC7B,MAAA,MAAMC,UAAU,GAAGF,MAAM,CAACR,KAAK,KAAKA,KAAK;AACzC,MAAA,MAAMW,gBAAgB,GAAGrB,QAAQ,IAAIkB,MAAM,CAAClB,QAAQ;MAEpD,OACEe,GAEE,CAAA,QAAA,EAAA;QAAAO,OAAO,EAAEA,MAAM,CAACD,gBAAgB,IAAIV,QAAQ,CAACO,MAAM,CAACR,KAAK,CAAC;AAC1DV,QAAAA,QAAQ,EAAEqB,gBAAgB;QAC1BT,SAAS,EAAEN,YAAY,CAAC;UACtBb,KAAK;UACLG,IAAI;AACJW,UAAAA,QAAQ,EAAEa,UAAU;AACpBpB,UAAAA,QAAQ,EAAEqB;SACX,CAAC;QAAAL,QAAA,EAEDE,MAAM,CAACK;SAVHJ,KAAK,CAWH;KAEZ;AACG,GAAA,CAAA;AAEV;;;;"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
6
|
+
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
var React = require('react');
|
|
9
|
+
var RadixTabs = require('@radix-ui/react-tabs');
|
|
10
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
11
|
+
var ThemeContext = require('../../contexts/ThemeContext.cjs.js');
|
|
12
|
+
|
|
13
|
+
function _interopNamespaceDefault(e) {
|
|
14
|
+
var n = Object.create(null);
|
|
15
|
+
if (e) {
|
|
16
|
+
Object.keys(e).forEach(function (k) {
|
|
17
|
+
if (k !== 'default') {
|
|
18
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return e[k]; }
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
n.default = e;
|
|
27
|
+
return Object.freeze(n);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var RadixTabs__namespace = /*#__PURE__*/_interopNamespaceDefault(RadixTabs);
|
|
31
|
+
|
|
32
|
+
const tabsRootStyles = classVarianceAuthority.cva('flex flex-col w-full', {
|
|
33
|
+
variants: {
|
|
34
|
+
theme: {
|
|
35
|
+
light: '',
|
|
36
|
+
dark: ''
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
defaultVariants: {
|
|
40
|
+
theme: 'light'
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const tabsListStyles = classVarianceAuthority.cva('flex relative overflow-x-auto scrollbar-hide after:absolute after:bottom-0 after:left-0 after:right-0 after:h-[1px] after:transition-colors', {
|
|
44
|
+
variants: {
|
|
45
|
+
theme: {
|
|
46
|
+
light: 'after:bg-[rgba(12,28,51,0.15)]',
|
|
47
|
+
dark: 'after:bg-gray-600/50'
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
defaultVariants: {
|
|
51
|
+
theme: 'light'
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const tabsTriggerStyles = classVarianceAuthority.cva(['flex items-center justify-center relative', 'font-dash-main font-light', 'transition-all duration-200 ease-in-out cursor-pointer', 'hover:opacity-80', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500', 'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:opacity-50', 'whitespace-nowrap flex-shrink-0', 'after:absolute after:bottom-0 after:left-[-0.25rem] after:w-full after:h-[1px] after:bg-transparent after:transition-colors after:duration-200 after:z-10'], {
|
|
55
|
+
variants: {
|
|
56
|
+
theme: {
|
|
57
|
+
light: '',
|
|
58
|
+
dark: ''
|
|
59
|
+
},
|
|
60
|
+
active: {
|
|
61
|
+
true: '',
|
|
62
|
+
false: ''
|
|
63
|
+
},
|
|
64
|
+
size: {
|
|
65
|
+
sm: 'text-sm leading-[1.25] tracking-[-0.02em] px-0 pr-3 pb-2 after:right-3',
|
|
66
|
+
lg: 'text-xl leading-[1.3] tracking-[-0.025em] px-0 pr-4 pb-3 after:right-4',
|
|
67
|
+
xl: 'text-2xl leading-[1.366] tracking-[-0.03em] px-0 pr-[0.875rem] pb-[10px] after:right-[0.875rem]'
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
compoundVariants: [{
|
|
71
|
+
theme: 'light',
|
|
72
|
+
active: true,
|
|
73
|
+
class: 'text-dash-primary-dark-blue [text-shadow:0.2px_0_0_currentColor,_-0.2px_0_0_currentColor] after:!bg-[#4C7EFF]'
|
|
74
|
+
}, {
|
|
75
|
+
theme: 'light',
|
|
76
|
+
active: false,
|
|
77
|
+
class: 'text-[rgba(12,28,51,0.35)]'
|
|
78
|
+
}, {
|
|
79
|
+
theme: 'dark',
|
|
80
|
+
active: true,
|
|
81
|
+
class: 'text-white [text-shadow:0.2px_0_0_currentColor,_-0.2px_0_0_currentColor] after:!bg-[#4C7EFF]'
|
|
82
|
+
}, {
|
|
83
|
+
theme: 'dark',
|
|
84
|
+
active: false,
|
|
85
|
+
class: 'text-gray-400'
|
|
86
|
+
}],
|
|
87
|
+
defaultVariants: {
|
|
88
|
+
theme: 'light',
|
|
89
|
+
active: false,
|
|
90
|
+
size: 'xl'
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const tabsContentStyles = classVarianceAuthority.cva('focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500', {
|
|
94
|
+
variants: {
|
|
95
|
+
theme: {
|
|
96
|
+
light: '',
|
|
97
|
+
dark: ''
|
|
98
|
+
},
|
|
99
|
+
size: {
|
|
100
|
+
sm: 'mt-2',
|
|
101
|
+
lg: 'mt-3',
|
|
102
|
+
xl: 'mt-4'
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
defaultVariants: {
|
|
106
|
+
theme: 'light',
|
|
107
|
+
size: 'xl'
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
/**
|
|
111
|
+
* Tabs component with sleek underline style matching Figma design.
|
|
112
|
+
* Built on radix-ui with light/dark theme support and keyboard navigation.
|
|
113
|
+
*/
|
|
114
|
+
const Tabs = ({
|
|
115
|
+
items,
|
|
116
|
+
value,
|
|
117
|
+
defaultValue,
|
|
118
|
+
onValueChange,
|
|
119
|
+
size = 'xl',
|
|
120
|
+
className = '',
|
|
121
|
+
listClassName = '',
|
|
122
|
+
triggerClassName = '',
|
|
123
|
+
contentClassName = ''
|
|
124
|
+
}) => {
|
|
125
|
+
var _a;
|
|
126
|
+
const {
|
|
127
|
+
theme
|
|
128
|
+
} = ThemeContext.useTheme();
|
|
129
|
+
const [internalValue, setInternalValue] = React.useState(defaultValue || ((_a = items[0]) === null || _a === void 0 ? void 0 : _a.value) || '');
|
|
130
|
+
// Use controlled value if provided, otherwise use internal state
|
|
131
|
+
const currentValue = value !== undefined ? value : internalValue;
|
|
132
|
+
const handleValueChange = newValue => {
|
|
133
|
+
if (value === undefined) {
|
|
134
|
+
setInternalValue(newValue);
|
|
135
|
+
}
|
|
136
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(newValue);
|
|
137
|
+
};
|
|
138
|
+
const rootClasses = tabsRootStyles({
|
|
139
|
+
theme
|
|
140
|
+
}) + (className ? ` ${className}` : '');
|
|
141
|
+
const listClasses = tabsListStyles({
|
|
142
|
+
theme
|
|
143
|
+
}) + (listClassName ? ` ${listClassName}` : '');
|
|
144
|
+
const contentClasses = tabsContentStyles({
|
|
145
|
+
theme,
|
|
146
|
+
size
|
|
147
|
+
}) + (contentClassName ? ` ${contentClassName}` : '');
|
|
148
|
+
return jsxRuntime.jsxs(RadixTabs__namespace.Root, {
|
|
149
|
+
className: rootClasses,
|
|
150
|
+
value: currentValue,
|
|
151
|
+
onValueChange: handleValueChange,
|
|
152
|
+
children: [jsxRuntime.jsx(RadixTabs__namespace.List, {
|
|
153
|
+
className: listClasses,
|
|
154
|
+
children: items.map(item => {
|
|
155
|
+
const isActive = currentValue === item.value;
|
|
156
|
+
const triggerClasses = tabsTriggerStyles({
|
|
157
|
+
theme,
|
|
158
|
+
active: isActive,
|
|
159
|
+
size
|
|
160
|
+
}) + (triggerClassName ? ` ${triggerClassName}` : '');
|
|
161
|
+
return jsxRuntime.jsx(RadixTabs__namespace.Trigger, {
|
|
162
|
+
value: item.value,
|
|
163
|
+
disabled: item.disabled,
|
|
164
|
+
className: triggerClasses,
|
|
165
|
+
children: item.label
|
|
166
|
+
}, item.value);
|
|
167
|
+
})
|
|
168
|
+
}), items.map(item => jsxRuntime.jsx(RadixTabs__namespace.Content, {
|
|
169
|
+
value: item.value,
|
|
170
|
+
className: contentClasses,
|
|
171
|
+
children: item.content
|
|
172
|
+
}, item.value))]
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
exports.Tabs = Tabs;
|
|
177
|
+
exports.default = Tabs;
|
|
178
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../../src/react/components/tabs/index.tsx"],"sourcesContent":["import React from 'react'\nimport * as RadixTabs from '@radix-ui/react-tabs'\nimport { cva } from 'class-variance-authority'\nimport { useTheme } from '../../contexts/ThemeContext'\n\nconst tabsRootStyles = cva(\n 'flex flex-col w-full',\n {\n variants: {\n theme: {\n light: '',\n dark: ''\n }\n },\n defaultVariants: {\n theme: 'light'\n }\n }\n)\n\nconst tabsListStyles = cva(\n 'flex relative overflow-x-auto scrollbar-hide after:absolute after:bottom-0 after:left-0 after:right-0 after:h-[1px] after:transition-colors',\n {\n variants: {\n theme: {\n light: 'after:bg-[rgba(12,28,51,0.15)]',\n dark: 'after:bg-gray-600/50'\n }\n },\n defaultVariants: {\n theme: 'light'\n }\n }\n)\n\nconst tabsTriggerStyles = cva(\n [\n 'flex items-center justify-center relative',\n 'font-dash-main font-light',\n 'transition-all duration-200 ease-in-out cursor-pointer',\n 'hover:opacity-80',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500',\n 'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:opacity-50',\n 'whitespace-nowrap flex-shrink-0',\n 'after:absolute after:bottom-0 after:left-[-0.25rem] after:w-full after:h-[1px] after:bg-transparent after:transition-colors after:duration-200 after:z-10'\n ],\n {\n variants: {\n theme: {\n light: '',\n dark: ''\n },\n active: {\n true: '',\n false: ''\n },\n size: {\n sm: 'text-sm leading-[1.25] tracking-[-0.02em] px-0 pr-3 pb-2 after:right-3',\n lg: 'text-xl leading-[1.3] tracking-[-0.025em] px-0 pr-4 pb-3 after:right-4',\n xl: 'text-2xl leading-[1.366] tracking-[-0.03em] px-0 pr-[0.875rem] pb-[10px] after:right-[0.875rem]'\n }\n },\n compoundVariants: [\n {\n theme: 'light',\n active: true,\n class: 'text-dash-primary-dark-blue [text-shadow:0.2px_0_0_currentColor,_-0.2px_0_0_currentColor] after:!bg-[#4C7EFF]'\n },\n {\n theme: 'light',\n active: false,\n class: 'text-[rgba(12,28,51,0.35)]'\n },\n {\n theme: 'dark',\n active: true,\n class: 'text-white [text-shadow:0.2px_0_0_currentColor,_-0.2px_0_0_currentColor] after:!bg-[#4C7EFF]'\n },\n {\n theme: 'dark',\n active: false,\n class: 'text-gray-400'\n }\n ],\n defaultVariants: {\n theme: 'light',\n active: false,\n size: 'xl'\n }\n }\n)\n\nconst tabsContentStyles = cva(\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500',\n {\n variants: {\n theme: {\n light: '',\n dark: ''\n },\n size: {\n sm: 'mt-2',\n lg: 'mt-3',\n xl: 'mt-4'\n }\n },\n defaultVariants: {\n theme: 'light',\n size: 'xl'\n }\n }\n)\n\nexport interface TabItem {\n /** Unique identifier for the tab */\n value: string\n /** Label text to display */\n label: string\n /** Content to render when tab is active */\n content: React.ReactNode\n /** Whether this tab is disabled */\n disabled?: boolean\n}\n\nexport interface TabsProps {\n /** Array of tab items */\n items: TabItem[]\n /** Currently active tab value (controlled) */\n value?: string\n /** Default active tab value (uncontrolled) */\n defaultValue?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n /** Size variant */\n size?: 'sm' | 'lg' | 'xl'\n /** Additional CSS classes */\n className?: string\n /** Additional CSS classes for the tabs list */\n listClassName?: string\n /** Additional CSS classes for tab triggers */\n triggerClassName?: string\n /** Additional CSS classes for tab content */\n contentClassName?: string\n}\n\n/**\n * Tabs component with sleek underline style matching Figma design.\n * Built on radix-ui with light/dark theme support and keyboard navigation.\n */\nexport const Tabs: React.FC<TabsProps> = ({\n items,\n value,\n defaultValue,\n onValueChange,\n size = 'xl',\n className = '',\n listClassName = '',\n triggerClassName = '',\n contentClassName = '',\n}) => {\n const { theme } = useTheme()\n const [internalValue, setInternalValue] = React.useState(defaultValue || items[0]?.value || '')\n \n // Use controlled value if provided, otherwise use internal state\n const currentValue = value !== undefined ? value : internalValue\n \n const handleValueChange = (newValue: string) => {\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onValueChange?.(newValue)\n }\n \n const rootClasses = tabsRootStyles({ theme }) + (className ? ` ${className}` : '')\n const listClasses = tabsListStyles({ theme }) + (listClassName ? ` ${listClassName}` : '')\n const contentClasses = tabsContentStyles({ theme, size }) + (contentClassName ? ` ${contentClassName}` : '')\n\n return (\n <RadixTabs.Root\n className={rootClasses}\n value={currentValue}\n onValueChange={handleValueChange}\n >\n <RadixTabs.List className={listClasses}>\n {items.map((item) => {\n const isActive = currentValue === item.value\n const triggerClasses = tabsTriggerStyles({ \n theme, \n active: isActive,\n size\n }) + (triggerClassName ? ` ${triggerClassName}` : '')\n \n return (\n <RadixTabs.Trigger\n key={item.value}\n value={item.value}\n disabled={item.disabled}\n className={triggerClasses}\n >\n {item.label}\n </RadixTabs.Trigger>\n )\n })}\n </RadixTabs.List>\n\n {items.map((item) => (\n <RadixTabs.Content\n key={item.value}\n value={item.value}\n className={contentClasses}\n >\n {item.content}\n </RadixTabs.Content>\n ))}\n </RadixTabs.Root>\n )\n}\n\nexport default Tabs\n\n\n"],"names":["tabsRootStyles","cva","variants","theme","light","dark","defaultVariants","tabsListStyles","tabsTriggerStyles","active","true","false","size","sm","lg","xl","compoundVariants","class","tabsContentStyles","Tabs","items","value","defaultValue","onValueChange","className","listClassName","triggerClassName","contentClassName","useTheme","internalValue","setInternalValue","React","useState","_a","currentValue","undefined","handleValueChange","newValue","rootClasses","listClasses","contentClasses","_jsxs","RadixTabs","Root","children","_jsx","List","map","item","isActive","triggerClasses","Trigger","disabled","label","Content","content"],"mappings":"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"}
|