cynx-ui 1.2.10 → 1.2.12
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/components/Input.jsx +11 -4
- package/components/Toggle.jsx +83 -56
- package/package.json +1 -1
package/components/Input.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useRef } from 'react';
|
|
1
|
+
import { useRef, useState } from 'react';
|
|
2
2
|
|
|
3
3
|
const SIZES = {
|
|
4
4
|
xs: { height: 30, fontSize: 11, paddingH: 8 },
|
|
@@ -24,6 +24,8 @@ export default function Input({
|
|
|
24
24
|
...props
|
|
25
25
|
}) {
|
|
26
26
|
const inputRef = useRef(null);
|
|
27
|
+
const [focused, setFocused] = useState(false);
|
|
28
|
+
const [hovered, setHovered] = useState(false);
|
|
27
29
|
const s = SIZES[size] || SIZES.md;
|
|
28
30
|
|
|
29
31
|
function handleClear() {
|
|
@@ -99,8 +101,8 @@ export default function Input({
|
|
|
99
101
|
style={{
|
|
100
102
|
display: 'block',
|
|
101
103
|
width: '100%',
|
|
102
|
-
background: 'var(--input-bg,#fff)',
|
|
103
|
-
border: `1px solid ${error ? 'var(--danger,#f64747)' : 'var(--bd,#d7d8e0)'}`,
|
|
104
|
+
background: props.disabled ? 'var(--grey-1,#f5f5f8)' : 'var(--input-bg,#fff)',
|
|
105
|
+
border: `1px solid ${error ? 'var(--danger,#f64747)' : focused ? 'var(--accent,#f99e2c)' : hovered ? 'var(--accent,#f99e2c)' : 'var(--bd,#d7d8e0)'}`,
|
|
104
106
|
borderRadius: 'var(--rads,8px)',
|
|
105
107
|
color: 'var(--t1,#1a1a2e)',
|
|
106
108
|
fontFamily: 'var(--f,var(--sans,inherit))',
|
|
@@ -113,13 +115,18 @@ export default function Input({
|
|
|
113
115
|
transition: 'border-color .14s, box-shadow .14s',
|
|
114
116
|
boxShadow: error
|
|
115
117
|
? '0 0 0 3px rgba(246,71,71,.12), var(--shadow,0 1px 3px rgba(20,22,41,.1))'
|
|
118
|
+
: focused
|
|
119
|
+
? '0 0 0 3px rgba(249,158,44,.12), var(--shadow,0 1px 3px rgba(20,22,41,.1))'
|
|
116
120
|
: 'var(--shadow,0 1px 3px rgba(20,22,41,.1))',
|
|
117
121
|
opacity: props.disabled ? 0.5 : 1,
|
|
118
122
|
cursor: props.disabled ? 'not-allowed' : undefined,
|
|
119
|
-
background: props.disabled ? 'var(--grey-1,#f5f5f8)' : undefined,
|
|
120
123
|
...style,
|
|
121
124
|
}}
|
|
122
125
|
value={value}
|
|
126
|
+
onFocus={e => { setFocused(true); props.onFocus?.(e); }}
|
|
127
|
+
onBlur={e => { setFocused(false); props.onBlur?.(e); }}
|
|
128
|
+
onMouseEnter={() => setHovered(true)}
|
|
129
|
+
onMouseLeave={() => setHovered(false)}
|
|
123
130
|
{...props}
|
|
124
131
|
/>
|
|
125
132
|
|
package/components/Toggle.jsx
CHANGED
|
@@ -1,56 +1,83 @@
|
|
|
1
|
-
const SIZES = {
|
|
2
|
-
sm: { w: 28, h: 16, r: 8, dot: 12, off: 2, on: 14 },
|
|
3
|
-
md: { w: 34, h: 18, r: 9, dot: 14, off: 2, on: 18 },
|
|
4
|
-
lg: { w: 44, h: 24, r: 12, dot: 18, off: 3, on: 23 },
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
const COLORS = {
|
|
8
|
-
primary: 'var(--accent)',
|
|
9
|
-
success: 'var(--success)',
|
|
10
|
-
warning: '#f59e0b',
|
|
11
|
-
danger: 'var(--danger)',
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
const SIZES = {
|
|
2
|
+
sm: { w: 28, h: 16, r: 8, dot: 12, off: 2, on: 14 },
|
|
3
|
+
md: { w: 34, h: 18, r: 9, dot: 14, off: 2, on: 18 },
|
|
4
|
+
lg: { w: 44, h: 24, r: 12, dot: 18, off: 3, on: 23 },
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const COLORS = {
|
|
8
|
+
primary: 'var(--accent)',
|
|
9
|
+
success: 'var(--success)',
|
|
10
|
+
warning: '#f59e0b',
|
|
11
|
+
danger: 'var(--danger)',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const STYLES = `
|
|
15
|
+
@keyframes cx-toggle-on {
|
|
16
|
+
0% { transform: translateY(-50%) scale(1); }
|
|
17
|
+
40% { transform: translateY(-50%) scale(1.15); }
|
|
18
|
+
100% { transform: translateY(-50%) scale(1); }
|
|
19
|
+
}
|
|
20
|
+
@keyframes cx-toggle-off {
|
|
21
|
+
0% { transform: translateY(-50%) scale(1); }
|
|
22
|
+
40% { transform: translateY(-50%) scale(1.15); }
|
|
23
|
+
100% { transform: translateY(-50%) scale(1); }
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
let _id = 'cynx-toggle-styles';
|
|
28
|
+
function ensureStyles() {
|
|
29
|
+
if (typeof document === 'undefined') return;
|
|
30
|
+
if (document.getElementById(_id)) return;
|
|
31
|
+
const tag = document.createElement('style');
|
|
32
|
+
tag.id = _id;
|
|
33
|
+
tag.textContent = STYLES;
|
|
34
|
+
document.head.appendChild(tag);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (typeof document !== 'undefined') ensureStyles();
|
|
38
|
+
|
|
39
|
+
export default function Toggle({
|
|
40
|
+
checked = false,
|
|
41
|
+
onChange,
|
|
42
|
+
disabled = false,
|
|
43
|
+
size = 'md',
|
|
44
|
+
color = 'primary',
|
|
45
|
+
label = null,
|
|
46
|
+
labelStyle = {},
|
|
47
|
+
onClick = null,
|
|
48
|
+
className = '',
|
|
49
|
+
style = {},
|
|
50
|
+
}) {
|
|
51
|
+
ensureStyles();
|
|
52
|
+
const s = SIZES[size] || SIZES.md;
|
|
53
|
+
const trackBg = checked ? (COLORS[color] || COLORS.primary) : 'var(--bd2,#d7d8e0)';
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<label
|
|
57
|
+
className={className}
|
|
58
|
+
style={{ display:'inline-flex', alignItems:'center', gap:8, cursor: disabled ? 'not-allowed' : 'pointer', userSelect:'none', opacity: disabled ? .4 : 1, ...style }}
|
|
59
|
+
onClick={onClick}
|
|
60
|
+
>
|
|
61
|
+
<input type="checkbox" checked={checked} disabled={disabled}
|
|
62
|
+
onChange={e => onChange?.(e.target.checked)}
|
|
63
|
+
style={{ position:'absolute', opacity:0, width:0, height:0 }} />
|
|
64
|
+
<span style={{
|
|
65
|
+
position:'relative', width: s.w, height: s.h, borderRadius: s.r,
|
|
66
|
+
background: trackBg, flexShrink:0, transition:'background .25s ease',
|
|
67
|
+
boxShadow:'0 1px 3px rgba(20,22,41,.1)',
|
|
68
|
+
}}>
|
|
69
|
+
<span style={{
|
|
70
|
+
position:'absolute', top:'50%',
|
|
71
|
+
transform:'translateY(-50%)',
|
|
72
|
+
left: checked ? s.on : s.off,
|
|
73
|
+
width: s.dot, height: s.dot,
|
|
74
|
+
background:'#fff', borderRadius:'50%',
|
|
75
|
+
boxShadow:'0 1px 3px rgba(0,0,0,.25)',
|
|
76
|
+
transition:'left .25s cubic-bezier(.34,1.56,.64,1)',
|
|
77
|
+
animation: `cx-toggle-${checked ? 'on' : 'off'} .25s cubic-bezier(.34,1.56,.64,1)`,
|
|
78
|
+
}} />
|
|
79
|
+
</span>
|
|
80
|
+
{label && <span style={labelStyle}>{label}</span>}
|
|
81
|
+
</label>
|
|
82
|
+
);
|
|
83
|
+
}
|