cynx-ui 1.2.6 → 1.2.8

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.
@@ -1,200 +1,200 @@
1
- import { useMemo, useState, useRef } from 'react';
2
-
3
- const card = {
4
- background: '#fff',
5
- border: '1px solid var(--border)',
6
- borderRadius: 'var(--rad)',
7
- boxShadow: '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
8
- };
9
-
10
- const MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
11
-
12
- function formatDate(date) {
13
- return `${MONTHS[date.getMonth()]} ${date.getDate()}`;
14
- }
15
-
16
- export default function UptimeBar({
17
- title = 'Uptime',
18
- subtitle,
19
- successValues = [],
20
- failedValues = [],
21
- totalSlots = 90,
22
- greenColor = 'var(--success)',
23
- redColor = 'var(--danger)',
24
- emptyColor = 'var(--grey-1)',
25
- barHeight = 28,
26
- barRadius = 3,
27
- leftLabel,
28
- rightLabel,
29
- showDot = true,
30
- dotColor,
31
- style,
32
- }) {
33
- const [hovered, setHovered] = useState(null);
34
- const [tooltipPos, setTooltipPos] = useState({ x: 0, y: 0 });
35
- const containerRef = useRef(null);
36
-
37
- const bars = useMemo(() => {
38
- const len = Math.max(successValues.length, failedValues.length, totalSlots);
39
- const result = [];
40
- const stepS = successValues.length / len;
41
- const stepF = failedValues.length / len;
42
- for (let i = 0; i < len; i++) {
43
- const si = Math.min(Math.floor(i * stepS), successValues.length - 1);
44
- const fi = Math.min(Math.floor(i * stepF), failedValues.length - 1);
45
- const s = successValues[si] || 0;
46
- const f = failedValues[fi] || 0;
47
- result.push({ success: s, failed: f });
48
- }
49
- return result;
50
- }, [successValues, failedValues, totalSlots]);
51
-
52
- const dates = useMemo(() => {
53
- const result = [];
54
- const now = new Date();
55
- for (let i = 0; i < bars.length; i++) {
56
- const d = new Date(now);
57
- d.setDate(d.getDate() - (bars.length - 1 - i));
58
- result.push(d);
59
- }
60
- return result;
61
- }, [bars.length]);
62
-
63
- const totalSuccess = bars.reduce((a, b) => a + b.success, 0);
64
- const totalFailed = bars.reduce((a, b) => a + b.failed, 0);
65
- const totalAll = totalSuccess + totalFailed;
66
- const uptimePercent = totalAll > 0 ? Math.round((totalSuccess / totalAll) * 100) : 100;
67
-
68
- function handleMouseEnter(e, idx) {
69
- const rect = e.currentTarget.getBoundingClientRect();
70
- const containerRect = containerRef.current.getBoundingClientRect();
71
- setTooltipPos({
72
- x: rect.left - containerRect.left + rect.width / 2,
73
- y: rect.top - containerRect.top - 8,
74
- });
75
- setHovered(idx);
76
- }
77
-
78
- return (
79
- <div ref={containerRef} style={{ ...card, padding: '14px 18px 14px', position: 'relative', ...style }}>
80
- {/* Header */}
81
- <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 12 }}>
82
- <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
83
- {showDot && (
84
- <span style={{
85
- width: 8, height: 8, borderRadius: '50%',
86
- background: dotColor || greenColor, flexShrink: 0,
87
- }} />
88
- )}
89
- <span style={{ fontSize: '.78rem', fontWeight: 700, color: 'var(--primary-text)', letterSpacing: '-.01em' }}>{title}</span>
90
- {subtitle && <span style={{ fontSize: '.65rem', color: 'var(--muted)', fontWeight: 500 }}>{subtitle}</span>}
91
- </div>
92
- {/* Legend */}
93
- <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
94
- <LegendDot color={greenColor} label="Success" />
95
- <LegendDot color={redColor} label="Failed" />
96
- <LegendDot color={emptyColor} label="None" />
97
- </div>
98
- </div>
99
-
100
- {/* Bars */}
101
- <div style={{ display: 'flex', alignItems: 'flex-end', gap: 2, height: barHeight, marginBottom: 6 }}>
102
- {bars.map((b, i) => {
103
- const total = b.success + b.failed;
104
- const hasData = total > 0;
105
- const successPct = hasData ? (b.success / total) * 100 : 0;
106
- const failedPct = hasData ? (b.failed / total) * 100 : 0;
107
-
108
- return (
109
- <div
110
- key={i}
111
- onMouseEnter={(e) => handleMouseEnter(e, i)}
112
- onMouseLeave={() => setHovered(null)}
113
- style={{
114
- flex: 1,
115
- height: '100%',
116
- borderRadius: barRadius,
117
- overflow: 'hidden',
118
- display: 'flex',
119
- flexDirection: 'column',
120
- background: hasData ? 'transparent' : emptyColor,
121
- }}
122
- >
123
- {hasData && (
124
- <>
125
- {/* Failed on bottom */}
126
- {b.failed > 0 && (
127
- <div style={{ height: `${failedPct}%`, background: redColor, marginTop: 'auto' }} />
128
- )}
129
- {/* Success on top */}
130
- {b.success > 0 && (
131
- <div style={{ height: `${successPct}%`, background: greenColor }} />
132
- )}
133
- </>
134
- )}
135
- </div>
136
- );
137
- })}
138
- </div>
139
-
140
- {/* Tooltip */}
141
- {hovered !== null && (
142
- <div style={{
143
- position: 'absolute',
144
- left: tooltipPos.x,
145
- top: tooltipPos.y,
146
- transform: 'translate(-50%, -100%)',
147
- background: '#fff',
148
- border: '1px solid var(--border)',
149
- borderRadius: 'var(--rads)',
150
- boxShadow: '0 4px 12px rgba(0,0,0,.12)',
151
- padding: '8px 12px',
152
- pointerEvents: 'none',
153
- zIndex: 100,
154
- whiteSpace: 'nowrap',
155
- }}>
156
- <div style={{ fontSize: '.65rem', color: 'var(--muted)', fontWeight: 500, marginBottom: 4 }}>
157
- {formatDate(dates[hovered])}
158
- </div>
159
- <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
160
- {bars[hovered].success > 0 && (
161
- <div style={{ fontSize: '.7rem', fontWeight: 700, color: greenColor }}>
162
- {bars[hovered].success} success login{bars[hovered].success !== 1 ? 's' : ''}
163
- {bars[hovered].failed > 0 && <span style={{ fontWeight: 500, color: 'var(--muted)' }}> ({Math.round((bars[hovered].success / (bars[hovered].success + bars[hovered].failed)) * 100)}%)</span>}
164
- </div>
165
- )}
166
- {bars[hovered].failed > 0 && (
167
- <div style={{ fontSize: '.7rem', fontWeight: 700, color: redColor }}>
168
- {bars[hovered].failed} failed login{bars[hovered].failed !== 1 ? 's' : ''}
169
- {bars[hovered].success > 0 && <span style={{ fontWeight: 500, color: 'var(--muted)' }}> ({Math.round((bars[hovered].failed / (bars[hovered].success + bars[hovered].failed)) * 100)}%)</span>}
170
- </div>
171
- )}
172
- {bars[hovered].success === 0 && bars[hovered].failed === 0 && (
173
- <div style={{ fontSize: '.7rem', fontWeight: 500, color: 'var(--muted)' }}>
174
- No logins
175
- </div>
176
- )}
177
- </div>
178
- </div>
179
- )}
180
-
181
- {/* Footer */}
182
- <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
183
- <span style={{ fontSize: '.58rem', color: 'var(--muted)', fontWeight: 500 }}>{leftLabel || '90 days ago'}</span>
184
- <span style={{ fontSize: '.78rem', fontWeight: 700, color: greenColor, fontFamily: 'var(--mono)' }}>
185
- {uptimePercent}%
186
- </span>
187
- <span style={{ fontSize: '.58rem', color: 'var(--muted)', fontWeight: 500 }}>{rightLabel || 'Today'}</span>
188
- </div>
189
- </div>
190
- );
191
- }
192
-
193
- function LegendDot({ color, label }) {
194
- return (
195
- <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
196
- <span style={{ width: 7, height: 7, borderRadius: 2, background: color, flexShrink: 0 }} />
197
- <span style={{ fontSize: '.55rem', color: 'var(--muted)', fontWeight: 500 }}>{label}</span>
198
- </div>
199
- );
200
- }
1
+ import { useMemo, useState, useRef } from 'react';
2
+
3
+ const card = {
4
+ background: '#fff',
5
+ border: '1px solid var(--border)',
6
+ borderRadius: 'var(--rad)',
7
+ boxShadow: '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
8
+ };
9
+
10
+ const MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
11
+
12
+ function formatDate(date) {
13
+ return `${MONTHS[date.getMonth()]} ${date.getDate()}`;
14
+ }
15
+
16
+ export default function UptimeBar({
17
+ title = 'Uptime',
18
+ subtitle,
19
+ successValues = [],
20
+ failedValues = [],
21
+ totalSlots = 90,
22
+ greenColor = 'var(--success)',
23
+ redColor = 'var(--danger)',
24
+ emptyColor = 'var(--grey-1)',
25
+ barHeight = 28,
26
+ barRadius = 3,
27
+ leftLabel,
28
+ rightLabel,
29
+ showDot = true,
30
+ dotColor,
31
+ style,
32
+ }) {
33
+ const [hovered, setHovered] = useState(null);
34
+ const [tooltipPos, setTooltipPos] = useState({ x: 0, y: 0 });
35
+ const containerRef = useRef(null);
36
+
37
+ const bars = useMemo(() => {
38
+ const len = Math.max(successValues.length, failedValues.length, totalSlots);
39
+ const result = [];
40
+ const stepS = successValues.length / len;
41
+ const stepF = failedValues.length / len;
42
+ for (let i = 0; i < len; i++) {
43
+ const si = Math.min(Math.floor(i * stepS), successValues.length - 1);
44
+ const fi = Math.min(Math.floor(i * stepF), failedValues.length - 1);
45
+ const s = successValues[si] || 0;
46
+ const f = failedValues[fi] || 0;
47
+ result.push({ success: s, failed: f });
48
+ }
49
+ return result;
50
+ }, [successValues, failedValues, totalSlots]);
51
+
52
+ const dates = useMemo(() => {
53
+ const result = [];
54
+ const now = new Date();
55
+ for (let i = 0; i < bars.length; i++) {
56
+ const d = new Date(now);
57
+ d.setDate(d.getDate() - (bars.length - 1 - i));
58
+ result.push(d);
59
+ }
60
+ return result;
61
+ }, [bars.length]);
62
+
63
+ const totalSuccess = bars.reduce((a, b) => a + b.success, 0);
64
+ const totalFailed = bars.reduce((a, b) => a + b.failed, 0);
65
+ const totalAll = totalSuccess + totalFailed;
66
+ const uptimePercent = totalAll > 0 ? Math.round((totalSuccess / totalAll) * 100) : 100;
67
+
68
+ function handleMouseEnter(e, idx) {
69
+ const rect = e.currentTarget.getBoundingClientRect();
70
+ const containerRect = containerRef.current.getBoundingClientRect();
71
+ setTooltipPos({
72
+ x: rect.left - containerRect.left + rect.width / 2,
73
+ y: rect.top - containerRect.top - 8,
74
+ });
75
+ setHovered(idx);
76
+ }
77
+
78
+ return (
79
+ <div ref={containerRef} style={{ ...card, padding: '14px 18px 14px', position: 'relative', ...style }}>
80
+ {/* Header */}
81
+ <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 12 }}>
82
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
83
+ {showDot && (
84
+ <span style={{
85
+ width: 8, height: 8, borderRadius: '50%',
86
+ background: dotColor || greenColor, flexShrink: 0,
87
+ }} />
88
+ )}
89
+ <span style={{ fontSize: '.78rem', fontWeight: 700, color: 'var(--primary-text)', letterSpacing: '-.01em' }}>{title}</span>
90
+ {subtitle && <span style={{ fontSize: '.65rem', color: 'var(--muted)', fontWeight: 500 }}>{subtitle}</span>}
91
+ </div>
92
+ {/* Legend */}
93
+ <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
94
+ <LegendDot color={greenColor} label="Success" />
95
+ <LegendDot color={redColor} label="Failed" />
96
+ <LegendDot color={emptyColor} label="None" />
97
+ </div>
98
+ </div>
99
+
100
+ {/* Bars */}
101
+ <div style={{ display: 'flex', alignItems: 'flex-end', gap: 2, height: barHeight, marginBottom: 6 }}>
102
+ {bars.map((b, i) => {
103
+ const total = b.success + b.failed;
104
+ const hasData = total > 0;
105
+ const successPct = hasData ? (b.success / total) * 100 : 0;
106
+ const failedPct = hasData ? (b.failed / total) * 100 : 0;
107
+
108
+ return (
109
+ <div
110
+ key={i}
111
+ onMouseEnter={(e) => handleMouseEnter(e, i)}
112
+ onMouseLeave={() => setHovered(null)}
113
+ style={{
114
+ flex: 1,
115
+ height: '100%',
116
+ borderRadius: barRadius,
117
+ overflow: 'hidden',
118
+ display: 'flex',
119
+ flexDirection: 'column',
120
+ background: hasData ? 'transparent' : emptyColor,
121
+ }}
122
+ >
123
+ {hasData && (
124
+ <>
125
+ {/* Failed on bottom */}
126
+ {b.failed > 0 && (
127
+ <div style={{ height: `${failedPct}%`, background: redColor, marginTop: 'auto' }} />
128
+ )}
129
+ {/* Success on top */}
130
+ {b.success > 0 && (
131
+ <div style={{ height: `${successPct}%`, background: greenColor }} />
132
+ )}
133
+ </>
134
+ )}
135
+ </div>
136
+ );
137
+ })}
138
+ </div>
139
+
140
+ {/* Tooltip */}
141
+ {hovered !== null && (
142
+ <div style={{
143
+ position: 'absolute',
144
+ left: tooltipPos.x,
145
+ top: tooltipPos.y,
146
+ transform: 'translate(-50%, -100%)',
147
+ background: '#fff',
148
+ border: '1px solid var(--border)',
149
+ borderRadius: 'var(--rads)',
150
+ boxShadow: '0 4px 12px rgba(0,0,0,.12)',
151
+ padding: '8px 12px',
152
+ pointerEvents: 'none',
153
+ zIndex: 100,
154
+ whiteSpace: 'nowrap',
155
+ }}>
156
+ <div style={{ fontSize: '.65rem', color: 'var(--muted)', fontWeight: 500, marginBottom: 4 }}>
157
+ {formatDate(dates[hovered])}
158
+ </div>
159
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
160
+ {bars[hovered].success > 0 && (
161
+ <div style={{ fontSize: '.7rem', fontWeight: 700, color: greenColor }}>
162
+ {bars[hovered].success} success login{bars[hovered].success !== 1 ? 's' : ''}
163
+ {bars[hovered].failed > 0 && <span style={{ fontWeight: 500, color: 'var(--muted)' }}> ({Math.round((bars[hovered].success / (bars[hovered].success + bars[hovered].failed)) * 100)}%)</span>}
164
+ </div>
165
+ )}
166
+ {bars[hovered].failed > 0 && (
167
+ <div style={{ fontSize: '.7rem', fontWeight: 700, color: redColor }}>
168
+ {bars[hovered].failed} failed login{bars[hovered].failed !== 1 ? 's' : ''}
169
+ {bars[hovered].success > 0 && <span style={{ fontWeight: 500, color: 'var(--muted)' }}> ({Math.round((bars[hovered].failed / (bars[hovered].success + bars[hovered].failed)) * 100)}%)</span>}
170
+ </div>
171
+ )}
172
+ {bars[hovered].success === 0 && bars[hovered].failed === 0 && (
173
+ <div style={{ fontSize: '.7rem', fontWeight: 500, color: 'var(--muted)' }}>
174
+ No logins
175
+ </div>
176
+ )}
177
+ </div>
178
+ </div>
179
+ )}
180
+
181
+ {/* Footer */}
182
+ <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
183
+ <span style={{ fontSize: '.58rem', color: 'var(--muted)', fontWeight: 500 }}>{leftLabel || '90 days ago'}</span>
184
+ <span style={{ fontSize: '.78rem', fontWeight: 700, color: greenColor, fontFamily: 'var(--mono)' }}>
185
+ {uptimePercent}%
186
+ </span>
187
+ <span style={{ fontSize: '.58rem', color: 'var(--muted)', fontWeight: 500 }}>{rightLabel || 'Today'}</span>
188
+ </div>
189
+ </div>
190
+ );
191
+ }
192
+
193
+ function LegendDot({ color, label }) {
194
+ return (
195
+ <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
196
+ <span style={{ width: 7, height: 7, borderRadius: 2, background: color, flexShrink: 0 }} />
197
+ <span style={{ fontSize: '.55rem', color: 'var(--muted)', fontWeight: 500 }}>{label}</span>
198
+ </div>
199
+ );
200
+ }
@@ -1,22 +1,22 @@
1
- export function XTable({ children, style }) { return <table className="x-table" style={style}>{children}</table>; }
2
- export function XThead({ children }) { return <thead>{children}</thead>; }
3
- export function XTbody({ children }) { return <tbody>{children}</tbody>; }
4
- export function XTr({ children, onClick }) { return <tr className="x-tr" onClick={onClick}>{children}</tr>; }
5
- export function XTh({ children, style }) { return <th className="x-th" style={style}>{children}</th>; }
6
- export function XTd({ children, style, className = '', colSpan }) {
7
- return <td className={`x-td ${className}`} style={style} colSpan={colSpan}>{children}</td>;
8
- }
9
-
10
- export function SkeletonTable({ rows = 6, cols = 5 }) {
11
- return (
12
- <div>
13
- {Array.from({ length: rows }).map((_, i) => (
14
- <div key={i} className="skeleton-row">
15
- {Array.from({ length: cols }).map((_, j) => (
16
- <div key={j} className={`skeleton skeleton-text ${j === 0 ? 'short' : j === cols - 1 ? 'short' : 'mid'}`} style={{ flex: 1 }} />
17
- ))}
18
- </div>
19
- ))}
20
- </div>
21
- );
22
- }
1
+ export function XTable({ children, style }) { return <table className="x-table" style={style}>{children}</table>; }
2
+ export function XThead({ children }) { return <thead>{children}</thead>; }
3
+ export function XTbody({ children }) { return <tbody>{children}</tbody>; }
4
+ export function XTr({ children, onClick }) { return <tr className="x-tr" onClick={onClick}>{children}</tr>; }
5
+ export function XTh({ children, style }) { return <th className="x-th" style={style}>{children}</th>; }
6
+ export function XTd({ children, style, className = '', colSpan }) {
7
+ return <td className={`x-td ${className}`} style={style} colSpan={colSpan}>{children}</td>;
8
+ }
9
+
10
+ export function SkeletonTable({ rows = 6, cols = 5 }) {
11
+ return (
12
+ <div>
13
+ {Array.from({ length: rows }).map((_, i) => (
14
+ <div key={i} className="skeleton-row">
15
+ {Array.from({ length: cols }).map((_, j) => (
16
+ <div key={j} className={`skeleton skeleton-text ${j === 0 ? 'short' : j === cols - 1 ? 'short' : 'mid'}`} style={{ flex: 1 }} />
17
+ ))}
18
+ </div>
19
+ ))}
20
+ </div>
21
+ );
22
+ }
package/index.js CHANGED
@@ -1,94 +1,94 @@
1
- // cynx-ui — shared component library
2
- import { default as _Button } from './components/Button.jsx';
3
- import { default as _Input } from './components/Input.jsx';
4
- import { default as _Toggle } from './components/Toggle.jsx';
5
- import { default as _Spinner, Spinner as _SpinnerNamed } from './components/Spinner.jsx';
6
- import { default as _TabBar } from './components/TabBar.jsx';
7
- import { default as _Dropdown } from './components/Dropdown.jsx';
8
- import { default as _MultiSelect } from './components/MultiSelect.jsx';
9
- import { default as _ImageUpload } from './components/ImageUpload.jsx';
10
- import { default as _ChipSelect } from './components/ChipSelect.jsx';
11
- import { default as _Checkbox } from './components/Checkbox.jsx';
12
- import { default as _AuthOverlay } from './components/AuthOverlay.jsx';
13
- import { default as _UptimeBar } from './components/UptimeBar.jsx';
14
- import { default as _LineProgress } from './components/LineProgress.jsx';
15
- import { default as _StatBarCard } from './components/StatBarCard.jsx';
16
- import { default as _StatsCard } from './components/StatsCard.jsx';
17
- import { default as _ActivityCard } from './components/ActivityCard.jsx';
18
- import { default as _HoverCard } from './components/HoverCard.jsx';
19
- import { default as _StatsBar } from './components/StatsBar.jsx';
20
- import { default as _Select } from './components/Select.jsx';
21
- import { default as _Badge } from './components/Badge.jsx';
22
- import { default as _PulseDot } from './components/PulseDot.jsx';
23
- import { default as _CircularProgress } from './components/CircularProgress.jsx';
24
- import { default as _Skeleton } from './components/Skeleton.jsx';
25
- import { Modal as _Modal, Confirm as _Confirm } from './components/Modal.jsx';
26
- import { toast as _toast, useToast as _useToast, Toast as _Toast } from './components/Toast.jsx';
27
- import { ConfirmRoot as _ConfirmRoot, confirm as _confirm } from './components/Confirm.jsx';
28
- import { SearchableDropdown as _SearchableDropdown } from './components/SearchableDropdown.jsx';
29
- import { Pagination as _Pagination } from './components/Pagination.jsx';
30
- import { DatePicker as _DatePicker } from './components/DatePicker.jsx';
31
- import { ActionsMenu as _ActionsMenu } from './components/ActionsMenu.jsx';
32
- import { BrandingCard as _BrandingCard } from './components/BrandingCard.jsx';
33
- import { Dropzone as _Dropzone } from './components/Dropzone.jsx';
34
- import { Tabs as _Tabs } from './components/Tabs.jsx';
35
- import { SkeletonText as _SkeletonText, SkeletonCard as _SkeletonCard, SkeletonRows as _SkeletonRows, SkeletonStats as _SkeletonStats } from './components/Skeleton.jsx';
36
- import { XTable as _XTable, XThead as _XThead, XTbody as _XTbody, XTr as _XTr, XTh as _XTh, XTd as _XTd, SkeletonTable as _SkeletonTable } from './components/XTable.jsx';
37
- import { PageShell as _PageShell, TableCard as _TableCard, TableCardFilters as _TableCardFilters, TableCardBody as _TableCardBody, TableCardFooter as _TableCardFooter, CardHdr as _CardHdr, StatCard as _StatCard, StatCardSkeleton as _StatCardSkeleton } from './components/Card.jsx';
38
-
39
- export const Button = _Button;
40
- export const Input = _Input;
41
- export const Toggle = _Toggle;
42
- export const Spinner = _Spinner || _SpinnerNamed;
43
- export const TabBar = _TabBar;
44
- export const Dropdown = _Dropdown;
45
- export const MultiSelect = _MultiSelect;
46
- export const ImageUpload = _ImageUpload;
47
- export const ChipSelect = _ChipSelect;
48
- export const Checkbox = _Checkbox;
49
- export const AuthOverlay = _AuthOverlay;
50
- export const UptimeBar = _UptimeBar;
51
- export const LineProgress = _LineProgress;
52
- export const StatBarCard = _StatBarCard;
53
- export const StatsCard = _StatsCard;
54
- export const ActivityCard = _ActivityCard;
55
- export const HoverCard = _HoverCard;
56
- export const StatsBar = _StatsBar;
57
- export const Select = _Select;
58
- export const Badge = _Badge;
59
- export const PulseDot = _PulseDot;
60
- export const CircularProgress = _CircularProgress;
61
- export const Skeleton = _Skeleton;
62
- export const Modal = _Modal;
63
- export const Confirm = _Confirm;
64
- export const toast = _toast;
65
- export const useToast = _useToast;
66
- export const Toast = _Toast;
67
- export const ConfirmRoot = _ConfirmRoot;
68
- export const confirm = _confirm;
69
- export const SearchableDropdown = _SearchableDropdown;
70
- export const Pagination = _Pagination;
71
- export const DatePicker = _DatePicker;
72
- export const ActionsMenu = _ActionsMenu;
73
- export const BrandingCard = _BrandingCard;
74
- export const Dropzone = _Dropzone;
75
- export const Tabs = _Tabs;
76
- export const SkeletonText = _SkeletonText;
77
- export const SkeletonCard = _SkeletonCard;
78
- export const SkeletonRows = _SkeletonRows;
79
- export const SkeletonStats = _SkeletonStats;
80
- export const XTable = _XTable;
81
- export const XThead = _XThead;
82
- export const XTbody = _XTbody;
83
- export const XTr = _XTr;
84
- export const XTh = _XTh;
85
- export const XTd = _XTd;
86
- export const SkeletonTable = _SkeletonTable;
87
- export const PageShell = _PageShell;
88
- export const TableCard = _TableCard;
89
- export const TableCardFilters = _TableCardFilters;
90
- export const TableCardBody = _TableCardBody;
91
- export const TableCardFooter = _TableCardFooter;
92
- export const CardHdr = _CardHdr;
93
- export const StatCard = _StatCard;
94
- export const StatCardSkeleton = _StatCardSkeleton;
1
+ // cynx-ui — shared component library
2
+ import { default as _Button } from './components/Button.jsx';
3
+ import { default as _Input } from './components/Input.jsx';
4
+ import { default as _Toggle } from './components/Toggle.jsx';
5
+ import { default as _Spinner, Spinner as _SpinnerNamed } from './components/Spinner.jsx';
6
+ import { default as _TabBar } from './components/TabBar.jsx';
7
+ import { default as _Dropdown } from './components/Dropdown.jsx';
8
+ import { default as _MultiSelect } from './components/MultiSelect.jsx';
9
+ import { default as _ImageUpload } from './components/ImageUpload.jsx';
10
+ import { default as _ChipSelect } from './components/ChipSelect.jsx';
11
+ import { default as _Checkbox } from './components/Checkbox.jsx';
12
+ import { default as _AuthOverlay } from './components/AuthOverlay.jsx';
13
+ import { default as _UptimeBar } from './components/UptimeBar.jsx';
14
+ import { default as _LineProgress } from './components/LineProgress.jsx';
15
+ import { default as _StatBarCard } from './components/StatBarCard.jsx';
16
+ import { default as _StatsCard } from './components/StatsCard.jsx';
17
+ import { default as _ActivityCard } from './components/ActivityCard.jsx';
18
+ import { default as _HoverCard } from './components/HoverCard.jsx';
19
+ import { default as _StatsBar } from './components/StatsBar.jsx';
20
+ import { default as _Select } from './components/Select.jsx';
21
+ import { default as _Badge } from './components/Badge.jsx';
22
+ import { default as _PulseDot } from './components/PulseDot.jsx';
23
+ import { default as _CircularProgress } from './components/CircularProgress.jsx';
24
+ import { default as _Skeleton } from './components/Skeleton.jsx';
25
+ import { Modal as _Modal, Confirm as _Confirm } from './components/Modal.jsx';
26
+ import { toast as _toast, useToast as _useToast, Toast as _Toast } from './components/Toast.jsx';
27
+ import { ConfirmRoot as _ConfirmRoot, confirm as _confirm } from './components/Confirm.jsx';
28
+ import { SearchableDropdown as _SearchableDropdown } from './components/SearchableDropdown.jsx';
29
+ import { Pagination as _Pagination } from './components/Pagination.jsx';
30
+ import { DatePicker as _DatePicker } from './components/DatePicker.jsx';
31
+ import { ActionsMenu as _ActionsMenu } from './components/ActionsMenu.jsx';
32
+ import { BrandingCard as _BrandingCard } from './components/BrandingCard.jsx';
33
+ import { Dropzone as _Dropzone } from './components/Dropzone.jsx';
34
+ import { Tabs as _Tabs } from './components/Tabs.jsx';
35
+ import { SkeletonText as _SkeletonText, SkeletonCard as _SkeletonCard, SkeletonRows as _SkeletonRows, SkeletonStats as _SkeletonStats } from './components/Skeleton.jsx';
36
+ import { XTable as _XTable, XThead as _XThead, XTbody as _XTbody, XTr as _XTr, XTh as _XTh, XTd as _XTd, SkeletonTable as _SkeletonTable } from './components/XTable.jsx';
37
+ import { PageShell as _PageShell, TableCard as _TableCard, TableCardFilters as _TableCardFilters, TableCardBody as _TableCardBody, TableCardFooter as _TableCardFooter, CardHdr as _CardHdr, StatCard as _StatCard, StatCardSkeleton as _StatCardSkeleton } from './components/Card.jsx';
38
+
39
+ export const Button = _Button;
40
+ export const Input = _Input;
41
+ export const Toggle = _Toggle;
42
+ export const Spinner = _Spinner || _SpinnerNamed;
43
+ export const TabBar = _TabBar;
44
+ export const Dropdown = _Dropdown;
45
+ export const MultiSelect = _MultiSelect;
46
+ export const ImageUpload = _ImageUpload;
47
+ export const ChipSelect = _ChipSelect;
48
+ export const Checkbox = _Checkbox;
49
+ export const AuthOverlay = _AuthOverlay;
50
+ export const UptimeBar = _UptimeBar;
51
+ export const LineProgress = _LineProgress;
52
+ export const StatBarCard = _StatBarCard;
53
+ export const StatsCard = _StatsCard;
54
+ export const ActivityCard = _ActivityCard;
55
+ export const HoverCard = _HoverCard;
56
+ export const StatsBar = _StatsBar;
57
+ export const Select = _Select;
58
+ export const Badge = _Badge;
59
+ export const PulseDot = _PulseDot;
60
+ export const CircularProgress = _CircularProgress;
61
+ export const Skeleton = _Skeleton;
62
+ export const Modal = _Modal;
63
+ export const Confirm = _Confirm;
64
+ export const toast = _toast;
65
+ export const useToast = _useToast;
66
+ export const Toast = _Toast;
67
+ export const ConfirmRoot = _ConfirmRoot;
68
+ export const confirm = _confirm;
69
+ export const SearchableDropdown = _SearchableDropdown;
70
+ export const Pagination = _Pagination;
71
+ export const DatePicker = _DatePicker;
72
+ export const ActionsMenu = _ActionsMenu;
73
+ export const BrandingCard = _BrandingCard;
74
+ export const Dropzone = _Dropzone;
75
+ export const Tabs = _Tabs;
76
+ export const SkeletonText = _SkeletonText;
77
+ export const SkeletonCard = _SkeletonCard;
78
+ export const SkeletonRows = _SkeletonRows;
79
+ export const SkeletonStats = _SkeletonStats;
80
+ export const XTable = _XTable;
81
+ export const XThead = _XThead;
82
+ export const XTbody = _XTbody;
83
+ export const XTr = _XTr;
84
+ export const XTh = _XTh;
85
+ export const XTd = _XTd;
86
+ export const SkeletonTable = _SkeletonTable;
87
+ export const PageShell = _PageShell;
88
+ export const TableCard = _TableCard;
89
+ export const TableCardFilters = _TableCardFilters;
90
+ export const TableCardBody = _TableCardBody;
91
+ export const TableCardFooter = _TableCardFooter;
92
+ export const CardHdr = _CardHdr;
93
+ export const StatCard = _StatCard;
94
+ export const StatCardSkeleton = _StatCardSkeleton;