react-restyle-components 0.4.8 → 0.4.10
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/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.d.ts.map +1 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.js +250 -32
- package/lib/src/core-components/src/components/Badge/Badge.d.ts +3 -3
- package/lib/src/core-components/src/components/FormField/FormField.d.ts +2 -2
- package/lib/src/core-components/src/components/FormField/FormField.js +4 -4
- package/lib/src/core-components/src/core-components/atoms/Input/Input.d.ts +2 -2
- package/lib/src/core-components/src/core-components/atoms/Input/Input.js +3 -3
- package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.d.ts +2 -2
- package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +3 -3
- package/lib/src/core-components/src/tc.global.css +4 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-complete-filter-single-select-multiple-fields-display.component.d.ts","sourceRoot":"","sources":["../../../../../../../src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auto-complete-filter-single-select-multiple-fields-display.component.d.ts","sourceRoot":"","sources":["../../../../../../../src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.tsx"],"names":[],"mappings":"AAsIA,UAAU,qDAAqD;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;CAC7B;AAED,eAAO,MAAM,gDAAgD,+HAa1D,qDAAqD,4CAsWvD,CAAC"}
|
|
@@ -1,21 +1,136 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/* eslint-disable */
|
|
3
|
-
import { useState, useEffect, useRef } from 'react';
|
|
3
|
+
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
4
4
|
import { Icon } from '../../Icon/Icon';
|
|
5
5
|
import s from '../../../tc.module.css';
|
|
6
6
|
import { cn } from '../../../utils';
|
|
7
7
|
import { debounce } from '@techabl/core-utils';
|
|
8
|
+
// Inline styles for animations (CSS-in-JS approach for portability)
|
|
9
|
+
const animationStyles = {
|
|
10
|
+
dropdown: {
|
|
11
|
+
base: {
|
|
12
|
+
transformOrigin: 'top center',
|
|
13
|
+
transition: 'opacity 200ms ease-out, transform 200ms ease-out',
|
|
14
|
+
},
|
|
15
|
+
entering: {
|
|
16
|
+
opacity: 1,
|
|
17
|
+
transform: 'scaleY(1) translateY(0)',
|
|
18
|
+
},
|
|
19
|
+
exiting: {
|
|
20
|
+
opacity: 0,
|
|
21
|
+
transform: 'scaleY(0.95) translateY(-8px)',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
listItem: {
|
|
25
|
+
base: {
|
|
26
|
+
transition: 'opacity 180ms ease-out, transform 180ms ease-out, background-color 150ms ease',
|
|
27
|
+
cursor: 'pointer',
|
|
28
|
+
},
|
|
29
|
+
visible: {
|
|
30
|
+
opacity: 1,
|
|
31
|
+
transform: 'translateX(0)',
|
|
32
|
+
},
|
|
33
|
+
hidden: {
|
|
34
|
+
opacity: 0,
|
|
35
|
+
transform: 'translateX(-12px)',
|
|
36
|
+
},
|
|
37
|
+
hover: {
|
|
38
|
+
backgroundColor: 'rgba(59, 130, 246, 0.1)',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
skeleton: {
|
|
42
|
+
base: {
|
|
43
|
+
background: 'linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%)',
|
|
44
|
+
backgroundSize: '200% 100%',
|
|
45
|
+
animation: 'shimmer 1.5s infinite',
|
|
46
|
+
borderRadius: '4px',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
spinner: {
|
|
50
|
+
animation: 'spin 0.8s linear infinite',
|
|
51
|
+
border: '2px solid #e5e7eb',
|
|
52
|
+
borderTopColor: '#3b82f6',
|
|
53
|
+
borderRadius: '50%',
|
|
54
|
+
width: '16px',
|
|
55
|
+
height: '16px',
|
|
56
|
+
},
|
|
57
|
+
fadeContent: {
|
|
58
|
+
base: {
|
|
59
|
+
transition: 'opacity 200ms ease-out',
|
|
60
|
+
},
|
|
61
|
+
loading: {
|
|
62
|
+
opacity: 0.5,
|
|
63
|
+
},
|
|
64
|
+
ready: {
|
|
65
|
+
opacity: 1,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
// Inject keyframes for shimmer animation
|
|
70
|
+
const injectKeyframes = () => {
|
|
71
|
+
const styleId = 'autocomplete-animations';
|
|
72
|
+
if (typeof document !== 'undefined' && !document.getElementById(styleId)) {
|
|
73
|
+
const style = document.createElement('style');
|
|
74
|
+
style.id = styleId;
|
|
75
|
+
style.textContent = `
|
|
76
|
+
@keyframes shimmer {
|
|
77
|
+
0% { background-position: 200% 0; }
|
|
78
|
+
100% { background-position: -200% 0; }
|
|
79
|
+
}
|
|
80
|
+
@keyframes spin {
|
|
81
|
+
from { transform: rotate(0deg); }
|
|
82
|
+
to { transform: rotate(360deg); }
|
|
83
|
+
}
|
|
84
|
+
@keyframes fadeInUp {
|
|
85
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
86
|
+
to { opacity: 1; transform: translateY(0); }
|
|
87
|
+
}
|
|
88
|
+
@keyframes pulse {
|
|
89
|
+
0%, 100% { opacity: 1; }
|
|
90
|
+
50% { opacity: 0.5; }
|
|
91
|
+
}
|
|
92
|
+
`;
|
|
93
|
+
document.head.appendChild(style);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
// Skeleton loader component
|
|
97
|
+
const SkeletonItem = ({ delay = 0 }) => (_jsxs("div", { style: {
|
|
98
|
+
display: 'flex',
|
|
99
|
+
alignItems: 'center',
|
|
100
|
+
padding: '8px 8px',
|
|
101
|
+
gap: '12px',
|
|
102
|
+
animation: `fadeInUp 300ms ease-out ${delay}ms both`,
|
|
103
|
+
}, children: [_jsx("div", { style: {
|
|
104
|
+
...animationStyles.skeleton.base,
|
|
105
|
+
width: '60px',
|
|
106
|
+
height: '14px',
|
|
107
|
+
} }), _jsx("div", { style: {
|
|
108
|
+
...animationStyles.skeleton.base,
|
|
109
|
+
flex: 1,
|
|
110
|
+
height: '14px',
|
|
111
|
+
maxWidth: '180px',
|
|
112
|
+
} })] }));
|
|
113
|
+
// Loading spinner component
|
|
114
|
+
const LoadingSpinner = () => (_jsx("div", { style: animationStyles.spinner, role: "status", "aria-label": "Loading" }));
|
|
8
115
|
export const AutoCompleteFilterSingleSelectMultiFieldsDisplay = ({ disable = false, loader = false, displayValue = '', placeholder = 'Search...', data, hasError = false, className, posstion = 'absolute', keyboard = 'text', onFilter, onSelect, onBlur, }) => {
|
|
9
116
|
const [value, setValue] = useState(displayValue);
|
|
10
117
|
const [options, setOptions] = useState(data.list);
|
|
11
118
|
const [isListOpen, setIsListOpen] = useState(false);
|
|
12
119
|
const [filterValue, setFilterValue] = useState();
|
|
120
|
+
const [isAnimating, setIsAnimating] = useState(false);
|
|
121
|
+
const [visibleItems, setVisibleItems] = useState(new Set());
|
|
122
|
+
const [hoveredIndex, setHoveredIndex] = useState(null);
|
|
123
|
+
const [isFiltering, setIsFiltering] = useState(false);
|
|
124
|
+
const [showDropdown, setShowDropdown] = useState(false);
|
|
125
|
+
// Inject animation keyframes on mount
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
injectKeyframes();
|
|
128
|
+
}, []);
|
|
13
129
|
const useOutsideAlerter = (ref) => {
|
|
14
130
|
useEffect(() => {
|
|
15
131
|
function handleClickOutside(event) {
|
|
16
132
|
if (ref.current && !ref.current.contains(event.target) && isListOpen) {
|
|
17
|
-
|
|
18
|
-
//setValue('');
|
|
133
|
+
handleCloseDropdown();
|
|
19
134
|
}
|
|
20
135
|
}
|
|
21
136
|
document.addEventListener('mousedown', handleClickOutside);
|
|
@@ -27,8 +142,55 @@ export const AutoCompleteFilterSingleSelectMultiFieldsDisplay = ({ disable = fal
|
|
|
27
142
|
const inputRef = useRef(null);
|
|
28
143
|
const wrapperRef = useRef(null);
|
|
29
144
|
useOutsideAlerter(wrapperRef);
|
|
145
|
+
// Smooth dropdown open/close with animation
|
|
146
|
+
const handleOpenDropdown = useCallback(() => {
|
|
147
|
+
setIsListOpen(true);
|
|
148
|
+
// Small delay to trigger CSS transition
|
|
149
|
+
requestAnimationFrame(() => {
|
|
150
|
+
setShowDropdown(true);
|
|
151
|
+
});
|
|
152
|
+
}, []);
|
|
153
|
+
const handleCloseDropdown = useCallback(() => {
|
|
154
|
+
setShowDropdown(false);
|
|
155
|
+
// Wait for animation to complete before hiding
|
|
156
|
+
setTimeout(() => {
|
|
157
|
+
setIsListOpen(false);
|
|
158
|
+
}, 200);
|
|
159
|
+
}, []);
|
|
160
|
+
// Staggered animation for list items
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
if (isListOpen && options.length > 0 && !loader) {
|
|
163
|
+
setVisibleItems(new Set());
|
|
164
|
+
// Stagger the appearance of items
|
|
165
|
+
options.forEach((_, index) => {
|
|
166
|
+
setTimeout(() => {
|
|
167
|
+
setVisibleItems((prev) => new Set([...prev, index]));
|
|
168
|
+
}, Math.min(index * 30, 300)); // Cap at 300ms total
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}, [isListOpen, options, loader]);
|
|
172
|
+
// Smooth transition when data changes
|
|
30
173
|
useEffect(() => {
|
|
31
|
-
|
|
174
|
+
if (isFiltering) {
|
|
175
|
+
// Brief fade out during filter
|
|
176
|
+
setIsAnimating(true);
|
|
177
|
+
const timer = setTimeout(() => {
|
|
178
|
+
setOptions(data.list);
|
|
179
|
+
setIsAnimating(false);
|
|
180
|
+
setIsFiltering(false);
|
|
181
|
+
// Re-trigger staggered animation
|
|
182
|
+
setVisibleItems(new Set());
|
|
183
|
+
data.list.forEach((_, index) => {
|
|
184
|
+
setTimeout(() => {
|
|
185
|
+
setVisibleItems((prev) => new Set([...prev, index]));
|
|
186
|
+
}, Math.min(index * 25, 200));
|
|
187
|
+
});
|
|
188
|
+
}, 150);
|
|
189
|
+
return () => clearTimeout(timer);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
setOptions(data.list);
|
|
193
|
+
}
|
|
32
194
|
}, [data]);
|
|
33
195
|
useEffect(() => {
|
|
34
196
|
setValue(displayValue);
|
|
@@ -37,8 +199,22 @@ export const AutoCompleteFilterSingleSelectMultiFieldsDisplay = ({ disable = fal
|
|
|
37
199
|
const search = e.target.value;
|
|
38
200
|
setValue(search);
|
|
39
201
|
setFilterValue(search);
|
|
202
|
+
setIsFiltering(true);
|
|
40
203
|
const filteredOptions = data.list.filter((item) => data.displayKey.some((key) => item[key]?.toString().toLowerCase().includes(search.toLowerCase())));
|
|
41
|
-
|
|
204
|
+
// Animate transition
|
|
205
|
+
setIsAnimating(true);
|
|
206
|
+
setTimeout(() => {
|
|
207
|
+
setOptions(filteredOptions);
|
|
208
|
+
setIsAnimating(false);
|
|
209
|
+
setIsFiltering(false);
|
|
210
|
+
// Re-animate visible items
|
|
211
|
+
setVisibleItems(new Set());
|
|
212
|
+
filteredOptions.forEach((_, index) => {
|
|
213
|
+
setTimeout(() => {
|
|
214
|
+
setVisibleItems((prev) => new Set([...prev, index]));
|
|
215
|
+
}, Math.min(index * 25, 200));
|
|
216
|
+
});
|
|
217
|
+
}, 100);
|
|
42
218
|
debounce(() => {
|
|
43
219
|
onFilter && onFilter(search);
|
|
44
220
|
});
|
|
@@ -58,7 +234,7 @@ export const AutoCompleteFilterSingleSelectMultiFieldsDisplay = ({ disable = fal
|
|
|
58
234
|
const selectedItem = options.find((item) => item.labId === Number(value));
|
|
59
235
|
if (selectedItem) {
|
|
60
236
|
setValue(data.displayKey.map((key) => `${selectedItem[key]}`).join(' - '));
|
|
61
|
-
|
|
237
|
+
handleCloseDropdown();
|
|
62
238
|
onSelect && onSelect(selectedItem);
|
|
63
239
|
}
|
|
64
240
|
}
|
|
@@ -67,38 +243,80 @@ export const AutoCompleteFilterSingleSelectMultiFieldsDisplay = ({ disable = fal
|
|
|
67
243
|
const calculateMaxHeight = () => {
|
|
68
244
|
if (inputRef.current) {
|
|
69
245
|
const inputRect = inputRef.current.getBoundingClientRect();
|
|
70
|
-
const availableHeight = window.innerHeight - inputRect.bottom - 20;
|
|
246
|
+
const availableHeight = window.innerHeight - inputRect.bottom - 20;
|
|
71
247
|
return availableHeight;
|
|
72
248
|
}
|
|
73
249
|
return 'calc(100vh - 140px)';
|
|
74
250
|
};
|
|
75
|
-
|
|
251
|
+
const handleSelectItem = useCallback((item) => {
|
|
252
|
+
setValue(data.displayKey
|
|
253
|
+
.map((key) => item[key])
|
|
254
|
+
.filter((value) => value !== null && value !== undefined)
|
|
255
|
+
.join(' - '));
|
|
256
|
+
handleCloseDropdown();
|
|
257
|
+
onSelect && onSelect(item);
|
|
258
|
+
}, [data.displayKey, onSelect, handleCloseDropdown]);
|
|
259
|
+
// Show loading state
|
|
260
|
+
const isLoading = loader || isFiltering;
|
|
261
|
+
return (_jsx(_Fragment, { children: _jsxs("div", { ref: wrapperRef, className: cn(s['w-full'], s['relative']), children: [_jsxs("div", { className: cn(s['flex'], s['p-2'], s['leading-4'], s['focus:outline-none'], s['focus:ring'], s['w-full'], s['shadow-sm'], s['sm:text-base'], s['border'], s['rounded-md'], s['transition-all'], s['duration-200'], {
|
|
76
262
|
[s['border-red']]: hasError,
|
|
77
263
|
[s['border-gray-300']]: !hasError,
|
|
78
264
|
[s['dark:text-black']]: true,
|
|
79
|
-
}),
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
265
|
+
}), style: {
|
|
266
|
+
transition: 'border-color 200ms ease, box-shadow 200ms ease',
|
|
267
|
+
}, children: [_jsx("input", { ref: inputRef, placeholder: placeholder, type: keyboard, value: value, className: cn(s['w-full'], s['focus:outline-none'], s['bg-none'], s['dark:text-black'], className), onKeyUp: onKeyUp, onChange: onChange, onClick: handleOpenDropdown, disabled: disable, onMouseDown: () => setValue(''), onBlur: (e) => onBlur && onBlur(e), onKeyDown: onKeyDown }), _jsxs("div", { style: {
|
|
268
|
+
display: 'flex',
|
|
269
|
+
alignItems: 'center',
|
|
270
|
+
gap: '8px',
|
|
271
|
+
}, children: [isLoading && _jsx(LoadingSpinner, {}), _jsx("div", { style: {
|
|
272
|
+
transition: 'transform 200ms ease',
|
|
273
|
+
transform: isListOpen ? 'rotate(180deg)' : 'rotate(0deg)',
|
|
274
|
+
}, children: _jsx(Icon, { nameIcon: "FaChevronDown", propsIcon: {
|
|
275
|
+
size: 16,
|
|
276
|
+
} }) })] })] }), isListOpen && (_jsx("div", { className: cn(s['absolute'], s['w-full'], s['bg-white'], s['rounded-md'], s['shadow-lg'], s['overflow-hidden']), style: {
|
|
277
|
+
...animationStyles.dropdown.base,
|
|
278
|
+
...(showDropdown
|
|
279
|
+
? animationStyles.dropdown.entering
|
|
280
|
+
: animationStyles.dropdown.exiting),
|
|
84
281
|
zIndex: 500,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
282
|
+
marginTop: '4px',
|
|
283
|
+
border: '1px solid #e5e7eb',
|
|
284
|
+
}, children: _jsx("div", { className: cn(s['overflow-y-auto'], s['p-1']), style: {
|
|
285
|
+
maxHeight: `${calculateMaxHeight()}px`,
|
|
286
|
+
...animationStyles.fadeContent.base,
|
|
287
|
+
...(isAnimating
|
|
288
|
+
? animationStyles.fadeContent.loading
|
|
289
|
+
: animationStyles.fadeContent.ready),
|
|
290
|
+
}, children: loader ? (
|
|
291
|
+
// Skeleton loading state
|
|
292
|
+
_jsx("div", { style: { padding: '4px 0' }, children: [0, 1, 2, 3, 4].map((i) => (_jsx(SkeletonItem, { delay: i * 50 }, i))) })) : options.length > 0 ? (_jsx("ul", { style: { listStyle: 'none', margin: 0, padding: 0 }, children: options.map((item, index) => (_jsx("li", { className: cn(s['flex'], s['items-center']), onClick: () => handleSelectItem(item), onMouseEnter: () => setHoveredIndex(index), onMouseLeave: () => setHoveredIndex(null), style: {
|
|
293
|
+
...animationStyles.listItem.base,
|
|
294
|
+
...(visibleItems.has(index)
|
|
295
|
+
? animationStyles.listItem.visible
|
|
296
|
+
: animationStyles.listItem.hidden),
|
|
297
|
+
...(hoveredIndex === index
|
|
298
|
+
? animationStyles.listItem.hover
|
|
299
|
+
: {}),
|
|
300
|
+
padding: '10px 12px',
|
|
301
|
+
borderRadius: '6px',
|
|
302
|
+
margin: '2px 0',
|
|
303
|
+
transitionDelay: `${Math.min(index * 20, 150)}ms`,
|
|
304
|
+
}, children: _jsx("label", { className: cn(s['text-gray-700']), style: {
|
|
305
|
+
textOverflow: 'ellipsis',
|
|
306
|
+
minWidth: 0,
|
|
307
|
+
overflow: 'hidden',
|
|
308
|
+
whiteSpace: 'nowrap',
|
|
309
|
+
cursor: 'pointer',
|
|
310
|
+
fontSize: '14px',
|
|
311
|
+
}, title: data.displayKey
|
|
312
|
+
.map((key) => item[key])
|
|
313
|
+
.join(' - '), children: data.displayKey
|
|
314
|
+
.map((key) => item[key])
|
|
315
|
+
.filter((value) => value !== null && value !== undefined)
|
|
316
|
+
.join(' - ') }) }, index))) })) : (_jsx("div", { style: {
|
|
317
|
+
padding: '16px',
|
|
318
|
+
textAlign: 'center',
|
|
319
|
+
color: '#6b7280',
|
|
320
|
+
animation: 'fadeInUp 200ms ease-out',
|
|
321
|
+
}, children: _jsx("span", { children: "No results found" }) })) }) }))] }) }));
|
|
104
322
|
};
|
|
@@ -56,6 +56,8 @@ export declare const Badge: React.NamedExoticComponent<Omit<BadgeProps & React.R
|
|
|
56
56
|
unselectable?: "off" | "on" | undefined;
|
|
57
57
|
inputMode?: "search" | "text" | "none" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
|
|
58
58
|
is?: string | undefined;
|
|
59
|
+
exportparts?: string | undefined;
|
|
60
|
+
part?: string | undefined;
|
|
59
61
|
"aria-activedescendant"?: string | undefined;
|
|
60
62
|
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
61
63
|
"aria-autocomplete"?: "inline" | "both" | "none" | "list" | undefined;
|
|
@@ -130,7 +132,7 @@ export declare const Badge: React.NamedExoticComponent<Omit<BadgeProps & React.R
|
|
|
130
132
|
onBlurCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
|
|
131
133
|
onChange?: React.FormEventHandler<HTMLDivElement> | undefined;
|
|
132
134
|
onChangeCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
|
|
133
|
-
onBeforeInput?: React.
|
|
135
|
+
onBeforeInput?: React.InputEventHandler<HTMLDivElement> | undefined;
|
|
134
136
|
onBeforeInputCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
|
|
135
137
|
onInput?: React.FormEventHandler<HTMLDivElement> | undefined;
|
|
136
138
|
onInputCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
|
|
@@ -180,8 +182,6 @@ export declare const Badge: React.NamedExoticComponent<Omit<BadgeProps & React.R
|
|
|
180
182
|
onProgressCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
181
183
|
onRateChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
182
184
|
onRateChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
183
|
-
onResize?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
184
|
-
onResizeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
185
185
|
onSeeked?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
186
186
|
onSeekedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
187
187
|
onSeeking?: React.ReactEventHandler<HTMLDivElement> | undefined;
|
|
@@ -82,8 +82,8 @@ type FieldEventHandlers = {
|
|
|
82
82
|
onFocus?: (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
83
83
|
/** onBlur handler - receives the event object (standard React pattern) */
|
|
84
84
|
onBlur?: (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
85
|
-
/**
|
|
86
|
-
|
|
85
|
+
/** onValueBlur - receives just the string value (cleaner alternative to onBlur for text inputs) */
|
|
86
|
+
onValueBlur?: (value: string) => void;
|
|
87
87
|
onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
88
88
|
onKeyUp?: (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
89
89
|
onKeyPress?: (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
@@ -7,7 +7,7 @@ import { PasswordInput, ToggleInput, RadioInput, CheckboxInput, CheckboxGroupInp
|
|
|
7
7
|
export { PasswordInput, ToggleInput, RadioInput, CheckboxInput, CheckboxGroupInput, DatePickerInput, DropdownInput, TextDropdownInput, PinInput, OtpInput, CssMultilineInput, } from './components';
|
|
8
8
|
export const Label = (props) => (_jsx(_Fragment, { children: _jsx("label", { htmlFor: props.htmlFor, className: `${props.hasError ? 'text-red-400' : 'text-gray-700'} block text-3xs font-medium mb-1`, style: { ...props.style }, children: props.children }) }));
|
|
9
9
|
export const InputWrapper = (props) => (_jsxs("div", { className: props.className, ref: props.ref, children: [_jsx(Label, { htmlFor: props.id || '', hasError: props.hasError, style: { ...props.style }, children: _jsx("span", { className: "dark:text-white", children: props.label }) }), props.children] }));
|
|
10
|
-
export const FormField = React.forwardRef(({ label, error, hasError, id, labelProps, required, type = 'text', showPasswordToggle, radioOptions, checkboxLabel, checkboxOptions, isToggleLabel = true, dateFormat = 'yyyy-MM-dd', dropdownItems = [], allowCustomInput = true, pinLength = 12, otpLength = 6, pinValue = [], pinErrorMsg, pinDefaultMsg, cssProperties, onReset, onMoreInfo, value, onChange, onValueChange, onBlur,
|
|
10
|
+
export const FormField = React.forwardRef(({ label, error, hasError, id, labelProps, required, type = 'text', showPasswordToggle, radioOptions, checkboxLabel, checkboxOptions, isToggleLabel = true, dateFormat = 'yyyy-MM-dd', dropdownItems = [], allowCustomInput = true, pinLength = 12, otpLength = 6, pinValue = [], pinErrorMsg, pinDefaultMsg, cssProperties, onReset, onMoreInfo, value, onChange, onValueChange, onBlur, onValueBlur, disabled, children, ...props }, ref) => {
|
|
11
11
|
const fieldId = id || `field-${Math.random().toString(36).substr(2, 9)}`;
|
|
12
12
|
const isTextarea = type === 'textarea';
|
|
13
13
|
const isToggle = type === 'toggle';
|
|
@@ -86,18 +86,18 @@ export const FormField = React.forwardRef(({ label, error, hasError, id, labelPr
|
|
|
86
86
|
}
|
|
87
87
|
// Render textarea - use Textarea atom component
|
|
88
88
|
if (isTextarea) {
|
|
89
|
-
return (_jsx(Textarea, { ref: ref, id: fieldId, label: label, error: effectiveError, required: required, value: value, onChange: onChange, onValueChange: onValueChange, onBlur: onBlur,
|
|
89
|
+
return (_jsx(Textarea, { ref: ref, id: fieldId, label: label, error: effectiveError, required: required, value: value, onChange: onChange, onValueChange: onValueChange, onBlur: onBlur, onValueBlur: onValueBlur, ...labelProps, ...props }));
|
|
90
90
|
}
|
|
91
91
|
// Render standard input - use Input atom component
|
|
92
92
|
// For password without toggle, use Input atom
|
|
93
93
|
if (isPassword && !showPasswordToggle) {
|
|
94
|
-
return (_jsx(Input, { ref: ref, id: fieldId, type: type, label: label, error: effectiveError, required: required, value: value, onChange: onChange, onValueChange: onValueChange, onBlur: onBlur,
|
|
94
|
+
return (_jsx(Input, { ref: ref, id: fieldId, type: type, label: label, error: effectiveError, required: required, value: value, onChange: onChange, onValueChange: onValueChange, onBlur: onBlur, onValueBlur: onValueBlur, ...labelProps, ...props }));
|
|
95
95
|
}
|
|
96
96
|
// For password with toggle, use PasswordInput component
|
|
97
97
|
if (isPassword && showPasswordToggle) {
|
|
98
98
|
return (_jsx(PasswordInput, { ref: ref, id: fieldId, label: label, error: effectiveError, required: required, value: value, onChange: onChange, disabled: disabled, labelProps: labelProps, ...props }));
|
|
99
99
|
}
|
|
100
100
|
// Render standard input - use Input atom component
|
|
101
|
-
return (_jsx(Input, { ref: ref, id: fieldId, type: type, label: label, error: effectiveError, required: required, value: value, onChange: onChange, onValueChange: onValueChange, onBlur: onBlur,
|
|
101
|
+
return (_jsx(Input, { ref: ref, id: fieldId, type: type, label: label, error: effectiveError, required: required, value: value, onChange: onChange, onValueChange: onValueChange, onBlur: onBlur, onValueBlur: onValueBlur, ...labelProps, ...props }));
|
|
102
102
|
});
|
|
103
103
|
FormField.displayName = 'FormField';
|
|
@@ -8,8 +8,8 @@ export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElem
|
|
|
8
8
|
onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
9
9
|
/** onValueChange - receives just the string value (alternative to onChange) */
|
|
10
10
|
onValueChange?: (value: string) => void;
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/** onValueBlur - receives just the string value (alternative to onBlur) */
|
|
12
|
+
onValueBlur?: (value: string) => void;
|
|
13
13
|
}
|
|
14
14
|
export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
|
|
15
15
|
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -2,17 +2,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import s from '../../../tc.module.css';
|
|
4
4
|
import { cn } from '../../../utils';
|
|
5
|
-
export const Input = React.forwardRef(({ className, error, label, id, onChange, onBlur, onValueChange,
|
|
5
|
+
export const Input = React.forwardRef(({ className, error, label, id, onChange, onBlur, onValueChange, onValueBlur, ...props }, ref) => {
|
|
6
6
|
const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;
|
|
7
7
|
// Handle onChange - always pass event to onChange, value to onValueChange
|
|
8
8
|
const handleChange = (e) => {
|
|
9
9
|
onChange?.(e);
|
|
10
10
|
onValueChange?.(e.target.value);
|
|
11
11
|
};
|
|
12
|
-
// Handle onBlur - always pass event to onBlur, value to
|
|
12
|
+
// Handle onBlur - always pass event to onBlur, value to onValueBlur
|
|
13
13
|
const handleBlur = (e) => {
|
|
14
14
|
onBlur?.(e);
|
|
15
|
-
|
|
15
|
+
onValueBlur?.(e.target.value);
|
|
16
16
|
};
|
|
17
17
|
return (_jsxs("div", { className: cn(s['w-full']), children: [label && (_jsx("label", { className: cn(s['block'], s['text-sm'], s['font-medium'], s['text-gray-700'], s['dark:text-gray-300'], s['mb-1']), children: label })), _jsx("input", { ref: ref, id: inputId, className: cn(s['w-full'], s['px-4'], s['py-2'], s['border'], s['rounded-lg'], s['transition-colors'], s['bg-white'], s['dark:bg-gray-800'], s['border-gray-300'], s['dark:border-gray-600'], s['text-gray-900'], s['dark:text-gray-100'], s['placeholder-gray-500'], s['dark:placeholder-gray-400'], s['focus:outline-none'], s['focus:ring-2'], s['focus:ring-primary'], s['focus:ring-offset-1'], error && s['border-red-500'], error && s['focus:ring-red-500'], className), style: {
|
|
18
18
|
...props.style,
|
|
@@ -8,8 +8,8 @@ export interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTex
|
|
|
8
8
|
onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;
|
|
9
9
|
/** onValueChange - receives just the string value (alternative to onChange) */
|
|
10
10
|
onValueChange?: (value: string) => void;
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/** onValueBlur - receives just the string value (alternative to onBlur) */
|
|
12
|
+
onValueBlur?: (value: string) => void;
|
|
13
13
|
}
|
|
14
14
|
export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
15
15
|
//# sourceMappingURL=Textarea.d.ts.map
|
|
@@ -2,17 +2,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import s from '../../../tc.module.css';
|
|
4
4
|
import { cn } from '../../../utils';
|
|
5
|
-
export const Textarea = React.forwardRef(({ className, error, label, id, onChange, onBlur, onValueChange,
|
|
5
|
+
export const Textarea = React.forwardRef(({ className, error, label, id, onChange, onBlur, onValueChange, onValueBlur, ...props }, ref) => {
|
|
6
6
|
const textareaId = id || `textarea-${Math.random().toString(36).substr(2, 9)}`;
|
|
7
7
|
// Handle onChange - always pass event to onChange, value to onValueChange
|
|
8
8
|
const handleChange = (e) => {
|
|
9
9
|
onChange?.(e);
|
|
10
10
|
onValueChange?.(e.target.value);
|
|
11
11
|
};
|
|
12
|
-
// Handle onBlur - always pass event to onBlur, value to
|
|
12
|
+
// Handle onBlur - always pass event to onBlur, value to onValueBlur
|
|
13
13
|
const handleBlur = (e) => {
|
|
14
14
|
onBlur?.(e);
|
|
15
|
-
|
|
15
|
+
onValueBlur?.(e.target.value);
|
|
16
16
|
};
|
|
17
17
|
return (_jsxs("div", { className: cn(s['w-full']), children: [label && (_jsx("label", { className: cn(s['block'], s['text-sm'], s['font-medium'], s['text-gray-700'], s['dark:text-gray-300'], s['mb-1']), children: label })), _jsx("textarea", { ref: ref, id: textareaId, className: cn(s['w-full'], s['px-4'], s['py-2'], s['border'], s['rounded-lg'], s['transition-colors'], s['resize-vertical'], s['bg-white'], s['dark:bg-gray-800'], s['border-gray-300'], s['dark:border-gray-600'], s['text-gray-900'], s['dark:text-gray-100'], s['placeholder-gray-500'], s['dark:placeholder-gray-400'], s['focus:outline-none'], s['focus:ring-2'], s['focus:ring-primary'], s['focus:ring-offset-1'], error && s['border-red-500'], error && s['focus:ring-red-500'], className), ...props, onChange: handleChange, onBlur: handleBlur }), error && (_jsx("p", { className: cn(s['mt-1'], s['text-sm'], s['text-red-600'], s['dark:text-red-400']), children: error }))] }));
|
|
18
18
|
});
|
|
@@ -78,5 +78,9 @@
|
|
|
78
78
|
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
79
79
|
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
80
80
|
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}.blur,.ring-1,.shadow,.shadow-lg,body{font-family:Arima Regular;font-size:14px}/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
81
|
+
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
82
|
+
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
83
|
+
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
84
|
+
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}
|
|
81
85
|
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}.dark\:bg-black:is(.dark *),.dark\:border-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
|
|
82
86
|
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/fieldset,legend{padding:0}.container{width:100%}@media (min-width:0px){.container{max-width:0}}@media (min-width:20rem){.container{max-width:20rem}}@media (min-width:23.4375rem){.container{max-width:23.4375rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:90rem){.container{max-width:90rem}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.form-input,.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,.form-input::placeholder,.form-input:focus,.form-multiselect,.form-multiselect:focus,.form-select,.form-select:focus,table{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}table:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}table tr:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}select:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.-my-2{margin-bottom:-.5rem;margin-top:-.5rem}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.blur,.ring-1,.shadow,.shadow-lg,.shadow-sm,body{font-family:Arima Regular;font-size:14px}.dark\:border-gray-600:is(.dark *),.dark\:bg-black:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:bg-boxdark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(36 48 63/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-black:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:placeholder-gray-400:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}.dark\:hover\:bg-blue-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity,1))}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}@font-face{font-family:ArimaRegular;src:url(library/assets/fonts/arima/arima-regular.ttf)}.container{width:100%}@media (min-width:0px){.container{max-width:0}}@media (min-width:20rem){.container{max-width:20rem}}@media (min-width:23.4375rem){.container{max-width:23.4375rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:90rem){.container{max-width:90rem}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.form-input,.form-multiselect,.form-select,.form-input:focus,.form-multiselect:focus,.form-select:focus,.form-input::placeholder,.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,table{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}table:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}table tr:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}select:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.-my-2{margin-bottom:-.5rem;margin-top:-.5rem}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,@keyframes pulse{50%{opacity:.5}}@keyframes spin{to{transform:rotate(1turn)}}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.shadow,.shadow-lg,.shadow-sm,.ring-1,.blur,body{font-family:Arima Regular;font-size:14px}.menu ul{list-style:none;margin:0;padding:0}.menu li{border-bottom:1px solid #ddd;padding:10px}.menu li:last-child{border-bottom:none}.focus\:ring-0:focus,.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:bg-black:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:bg-boxdark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(36 48 63/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-black:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:placeholder-gray-400:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}.dark\:hover\:bg-blue-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity,1))}@media (min-width:0px) and (max-width:767px){}
|