cynx-ui 1.2.27 → 1.2.28

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.
@@ -77,10 +77,10 @@ export function ActionsMenu({ items, align = 'right' }) {
77
77
  style={{
78
78
  width: 30, height: 30, borderRadius: 'var(--rads,8px)',
79
79
  border: isOpen ? '1px solid var(--accent,#f99e2c)' : '1px solid var(--border-light,#d7d8e0)',
80
- background: '#fff',
80
+ background: 'var(--surface,#fff)',
81
81
  cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center',
82
82
  color: isOpen ? 'var(--accent)' : 'var(--muted,#797b8d)', transition: 'all .14s',
83
- boxShadow: isOpen ? '0 0 0 3px rgba(249,158,44,.12)' : '0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06)',
83
+ boxShadow: isOpen ? 'var(--pd, rgba(249,158,44,.12))' : 'var(--shadow, 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06))',
84
84
  }}
85
85
  >
86
86
  <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
@@ -93,9 +93,9 @@ export function ActionsMenu({ items, align = 'right' }) {
93
93
  ref={menuRef}
94
94
  style={{
95
95
  position: 'fixed', zIndex: 8100, minWidth: 180, padding: 5,
96
- background: '#fff', border: '1.5px solid var(--border-light,#e2e8f0)',
96
+ background: 'var(--surface,#fff)', border: '1.5px solid var(--border-light,#e2e8f0)',
97
97
  borderRadius: 'var(--rads,8px)',
98
- boxShadow: '0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.06)',
98
+ boxShadow: 'var(--shadow-lg, 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.06))',
99
99
  animation: closing
100
100
  ? 'actionsClose .14s ease forwards'
101
101
  : 'actionsDrop .14s cubic-bezier(.16,1,.3,1)',
@@ -116,7 +116,7 @@ export function ActionsMenu({ items, align = 'right' }) {
116
116
  fontWeight: 500,
117
117
  }}
118
118
  onMouseEnter={e => {
119
- e.currentTarget.style.background = item.variant === 'danger' ? 'rgba(246,71,71,.08)' : item.variant === 'warning' ? 'rgba(249,158,44,.08)' : 'var(--grey-1,#f5f5f8)';
119
+ e.currentTarget.style.background = item.variant === 'danger' ? 'var(--dd, rgba(246,71,71,.08))' : item.variant === 'warning' ? 'var(--pd, rgba(249,158,44,.08))' : 'var(--grey-1,#f5f5f8)';
120
120
  }}
121
121
  onMouseLeave={e => { e.currentTarget.style.background = 'transparent'; }}
122
122
  >
@@ -79,8 +79,8 @@ export default function ActivityCard({
79
79
 
80
80
  return (
81
81
  <div ref={containerRef} style={{
82
- background: '#fff', border: '1px solid var(--border)', borderRadius: 'var(--rad)',
83
- boxShadow: '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
82
+ background: 'var(--surface,#fff)', border: '1px solid var(--border)', borderRadius: 'var(--rad)',
83
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04))',
84
84
  padding: '14px 18px', position: 'relative', ...style,
85
85
  }}>
86
86
  {/* Header */}
@@ -134,9 +134,9 @@ export default function ActivityCard({
134
134
  {hovered !== null && (
135
135
  <div style={{
136
136
  position: 'absolute', left: tooltipPos.x, top: tooltipPos.y,
137
- transform: 'translate(-50%, -100%)', background: '#fff',
137
+ transform: 'translate(-50%, -100%)', background: 'var(--surface,#fff)',
138
138
  border: '1px solid var(--border)', borderRadius: 'var(--rads, 8px)',
139
- boxShadow: '0 4px 12px rgba(0,0,0,.12)', padding: '10px 14px',
139
+ boxShadow: 'var(--smd, 0 4px 12px rgba(0,0,0,.12))', padding: '10px 14px',
140
140
  pointerEvents: 'none', zIndex: 100, whiteSpace: 'nowrap',
141
141
  animation: 'hoverCardIn .15s ease',
142
142
  }}>
@@ -161,7 +161,7 @@ export default function ActivityCard({
161
161
  <div style={{
162
162
  position: 'absolute', left: '50%', bottom: -5,
163
163
  transform: 'translateX(-50%) rotate(45deg)',
164
- width: 8, height: 8, background: '#fff',
164
+ width: 8, height: 8, background: 'var(--surface,#fff)',
165
165
  borderRight: '1px solid var(--border)', borderBottom: '1px solid var(--border)',
166
166
  }} />
167
167
  </div>
@@ -1,24 +1,24 @@
1
1
  const VARIANTS = {
2
- ok: { bg: 'var(--success-bg,rgba(39,174,96,.1))', color: 'var(--success,#27ae60)', border: 'rgba(39,174,96,.2)', dot: 'var(--success,#27ae60)' },
3
- err: { bg: 'var(--danger-bg,rgba(246,71,71,.1))', color: 'var(--danger,#f64747)', border: 'rgba(246,71,71,.2)', dot: 'var(--danger,#f64747)' },
2
+ ok: { bg: 'var(--success-bg,rgba(39,174,96,.1))', color: 'var(--success,#27ae60)', border: 'var(--sd, rgba(39,174,96,.2))', dot: 'var(--success,#27ae60)' },
3
+ err: { bg: 'var(--danger-bg,rgba(246,71,71,.1))', color: 'var(--danger,#f64747)', border: 'var(--dd, rgba(246,71,71,.2))', dot: 'var(--danger,#f64747)' },
4
4
  warn: { bg: 'var(--accent-bg,rgba(249,158,44,.1))', color: 'var(--accent,#f99e2c)', border: 'var(--accent-border,rgba(249,158,44,.25))', dot: 'var(--accent,#f99e2c)' },
5
- blue: { bg: 'var(--blue-bg,rgba(39,130,228,.1))', color: 'var(--blue,#2782e4)', border: 'rgba(39,130,228,.2)', dot: 'var(--blue,#2782e4)' },
5
+ blue: { bg: 'var(--blue-bg,rgba(39,130,228,.1))', color: 'var(--blue,#2782e4)', border: 'var(--infd, rgba(39,130,228,.2))', dot: 'var(--blue,#2782e4)' },
6
6
  dim: { bg: 'var(--grey-1,#f5f5f8)', color: 'var(--grey-4,#797b8d)', border: 'var(--border,#d7d8e0)', dot: 'var(--grey-4,#797b8d)' },
7
7
  purple: { bg: 'rgba(139,92,246,.1)', color: '#8b5cf6', border: 'rgba(139,92,246,.2)', dot: '#8b5cf6' },
8
8
  teal: { bg: 'rgba(20,184,166,.1)', color: '#14b8a6', border: 'rgba(20,184,166,.2)', dot: '#14b8a6' },
9
9
  pink: { bg: 'rgba(236,72,153,.1)', color: '#ec4899', border: 'rgba(236,72,153,.2)', dot: '#ec4899' },
10
10
  ghost: { bg: 'transparent', color: 'var(--t2,var(--grey-4,#797b8d))', border: 'var(--bd,var(--border,#d7d8e0))', dot: 'var(--t3,var(--grey-4,#797b8d))' },
11
- paid: { bg: 'rgba(30,41,59,.08)', color: '#1e293b', border: 'rgba(30,41,59,.15)', dot: '#1e293b' },
12
- invoiced: { bg: 'rgba(120,120,130,.08)', color: '#787882', border: 'rgba(120,120,130,.15)', dot: '#787882' },
13
- verified: { bg: 'rgba(34,197,94,.08)', color: '#22c55e', border: 'rgba(34,197,94,.15)', dot: '#22c55e' },
11
+ paid: { bg: 'var(--pd, rgba(30,41,59,.08))', color: 'var(--t, #1e293b)', border: 'var(--accent-border, rgba(30,41,59,.15))', dot: 'var(--t, #1e293b)' },
12
+ invoiced: { bg: 'rgba(120,120,130,.08)', color: 'var(--t2, #787882)', border: 'rgba(120,120,130,.15)', dot: 'var(--t2, #787882)' },
13
+ verified: { bg: 'var(--sd, rgba(34,197,94,.08))', color: 'var(--s, #22c55e)', border: 'var(--sd, rgba(34,197,94,.15))', dot: 'var(--s, #22c55e)' },
14
14
  partial: { bg: 'rgba(100,100,110,.08)', color: '#64646e', border: 'rgba(100,100,110,.15)', dot: '#64646e' },
15
- deleted: { bg: 'rgba(239,68,68,.08)', color: '#ef4444', border: 'rgba(239,68,68,.15)', dot: '#ef4444' },
16
- update: { bg: 'rgba(249,115,22,.08)', color: '#f97316', border: 'rgba(249,115,22,.15)', dot: '#f97316' },
17
- ready: { bg: 'rgba(234,179,8,.08)', color: '#eab308', border: 'rgba(234,179,8,.15)', dot: '#eab308' },
18
- new: { bg: 'rgba(59,130,246,.08)', color: '#3b82f6', border: 'rgba(59,130,246,.15)', dot: '#3b82f6' },
19
- active: { bg: 'transparent', color: '#22c55e', border: 'none', dot: '#22c55e', noPad: true },
20
- inactive: { bg: 'transparent', color: '#ef4444', border: 'none', dot: '#ef4444', noPad: true },
21
- pending: { bg: 'transparent', color: '#d97706', border: 'none', dot: '#d97706', noPad: true, pulse: true },
15
+ deleted: { bg: 'var(--dd, rgba(239,68,68,.08))', color: 'var(--d, #ef4444)', border: 'var(--dd, rgba(239,68,68,.15))', dot: 'var(--d, #ef4444)' },
16
+ update: { bg: 'var(--wd, rgba(249,115,22,.08))', color: 'var(--w, #f97316)', border: 'var(--wd, rgba(249,115,22,.15))', dot: 'var(--w, #f97316)' },
17
+ ready: { bg: 'var(--wd, rgba(234,179,8,.08))', color: 'var(--w, #eab308)', border: 'var(--wd, rgba(234,179,8,.15))', dot: 'var(--w, #eab308)' },
18
+ new: { bg: 'var(--infd, rgba(59,130,246,.08))', color: 'var(--inf, #3b82f6)', border: 'var(--infd, rgba(59,130,246,.15))', dot: 'var(--inf, #3b82f6)' },
19
+ active: { bg: 'transparent', color: 'var(--s, #22c55e)', border: 'none', dot: 'var(--s, #22c55e)', noPad: true },
20
+ inactive: { bg: 'transparent', color: 'var(--d, #ef4444)', border: 'none', dot: 'var(--d, #ef4444)', noPad: true },
21
+ pending: { bg: 'transparent', color: 'var(--w, #d97706)', border: 'none', dot: 'var(--w, #d97706)', noPad: true, pulse: true },
22
22
  };
23
23
 
24
24
  const SHAPES = {
@@ -57,7 +57,7 @@ export function BrandingCard({ label, hint, value, onUpload, onRemove, saving, o
57
57
  display: 'flex', alignItems: 'center', justifyContent: 'space-between',
58
58
  padding: '10px 12px', borderRadius: 'var(--rads)',
59
59
  border: '1px solid var(--border-light)', background: 'var(--surface)',
60
- boxShadow: '0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06)',
60
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06))',
61
61
  ...cardStyle,
62
62
  }}>
63
63
  {(hasExisting || previewUrl) ? (
@@ -76,9 +76,9 @@ export function BrandingCard({ label, hint, value, onUpload, onRemove, saving, o
76
76
  </div>
77
77
  )}
78
78
  <div style={{ display: 'flex', gap: 4, flexShrink: 0 }}>
79
- <Button variant="ghost" size="xs" type="button" icon={<Pencil size={11} />} onClick={() => setEditOpen(true)} style={cardStyle ? { background: '#fff', color: '#333' } : undefined}>Edit</Button>
79
+ <Button variant="ghost" size="xs" type="button" icon={<Pencil size={11} />} onClick={() => setEditOpen(true)} style={cardStyle ? { background: 'var(--surface,#fff)', color: 'var(--t, #333)' } : undefined}>Edit</Button>
80
80
  {hasExisting && (
81
- <Button variant="ghost" size="xs" type="button" icon={<Trash2 size={11} />} style={cardStyle ? { background: '#fff', color: 'var(--danger)' } : { color: 'var(--danger)' }}
81
+ <Button variant="ghost" size="xs" type="button" icon={<Trash2 size={11} />} style={cardStyle ? { background: 'var(--surface,#fff)', color: 'var(--danger)' } : { color: 'var(--danger)' }}
82
82
  onClick={handleRemove} disabled={saving}>Remove</Button>
83
83
  )}
84
84
  </div>
@@ -2,7 +2,7 @@ import { Spinner } from './Spinner';
2
2
 
3
3
  const VARIANTS = {
4
4
  default: {
5
- background: '#fff',
5
+ background: 'var(--surface,#fff)',
6
6
  color: 'var(--def-btn-text,#0f111c)',
7
7
  border: '1px solid var(--bd,#d7d8e0)',
8
8
  hoverBg: 'var(--grey-1,#f5f5f8)',
@@ -10,7 +10,7 @@ const VARIANTS = {
10
10
  },
11
11
  primary: {
12
12
  background: 'var(--accent,#f99e2c)',
13
- color: '#fff',
13
+ color: 'var(--def-btn-text,#fff)',
14
14
  border: '1px solid transparent',
15
15
  hoverBg: 'var(--accent-hover,#e68d1f)',
16
16
  hoverShadow: '0 2px 8px rgba(249,158,44,.35)',
@@ -18,29 +18,29 @@ const VARIANTS = {
18
18
  secondary: {
19
19
  background: 'var(--blue-bg,rgba(39,130,228,.1))',
20
20
  color: 'var(--blue,#2782e4)',
21
- border: '1px solid rgba(39,130,228,.2)',
22
- hoverBg: 'rgba(39,130,228,.18)',
21
+ border: '1px solid var(--infd, rgba(39,130,228,.2))',
22
+ hoverBg: 'var(--infd, rgba(39,130,228,.18))',
23
23
  hoverShadow: '0 2px 8px rgba(39,130,228,.25)',
24
24
  },
25
25
  danger: {
26
26
  background: 'var(--danger-bg,rgba(246,71,71,.1))',
27
27
  color: 'var(--danger,#f64747)',
28
- border: '1px solid rgba(246,71,71,.2)',
29
- hoverBg: 'rgba(246,71,71,.18)',
28
+ border: '1px solid var(--dd, rgba(246,71,71,.2))',
29
+ hoverBg: 'var(--dd, rgba(246,71,71,.18))',
30
30
  hoverShadow: '0 2px 8px rgba(246,71,71,.25)',
31
31
  },
32
32
  success: {
33
33
  background: 'var(--success-bg,rgba(39,174,96,.1))',
34
34
  color: 'var(--success,#27ae60)',
35
- border: '1px solid rgba(39,174,96,.2)',
36
- hoverBg: 'rgba(39,174,96,.18)',
35
+ border: '1px solid var(--sd, rgba(39,174,96,.2))',
36
+ hoverBg: 'var(--sd, rgba(39,174,96,.18))',
37
37
  hoverShadow: '0 2px 8px rgba(39,174,96,.25)',
38
38
  },
39
39
  warning: {
40
40
  background: 'var(--accent-bg,rgba(249,158,44,.1))',
41
41
  color: 'var(--accent,#f99e2c)',
42
42
  border: '1px solid var(--accent-border,rgba(249,158,44,.25))',
43
- hoverBg: 'rgba(249,158,44,.18)',
43
+ hoverBg: 'var(--pd, rgba(249,158,44,.18))',
44
44
  hoverShadow: '0 2px 8px rgba(249,158,44,.25)',
45
45
  },
46
46
  ghost: {
@@ -13,7 +13,7 @@ export default function CircularProgress({
13
13
  size = 'md',
14
14
  customSize,
15
15
  color = 'var(--blue)',
16
- trackColor = '#e0e0e4',
16
+ trackColor = 'var(--bd2, #e0e0e4)',
17
17
  label = '',
18
18
  showPercent = true,
19
19
  animated = true,
@@ -37,13 +37,13 @@ export function ConfirmRoot() {
37
37
  <div style={{
38
38
  background: 'var(--surface)', border: '1px solid var(--border)',
39
39
  borderRadius: 14, width: '100%', maxWidth: 400,
40
- boxShadow: '0 20px 60px rgba(0,0,0,.4)',
40
+ boxShadow: 'var(--slg, 0 20px 60px rgba(0,0,0,.4))',
41
41
  animation: `${closing ? 'modalClose' : 'modalPop'} .25s cubic-bezier(.4,0,.2,1) forwards`,
42
42
  }}>
43
43
  <div style={{ padding: '20px 20px 0', display: 'flex', gap: 14, alignItems: 'flex-start' }}>
44
44
  <div style={{
45
45
  width: 36, height: 36, borderRadius: '50%', flexShrink: 0,
46
- background: state.danger ? 'rgba(246,71,71,.1)' : 'rgba(249,158,44,.1)',
46
+ background: state.danger ? 'var(--dd, rgba(246,71,71,.1))' : 'var(--pd, rgba(249,158,44,.1))',
47
47
  display: 'flex', alignItems: 'center', justifyContent: 'center',
48
48
  }}>
49
49
  <AlertTriangle size={17} color={state.danger ? 'var(--danger)' : 'var(--warning)'} />
@@ -64,7 +64,7 @@ export function ConfirmRoot() {
64
64
  background: 'var(--grey-1)', borderRadius: '0 0 14px 14px',
65
65
  }}>
66
66
  <Button variant="ghost" size="sm" onClick={() => answer(false)}>Cancel</Button>
67
- <Button variant={state.danger ? 'ghost' : 'primary'} size="sm" style={state.danger ? { background: 'var(--danger)', color: '#fff', border: 'none' } : {}} onClick={() => answer(true)}>
67
+ <Button variant={state.danger ? 'ghost' : 'primary'} size="sm" style={state.danger ? { background: 'var(--danger)', color: 'var(--def-btn-text,#fff)', border: 'none' } : {}} onClick={() => answer(true)}>
68
68
  {state.confirmLabel || 'Confirm'}
69
69
  </Button>
70
70
  </div>
@@ -122,7 +122,7 @@ export function DatePicker({ value, onChange, placeholder = 'Select date', badge
122
122
  : new Date(y, m + 1, c.day);
123
123
  return (
124
124
  <div key={i} onClick={() => { pick(date); }}
125
- style={{ textAlign: 'center', padding: '6px 2px', fontSize: '.78rem', color: 'var(--muted)', cursor: 'pointer', borderRadius: 6, transition: 'background .12s' }}
125
+ style={{ textAlign: 'center', padding: '6px 2px', fontSize: '.78rem', color: 'var(--muted)', cursor: 'pointer', borderRadius: 'var(--radxs, 6px)', transition: 'background .12s' }}
126
126
  onMouseEnter={e => e.currentTarget.style.background = 'var(--grey-1)'}
127
127
  onMouseLeave={e => e.currentTarget.style.background = 'transparent'}>
128
128
  {c.day}
@@ -141,9 +141,9 @@ export function DatePicker({ value, onChange, placeholder = 'Select date', badge
141
141
  <div key={i} onClick={() => !dis && pick(date)} style={{
142
142
  position: 'relative', textAlign: 'center', padding: '6px 2px',
143
143
  fontSize: '.8rem', fontWeight: sel ? 700 : today ? 600 : 400,
144
- borderRadius: 6, cursor: dis ? 'not-allowed' : 'pointer',
144
+ borderRadius: 'var(--radxs, 6px)', cursor: dis ? 'not-allowed' : 'pointer',
145
145
  background: sel ? 'var(--accent)' : 'transparent',
146
- color: sel ? '#fff' : dis ? 'var(--border)' : today ? 'var(--accent)' : 'var(--primary-text)',
146
+ color: sel ? 'var(--def-btn-text,#fff)' : dis ? 'var(--border)' : today ? 'var(--accent)' : 'var(--primary-text)',
147
147
  border: today && !sel ? '1.5px solid var(--accent)' : '1.5px solid transparent',
148
148
  transition: 'background .12s, color .12s',
149
149
  }}
@@ -174,8 +174,8 @@ export function DatePicker({ value, onChange, placeholder = 'Select date', badge
174
174
  const sel = value && value.getFullYear() === y && value.getMonth() === i;
175
175
  return (
176
176
  <div key={i} onClick={() => { const c = new Date(cursor); c.setMonth(i); setCursor(c); setView('day'); }}
177
- style={{ textAlign: 'center', padding: '10px 4px', borderRadius: 6, fontSize: '.82rem', fontWeight: 600, cursor: 'pointer',
178
- background: sel ? 'var(--accent)' : 'transparent', color: sel ? '#fff' : 'var(--primary-text)',
177
+ style={{ textAlign: 'center', padding: '10px 4px', borderRadius: 'var(--radxs, 6px)', fontSize: '.82rem', fontWeight: 600, cursor: 'pointer',
178
+ background: sel ? 'var(--accent)' : 'transparent', color: sel ? 'var(--def-btn-text,#fff)' : 'var(--primary-text)',
179
179
  transition: 'background .12s', }}
180
180
  onMouseEnter={e => { if (!sel) e.currentTarget.style.background = 'var(--grey-1)'; }}
181
181
  onMouseLeave={e => { if (!sel) e.currentTarget.style.background = 'transparent'; }}>
@@ -197,8 +197,8 @@ export function DatePicker({ value, onChange, placeholder = 'Select date', badge
197
197
  const sel = value && value.getFullYear() === yr;
198
198
  return (
199
199
  <div key={yr} onClick={() => { const c = new Date(cursor); c.setFullYear(yr); setCursor(c); setView('month'); }}
200
- style={{ textAlign: 'center', padding: '10px 4px', borderRadius: 6, fontSize: '.82rem', fontWeight: 600, cursor: 'pointer',
201
- background: sel ? 'var(--accent)' : 'transparent', color: sel ? '#fff' : 'var(--primary-text)',
200
+ style={{ textAlign: 'center', padding: '10px 4px', borderRadius: 'var(--radxs, 6px)', fontSize: '.82rem', fontWeight: 600, cursor: 'pointer',
201
+ background: sel ? 'var(--accent)' : 'transparent', color: sel ? 'var(--def-btn-text,#fff)' : 'var(--primary-text)',
202
202
  transition: 'background .12s', }}
203
203
  onMouseEnter={e => { if (!sel) e.currentTarget.style.background = 'var(--grey-1)'; }}
204
204
  onMouseLeave={e => { if (!sel) e.currentTarget.style.background = 'transparent'; }}>
@@ -248,23 +248,23 @@ export function DatePicker({ value, onChange, placeholder = 'Select date', badge
248
248
  <div ref={dropRef} style={{
249
249
  position: 'fixed', top: pos.top, left: pos.left, width: pos.width, zIndex: 9000,
250
250
  background: 'var(--surface)', border: '1px solid var(--border)',
251
- borderRadius: 10, boxShadow: 'var(--shadow-lg)',
251
+ borderRadius: 'var(--rad, 10px)', boxShadow: 'var(--shadow-lg)',
252
252
  padding: '10px 12px',
253
253
  animation: 'dp-in .12s ease',
254
254
  }}>
255
255
  {/* Calendar header */}
256
256
  <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 8 }}>
257
- <button type="button" onClick={() => nav(-1)} style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 4, borderRadius: 6, color: 'var(--muted)', display: 'flex', alignItems: 'center' }}
257
+ <button type="button" onClick={() => nav(-1)} style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 4, borderRadius: 'var(--radxs, 6px)', color: 'var(--muted)', display: 'flex', alignItems: 'center' }}
258
258
  onMouseEnter={e => e.currentTarget.style.background = 'var(--grey-1)'}
259
259
  onMouseLeave={e => e.currentTarget.style.background = 'none'}>
260
260
  <ChevronLeft size={15} />
261
261
  </button>
262
- <button type="button" onClick={cycleView} style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '.82rem', fontWeight: 700, color: 'var(--primary-text)', padding: '4px 8px', borderRadius: 6, fontFamily: 'var(--sans)' }}
262
+ <button type="button" onClick={cycleView} style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '.82rem', fontWeight: 700, color: 'var(--primary-text)', padding: '4px 8px', borderRadius: 'var(--radxs, 6px)', fontFamily: 'var(--sans)' }}
263
263
  onMouseEnter={e => e.currentTarget.style.background = 'var(--grey-1)'}
264
264
  onMouseLeave={e => e.currentTarget.style.background = 'none'}>
265
265
  {headerLabel}
266
266
  </button>
267
- <button type="button" onClick={() => nav(1)} style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 4, borderRadius: 6, color: 'var(--muted)', display: 'flex', alignItems: 'center' }}
267
+ <button type="button" onClick={() => nav(1)} style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 4, borderRadius: 'var(--radxs, 6px)', color: 'var(--muted)', display: 'flex', alignItems: 'center' }}
268
268
  onMouseEnter={e => e.currentTarget.style.background = 'var(--grey-1)'}
269
269
  onMouseLeave={e => e.currentTarget.style.background = 'none'}>
270
270
  <ChevronRight size={15} />
@@ -99,7 +99,7 @@ export default function Dropdown({ value, onChange, options, placeholder = 'Sele
99
99
  width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between',
100
100
  padding: '8px 11px', background: 'var(--input-bg)',
101
101
  border: `1px solid ${open ? 'var(--accent)' : 'var(--border)'}`,
102
- boxShadow: open ? '0 0 0 3px rgba(249,158,44,.12)' : 'var(--shadow)',
102
+ boxShadow: open ? 'var(--pd, rgba(249,158,44,.12))' : 'var(--shadow)',
103
103
  borderRadius: 'var(--rads)', cursor: disabled ? 'not-allowed' : 'pointer',
104
104
  color: selected ? 'var(--primary-text)' : 'var(--muted)',
105
105
  fontSize: '.82rem', fontFamily: 'var(--sans)', transition: 'all .14s',
@@ -49,11 +49,11 @@ export default function HoverCard({ trigger, children, position = 'top', width =
49
49
  transform: 'translateX(-50%)',
50
50
  zIndex: 9999,
51
51
  minWidth: width,
52
- background: '#fff',
52
+ background: 'var(--surface,#fff)',
53
53
  border: '1px solid var(--border)',
54
54
  borderRadius: 'var(--rads, 8px)',
55
55
  padding: '10px 14px',
56
- boxShadow: '0 4px 12px rgba(0,0,0,.12)',
56
+ boxShadow: 'var(--smd, 0 4px 12px rgba(0,0,0,.12))',
57
57
  pointerEvents: 'none',
58
58
  animation: 'hoverCardIn .15s ease',
59
59
  ...style,
@@ -63,7 +63,7 @@ export default function HoverCard({ trigger, children, position = 'top', width =
63
63
  position: 'absolute', left: '50%',
64
64
  [position === 'top' ? 'bottom' : 'top']: -5,
65
65
  transform: 'translateX(-50%) rotate(45deg)',
66
- width: 8, height: 8, background: '#fff',
66
+ width: 8, height: 8, background: 'var(--surface,#fff)',
67
67
  borderRight: '1px solid var(--border)',
68
68
  borderBottom: position === 'top' ? 'none' : '1px solid var(--border)',
69
69
  borderTop: position === 'top' ? '1px solid var(--border)' : 'none',
@@ -114,9 +114,9 @@ export default function Input({
114
114
  outline: 'none',
115
115
  transition: 'border-color .14s, box-shadow .14s',
116
116
  boxShadow: error
117
- ? '0 0 0 3px rgba(246,71,71,.12), var(--shadow,0 1px 3px rgba(20,22,41,.1))'
117
+ ? 'var(--dd, rgba(246,71,71,.12)), var(--shadow,0 1px 3px rgba(20,22,41,.1))'
118
118
  : focused
119
- ? '0 0 0 3px rgba(249,158,44,.12), var(--shadow,0 1px 3px rgba(20,22,41,.1))'
119
+ ? 'var(--pd, rgba(249,158,44,.12)), var(--shadow,0 1px 3px rgba(20,22,41,.1))'
120
120
  : 'var(--shadow,0 1px 3px rgba(20,22,41,.1))',
121
121
  opacity: props.disabled ? 0.5 : 1,
122
122
  cursor: props.disabled ? 'not-allowed' : undefined,
@@ -13,7 +13,7 @@ export default function LineProgress({
13
13
  size = 'md',
14
14
  customSize,
15
15
  color = 'var(--blue)',
16
- trackColor = '#e0e0e4',
16
+ trackColor = 'var(--bd2, #e0e0e4)',
17
17
  label = '',
18
18
  showPercent = true,
19
19
  animated = true,
@@ -43,9 +43,9 @@ const STYLES = `
43
43
  width: 48px; height: 48px; border-radius: 50%; margin: 0 auto 12px;
44
44
  display: flex; align-items: center; justify-content: center;
45
45
  }
46
- .confirm-icon.danger { background: rgba(246,71,71,.1); }
47
- .confirm-icon.warning { background: rgba(249,158,44,.1); }
48
- .confirm-icon.info { background: rgba(39,130,228,.1); }
46
+ .confirm-icon.danger { background: var(--dd, rgba(246,71,71,.1)); }
47
+ .confirm-icon.warning { background: var(--pd, rgba(249,158,44,.1)); }
48
+ .confirm-icon.info { background: var(--infd, rgba(39,130,228,.1)); }
49
49
 
50
50
  /* Modal scale */
51
51
  @keyframes modalIn {
@@ -149,7 +149,7 @@ export function Modal({ open, onClose, onBeforeClose, title, children, footer, m
149
149
  style={{
150
150
  background: 'var(--surface)', border: '1px solid var(--border)',
151
151
  borderRadius: 14, width: '100%', maxWidth, maxHeight: '60vh',
152
- boxShadow: '0 20px 60px rgba(0,0,0,.25)',
152
+ boxShadow: 'var(--slg, 0 20px 60px rgba(0,0,0,.25))',
153
153
  overflow: 'hidden', display: 'flex', flexDirection: 'column',
154
154
  animation: `${closing ? 'modalCardOut' : 'modalCardIn'} .26s cubic-bezier(.4,0,.2,1) forwards`,
155
155
  }}
@@ -196,7 +196,7 @@ export function Confirm({ open, onClose, onConfirm, title, message, variant = 'd
196
196
  <div className={`confirm-icon ${variant}`} style={{
197
197
  width: 48, height: 48, borderRadius: '50%', margin: '0 auto 12px',
198
198
  display: 'flex', alignItems: 'center', justifyContent: 'center',
199
- background: variant === 'danger' ? 'rgba(246,71,71,.1)' : variant === 'warning' ? 'rgba(249,158,44,.1)' : 'rgba(39,130,228,.1)',
199
+ background: variant === 'danger' ? 'var(--dd, rgba(246,71,71,.1))' : variant === 'warning' ? 'var(--pd, rgba(249,158,44,.1))' : 'var(--infd, rgba(39,130,228,.1))',
200
200
  }}>{icon}</div>
201
201
  <div style={{ fontSize: '.9rem', fontWeight: 700, marginBottom: 8 }}>{title}</div>
202
202
  {message && <div style={{ fontSize: '.8rem', color: 'var(--muted)', lineHeight: 1.5 }}>{message}</div>}
@@ -132,7 +132,7 @@ export default function MultiSelect({ value = [], onChange, options = [], placeh
132
132
  border: `1px solid ${open ? 'var(--accent)' : 'var(--border)'}`,
133
133
  borderRadius: 'var(--rads)',
134
134
  background: 'var(--surface)',
135
- boxShadow: open ? '0 0 0 3px rgba(249,158,44,.12)' : 'var(--shadow)',
135
+ boxShadow: open ? 'var(--pd, rgba(249,158,44,.12))' : 'var(--shadow)',
136
136
  cursor: 'pointer', fontSize: '.8rem', fontFamily: 'var(--sans)',
137
137
  transition: 'border-color .15s, box-shadow .15s',
138
138
  }}
@@ -63,7 +63,7 @@ export function SearchableDropdown({ value, onChange, options = [], placeholder
63
63
  border: `1px solid ${open ? 'var(--accent)' : 'var(--border)'}`, borderRadius: 'var(--rads)',
64
64
  background: 'var(--surface)', color: selected ? 'var(--primary-text)' : 'var(--muted)',
65
65
  cursor: 'pointer', fontSize: '.8rem', fontFamily: 'var(--sans)',
66
- transition: 'border-color .15s', boxShadow: open ? '0 0 0 3px rgba(249,158,44,.12)' : 'var(--shadow)',
66
+ transition: 'border-color .15s', boxShadow: open ? 'var(--pd, rgba(249,158,44,.12))' : 'var(--shadow)',
67
67
  }}
68
68
  onMouseEnter={e => { if (!open) e.currentTarget.style.borderColor = 'var(--accent)'; }}
69
69
  onMouseLeave={e => { if (!open) e.currentTarget.style.borderColor = 'var(--border)'; }}>
@@ -139,7 +139,7 @@ export default function Select({
139
139
  color: 'var(--t,var(--primary-text))',
140
140
  outline: 'none',
141
141
  transition: 'border-color var(--tr,.15s), box-shadow var(--tr,.15s)',
142
- boxShadow: open ? '0 0 0 3px rgba(37,99,235,.1)' : 'var(--shadow,0 1px 3px rgba(20,22,41,.1))',
142
+ boxShadow: open ? 'var(--infd, rgba(37,99,235,.1))' : 'var(--shadow,0 1px 3px rgba(20,22,41,.1))',
143
143
  }}
144
144
  >
145
145
  <div style={{ flex: 1, minWidth: 0, display: 'flex', alignItems: 'center' }}>
@@ -278,7 +278,7 @@ export default function Select({
278
278
  left: 3.5,
279
279
  width: 4.5,
280
280
  height: 7,
281
- border: 'solid #fff',
281
+ border: 'solid var(--def-btn-text,#fff)',
282
282
  borderWidth: '0 1.5px 1.5px 0',
283
283
  transform: 'rotate(45deg)',
284
284
  }} />
@@ -70,7 +70,7 @@ export function SkeletonCard({ rows = 3, style = {} }) {
70
70
  border: '1px solid var(--border-light, #ebebf0)',
71
71
  borderRadius: 'var(--rad, 10px)',
72
72
  padding: '14px 16px',
73
- boxShadow: '0 1px 3px rgba(0,0,0,.04)',
73
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.04))',
74
74
  ...style,
75
75
  }}>
76
76
  <div style={{
@@ -5,8 +5,8 @@ export default function StatBarCard({ title, icon, items, style }) {
5
5
 
6
6
  return (
7
7
  <div style={{
8
- background: '#fff', border: '1px solid var(--border)', borderRadius: 'var(--rad)',
9
- boxShadow: '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
8
+ background: 'var(--surface,#fff)', border: '1px solid var(--border)', borderRadius: 'var(--rad)',
9
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04))',
10
10
  padding: '12px 14px', minWidth: 220, ...style,
11
11
  }}>
12
12
  <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }}>
@@ -39,7 +39,7 @@ const groupStyle = {
39
39
  borderRadius: 7,
40
40
  border: '1px solid var(--border)',
41
41
  background: 'var(--surface)',
42
- boxShadow: '0 1px 2px rgba(0,0,0,.05)',
42
+ boxShadow: 'var(--shadow, 0 1px 2px rgba(0,0,0,.05))',
43
43
  };
44
44
 
45
45
  export default function StatsBar({ total = 0, active = 0, blocked = 0, actions = 0, type }) {
@@ -57,8 +57,8 @@ export default function StatsBar({ total = 0, active = 0, blocked = 0, actions =
57
57
  </div>
58
58
  <div style={sep} />
59
59
  <div style={itemStyle}>
60
- <span style={iconWrap('#22c55e')}><Users size={10} /></span>
61
- {dot('#22c55e')}
60
+ <span style={iconWrap('var(--s, #22c55e)')}><Users size={10} /></span>
61
+ {dot('var(--s, #22c55e)')}
62
62
  <span>{active}</span>
63
63
  </div>
64
64
  </div>
@@ -66,20 +66,20 @@ export default function StatsBar({ total = 0, active = 0, blocked = 0, actions =
66
66
  {/* Status group */}
67
67
  <div style={groupStyle}>
68
68
  <div style={itemStyle}>
69
- <span style={iconWrap('#ef4444')}><ShieldAlert size={10} /></span>
70
- {dot('#ef4444')}
69
+ <span style={iconWrap('var(--d, #ef4444)')}><ShieldAlert size={10} /></span>
70
+ {dot('var(--d, #ef4444)')}
71
71
  <span>{blocked}</span>
72
72
  </div>
73
73
  <div style={sep} />
74
74
  <div style={itemStyle}>
75
- <span style={iconWrap('#f59e0b')}><Activity size={10} /></span>
76
- {dot('#f59e0b')}
75
+ <span style={iconWrap('var(--w, #f59e0b)')}><Activity size={10} /></span>
76
+ {dot('var(--w, #f59e0b)')}
77
77
  <span>{actions}</span>
78
78
  </div>
79
79
  <div style={sep} />
80
80
  <div style={itemStyle}>
81
- <span style={iconWrap('#94a3b8')}><WifiOff size={10} /></span>
82
- {dot('#94a3b8')}
81
+ <span style={iconWrap('var(--t3, #94a3b8)')}><WifiOff size={10} /></span>
82
+ {dot('var(--t3, #94a3b8)')}
83
83
  <span>{total - active}</span>
84
84
  </div>
85
85
  </div>
@@ -9,7 +9,7 @@ const BASE = {
9
9
  borderRadius: 'var(--rad,10px)',
10
10
  background: 'var(--surface,#fff)',
11
11
  border: '1px solid var(--border)',
12
- boxShadow: '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
12
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04))',
13
13
  minWidth: 0,
14
14
  transition: 'border-color .15s',
15
15
  };
@@ -26,14 +26,14 @@ export default function StatsCard({
26
26
  variant = 'default',
27
27
  icon,
28
28
  iconColor = 'var(--blue)',
29
- iconBg = 'rgba(39,130,228,.1)',
29
+ iconBg = 'var(--infd, rgba(39,130,228,.1))',
30
30
  title,
31
31
  value,
32
32
  subtitle,
33
33
  percent,
34
34
  percentColor,
35
35
  progressSize = 'sm',
36
- progressTrackColor = '#e8e8ec',
36
+ progressTrackColor = 'var(--bd2, #e8e8ec)',
37
37
  headRight,
38
38
  className = '',
39
39
  style = {},
@@ -72,8 +72,8 @@ export default function TabBar({ tabs, active, onChange, capitalize = false, pad
72
72
  padding: padding || '5px 12px',
73
73
  border: 'none',
74
74
  borderRadius: 'var(--radxs, 6px)',
75
- background: isActive ? '#fff' : 'transparent',
76
- boxShadow: isActive ? '0 1px 2px rgba(0,0,0,.06)' : 'none',
75
+ background: isActive ? 'var(--surface,#fff)' : 'transparent',
76
+ boxShadow: isActive ? 'var(--shadow, 0 1px 2px rgba(0,0,0,.06))' : 'none',
77
77
  fontSize: '.75rem', fontWeight: isActive ? 600 : 500,
78
78
  color: isActive ? 'var(--primary-text, #0f111c)' : 'var(--muted, #9b9daa)',
79
79
  cursor: 'pointer',
@@ -11,8 +11,8 @@ export function Tabs({ tabs, value, onChange, style }) {
11
11
  padding: '5px 12px',
12
12
  border: 'none',
13
13
  borderRadius: 'var(--radxs, 6px)',
14
- background: active ? '#fff' : 'transparent',
15
- boxShadow: active ? '0 1px 2px rgba(0,0,0,.06)' : 'none',
14
+ background: active ? 'var(--surface,#fff)' : 'transparent',
15
+ boxShadow: active ? 'var(--shadow, 0 1px 2px rgba(0,0,0,.06))' : 'none',
16
16
  fontSize: '.75rem', fontWeight: active ? 600 : 500,
17
17
  color: active ? 'var(--primary-text, #0f111c)' : 'var(--muted, #9b9daa)',
18
18
  cursor: 'pointer',
@@ -5,13 +5,13 @@ const SIZES = {
5
5
  };
6
6
 
7
7
  const COLORS = {
8
- primary: '#f99e2c',
9
- success: '#27ae60',
10
- warning: '#f59e0b',
11
- danger: '#f64747',
8
+ primary: 'var(--accent, #f99e2c)',
9
+ success: 'var(--s, #27ae60)',
10
+ warning: 'var(--w, #f59e0b)',
11
+ danger: 'var(--d, #f64747)',
12
12
  };
13
13
 
14
- const OFF_COLOR = '#d7d8e0';
14
+ const OFF_COLOR = 'var(--bd, #d7d8e0)';
15
15
 
16
16
  export default function Toggle({
17
17
  checked = false,
@@ -46,7 +46,7 @@ export default function Toggle({
46
46
  position:'relative', width: s.w, height: s.h, borderRadius: s.r,
47
47
  background: trackBg, flexShrink: 0,
48
48
  transition: 'background .25s ease',
49
- boxShadow: '0 1px 3px rgba(20,22,41,.1)',
49
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(20,22,41,.1))',
50
50
  }}>
51
51
  <span style={{
52
52
  position:'absolute', top:'50%',
@@ -55,8 +55,8 @@ export default function Toggle({
55
55
  : 'translateY(-50%) scale(1)',
56
56
  left: checked ? s.on : s.off,
57
57
  width: s.dot, height: s.dot,
58
- background: '#fff', borderRadius: '50%',
59
- boxShadow: '0 1px 3px rgba(0,0,0,.25)',
58
+ background: 'var(--surface,#fff)', borderRadius: '50%',
59
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.25))',
60
60
  transition: 'left .3s cubic-bezier(.34,1.56,.64,1), transform .2s ease',
61
61
  willChange: 'left',
62
62
  }} />
@@ -1,10 +1,10 @@
1
1
  import { useMemo, useState, useRef } from 'react';
2
2
 
3
3
  const card = {
4
- background: '#fff',
4
+ background: 'var(--surface,#fff)',
5
5
  border: '1px solid var(--border)',
6
6
  borderRadius: 'var(--rad)',
7
- boxShadow: '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
7
+ boxShadow: 'var(--shadow, 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04))',
8
8
  };
9
9
 
10
10
  const MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
@@ -144,10 +144,10 @@ export default function UptimeBar({
144
144
  left: tooltipPos.x,
145
145
  top: tooltipPos.y,
146
146
  transform: 'translate(-50%, -100%)',
147
- background: '#fff',
147
+ background: 'var(--surface,#fff)',
148
148
  border: '1px solid var(--border)',
149
149
  borderRadius: 'var(--rads)',
150
- boxShadow: '0 4px 12px rgba(0,0,0,.12)',
150
+ boxShadow: 'var(--smd, 0 4px 12px rgba(0,0,0,.12))',
151
151
  padding: '8px 12px',
152
152
  pointerEvents: 'none',
153
153
  zIndex: 100,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cynx-ui",
3
- "version": "1.2.27",
3
+ "version": "1.2.28",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js"