@phpsoftbox/react-softbox 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/components/Alert/Alert.d.ts +11 -0
- package/dist/components/Alert/Alert.js +15 -0
- package/dist/components/Alert/Alert.js.map +1 -0
- package/dist/components/Alert/Alert.module.css +73 -0
- package/dist/components/Badge/Badge.d.ts +8 -0
- package/dist/components/Badge/Badge.js +15 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Badge/Badge.module.css +47 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +24 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.js +15 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.module.css +55 -0
- package/dist/components/Button/Button.d.ts +10 -0
- package/dist/components/Button/Button.js +37 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/Button.module.css +130 -0
- package/dist/components/Card/Card.d.ts +15 -0
- package/dist/components/Card/Card.js +26 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Card/Card.module.css +55 -0
- package/dist/components/CollapseButton/CollapseButton.d.ts +9 -0
- package/dist/components/CollapseButton/CollapseButton.js +11 -0
- package/dist/components/CollapseButton/CollapseButton.js.map +1 -0
- package/dist/components/CollapseButton/CollapseButton.module.css +57 -0
- package/dist/components/Drawer/Drawer.d.ts +19 -0
- package/dist/components/Drawer/Drawer.js +42 -0
- package/dist/components/Drawer/Drawer.js.map +1 -0
- package/dist/components/Drawer/Drawer.module.css +104 -0
- package/dist/components/Flex/Flex.module.css +11 -0
- package/dist/components/Flex/Row.d.ts +9 -0
- package/dist/components/Flex/Row.js +14 -0
- package/dist/components/Flex/Row.js.map +1 -0
- package/dist/components/Flex/Stack.d.ts +8 -0
- package/dist/components/Flex/Stack.js +13 -0
- package/dist/components/Flex/Stack.js.map +1 -0
- package/dist/components/Grid/Grid.d.ts +11 -0
- package/dist/components/Grid/Grid.js +16 -0
- package/dist/components/Grid/Grid.js.map +1 -0
- package/dist/components/Grid/Grid.module.css +32 -0
- package/dist/components/Input/DatePicker.d.ts +6 -0
- package/dist/components/Input/DatePicker.js +6 -0
- package/dist/components/Input/DatePicker.js.map +1 -0
- package/dist/components/Input/DateRangePicker.d.ts +16 -0
- package/dist/components/Input/DateRangePicker.js +16 -0
- package/dist/components/Input/DateRangePicker.js.map +1 -0
- package/dist/components/Input/Field.d.ts +5 -0
- package/dist/components/Input/Field.js +25 -0
- package/dist/components/Input/Field.js.map +1 -0
- package/dist/components/Input/FloatLabel/FloatLabel.d.ts +9 -0
- package/dist/components/Input/FloatLabel/FloatLabel.js +22 -0
- package/dist/components/Input/FloatLabel/FloatLabel.js.map +1 -0
- package/dist/components/Input/FloatLabel/FloatLabel.module.css +41 -0
- package/dist/components/Input/FormField/FormField.d.ts +29 -0
- package/dist/components/Input/FormField/FormField.js +60 -0
- package/dist/components/Input/FormField/FormField.js.map +1 -0
- package/dist/components/Input/FormField/FormField.module.css +30 -0
- package/dist/components/Input/Input.d.ts +59 -0
- package/dist/components/Input/Input.js +34 -0
- package/dist/components/Input/Input.js.map +1 -0
- package/dist/components/Input/Input.module.css +31 -0
- package/dist/components/Input/InputGroup.d.ts +11 -0
- package/dist/components/Input/InputGroup.js +25 -0
- package/dist/components/Input/InputGroup.js.map +1 -0
- package/dist/components/Input/InputGroup.module.css +38 -0
- package/dist/components/Input/MaskedInput.d.ts +9 -0
- package/dist/components/Input/MaskedInput.js +82 -0
- package/dist/components/Input/MaskedInput.js.map +1 -0
- package/dist/components/Input/NumberInput.d.ts +10 -0
- package/dist/components/Input/NumberInput.js +44 -0
- package/dist/components/Input/NumberInput.js.map +1 -0
- package/dist/components/Input/Radio/Radio.d.ts +7 -0
- package/dist/components/Input/Radio/Radio.js +9 -0
- package/dist/components/Input/Radio/Radio.js.map +1 -0
- package/dist/components/Input/Radio/Radio.module.css +83 -0
- package/dist/components/Input/Select/Select.d.ts +38 -0
- package/dist/components/Input/Select/Select.js +200 -0
- package/dist/components/Input/Select/Select.js.map +1 -0
- package/dist/components/Input/Select/Select.module.css +194 -0
- package/dist/components/Input/Switch/Switch.d.ts +6 -0
- package/dist/components/Input/Switch/Switch.js +9 -0
- package/dist/components/Input/Switch/Switch.js.map +1 -0
- package/dist/components/Input/Switch/Switch.module.css +62 -0
- package/dist/components/Input/Textarea/Textarea.d.ts +6 -0
- package/dist/components/Input/Textarea/Textarea.js +21 -0
- package/dist/components/Input/Textarea/Textarea.js.map +1 -0
- package/dist/components/Input/Textarea/Textarea.module.css +39 -0
- package/dist/components/Input/TimePicker.d.ts +4 -0
- package/dist/components/Input/TimePicker.js +6 -0
- package/dist/components/Input/TimePicker.js.map +1 -0
- package/dist/components/Menu/Dropdown.d.ts +13 -0
- package/dist/components/Menu/Dropdown.js +58 -0
- package/dist/components/Menu/Dropdown.js.map +1 -0
- package/dist/components/Menu/Menu.d.ts +31 -0
- package/dist/components/Menu/Menu.js +161 -0
- package/dist/components/Menu/Menu.js.map +1 -0
- package/dist/components/Menu/Menu.module.css +240 -0
- package/dist/components/Modal/Modal.d.ts +12 -0
- package/dist/components/Modal/Modal.js +31 -0
- package/dist/components/Modal/Modal.js.map +1 -0
- package/dist/components/Modal/Modal.module.css +90 -0
- package/dist/components/Notifier/Notifier.d.ts +17 -0
- package/dist/components/Notifier/Notifier.js +210 -0
- package/dist/components/Notifier/Notifier.js.map +1 -0
- package/dist/components/Notifier/Notifier.module.css +182 -0
- package/dist/components/Pagination/Pagination.d.ts +28 -0
- package/dist/components/Pagination/Pagination.js +70 -0
- package/dist/components/Pagination/Pagination.js.map +1 -0
- package/dist/components/Pagination/Pagination.module.css +93 -0
- package/dist/components/Progress/Progress.d.ts +16 -0
- package/dist/components/Progress/Progress.js +32 -0
- package/dist/components/Progress/Progress.js.map +1 -0
- package/dist/components/Progress/Progress.module.css +110 -0
- package/dist/components/Tabs/Tabs.d.ts +20 -0
- package/dist/components/Tabs/Tabs.js +115 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tabs/Tabs.module.css +101 -0
- package/dist/components/Typography/Heading.d.ts +13 -0
- package/dist/components/Typography/Heading.js +38 -0
- package/dist/components/Typography/Heading.js.map +1 -0
- package/dist/components/Typography/Text.d.ts +20 -0
- package/dist/components/Typography/Text.js +43 -0
- package/dist/components/Typography/Text.js.map +1 -0
- package/dist/components/Typography/Typography.module.css +132 -0
- package/dist/foundations/index.css +3 -0
- package/dist/foundations/layout.css +78 -0
- package/dist/foundations/tokens.css +236 -0
- package/dist/foundations/typography.css +49 -0
- package/dist/hooks/useDropdownPosition.d.ts +14 -0
- package/dist/hooks/useDropdownPosition.js +61 -0
- package/dist/hooks/useDropdownPosition.js.map +1 -0
- package/dist/hooks/useMediaQuery.d.ts +1 -0
- package/dist/hooks/useMediaQuery.js +33 -0
- package/dist/hooks/useMediaQuery.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/theme.d.ts +12 -0
- package/dist/theme.js +133 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/README.md +40 -0
- package/docs/breadcrumbs.md +47 -0
- package/docs/card.md +18 -0
- package/docs/feedback.md +38 -0
- package/docs/forms.md +166 -0
- package/docs/layout.md +39 -0
- package/docs/navigation.md +80 -0
- package/docs/overlays.md +31 -0
- package/docs/pagination.md +50 -0
- package/docs/progress.md +18 -0
- package/docs/tabs.md +34 -0
- package/docs/theme.md +49 -0
- package/docs/typography.md +26 -0
- package/package.json +49 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
.container {
|
|
2
|
+
position: fixed;
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: var(--spacing-3);
|
|
6
|
+
z-index: 48;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.topRight {
|
|
10
|
+
top: var(--spacing-6);
|
|
11
|
+
right: var(--spacing-6);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.topLeft {
|
|
15
|
+
top: var(--spacing-6);
|
|
16
|
+
left: var(--spacing-6);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.bottomRight {
|
|
20
|
+
bottom: var(--spacing-6);
|
|
21
|
+
right: var(--spacing-6);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.bottomLeft {
|
|
25
|
+
bottom: var(--spacing-6);
|
|
26
|
+
left: var(--spacing-6);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.toast {
|
|
30
|
+
min-width: 260px;
|
|
31
|
+
max-width: 360px;
|
|
32
|
+
display: flex;
|
|
33
|
+
gap: var(--spacing-3);
|
|
34
|
+
align-items: flex-start;
|
|
35
|
+
padding: var(--spacing-4);
|
|
36
|
+
border-radius: var(--radius-md);
|
|
37
|
+
border: 1px solid transparent;
|
|
38
|
+
background: var(--surface-panel);
|
|
39
|
+
color: var(--color-text);
|
|
40
|
+
box-shadow: var(--shadow-soft);
|
|
41
|
+
animation: toast-in 0.18s ease;
|
|
42
|
+
position: relative;
|
|
43
|
+
overflow: hidden;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.toastClosing {
|
|
47
|
+
animation: toast-out 0.22s ease forwards;
|
|
48
|
+
pointer-events: none;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.content {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
gap: 4px;
|
|
55
|
+
flex: 1;
|
|
56
|
+
min-width: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.title {
|
|
60
|
+
font-weight: 600;
|
|
61
|
+
font-size: 14px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.message {
|
|
65
|
+
font-size: 13px;
|
|
66
|
+
color: var(--color-muted);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.actions {
|
|
70
|
+
display: flex;
|
|
71
|
+
gap: 8px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.close {
|
|
75
|
+
border: none;
|
|
76
|
+
background: transparent;
|
|
77
|
+
color: var(--color-muted);
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
font-size: 18px;
|
|
80
|
+
line-height: 1;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.timer {
|
|
84
|
+
position: absolute;
|
|
85
|
+
left: 0;
|
|
86
|
+
right: 0;
|
|
87
|
+
bottom: 0;
|
|
88
|
+
height: 3px;
|
|
89
|
+
background: var(--toast-accent, rgba(20, 201, 214, 0.9));
|
|
90
|
+
transform-origin: left;
|
|
91
|
+
animation: toast-timer var(--toast-duration, 0ms) linear forwards;
|
|
92
|
+
pointer-events: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.toast[data-paused="true"] .timer {
|
|
96
|
+
animation-play-state: paused;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.default {
|
|
100
|
+
border-color: rgba(30, 51, 85, 0.6);
|
|
101
|
+
--toast-accent: rgba(30, 51, 85, 0.8);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.primary {
|
|
105
|
+
border-color: rgba(20, 201, 214, 0.55);
|
|
106
|
+
--toast-accent: rgba(20, 201, 214, 0.9);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.info {
|
|
110
|
+
border-color: rgba(30, 99, 233, 0.4);
|
|
111
|
+
--toast-accent: rgba(30, 99, 233, 0.9);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.success {
|
|
115
|
+
border-color: rgba(79, 230, 163, 0.5);
|
|
116
|
+
--toast-accent: rgba(79, 230, 163, 0.9);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.warning {
|
|
120
|
+
border-color: rgba(246, 200, 106, 0.5);
|
|
121
|
+
--toast-accent: rgba(246, 200, 106, 0.9);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.danger {
|
|
125
|
+
border-color: rgba(255, 107, 107, 0.5);
|
|
126
|
+
--toast-accent: rgba(255, 107, 107, 0.9);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@keyframes toast-in {
|
|
130
|
+
from {
|
|
131
|
+
opacity: 0;
|
|
132
|
+
transform: translateY(-6px);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
to {
|
|
136
|
+
opacity: 1;
|
|
137
|
+
transform: translateY(0);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@keyframes toast-out {
|
|
142
|
+
from {
|
|
143
|
+
opacity: 1;
|
|
144
|
+
transform: translateY(0);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
to {
|
|
148
|
+
opacity: 0;
|
|
149
|
+
transform: translateY(-6px);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@keyframes toast-timer {
|
|
154
|
+
from {
|
|
155
|
+
transform: scaleX(1);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
to {
|
|
159
|
+
transform: scaleX(0);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@media (max-width: 720px) {
|
|
164
|
+
.container {
|
|
165
|
+
left: var(--spacing-4);
|
|
166
|
+
right: var(--spacing-4);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.toast {
|
|
170
|
+
max-width: 100%;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@media (prefers-reduced-motion: reduce) {
|
|
175
|
+
.toast {
|
|
176
|
+
animation: none;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.timer {
|
|
180
|
+
animation: none;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type PaginationLinks = {
|
|
2
|
+
first?: string | null;
|
|
3
|
+
last?: string | null;
|
|
4
|
+
prev?: string | null;
|
|
5
|
+
next?: string | null;
|
|
6
|
+
};
|
|
7
|
+
export type PaginationMeta = {
|
|
8
|
+
current_page: number;
|
|
9
|
+
last_page: number;
|
|
10
|
+
per_page: number;
|
|
11
|
+
total: number;
|
|
12
|
+
from?: number | null;
|
|
13
|
+
to?: number | null;
|
|
14
|
+
path?: string;
|
|
15
|
+
};
|
|
16
|
+
type Props = {
|
|
17
|
+
meta: PaginationMeta;
|
|
18
|
+
links?: PaginationLinks;
|
|
19
|
+
pageParam?: string;
|
|
20
|
+
window?: number;
|
|
21
|
+
showEdges?: boolean;
|
|
22
|
+
showInfo?: boolean;
|
|
23
|
+
buildUrl?: (page: number) => string;
|
|
24
|
+
onNavigate?: (page: number, url: string) => void;
|
|
25
|
+
className?: string;
|
|
26
|
+
};
|
|
27
|
+
export default function Pagination({ meta, links, pageParam, window, showEdges, showInfo, buildUrl, onNavigate, className, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styles from './Pagination.module.css';
|
|
3
|
+
const sanitizeBase = (url, pageParam) => {
|
|
4
|
+
const cleaned = url.replace(new RegExp(`([?&])${pageParam}=[^&]*`, 'g'), '$1');
|
|
5
|
+
return cleaned.replace(/[?&]$/, '');
|
|
6
|
+
};
|
|
7
|
+
const buildDefaultUrl = (page, pageParam, base) => {
|
|
8
|
+
if (!base) {
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
const normalized = sanitizeBase(base, pageParam);
|
|
12
|
+
const separator = normalized.includes('?') ? '&' : '?';
|
|
13
|
+
return `${normalized}${separator}${pageParam}=${page}`;
|
|
14
|
+
};
|
|
15
|
+
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
16
|
+
export default function Pagination({ meta, links, pageParam = 'page', window = 2, showEdges = true, showInfo = true, buildUrl, onNavigate, className, }) {
|
|
17
|
+
const current = clamp(meta.current_page, 1, meta.last_page);
|
|
18
|
+
const last = Math.max(meta.last_page, 1);
|
|
19
|
+
const base = meta.path ?? links?.first ?? '';
|
|
20
|
+
const resolveUrl = (page) => {
|
|
21
|
+
if (buildUrl) {
|
|
22
|
+
return buildUrl(page);
|
|
23
|
+
}
|
|
24
|
+
return buildDefaultUrl(page, pageParam, base);
|
|
25
|
+
};
|
|
26
|
+
const pages = [];
|
|
27
|
+
const start = Math.max(1, current - window);
|
|
28
|
+
const end = Math.min(last, current + window);
|
|
29
|
+
if (showEdges && start > 1) {
|
|
30
|
+
pages.push({ type: 'page', page: 1, active: current === 1 });
|
|
31
|
+
if (start > 2) {
|
|
32
|
+
pages.push({ type: 'ellipsis', key: 'start' });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (let page = start; page <= end; page += 1) {
|
|
36
|
+
pages.push({ type: 'page', page, active: page === current });
|
|
37
|
+
}
|
|
38
|
+
if (showEdges && end < last) {
|
|
39
|
+
if (end < last - 1) {
|
|
40
|
+
pages.push({ type: 'ellipsis', key: 'end' });
|
|
41
|
+
}
|
|
42
|
+
pages.push({ type: 'page', page: last, active: current === last });
|
|
43
|
+
}
|
|
44
|
+
const prevPage = current > 1 ? current - 1 : null;
|
|
45
|
+
const nextPage = current < last ? current + 1 : null;
|
|
46
|
+
const prevUrl = links?.prev ?? (prevPage ? resolveUrl(prevPage) : '');
|
|
47
|
+
const nextUrl = links?.next ?? (nextPage ? resolveUrl(nextPage) : '');
|
|
48
|
+
const firstUrl = links?.first ?? resolveUrl(1);
|
|
49
|
+
const lastUrl = links?.last ?? resolveUrl(last);
|
|
50
|
+
const handleNavigate = (event, page, url) => {
|
|
51
|
+
if (!page || !url) {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (onNavigate) {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
onNavigate(page, url);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const from = meta.from ?? (current - 1) * meta.per_page + 1;
|
|
61
|
+
const to = meta.to ?? Math.min(current * meta.per_page, meta.total);
|
|
62
|
+
return (_jsxs("nav", { className: [styles.pagination, className].filter(Boolean).join(' '), "aria-label": "Pagination", children: [showInfo ? (_jsx("div", { className: styles.info, children: meta.total === 0 ? 'Нет записей' : `${from}–${to} из ${meta.total}` })) : null, _jsxs("div", { className: styles.controls, children: [showEdges ? (_jsx("a", { href: firstUrl, className: [styles.control, current === 1 ? styles.disabled : null].filter(Boolean).join(' '), "aria-disabled": current === 1, onClick: (event) => handleNavigate(event, 1, firstUrl), children: "\u00AB" })) : null, _jsx("a", { href: prevUrl, className: [styles.control, !prevPage ? styles.disabled : null].filter(Boolean).join(' '), "aria-disabled": !prevPage, onClick: (event) => handleNavigate(event, prevPage, prevUrl), children: "\u2039" }), _jsx("div", { className: styles.pages, children: pages.map((item) => {
|
|
63
|
+
if (item.type === 'ellipsis') {
|
|
64
|
+
return (_jsx("span", { className: styles.ellipsis, children: "\u2026" }, item.key));
|
|
65
|
+
}
|
|
66
|
+
const url = resolveUrl(item.page);
|
|
67
|
+
return (_jsx("a", { href: url, className: [styles.page, item.active ? styles.active : null].filter(Boolean).join(' '), "aria-current": item.active ? 'page' : undefined, onClick: (event) => handleNavigate(event, item.page, url), children: item.page }, item.page));
|
|
68
|
+
}) }), _jsx("a", { href: nextUrl, className: [styles.control, !nextPage ? styles.disabled : null].filter(Boolean).join(' '), "aria-disabled": !nextPage, onClick: (event) => handleNavigate(event, nextPage, nextUrl), children: "\u203A" }), showEdges ? (_jsx("a", { href: lastUrl, className: [styles.control, current === last ? styles.disabled : null].filter(Boolean).join(' '), "aria-disabled": current === last, onClick: (event) => handleNavigate(event, last, lastUrl), children: "\u00BB" })) : null] })] }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../src/components/Pagination/Pagination.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
.pagination {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
justify-content: space-between;
|
|
5
|
+
gap: var(--spacing-4);
|
|
6
|
+
flex-wrap: wrap;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.info {
|
|
10
|
+
font-size: 13px;
|
|
11
|
+
color: var(--color-muted);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.controls {
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
gap: var(--spacing-2);
|
|
18
|
+
flex-wrap: wrap;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.pages {
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
gap: 6px;
|
|
25
|
+
flex-wrap: wrap;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.page,
|
|
29
|
+
.control {
|
|
30
|
+
min-width: 36px;
|
|
31
|
+
height: 36px;
|
|
32
|
+
padding: 0 10px;
|
|
33
|
+
border-radius: 10px;
|
|
34
|
+
border: 1px solid rgba(30, 99, 233, 0.25);
|
|
35
|
+
background: var(--surface-control);
|
|
36
|
+
color: var(--color-text);
|
|
37
|
+
display: inline-flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
font-weight: 600;
|
|
41
|
+
font-size: 13px;
|
|
42
|
+
text-decoration: none;
|
|
43
|
+
transition: border-color 0.2s ease, background 0.2s ease, color 0.2s ease;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.page:hover,
|
|
47
|
+
.control:hover {
|
|
48
|
+
border-color: rgba(79, 230, 163, 0.4);
|
|
49
|
+
background: rgba(79, 230, 163, 0.08);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.page:focus-visible,
|
|
53
|
+
.control:focus-visible {
|
|
54
|
+
outline: none;
|
|
55
|
+
border-color: rgba(20, 201, 214, 0.8);
|
|
56
|
+
box-shadow: 0 0 0 3px rgba(20, 201, 214, 0.2);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.active {
|
|
60
|
+
border-color: rgba(20, 201, 214, 0.6);
|
|
61
|
+
color: var(--color-teal);
|
|
62
|
+
background: rgba(20, 201, 214, 0.18);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.disabled {
|
|
66
|
+
opacity: 0.45;
|
|
67
|
+
cursor: not-allowed;
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.ellipsis {
|
|
72
|
+
padding: 0 6px;
|
|
73
|
+
color: var(--color-muted);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@media (max-width: 720px) {
|
|
77
|
+
.pagination {
|
|
78
|
+
align-items: flex-start;
|
|
79
|
+
flex-direction: column;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.controls {
|
|
83
|
+
width: 100%;
|
|
84
|
+
justify-content: flex-start;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@media (prefers-reduced-motion: reduce) {
|
|
89
|
+
.page,
|
|
90
|
+
.control {
|
|
91
|
+
transition: none;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { UiVariant } from '../../types';
|
|
3
|
+
type ProgressVariant = UiVariant;
|
|
4
|
+
type ProgressSize = 'sm' | 'md' | 'lg';
|
|
5
|
+
type Props = {
|
|
6
|
+
value?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
label?: React.ReactNode;
|
|
9
|
+
showValue?: boolean;
|
|
10
|
+
variant?: ProgressVariant;
|
|
11
|
+
size?: ProgressSize;
|
|
12
|
+
indeterminate?: boolean;
|
|
13
|
+
className?: string;
|
|
14
|
+
};
|
|
15
|
+
export default function Progress({ value, max, label, showValue, variant, size, indeterminate, className, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styles from './Progress.module.css';
|
|
3
|
+
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
4
|
+
const variantMap = {
|
|
5
|
+
default: styles.default,
|
|
6
|
+
primary: styles.primary,
|
|
7
|
+
info: styles.info,
|
|
8
|
+
success: styles.success,
|
|
9
|
+
warning: styles.warning,
|
|
10
|
+
danger: styles.danger,
|
|
11
|
+
};
|
|
12
|
+
const sizeMap = {
|
|
13
|
+
sm: styles.sm,
|
|
14
|
+
md: styles.md,
|
|
15
|
+
lg: styles.lg,
|
|
16
|
+
};
|
|
17
|
+
export default function Progress({ value = 0, max = 100, label, showValue = false, variant = 'default', size = 'md', indeterminate = false, className, }) {
|
|
18
|
+
const safeMax = max > 0 ? max : 100;
|
|
19
|
+
const normalized = clamp(value, 0, safeMax);
|
|
20
|
+
const percent = Math.round((normalized / safeMax) * 100);
|
|
21
|
+
const wrapperClasses = [
|
|
22
|
+
styles.progress,
|
|
23
|
+
variantMap[variant],
|
|
24
|
+
sizeMap[size],
|
|
25
|
+
indeterminate ? styles.indeterminate : null,
|
|
26
|
+
className,
|
|
27
|
+
]
|
|
28
|
+
.filter(Boolean)
|
|
29
|
+
.join(' ');
|
|
30
|
+
return (_jsxs("div", { className: wrapperClasses, children: [label ? _jsx("div", { className: styles.label, children: label }) : null, _jsx("div", { className: styles.track, role: "progressbar", "aria-valuemin": indeterminate ? undefined : 0, "aria-valuemax": indeterminate ? undefined : safeMax, "aria-valuenow": indeterminate ? undefined : normalized, "aria-busy": indeterminate ? 'true' : undefined, children: _jsx("div", { className: styles.bar, style: indeterminate ? undefined : { width: `${percent}%` } }) }), showValue ? _jsx("div", { className: styles.value, children: indeterminate ? '…' : `${percent}%` }) : null] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=Progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Progress.js","sourceRoot":"","sources":["../../../src/components/Progress/Progress.tsx"],"names":[],"mappings":";AACA,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAiB3C,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAE/F,MAAM,UAAU,GAAoC;IAClD,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM;CACtB,CAAC;AAEF,MAAM,OAAO,GAAiC;IAC5C,EAAE,EAAE,MAAM,CAAC,EAAE;IACb,EAAE,EAAE,MAAM,CAAC,EAAE;IACb,EAAE,EAAE,MAAM,CAAC,EAAE;CACd,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,KAAK,GAAG,CAAC,EACT,GAAG,GAAG,GAAG,EACT,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,aAAa,GAAG,KAAK,EACrB,SAAS,GACH;IACN,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG;QACrB,MAAM,CAAC,QAAQ;QACf,UAAU,CAAC,OAAO,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;QACb,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;QAC3C,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,eAAK,SAAS,EAAE,cAAc,aAC3B,KAAK,CAAC,CAAC,CAAC,cAAK,SAAS,EAAE,MAAM,CAAC,KAAK,YAAG,KAAK,GAAO,CAAC,CAAC,CAAC,IAAI,EAC3D,cACE,SAAS,EAAE,MAAM,CAAC,KAAK,EACvB,IAAI,EAAC,aAAa,mBACH,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mBAC7B,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,mBACnC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,eAC1C,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAE7C,cAAK,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,GAAG,EAAE,GAAI,GACvF,EACL,SAAS,CAAC,CAAC,CAAC,cAAK,SAAS,EAAE,MAAM,CAAC,KAAK,YAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,GAAO,CAAC,CAAC,CAAC,IAAI,IACzF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
.progress {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 8px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.label {
|
|
8
|
+
font-size: 13px;
|
|
9
|
+
color: var(--color-muted);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.track {
|
|
13
|
+
width: 100%;
|
|
14
|
+
background: var(--surface-control);
|
|
15
|
+
border: 1px solid rgba(30, 99, 233, 0.2);
|
|
16
|
+
border-radius: 999px;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.bar {
|
|
22
|
+
height: 100%;
|
|
23
|
+
width: 0;
|
|
24
|
+
background: linear-gradient(90deg, rgba(79, 230, 163, 0.9), rgba(20, 201, 214, 0.9));
|
|
25
|
+
transition: width 0.2s ease;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.value {
|
|
29
|
+
font-size: 12px;
|
|
30
|
+
color: var(--color-muted);
|
|
31
|
+
text-align: right;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.sm .track {
|
|
35
|
+
height: 6px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.md .track {
|
|
39
|
+
height: 10px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.lg .track {
|
|
43
|
+
height: 14px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.default .bar {
|
|
47
|
+
background: linear-gradient(90deg, rgba(79, 230, 163, 0.9), rgba(20, 201, 214, 0.9));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.primary .bar {
|
|
51
|
+
background: linear-gradient(90deg, rgba(30, 99, 233, 0.9), rgba(20, 201, 214, 0.9));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.info .bar {
|
|
55
|
+
background: linear-gradient(90deg, rgba(20, 201, 214, 0.9), rgba(79, 230, 163, 0.9));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.success .bar {
|
|
59
|
+
background: linear-gradient(90deg, rgba(79, 230, 163, 0.9), rgba(20, 201, 214, 0.9));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.warning .bar {
|
|
63
|
+
background: linear-gradient(90deg, rgba(255, 214, 90, 0.9), rgba(255, 176, 59, 0.9));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.danger .bar {
|
|
67
|
+
background: linear-gradient(90deg, rgba(255, 94, 126, 0.9), rgba(255, 120, 106, 0.9));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.indeterminate .bar {
|
|
71
|
+
width: 100%;
|
|
72
|
+
position: absolute;
|
|
73
|
+
left: 0;
|
|
74
|
+
animation: progress-sweep 1.6s linear infinite;
|
|
75
|
+
clip-path: inset(0 100% 0 0);
|
|
76
|
+
will-change: clip-path;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@keyframes progress-sweep {
|
|
80
|
+
0% {
|
|
81
|
+
clip-path: inset(0 100% 0 0);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
25% {
|
|
85
|
+
clip-path: inset(0 50% 0 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
50% {
|
|
89
|
+
clip-path: inset(0 0 0 0);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
75% {
|
|
93
|
+
clip-path: inset(0 0 0 50%);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
100% {
|
|
97
|
+
clip-path: inset(0 0 0 100%);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@media (prefers-reduced-motion: reduce) {
|
|
102
|
+
.bar {
|
|
103
|
+
transition: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.indeterminate .bar {
|
|
107
|
+
animation: none;
|
|
108
|
+
clip-path: inset(0 0 0 0);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type TabItem = {
|
|
3
|
+
id: string;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
content: React.ReactNode;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
badge?: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
type Props = {
|
|
10
|
+
items: TabItem[];
|
|
11
|
+
activeId?: string;
|
|
12
|
+
defaultActiveId?: string;
|
|
13
|
+
orientation?: 'horizontal' | 'vertical';
|
|
14
|
+
className?: string;
|
|
15
|
+
listClassName?: string;
|
|
16
|
+
panelClassName?: string;
|
|
17
|
+
onChange?: (id: string) => void;
|
|
18
|
+
};
|
|
19
|
+
export default function Tabs({ items, activeId, defaultActiveId, orientation, className, listClassName, panelClassName, onChange, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import styles from './Tabs.module.css';
|
|
4
|
+
const getFirstEnabled = (items) => items.find((item) => !item.disabled)?.id;
|
|
5
|
+
export default function Tabs({ items, activeId, defaultActiveId, orientation = 'horizontal', className, listClassName, panelClassName, onChange, }) {
|
|
6
|
+
const isControlled = activeId !== undefined;
|
|
7
|
+
const baseId = React.useId();
|
|
8
|
+
const listRef = React.useRef(null);
|
|
9
|
+
const fallbackId = React.useMemo(() => getFirstEnabled(items), [items]);
|
|
10
|
+
const [internalId, setInternalId] = React.useState(defaultActiveId ?? fallbackId);
|
|
11
|
+
React.useEffect(() => {
|
|
12
|
+
if (isControlled) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const isValid = internalId && items.some((item) => item.id === internalId && !item.disabled);
|
|
16
|
+
if (!isValid) {
|
|
17
|
+
setInternalId(defaultActiveId ?? fallbackId);
|
|
18
|
+
}
|
|
19
|
+
}, [items, internalId, defaultActiveId, fallbackId, isControlled]);
|
|
20
|
+
const currentId = React.useMemo(() => {
|
|
21
|
+
if (isControlled) {
|
|
22
|
+
const valid = activeId && items.some((item) => item.id === activeId && !item.disabled);
|
|
23
|
+
return valid ? activeId : fallbackId;
|
|
24
|
+
}
|
|
25
|
+
return internalId ?? fallbackId;
|
|
26
|
+
}, [activeId, fallbackId, internalId, isControlled, items]);
|
|
27
|
+
const handleSelect = (id, disabled) => {
|
|
28
|
+
if (disabled) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!isControlled) {
|
|
32
|
+
setInternalId(id);
|
|
33
|
+
}
|
|
34
|
+
onChange?.(id);
|
|
35
|
+
};
|
|
36
|
+
const handleKeyDown = (event) => {
|
|
37
|
+
if (!listRef.current) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const focusable = Array.from(listRef.current.querySelectorAll('[role="tab"]')).filter((el) => {
|
|
41
|
+
if (el.getAttribute('aria-disabled') === 'true') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (el instanceof HTMLButtonElement && el.disabled) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
if (focusable.length === 0) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const enabledIds = focusable.map((el) => el.getAttribute('data-tab-id')).filter(Boolean);
|
|
53
|
+
const activeElement = document.activeElement;
|
|
54
|
+
const focusedIndex = activeElement ? focusable.indexOf(activeElement) : -1;
|
|
55
|
+
const resolvedIndex = focusedIndex >= 0 ? focusedIndex : enabledIds.indexOf(currentId ?? '');
|
|
56
|
+
const currentIndex = resolvedIndex >= 0 ? resolvedIndex : 0;
|
|
57
|
+
const moveTo = (nextIndex) => {
|
|
58
|
+
const tab = focusable[nextIndex];
|
|
59
|
+
tab?.focus();
|
|
60
|
+
const id = tab?.getAttribute('data-tab-id');
|
|
61
|
+
if (id) {
|
|
62
|
+
handleSelect(id);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const lastIndex = focusable.length - 1;
|
|
66
|
+
const isVertical = orientation === 'vertical';
|
|
67
|
+
switch (event.key) {
|
|
68
|
+
case 'ArrowRight':
|
|
69
|
+
if (!isVertical) {
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
moveTo(currentIndex >= lastIndex ? 0 : currentIndex + 1);
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
case 'ArrowLeft':
|
|
75
|
+
if (!isVertical) {
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
moveTo(currentIndex <= 0 ? lastIndex : currentIndex - 1);
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case 'ArrowDown':
|
|
81
|
+
if (isVertical) {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
moveTo(currentIndex >= lastIndex ? 0 : currentIndex + 1);
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
case 'ArrowUp':
|
|
87
|
+
if (isVertical) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
moveTo(currentIndex <= 0 ? lastIndex : currentIndex - 1);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
case 'Home':
|
|
93
|
+
event.preventDefault();
|
|
94
|
+
moveTo(0);
|
|
95
|
+
break;
|
|
96
|
+
case 'End':
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
moveTo(lastIndex);
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const classes = [styles.tabs, styles[orientation], className].filter(Boolean).join(' ');
|
|
105
|
+
const listClasses = [styles.list, listClassName].filter(Boolean).join(' ');
|
|
106
|
+
const panelClasses = [styles.panel, panelClassName].filter(Boolean).join(' ');
|
|
107
|
+
const activeItem = items.find((item) => item.id === currentId && !item.disabled);
|
|
108
|
+
return (_jsxs("div", { className: classes, children: [_jsx("div", { className: listClasses, role: "tablist", "aria-orientation": orientation, onKeyDown: handleKeyDown, ref: listRef, children: items.map((item) => {
|
|
109
|
+
const selected = item.id === currentId && !item.disabled;
|
|
110
|
+
const tabId = `${baseId}-tab-${item.id}`;
|
|
111
|
+
const panelId = `${baseId}-panel-${item.id}`;
|
|
112
|
+
return (_jsxs("button", { id: tabId, type: "button", role: "tab", className: [styles.tab, selected ? styles.active : null].filter(Boolean).join(' '), "aria-selected": selected, "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: selected ? 0 : -1, "data-tab-id": item.id, onClick: () => handleSelect(item.id, item.disabled), disabled: item.disabled, children: [_jsx("span", { className: styles.tabLabel, children: item.label }), item.badge ? _jsx("span", { className: styles.tabBadge, children: item.badge }) : null] }, item.id));
|
|
113
|
+
}) }), _jsx("div", { className: panelClasses, children: activeItem ? (_jsx("div", { id: `${baseId}-panel-${activeItem.id}`, role: "tabpanel", "aria-labelledby": `${baseId}-tab-${activeItem.id}`, children: activeItem.content })) : (_jsx("div", { className: styles.empty, children: "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0432\u043A\u043B\u0430\u0434\u043E\u043A" })) })] }));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=Tabs.js.map
|